Percona XtraDB Cluster是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性
完全兼容 MySQL。
同步复制,事务要么在所有节点提交或不提交。
多主复制,可以在任意节点进行写操作。
在从服务器上并行应用事件,真正意义上的并行复制。
节点自动配置,数据一致性,不再是异步复制。
故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。
自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉取在线节点数据,集群最终会变为一致;
PXC最大的优势:强一致性、无同步延迟
复制只支持InnoDB 引擎,其他存储引擎的更改不复制
写入效率取决于节点中最慢的一台
Replication | PXC |
---|---|
数据同步是单向的,master负责写,然后异步复制给slave;如果slave写入数据,不会复制给master | 数据同步时双向的,任何一个mysql节点写入数据,都会同步到集群中其它的节点 |
异步复制,从和主无法保证数据的一致性 | 同步复制,事务在所有集群节点要么同时提交,要么同时不提交 |
Replication | PXC |
---|---|
【低价值业务】 | 【高价值业务】 |
日志 | 订单 |
新闻 | 账户 |
帖子 | 财务 |
1.进入配置文件编辑
vim /etc/hosts
#mysql实例端口:3306
#PXC cluster相互通讯的端口:4567
#用于SST传送的端口:4444
#用于IST传送的端口:4568
【查看防火墙】
sudo systemctl status firewalld
【关闭防火墙】
sudo systemctl stop firewalld
查看了一下发现默认是关闭的,inactive(dead) 代表关闭了,如果是active(running)就意味着防火墙开启了,我这里是测试也就让防火墙关闭着,如果不可以关就把上文中那四个需要的端口给开放即可
1.输入命令进入配置文件
vim /etc/selinux/config
2.将SELINUX的值设置为disabled
修改后的文件如图所示
3.输入命令使关闭生效
setenforce 0
1.输入安装命令
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
1.输入安装命令
sudo yum install Percona-XtraDB-Cluster-57
1.先启动 Percona XtraDB Cluster 服务
sudo systemctl start mysqld
2.查看自动生成的ROOT临时密码
sudo grep 'temporary password' /var/log/mysqld.log
如图所示,这次我的临时密码就是 wBL(K6HD9yml
3.登录 MySQL
mysql -u root -p
将临时密码复制粘贴,注意密码录入会自动隐藏,粘贴完直接回车即可
登录成功进入Mysql命令行
4.输入命令,将密码修改为molimoli
ALTER USER 'root'@'localhost' IDENTIFIED BY 'molimoli';
5.退出
exit
6.关闭 MySQL 服务
sudo systemctl start mysqld
1.输入命令编辑my.cnf文件
sudo vim /etc/my.cnf
2.按下Ins建 开启编辑模式(开启后左下角有提示)
3.在内容尾部追加信息
注意:将【88.88.88.88】改为你第一个服务器的IP,将【99.99.99.99】改为你第二个服务器的IP
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://99.99.99.99,88.88.88.88
wsrep_node_name=ml1
wsrep_node_address=88.88.88.88
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:molimoli
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
配置参数说明
wsrep_provider
指定 Galera 库的路径。
wsrep_cluster_name
指定集群的逻辑名称,集群内的所有节点,这个名称必须一致。
wsrep_cluster_address
指定集群内节点的 IP 地址,建议将集群节点都配上。
wsrep_node_name
指定单个节点的逻辑名称,如果没有指定,将使用 hostname 作为逻辑名称。
wsrep_node_address
指定此特定节点的 IP 地址。
wsrep_sst_method
默认的使用 Percona Xtrabackup 进行 State Snapshot Transfer (SST),强烈建议使用 wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth
指定 sst 的身份验证凭据,使用<sst_user>:<sst_pass> 这种格式,启动第一个节点时必须创建,并且提供相应的权限。
pxc_strict_mode
关闭实验性的或者不支持的特性
binlog_format
Galera 只支持 row-level replication,所以设置为 binlog_format=ROW。
default_storage_engine
Galera 只支持 InnoDB 引擎,所以设置为 default_storage_engine=InnoDB。
innodb_autoinc_lock_mode
Galera 只支持 lock mode 为 2 的 InnoDB 引擎,所以设置为 innodb_autoinc_lock_mode=2。
4.按ESC退出编辑模式,然后按shift + Z +Z 退出并保存
1.输入该命令启动第一个节点
注:使用 bootstrap 模式启动,默认会设置 wsrep_cluster_address=gcomm://,后面没有 IP,表示初始化集群。
sudo systemctl start mysql@bootstrap
mysql -u root -p
show status like 'wsrep%';
打印了一长串信息,这就是PXC集群状态监控指标,可以看到集群数量时 1,本节点为 Synced 状态,表示连接成功,并且准备好进行 write-set replication。
常用PXC集群状态监控指标说明:
(1)wsrep_local_state_uuid:与wsrep_cluster_state_uuid的值一致,且所有节点该值都相同
(2)wsrep_cluster_state_uuid:所有节点该值都相同,如果有不同值的节点,说明该节点没有与集群建立连接
(3)wsrep_last_committed:集群已经提交事务的数量,是一个累计值,所有节点该值都相同,如果出现不一致,说明事务有延迟,可以用来计算延
(4)wsrep_replicated:从本节点复制出去的写集数量,wsrep_replicated_bytes为写集的总字节数,可以用于参考节点间的负载均衡是否平衡,该值较大的节点较为繁忙
(5)wsrep_received:与wsrep_replicated对应,本节点接收来自其它节点的写集数量
(6)wsrep_local_state:所有节点该值都应该为4,表示正常,节点状态有如下6个取值
a、取值1:节点启动并与集群建立连接
b、取值2:当节点成功执行状态传输请求时,该节点开始缓存写集
c、取值3:节点接收了SST全量数据传输,该节点现在拥有所有集群数据,并开始应用已缓存的写集
d、取值4:节点完成与集群数据的同步,它的从属队列现在是空的,并启用流控使其保持为空
e、取值5:节点接收了状态传输请求,该节点现在对donor不执行流控,该节点已缓存所有的写集但无法应用
f、取值6:节点完成对joiner节点的状态传输
(7)wsrep_incoming_addresses:集群中所有节点的IP,且每个节点该值都相同
(8)wsrep_cluster_size:集群中的节点数量,所有节点该值都相同
(9)wsrep_cluster_conf_id:所有节点该值都相同,如果值不同,说明该节点被临时“分区”了
(10)wsrep_cluster_status:集群组成的状态,所有节点该值都为“Primary”,如果该值不为“Primary”,说明该节点出现“分区”或“脑裂”现象
(11)wsrep_connected:所有节点该值都为“ON”,表示本节点已经与集群建立连接
(12)wsrep_ready:所有节点该值都为“ON”,表示本节点可以正常提供服务
1.创建用户
注:用户名和密码必须跟配置文件匹配
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'molimoli';
2.授权
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
3.刷新
FLUSH PRIVILEGES;
1.输入命令编辑my.cnf文件
sudo vim /etc/my.cnf
2.在内容尾部追加信息
注意:将【88.88.88.88】改为你第一个服务器的IP,将【99.99.99.99】改为你第二个服务器的IP
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://88.88.88.88,99.99.99.99
wsrep_node_name=ml2
wsrep_node_address=99.99.99.99
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=sstuser:molimoli
pxc_strict_mode=ENFORCING
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
第二节点的配置文件与第一节点的配置文件区别是
wsrep_node_name=ml1
wsrep_node_address=88.88.88.88
变为
wsrep_node_name=ml2
wsrep_node_address=99.99.99.99
也就是将逻辑名改为第二节点,IP改为第二节点的IP,如果你要创建第三节点,同理只需要改这两处即可
1.输入命令启动第二节点
sudo systemctl start mysqld
2.登录Mysql,并查询状态
mysql -u root -p
show status like 'wsrep%';
可以看到 wsrep_cluster_size 的值是 2 表示集群已经有 2 个节点了。wsrep_local_state_comment 的值是 Synced 表示已经同步了。
注意 如果 wsrep_local_state_comment 的状态是 Joiner,表示正在同步,请不要启动第三个第四个节点的服务。
在sql命令行下输入
grant all on *.* to root@'%' identified by 'molimoli' with grant option;
1.填写信息
2.点击测试按钮,确保可以正常连接,然后单击确定即可完成节点1的添加
3.节点2添加同理,最终效果如图
可以看到节点2同步了节点1的数据,如果开启更多的节点也都是同样的效果
1.所有其他节点的数据和配置都会被第一个节点的数据覆盖
2.不用同时加入多个节点,避免数据或网络开销过大
这是我通过学习对知识的整理及备忘,本博客的所有内容,仅是自己的一些学习笔记,如有错误,欢迎指正。如有侵权,请告知修改。
参考文章:
http://www.mamicode.com/info-detail-2652214.html
http://www.imooc.com/article/28832?block_id=tuijian_wz
https://qizhanming.com/blog/2019/05/16/how-to-install-percona-xtradb-cluster-on-centos-7
https://cloud.tencent.com/developer/article/1177822