PXC是Percona XtraDB Cluster的缩写,是 Percona 公司出品的免费MySQL集群产品。PXC的做用是经过mysql自带的Galera集群技术,将不一样的mysql实例链接起来,实现多主集群。在PXC集群中每一个mysql节点都是可读可写的,也就是主从概念中的主节点,不存在只读的节点。html
PXC其实是基于Galera的面向OLTP的多主同步复制插件,PXC主要用于解决MySQL集群中数据同步强一性问题。PXC能够集群任何mysql的衍生版本,例如MariaDB和Percona Server。因为Percona Server的性能最接近于mysql企业版,性能相对于标准版的mysql有显著的提高,而且对mysql基本兼容。因此在搭建PXC集群时,一般建议基于Percona Server进行搭建。node
关于数据库集群方案的选择能够参考:mysql
环境版本说明:sql
MySQL有几个常见的衍生版,Percona Server就是其一。这里选择Percona Server是由于它是最接近于企业版的MySQL。各衍生版的对比图以下:数据库
本文的PXC集群设计如图:bootstrap
根据该图,咱们须要建立三个虚拟机来搭建一个三节点的PXC集群:vim
节点说明:安全
Node | Host | IP |
---|---|---|
Node1 | PXC-Node1 | 192.168.190.132 |
Node2 | PXC-Node2 | 192.168.190.133 |
Node3 | PXC-Node3 | 192.168.190.134 |
每一个虚拟机的配置以下图:bash
关于 PXC 集群是以牺牲性能来保证数据的强一致性问题。PXC 集群中的节点越多就意味着数据同步的时间就越长,那么应该用几台数据库服务器来作集群最合适,相对来讲算是能达到一个性能上最优的结果呢 ?服务器
一般来讲不超过15台节点组成一个PXC集群,性能上很好,多了就不行。而后这个PXC集群做为一个分片,MyCat上多设置几个分片,就能应对数据切分和并发访问了
有些 CentOS 版本默认捆绑了mariadb-libs
,在安装PXC以前须要先将其卸载:
[root@PXC-Node1 ~]# yum -y remove mari*
PXC集群要使用四个端口:
端口 | 描述 |
---|---|
3306 | MySQL服务端口 |
4444 | 请求全量同步(SST)端口 |
4567 | 数据库节点之间的通讯端口 |
4568 | 请求增量同步(IST)端口 |
因此若是系统启用了防火墙则须要开放这些端口:
[root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=3306/tcp --permanent [root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=4444/tcp --permanent [root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=4567/tcp --permanent [root@PXC-Node1 ~]# firewall-cmd --zone=public --add-port=4568/tcp --permanent [root@PXC-Node1 ~]# firewall-cmd --reload
先上官方文档:
PXC有两种较为简单的安装方式,一是到官网下载rpm
包到系统本地进行安装,二是使用官方提供的yum
仓库进行在线安装。本文演示的是本地安装这种方式,首先打开以下网址:
选择相应的版本后,复制下载连接:
而后到CentOS上使用wget
命令进行下载,以下示例:
[root@PXC-Node1 ~]# cd /usr/local/src [root@PXC-Node1 /usr/local/src]# wget https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.28-31.41/binary/redhat/8/x86_64/Percona-XtraDB-Cluster-5.7.28-31.41-r514-el8-x86_64-bundle.tar
建立存放rpm
文件的目录,并将下载好的PXC安装包解压缩到新建的目录中:
[root@PXC-Node1 /usr/local/src]# mkdir pxc-rpms [root@PXC-Node1 /usr/local/src]# tar -xvf Percona-XtraDB-Cluster-5.7.28-31.41-r514-el8-x86_64-bundle.tar -C pxc-rpms [root@PXC-Node1 /usr/local/src]# ls pxc-rpms Percona-XtraDB-Cluster-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-57-debugsource-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-client-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-client-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-devel-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-full-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-garbd-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-garbd-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-server-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-server-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-shared-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-shared-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-test-57-5.7.28-31.41.1.el8.x86_64.rpm Percona-XtraDB-Cluster-test-57-debuginfo-5.7.28-31.41.1.el8.x86_64.rpm
另外,PXC的安装须要依赖于qpress
和percona-xtrabackup-24
,能够在percona提供的仓库中获取到相应的rpm
包下载连接。而后进入pxc-rpms
目录下载这两个组件的rpm
包,以下:
[root@PXC-Node1 /usr/local/src]# cd pxc-rpms [root@PXC-Node1 /usr/local/src/pxc-rpms]# wget https://repo.percona.com/release/8/RPMS/x86_64/qpress-11-1.el8.x86_64.rpm [root@PXC-Node1 /usr/local/src/pxc-rpms]# wget https://repo.percona.com/release/8/RPMS/x86_64/percona-xtrabackup-24-2.4.18-1.el8.x86_64.rpm
完成以上步骤后,如今就能够经过yum
命令以本地形式安装PXC了:
[root@PXC-Node1 /usr/local/src/pxc-rpms]# yum localinstall -y *.rpm
成功安装后,系统中就会有mysql
的相关命令。以下,能正常查看到版本信息表明已安装成功:
[root@PXC-Node1 /usr/local/src/pxc-rpms]# mysql --version mysql Ver 14.14 Distrib 5.7.28-31, for Linux (x86_64) using 7.0 [root@PXC-Node1 /usr/local/src/pxc-rpms]#
安装后须要进行一些配置才能启动集群,PXC的配置文件默认位于/etc/percona-xtradb-cluster.conf.d/
目录下,/etc/my.cnf
文件只是对其引用:
[root@PXC-Node1 ~]# cd /etc/percona-xtradb-cluster.conf.d/ [root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# ll 总用量 12 -rw-r--r-- 1 root root 381 12月 13 17:19 mysqld.cnf # mysql相关配置 -rw-r--r-- 1 root root 440 12月 13 17:19 mysqld_safe.cnf # mysqld_safe相关配置 -rw-r--r-- 1 root root 1066 12月 13 17:19 wsrep.cnf # PXC集群的相关配置
在mysqld.cnf
文件中添加一些字符集等基本配置:
[root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# vim mysqld.cnf [mysqld] ... # 设置字符集 character_set_server=utf8 # 设置监听的ip bind-address=0.0.0.0 # 跳过DNS解析 skip-name-resolve
而后是配置PXC集群,修改wsrep.cnf
文件中的以下配置项:
[root@PXC-Node1 /etc/percona-xtradb-cluster.conf.d]# vim wsrep.cnf [mysqld] # PXC集群中MySQL实例的惟一ID,不能重复,且必须是数字 server-id=1 # Galera库文件的路径 wsrep_provider=/usr/lib64/galera3/libgalera_smm.so # PXC集群的名称 wsrep_cluster_name=pxc-cluster # 集群中全部节点的ip wsrep_cluster_address=gcomm://192.168.190.132,192.168.190.133,192.168.190.134 # 当前节点的名称 wsrep_node_name=pxc-node-01 # 当前节点的IP wsrep_node_address=192.168.190.132 # 同步方法(mysqldump、 rsync、 xtrabackup) wsrep_sst_method=xtrabackup-v2 # 同步时使用的账户密码 wsrep_sst_auth=admin:Abc_123456 # 采用严格的同步模式 pxc_strict_mode=ENFORCING # 基于ROW复制(安全可靠) binlog_format=ROW # 默认引擎 default_storage_engine=InnoDB # 主键自增加不锁表 innodb_autoinc_lock_mode=2
到此为止,咱们在PXC-Node1
这台虚拟机上完成了PXC的安装及配置。而后到其余两个节点上完成一样的步骤便可,这里就再也不重复了。
当全部的节点都准备完成后,使用以下命令启动PXC集群。注意这条的命令是用于启动首节点的,初次启动集群时首节点能够是这三个节点中的任意一个,这里我采用PXC-Node1
做为首节点。故在该虚拟机下执行这条命令:
[root@PXC-Node1 ~]# systemctl start mysql@bootstrap.service
而其余节点只须要正常启动MySQL服务便可,启动以后会根据wsrep.cnf
文件中的配置自动加入集群中:
[root@PXC-Node2 ~]# systemctl start mysqld
禁用Percona Server的开机自启动:
[root@localhost ~]# systemctl disable mysqld Removed /etc/systemd/system/multi-user.target.wants/mysqld.service. Removed /etc/systemd/system/mysql.service. [root@localhost ~]#
接着修改root帐户的默认密码。咱们能够在mysql的日志文件中找到初始的默认密码。下图红框标注的就是默认密码:
复制默认密码,而后使用mysql_secure_installation
命令修改root帐户的密码:
[root@localhost ~]# mysql_secure_installation
为了安全起见,root帐户通常是不容许远程登陆的,因此咱们须要单首创建一个用于远程访问的数据库帐户。这个帐户也是用于PXC集群同步数据的帐户,与wsrep.cnf
文件中的wsrep_sst_auth
配置项所对应:
[root@localhost ~]# mysql -uroot -p mysql> create user 'admin'@'%' identified by 'Abc_123456'; mysql> grant all privileges on *.* to 'admin'@'%'; mysql> flush privileges;
建立完帐户后,使用客户端工具进行远程链接测试看看是否能正常链接成功:
到此为止,咱们就算是完成PXC集群的搭建了。如今应该是已经能够看到PXC集群的同步效果的,由于上面修改root密码以及新建帐户的操做都会被同步到其余两个节点上。也就是说,此时其余两个节点的root帐户密码已是修改后的密码,而且也会有一个admin帐户。关于这一点能够自行验证一下。
除此以外,咱们也可使用以下语句来确认集群的状态信息:
show status like 'wsrep_cluster%';
执行结果:
变量说明:
wsrep_cluster_weight
:该节点在集群中的权重值wsrep_cluster_conf_id
:集群节点关系改变的次数(每次增长/删除都会+1)wsrep_cluster_size
:集群中的节点个数wsrep_cluster_state_uuid
:集群当前状态的UUID,这是集群当前状态及其所经历的更改序列的惟一标识符。也用于比较两个或多个节点是否处于同一集群,若两个节点的该变量值一致就表明处于一个集群,若是该值不一致则表示不处于同一集群wsrep_cluster_status
:集群的目前状态一、验证建立数据库是否能同步
在节点1中建立一个test
库:
建立完成后,点击其余节点也应能看到test
这个库:
二、验证建立数据表是否能同步
在节点1中的test
库里建立一张student
表:
建立完成后,在其余节点也应能看到这张student
表:
三、验证表数据是否能同步
往节点1中的student
表里插入一条数据:
此时其余节点中也应能看到这条数据:
集群的状态参数能够经过SQL语句进行查询的,以下:
show status like '%wsrep%';
因为查询出来的状态参数变量很是的多,这里针对一些经常使用的进行说明。PXC集群参数能够分为如下几类:
wsrep_local_send_queue
:发送队列的长度wsrep_local_send_queue_max
:发送队列的最大长度wsrep_local_send_queue_min
:发送队列的最小长度wsrep_local_send_queue_avg
:发送队列的平均长度wsrep_local_recv_queue
:接收队列的长度wsrep_local_recv_queue_max
:接收队列的最大长度wsrep_local_recv_queue_min
:接收队列的最小长度wsrep_local_recv_queue_avg
:接收队列的平均长度wsrep_replicated
:同步数据到其余节点的次数wsrep_replicated_bytes
:同步到其余节点的数据总量,单位字节wsrep_received
:接收到其余节点同步请求的次数wsrep_received_bytes
:接收到其余节点的同步数据总量,单位字节wsrep_last_applied
:同步应用次数wsrep_last_committed
:事务提交次数wsrep_flow_control_paused_ns
:流控暂停状态下花费的总时间(纳秒)wsrep_flow_control_paused
:流控暂停时间的占比(0 ~ 1)wsrep_flow_control_sent
:发送的流控暂停事件的数量,即当前节点触发流控的次数wsrep_flow_control_recv
:接收的流控暂停事件的数量wsrep_flow_control_interval
:流控的下限和上限。上限是队列中容许的最大请求数。若是队列达到上限,则拒绝新的请求,即触发流控。当处理现有请求时,队列会减小,一旦到达下限,将再次容许新的请求,即解除流控wsrep_flow_control_status
:流控的开关状态(开启:ON,关闭:OFF)wsrep_cert_deps_distance
:事务执行的并发数wsrep_apply_oooe
:接收队列中事务的占比wsrep_apply_oool
:接收队列中事务乱序执行的频率wsrep_apply_window
:接收队列中事务的平均数量wsrep_commit_oooe
:发送队列中事务的占比wsrep_commit_oool
:无任何意义(不存在本地乱序提交)wsrep_commit_window
:发送队列中事务的平均数量wsrep_local_state_comment
:节点的当前状态wsrep_cluster_status
:集群的当前状态wsrep_connected
:节点是否链接到集群wsrep_ready
集群是否正常工做wsrep_cluster_size
:集群中的节点个数wsrep_desync_count
:延时节点的数量wsrep_incoming_addresses
:集群中全部节点的IP地址PXC节点状态图:
OPEN
:节点启动成功PRIMARY
:节点成功加入集群JOINER
:与其余节点同步数据JOINED
:与其余节点同步数据成功SYNCED
:与集群同步完成,能够对外提供服务DONER
:接收其余节点的全量数据同步,处于不可用PXC集群状态图:
PRIMARY
:正常状态NON_PRIMARY
:集群发生脑裂DISCONNECTED
:集群处于没法链接状态官方文档:
一、PXC节点的安全下线姿式
节点是怎么启动的,就使用对应的命令去关闭便可
systemctl start mysql@bootstrap.service
systemctl stop mysql@bootstrap.service
systemctl start mysqld
systemctl stop mysqld
二、若是全部PXC节点都是安全下线的,那么在启动集群时,就须要先启动最后下线的节点
初次启动集群时能够将任意一个节点做为首节点启动。但若是是一个已经启动过的集群,那么当该集群下线再上线时,就须要将最后下线的节点做为首节点来启动。其实关于某个节点是否能做为首节点启动,能够经过查看 grastate.dat
文件得知:
[root@PXC-Node1 ~]# cat /var/lib/mysql/grastate.dat # GALERA saved state version: 2.1 uuid: 2c915504-39ac-11ea-bba7-a294386c4285 seqno: -1 safe_to_bootstrap: 0 [root@PXC-Node1 ~]#
safe_to_bootstrap
的值为0
时表示不能做为首节点启动,为1
时表示能够做为首节点启动。PXC集群中最后一个下线的节点就会将safe_to_bootstrap
的值改成1
,下次启动集群时就须要将该节点做为首节点启动。这是由于最后一个下线的节点数据是最新的。将其做为首节点启动,而后让其余节点与该节点进行数据同步,这样才能保证集群中的数据是最新的。不然,可能会致使集群中的数据是某个时间点以前的旧数据。三、若是PXC节点都是意外退出的,并且不是在同一时间退出的状况
在本文开头提到过,PXC集群中一半以上的节点因意外宕机而没法访问时,PXC集群就会中止运行。但若是这些PXC节点是以安全下线的方式退出,则不会引起集群自动中止运行的问题,只会缩小集群的规模。只有意外下线一半以上节点时集群才会自动中止,意外下线的状况包括:
只要PXC集群中的节点不是同时意外退出的,那么当集群还剩一个节点时,该节点就会自动将grastate.dat
文件中的safe_to_bootstrap
值改成1
。因此在重启集群时,也是先启动最后一个退出的节点。
四、若是PXC节点都是同时意外退出的,则须要修改grastate.dat
文件
当集群中全部节点都是在同一时间因意外状况而退出,那么此时全部节点的safe_to_bootstrap
都为0
,由于没有一个节点来得及去修改safe_to_bootstrap
的值。当全部节点的safe_to_bootstrap
均为0
时,PXC集群是没法启动的。
在这种状况下咱们就只能手动选择一个节点,将safe_to_bootstrap
修改成1
,而后将该节点做为首节点进行启动:
[root@PXC-Node1 ~]# vim /var/lib/mysql/grastate.dat ... safe_to_bootstrap: 1 [root@PXC-Node1 ~]# systemctl start mysql@bootstrap.service
接着再依次启动其余节点便可:
[root@PXC-Node2 ~]# systemctl start mysqld
五、若是集群中还有可运行的节点,那么其余下线的节点只须要按普通节点上线便可
[root@PXC-Node2 ~]# systemctl start mysqld