金融级数据安全的解决方案
基于Galera Cluster来实现的:pxc和组复制
pxc单独配置仓库
下载仓库:https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
pxc原理:
多主架构,每个机器既能实现读也能实现写,并且写操作发生后,他能自动的把自己写过的数据和其他的机器进行实时同步
而且是强一致,任何数据库发生更新后,这个更新必须同步到其他节点,数据是一样的。
实战案例:性能协议XtraDB集群(PXC 5.7)
1 环境准备
四台主机:
pxc1:10.0.0.7 pxc2:10.0.0.17 pxc3:10.0.0.27 pxc4:10.0.0.37
OS 版本目前不支持CentOS 8
关闭防火墙和selinux,保证时间同步
注意:如果已经安装MySQL,必须卸载
2 安装Percona XtraDB Cluster 5.7
此处使用清华大学yum源,官方源太慢了
vim /etc/yum.repos.d/pxc.repo
[percona]
name=percona_repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/$releasever/RPMS/$basearch
enabled=1
gpgcheck=0
把文件拷贝到其他节点
scp /etc/yum.repos.d/pxc.repo 10.0.0.17:/etc/yum.repos.d
scp /etc/yum.repos.d/pxc.repo 10.0.0.27:/etc/yum.repos.d
在三个节点都安装好pxc 5.7
yum -y install Percona-XtraDB-Cluster-5.7
查看包
rpm -ql Percona-XtraDB-Cluster-5.7
3 在各个节点上分别配置mysql及集群配置文件
/etc/my.cnf为主配置文件,当前版本中,其余的配置文件都放在/etc/percona-xtradb-cluster.conf.d目录里,包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf三个文件
主配置文件不需要修改
cat /etc/my.cnf
ls /etc/Percona-XtraDB-Cluster.conf.d/
mysqld.cnf mysqld_safe.cnf wsrep.cnf
下面配置文件不需要修改
cat /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=1 #建议各个节点不同
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
log-bin #建议启用,非必须项
log_slave_updates
expire_logs_days=7
symbolic-links=0
下面配置文件不需要修改
cat /etc/percona-xtradb-cluster.conf.d/mysqld_safe.cnf
[mysqld_safe]
pid-file=/var/run/mysqld/mysqld.pid
socket=/var/lib/mysql/mysql.sock
nice=0
PXC的配置文件必须修改
pxc1:
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27 #三个节点的IP binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.7 #各个节点,指定自已的IP
wsrep_cluster_name=pxc-cluster #所有节点都一致
wsrep_node_name=pxc-cluster-node-1 #各个节点,指定自已节点名称
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretpass #取消本行注释,同一集群内多个节点的验证用户和密码信息必须一致
pxc2:
grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27 #三个节点的IP binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.17 #各个节点,指定自已的IP
wsrep_cluster_name=pxc-cluster #所有节点都一致
wsrep_node_name=pxc-cluster-node-2 #各个节点,指定自已节点名称
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretpass #取消本行注释,同一集群内多个节点的验证用户和密码信息必须一致
pxc3:
grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27 #三个节点的IP binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.27 #各个节点,指定自已的IP
wsrep_cluster_name=pxc-cluster #所有节点都一致
wsrep_node_name=pxc-cluster-node-3 #各个节点,指定自已节点名称
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretpass #取消本行注释,同一集群内多个节点的验证用户和密码信息必须一致
注意:尽管Galera Cluster不再需要通过binlog的形式进行同步,但还是建议在配置文件中开启二进制日志功能,原因是后期如果有新节点需要加入,老节点通过SST全量传输的方式向新节点传输数据,很可能会拖垮集群性能,所以让新节点先通过binlog方式完成同步后再加入集群会是一种更好的选择
配置文件各项配置意义
配置 | 说明 |
wsrep_provider | 指定Galera库的路径 |
wsrep_cluster_name | Galera集群的名称,可以改,所有节点都一致 |
wsrep_cluster_address | Galera集群中各节点地址.地址使用组通信协议gcomm://(group communication) |
wsrep_node_name | 本节点在Galera集群中的名称 |
wsrep_node_address | 本节点在Galera集群中的通信地址 |
wsrep_sst_method | state_snapshot_transfer(SST)使用的传输方法,可用方法有mysqldump,rsync和xtrabackup,前两者在传输时都需要对Donor加全局只读锁(带有读取锁的刷新表),xtrabackup则不需要(它使用percona自己提供的backup lock)。强烈建议采用xtrabackup |
wsrep_sst_auth | 在SST传输时需要用到的认证凭据,格式为:"用户:密码" 系统自带,需要修改 |
pxc_strict_mode | 是否限制PXC启用正在试用阶段的功能,ENFORCING是默认值, 表示不启用 |
binlog_format | 二进制日志的格式.Galera只支持row格式的二进制日志 |
default_storage_engine | 指定默认存储引擎.Galera的复制功能只支持InnoDB |
innodb_autoinc_lock_mode | 只能设置为2,设置为0或1时会无法正确处理死锁问题 |
4 启动pxc集群中的第一个节点,启动之后生成初始化数据
pxc1: ss -ntul
启动第一个节点:4567端口 实现数据同步
systemctl start mysql@bootstrap.service
ss -ntul 可看到端口4567已启动
查看root密码:随机密码
cat /var/log/mysqld.log |grep "temporary password"
用随机密码登录
mysql -uroot -p'=tWFP0oRJl8t'
修改root密码
mysql> alter uesr 'root'@'localhost' identified by '123456';
创建相关用户并授权:
这个账户已经在配置文件wsrep.cnf指定,里面指定账号密码多少,这里就创建相同的密码帐号
mysql> create user 'sstuser'@'localhost' identified by 's3cretPass';
mysql> grant reload, lock tables, process, replication client on *.* to 'sstuser'@'localhost'
查看相关变量
mysql> show variables like 'wsrep%size%'\G
查看相关状态变量
mysql> show STATUS LIKE 'wsrep_cluster_size%'\G
重点关注下面内容
说明:
wsrep_cluster_size表示,该Galera集群中只有一个节点
wsrep_local_state_comment 状态为Synced(4),表示数据已同步完成(因为是第一个引导节点,无数据 需要同步). 如果状态是Joiner, 意味着 SST 没有完成. 只有所有节点状态是Synced,才可以加新节点 wsrep_cluster_status为Primary,且已经完全连接并准备好
5 启动PXC集群中其它所有节点
pxc2:ss -ntul
pxc2:systemctl start mysql
pxc2:ss -ntul
pxc3:systemctl start mysql
6 查看集群状态,验证集群是否成功
在任意节点,查看集群状态
pxc1:mysql -uroot -p123456
mysql> show variables like 'wsrep_node_name';
mysql> show variables like 'wsrep_node_address';
mysql> show variables like 'wsrep_on';
mysql> show status like 'wsrep_cluster_size';
在任意节点查看数据库
mysql> show databases;
在任意节点创建数据库
mysql> create database testdb1;
mysql> show databases;
在任意其它节点验证数据是否同步
pxc2:mysql -uroot -p123456
mysql> show databases;
利用Xshell软件,同时在三个节点数据库,在其中一个节点成功
mysql> create database testdb2;
在数据库中写入数据,数据相比之前写入变慢,因为它需要进行全局校验,在所有的节点都进行检查,事务在所有的节点都成功后才可以提交。PXC节点不宜过多
7 在PXC集群中加入节点
一个节点加入到Galera集群有两种情况:新节点加入集群,暂时离组的成员再次加入集群
1)新节点加入Galera集群 新节点加入集群时,需要从当前集群中选择一个Donor节点来同步数据,也就是所谓的 state_snapshot_tranfer(SST)过程.SST同步数据的方式由选项wsrep_sst_method决定,一般选择的是 xtrabackup. 必须注意,新节点加入Galera时,会删除新节点上所有已有数据,再通过xtrabackup(假设使用的是该方 式)从Donor处完整备份所有数据进行恢复.所以,如果数据量很大,新节点加入过程会很慢.而且,在 一个新节点成为Synced状态之前,不要同时加入其它新节点,否则很容易将集群压垮. 如果是这种情况,可以考虑使用wsrep_sst_method=rsync来做增量同步,既然是增量同步,最好保证 新节点上已经有一部分数据基础,否则和全量同步没什么区别,且这样会对Donor节点加上全局read only锁.
2)旧节点加入Galera集群 如果旧节点加入Galera集群,说明这个节点在之前已经在Galera集群中呆过,有一部分数据基础,缺少 的只是它离开集群时的数据.这时加入集群时,会采用IST(incremental snapshot transfer)传输机制, 即使用增量传输. 但注意,这部分增量传输的数据源是Donor上缓存在GCache文件中的,这个文件有大小限制,如果缺失 的数据范围超过已缓存的内容,则自动转为SST传输.如果旧节点上的数据和Donor上的数据不匹配(例 如这个节点离组后人为修改了一点数据),则自动转为SST传输.
在PXC集群中再加一台新的主机PXC4:10.0.0.37
yum -y install Percona-XtraDB-Cluster-5.7
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
grep -Ev "^#|^$" /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27,10.0.0.37 #三个节点的IP binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=10.0.0.37 #各个节点,指定自已的IP
wsrep_cluster_name=pxc-cluster #所有节点都一致
wsrep_node_name=pxc-cluster-node-4 #各个节点,指定自已节点名称
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:s3cretpass #取消本行注释,同一集群内多个节点的验证用户和密码信息必须一致
systemctl start mysql
mysql -uroot -p123456
mysql> show status like 'wsrep_cluster_size';
mysql> show databases;
将其它节点的配置文件加以修改
vim/etc/percona-xtradb-cluster.conf.d/wsrep.cnf
wsrep_cluster_address=gcomm://10.0.0.7,10.0.0.17,10.0.0.27,10.0.0.37
8 在PXC集群中修复故障节点
在除第一个启动节点外的任意节点停止服务
systemctl stop mysqld
在其它任意节点查看wsrep_cluster_size变量少了一个节点
mysql -uroot -p123456
mysql> show status like 'wsrep_cluster_size';
mysql> create database testdb4
在其它任意节点可看到数据已同步
mysql> show databases;
恢复服务,数据同步
systemctl stop mysqld
mysql -uroot -p123456
mysql> show databases;
mysql> show status like 'wsrep_cluster_size';
组复制MGR实战
组复制不是全局校验,只要大多数通过即可(N/2+1),即可提交
一个事务的提交,只需半数以上的节点通过即可
MGR特点:
强一致性: 基于原生复制和paxos协议,保证数据传输的一致性哈原子性
高容错性: 只要大多数节点没有出现故障,集群就可对外提供服务
高扩展性: 节点的加入和移除都是自动的,不需要人为过多干涉
高灵活性具有单主模式和多主模式,单主模式在主宕机自动选主,多主模式多节点写入,具备冲突检测机制,适用于多场景
组复制的模式:
单主模式:有一个节点可读写,其他节点超级只读(会自动选举新主)
多主模式:所有节点可读写
单主选举排序考虑因素:
1.运行的MySQL版本低的优先
2.成员权重 0-100 ,可以指定权重
3.uuid最低优先
多组复制满足以下要求
组复制的使用需满足如下要求:
环境准备:
三台机器 (rocky)
10.0.0.101
10.0.0.102
10.0.0.103
主机名和名称解析(三台都该)
hostnamectl set-hostname nodel.li.org
cat >> /etc/hosts <<EOF
10.0.0.101 nodel.li.org
10.0.0.102 node2.li.org
10.0.0.103 node3.li.org
EOF
将此文件拷贝到其他节点上,并去其他节点修改主机名
scp /etc/hosts 10.0.0.102:/etc
scp /etc/hosts 10.0.0.103:/etc
二进制安装MySQL8.0.30或者yum -y install mysql-server
1.所有主机修改配置文件
vim /etc/my.cnf
[mysqld]
default_authentication_plugin=mysql_native_password
binlog_checksum=NONE
server-id=101
gtid_mode=ON
enforce_gtid_cnotallow=ON
loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee"
#可uuidgen生成唯一的uuid
loose-group_replication_start_on_boot=OFF
loose-group_replication_local_address="10.0.0.101:24901"
loose-group_replication_group_seeds="10.0.0.101:24901,10.0.0.102:24901,10.0.0.103:24901"
loose-group_replication_bootstrap_group=OFF
loose-group_replication_recovery_use_ssl=ON
#主要修改节点IP
2.启动所有节点服务
systemctl restart mysqld
3.在所有节点创建参与复制的账号
set sql_log_bin=0; #不需要记录二进制日志,临时关闭
creste user repluser@'%' identified by '123456';
grant replication slave on *.* to repluser@'%';
flush privileges;
set sql_log_bin=1; #开启二进制日志
4.在所有节点上安装插件
install plugin group_replication soname 'group_replication.so';
show plugins; #查看插件是否存在
5.启动第一个节点
set global group_replication_bootstrap_group=ON;
start group_replication;
set global group_replication_bootstrap_group=OFF;
验证结果,有一个成员online了
select * from performance_schema.replication_group_members;
6.启动剩下的节点
设置复制用户
change master to master_user='repluser',master_password='123456' for channel 'group_replication_recovery'; #让其他两个节点参与复制
启动复制
start group_replication; #自动会加入组复制里
7.在第一个节点上写数据,其他节点可查看到写入的数据,但是其他的节点是无法写入数据的
8.挂掉第一个节点,会自动提升其他节点为主
关闭mysql:systemctl stop mysqld
9.把停掉的第一个节点开启,再次加入集群,其状态为从
开启mysql:systemctl start mysqld
加入:change master to master_user='repluser',master_password='123456' for channel 'group_replication_recovery';
开启:start group_replication;
查看状态:select * from performance_schema.replication_group_members;
10.切多主(在任何一个节点),所有节点都可以写入
select group_replication_switch_to_multi_primary_mode();
11.切回单主
select group_replication_switch_to_single_primary_mode();
12.设置某节点当主
select group_replication_set_as_primary("节点uuid");
select * from performance_schema.replication_group_members;此命令可查看UUID