【目前网络上还没有比较完善的PXC最新版本8.0的中文部署参考,结合项目需要,本人完全基于官方文档,做了一次全新尝试。本文基于PXC最新版本8.0.21,详细记录了在CentOS7的部署过程,值得参考】
“Percona XtraDB Cluster是MySQL的数据库集群解决方案。它确保高可用性,防止停机和数据丢失,并为不断增长的环境提供线性可伸缩性。”---来自官网
PXC近几年广为应用的应该是5.6、5.7版本,笔者于2018年在某项目部署的版本就是5.7,也留下了深刻印象。
最新的版本是8.0,相比较5.7最为显著的变化,个人感觉第一是安全性增强,取消了之前的SST全量同步的明文用户密码的方式,改为SSL证书、密钥加密同步传输方式,同时也支持客户端应用的SSL加密方式。第二个大变化就是增加了一个ProxySQL工具。
请相信笔者的建议,一个高级技术的实践使用,最佳的参考文档一定是官方文档,笔者热爱的Oracle如此,PXC也不例外,网上的文章水平参差不齐,很有可能给你方便的同时,也会给你留下一些坑,让你费时费力。哈哈,所以此文也一样,仅供你有选择的参考。但是笔者的风格是知无不言言无不尽,尽量还原全部步骤。
本次实战的参考来自官方网站,在这里有所有的参考资料:
https://www.percona.com/doc/percona-xtradb-cluster/8.0/index.html
1. PXC基础知识
1.1 PXC集群使用四个端口
端口 描述
3306 MySQL服务端口
4444 请求全量同步(SST)端口
4567 数据库节点之间的通信端口
4568 请求增量同步(IST)端口
因此如系统启用了防火墙则需开放这些端口,后者干脆关闭防火墙
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent
firewall-cmd --zone=public --add-port=4567/tcp --permanent
firewall-cmd --zone=public --add-port=4568/tcp --permanent
firewall-cmd --reload
1.2 关于SST同步
Different from previous version
The variable wsrep_sst_auth has been removed. Percona XtraDB Cluster 8.0 automatically creates the system user mysql.pxc.internal.session. During SST, the user mysql.pxc.sst.user and the role mysql.pxc.sst.role are created on the donor node.
1.3 节点状态定义
OPEN:节点启动成功
PRIMARY:节点成功加入集群
JOINER:与其他节点同步数据
JOINED:与其他节点同步数据成功
SYNCED:与集群同步完成,可以对外提供服务
DONER:接收其他节点的全量数据同步,处于不可用
1.4 最常使用的查看命令
show variables like 'wsrep%';
show status like 'wsrep%';
2. Pre-task preparation
2.1 config hostname、hosts file、ip address
cat /etc/hosts
cat > /etc/hosts << EOF
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
133.95.34.245 mysqldb1
133.95.34.246 mysqldb2
133.95.34.250 mysqldb3
EOF
2.2 时间同步
使用chronyd配置节点间时间同步,略
2.3 Modify /etc/profile
加入常用的环境变量
2.4 系统核心参数配置
cat >> /etc/sysctl.conf << EOF
fs.aio-max-nr = 1048576
fs.file-max = 681574400
kernel.sem = 250 32000 100 200
net.ipv4.ip_local_port_range = 9000 65000
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048586
EOF
sysctl -p
mysql服务需要打开较多的文件数,默认用户只有1024,修改如下
cat >> /etc/security/limits.conf << EOF
- soft nproc 65536
- hard nproc 65536
- soft nofile 65536
- hard nofile 65536
EOF
2.5 防火墙配置
systemctl status firewalld
关闭防火墙或配置好也行
2.6 SELinux配置
cat /etc/selinux/config
cp /etc/selinux/config /etc/selinux/config.bak
sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
setenforce 0
3. PXC安装
一般系统默认捆绑了mariadb-libs,安装PXC会自动替换这个基本包:
Replaced:
mariadb-libs.x86_64 1:5.5.65-1.el7
3.1 在线安装
cat > /etc/yum.repos.d/percona_pxc.repo << EOF
[percona]
name=percona_repo
baseurl=https://mirrors.tuna.tsinghua.edu.cn/percona/release/\$releasever/RPMS/\$basearch
enabled=1
gpgcheck=0
EOF
yum install percona-xtradb-cluster
但是发现这样子无法找到8.0最新版本。
3.2 离线安装
https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-8.0.21/binary/redhat/7/
wget -c https://downloads.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-8.0.21/binary/redhat/7/x86_64/Percona-XtraDB-Cluster-8.0.21-r248-el7-x86_64-bundle.tar&
PXC的安装依赖于qpress和percona-xtrabackup,可在percona提供的仓库地址中获取相应的rpm包下载链接
https://repo.percona.com/release/7/RPMS/x86_64/
wget https://repo.percona.com/release/7/RPMS/x86_64/qpress-11-1.el7.x86_64.rpm
wget https://repo.percona.com/release/7/RPMS/x86_64/percona-xtrabackup-80-8.0.22-15.1.el7.x86_64.rpm
下载后在目录下直接执行安装:
yum localinstall *.rpm
Error: Package: percona-xtradb-cluster-server-8.0.21-12.1.el7.x86_64 (/percona-xtradb-cluster-server-8.0.21-12.1.el7.x86_64)
Requires: libev.so.4()(64bit)
Error: Package: percona-xtrabackup-80-8.0.22-15.1.el7.x86_64 (/percona-xtrabackup-80-8.0.22-15.1.el7.x86_64)
Requires: libev.so.4()(64bit)
可见缺少libev这个包,网搜找到这个包的位置如下:
https://pkgs.org/download/libev.so.4()(64bit)
继而找到具体的下载地址如下:
wget http://mirror.centos.org/centos/7/extras/x86_64/Packages/libev-4.15-7.el7.x86_64.rpm
下载后再次安装成功。
期间也安装了其他一些依赖包,因此需要事先配置好操作系统的yum安装源:
keyutils-libs-devel
krb5-devel
libcom_err-devel
libkadm5
libselinux-devel
libsepol-devel
libverto-devel
openssl-devel
pcre-devel
perl-DBD-MySQL
perl-Digest
perl-Digest-MD5
perl-Env
perl-Test-Harness
perl-Test-Simple
socat
zlib-devel
3.3 安装后查看版本、状态
[root@mysqldb1:0 /etc]# mysql --version
mysql Ver 8.0.21-12.1 for Linux on x86_64 (Percona XtraDB Cluster (GPL), Release rel12, Revision 4d973e2, WSREP version 26.4.3)
[root@mysqldb1:0 /etc]# systemctl status mysql
● mysql.service - Percona XtraDB Cluster
Loaded: loaded (/usr/lib/systemd/system/mysql.service; enabled; vendor preset: disabled)
Active: inactive (dead)
4. PXC配置
4.1 配置文件修改
/etc/my.cnf为主配置文件
注:早期的版本还有其他配置文件在/etc/percona-xtradb-cluster.conf.d目录,包括mysqld.cnf,mysqld_safe.cnf,wsrep.cnf等。
4.2 安装后默认的配置文件内容
[root@mysqldb1:0 /etc]# grep -Ev "^#|^$" /etc/my.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
binlog_expire_logs_seconds=604800
wsrep_provider=/usr/lib64/galera4/libgalera_smm.so
wsrep_cluster_address=gcomm://
binlog_format=ROW
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_cluster_name=pxc-cluster
wsrep_node_name=pxc-cluster-node-1
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
4.3 需配置项
PXC集群中MySQL实例的唯一ID,不能重复,且必须是数字
server-id=1
集群中所有节点的ip
wsrep_cluster_address=gcomm://133.95.34.245,133.95.34.246,133.95.34.250
当前节点的名称
wsrep_node_name=mysqldb1
同时可见,不同于早期的版本,没有配置本机的ip_address那个参数了,其实那个参数本来就多余的感觉
在Percona XtraDB Cluster 8.0中,默认情况下(通过变量)启用了加密复制通信pxc-encrypt-cluster-traffic。
设置流量加密设置。群集的每个节点必须使用相同的SSL证书。
需做如下设置,同时增加部分其他配置:
[client]
socket=/mysql/pxc/mysql.sock
[mysqld]
datadir=/mysql/pxc/data
socket=/mysql/pxc/mysql.sock
log-error=/mysql/pxc/mysqld.log
wsrep_provider_options="socket.ssl_key=server-key.pem;socket.ssl_cert=server-cert.pem;socket.ssl_ca=ca.pem"
lower_case_table_names=1
max_allowed_packet=200M
character-set-server=utf8
[sst]
encrypt=4
ssl-key=server-key.pem
ssl-ca=ca.pem
ssl-cert=server-cert.pem
4.4 修改后的配置文件
[root@node1:0 /mysql/soft]# grep -Ev "^#|^$" /etc/my.cnf
[client]
socket=/mysql/pxc/mysql.sock
[mysqld]
server-id=1
datadir=/mysql/pxc/data
socket=/mysql/pxc/mysql.sock
log-error=/mysql/pxc/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
binlog_expire_logs_seconds=604800
wsrep_provider=/usr/lib64/galera4/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.222.11,192.168.222.12
binlog_format=ROW
wsrep_slave_threads=8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_cluster_name=pxc-cluster
wsrep_node_name=node1
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_provider_options="socket.ssl_key=server-key.pem;socket.ssl_cert=server-cert.pem;socket.ssl_ca=ca.pem"
lower_case_table_names=1
max_allowed_packet=200M
character-set-server=utf8
[sst]
encrypt=4
ssl-key=server-key.pem
ssl-ca=ca.pem
ssl-cert=server-cert.pem
4.5 其他节点配置
scp /etc/my.cnf mysqldb2:/etc/my.cnf
scp /etc/my.cnf mysqldb3:/etc/my.cnf
SERVIER_ID=date +%S
sed -i "s/server-id=1/server-id=1"${SERVIER_ID}"/" /etc/my.cnf
sed -i 's/wsrep_node_name=mysqldb1/wsrep_node_name=mysqldb2/' /etc/my.cnf
SERVIER_ID=date +%S
sed -i "s/server-id=1/server-id=1"${SERVIER_ID}"/" /etc/my.cnf
sed -i 's/wsrep_node_name=mysqldb1/wsrep_node_name=mysqldb3/' /etc/my.cnf
4.6 启动集群
需要注意的是,需要对相关的路径正确赋权,否则会因为无法写日志或文件导致报错而无法启动:
mkdir -p /mysql/pxc;chown -R mysql.mysql /mysql/pxc
【首节点初次启动集群】首节点可以是任意节点,此处采用mysqldb1作为首节点,执行如下命令启动
[root@mysqldb1:0 ~]# systemctl start mysql@bootstrap.service
按照官方文档,需要第一时间修改密码
[root@mysqldb1:0 ~]# grep 'temporary password' /mysql/pxc/mysqld.log
2021-03-05T09:47:56.337100Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: #phaDuBk)4pl
mysql -u root -p
mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY 'passwd';
然后stop-start
systemctl stop mysql@bootstrap.service
此时由于还没有其他节点加入,还需如下方式启动:
systemctl start mysql@bootstrap.service
【首节点非初次启动集群】
systemctl start mysql
【其他节点启动】只需要正常启动MySQL服务即可,启动之后会根据wsrep.cnf文件中的配置自动加入集群中:
[root@mysqldb2:0 ~]# systemctl start mysql
4.7 节点2加入集群时报错
2021-03-06T11:02:37.208782Z 0 [ERROR] [MY-000000] [Galera] handshake with remote endpoint ssl://133.95.34.245:4567 failed: asio.ssl:67567754: 'invalid padding' ( 67567754: 'error:0407008A:rsa routines:RSA_padding_check_PKCS1_type_1:invalid padding')
This error is often caused by SSL issues. For more information, please see:
https://per.co.na/pxc/encrypt_cluster_traffic
按照提示的网址,认真研读下。
SSL加密的自动配置需要密钥和证书文件。MySQL会生成一个默认密钥和证书文件,并将它们放置在数据目录中。
重要的是,群集在所有节点上使用相同的SSL证书。
原来各个节点的pem文件必须一致才可以!
scp mysqldb1:/mysql/pxc/data/*.pem /mysql/pxc/data
包括了如下文件
ca-key.pem
ca.pem
client-cert.pem
client-key.pem
private_key.pem
public_key.pem
server-cert.pem
server-key.pem
4.8 节点3加入集群
同上,将节点1的SSL证书拷贝过来,即可启动成功。
4.9 禁用Percona Server开机自启动
systemctl disable mysql
之所以要禁用开机自启,是因为在PXC集群中,当一个节点宕机重启后,它会随机与一个PXC节点进行数据同步。如果该节点宕机时间过长,那么需要同步的数据量就会比较大。当发生大量数据同步时,PXC集群会限制其他的写入操作,直到数据全部同步成功。所以长时间宕机之后,正确的做法是不要马上启动节点,而是先从其他节点拷贝数据文件到该节点中,然后再进行启动。这样需要同步的数据就会少很多,不会引起长时间的限速。
5. PXC节点的上线与下线
5.1 PXC节点的安全下线姿势
节点是怎么启动的,就使用对应的命令去关闭即可
--首节点
启动首节点用的命令是:systemctl start mysql@bootstrap.service
则对应的关闭命令就是:systemctl stop mysql@bootstrap.service
--其他节点
启动其他节点的命令是:systemctl start mysql
则对应的关闭命令就是:systemctl stop mysql
5.2 如所有PXC节点都是安全下线的,则在启动集群时,需先启动最后下线的节点
初次启动集群,可以将任意一个节点作为首节点启动。
如是已启动过的集群,当该集群下线再上线时,需将最后下线的节点作为首节点来启动。
关于某个节点是否能作为首节点启动,可以通过查看 grastate.dat 文件得知:
cat grastate.dat
safe_to_bootstrap: 0
说明:safe_to_bootstrap的值为0时表示不能作为首节点启动,为1时表示可以作为首节点启动。
PXC集群中最后一个下线的节点就会将safe_to_bootstrap的值改为1,下次启动集群时就需要将该节点作为首节点启动。这是因为最后一个下线的节点数据是最新的。将其作为首节点启动,然后让其他节点与该节点进行数据同步,这样才能保证集群中的数据是最新的。否则,可能会导致集群中的数据是某个时间点之前的旧数据。
5.3 如PXC节点都是意外退出的,且不是在同一时间退出的
PXC集群中一半以上的节点因意外宕机而无法访问时,PXC集群就会停止运行。
但如果这些PXC节点是以安全下线的方式退出,则不会引发集群自动停止运行的问题,只会缩小集群的规模。
只有意外下线一半以上节点时集群才会自动停止,意外下线的情况包括:
宕机、挂起、关机、重启、断电、断网等,反正就是没有使用相应的停止命令安全下线节点都属于意外下线
只要PXC集群中的节点不是同时意外退出的,那么当集群还剩一个节点时,该节点就会自动将grastate.dat文件中的safe_to_bootstrap值改为1。所以在重启集群时,也是先启动最后一个退出的节点。
5.4 如PXC节点都是同时意外退出的,则需要修改grastate.dat文件
当集群中所有节点都是在同一时间因意外情况而退出,那么此时所有节点的safe_to_bootstrap都为0,因为没有一个节点来得及去修改safe_to_bootstrap的值。当所有节点的safe_to_bootstrap均为0时,PXC集群是无法启动的。
在这种情况下我们就只能手动选择一个节点,将safe_to_bootstrap修改为1,然后将该节点作为首节点进行启动:
vim grastate.dat
safe_to_bootstrap: 1
systemctl start mysql@bootstrap.service
接着再依次启动其他节点即可:
systemctl start mysql
5.5 如集群中还有可运行的节点,那么其他下线的节点只需要按普通节点上线即可
systemctl start mysql
文章评论