文章目录
PXC介绍
Percona XtraDB Cluster(简称PXC)
- 是基于Galera的MySQL高可用集群解决方案
- Galera Cluster是Codership公司开发的一套免费开源的高可用方案
- PXC集群主要由两部分组成:Percona Server with XtraDB和Write Set Replication patches(同步、多主复制插件)
- 官网:http://galeracluster.com
PXC特点
- 数据强一致性、无同步延迟
- 没有主从切换操作,无需使用虚拟IP
- 支持InnoDB存储引擎
- 多线程复制
- 部署使用简单
- 支持节点自动加入,无需手动拷贝数据
- 新加入的节点开销大,需要复制完整的数据。采用sst传输开销太大
相应端口
端口 | 说明 |
---|---|
3306 | 数据库服务端口 |
4444 | SST端口 |
4567 | 集群通信端口 |
4568 | IST端口 |
IST | Incremental State Transfer 增量同步 |
SST | State Snapshot Transfer 全量同步 |
主机角色
三台服务器
主机名 | IP地址 | 角色 |
---|---|---|
pxc71 | 192.168.4.71 | 数据库服务器 |
pxc72 | 192.168.4.72 | 数据库服务器 |
pxc73 | 192.168.4.73 | 数据库服务器 |
配置主机名映射
PXC集群需要用主机名通信,所以需要添加本机hosts文件,进行主机名映射
三台服务器都要添加
vim /etc/hosts
192.168.4.71 pxc71
192.168.4.72 pxc72
192.168.4.73 pxc73
安装软件
实验环境 centos7.9 ,pxc5.7
做这个实验需要三个程序
软件 | 作用 |
---|---|
percona-xtrabackup | 在线热备程序 |
qpress | 递归压缩程序 |
Percona-XtraDB-Cluster-server-57-5.7.35-31.53.1.el7.x86_64.rpm | 集群服务程序 |
下载网址:
Percona-XtraDB-Cluster:https://www.percona.com/downloads/Percona-XtraDB-Cluster-57/LATEST/,本站下载:Percona-XtraDB-Cluster
percona-xtrabackup:https://www.percona.com/downloads/Percona-XtraBackup-2.4/LATEST/,本站下载:percona-xtrabackup
应该这三个软件有依赖关系,需要注意安装顺序
qpress:https://centos.pkgs.org/7/percona-x86_64/qpress-11-1.el7.x86_64.rpm.html,
三台主机都要进行安装
#192.168.4.71、192.168.4.72、192.1688.4.73
yum -y install libev #安装依赖
yum -y install percona-xtrabackup-24-2.4.24-1.el7.x86_64.rpm
yum -y install qpress-11-1.el7.x86_64.rpm #依赖包
tar -xvf Percona-XtraDB-Cluster-5.7.35-31.53-r611-el7-x86_64-bundle.tar
yum -y install Percona-XtraDB-Cluster-*.rpm
配置服务
- 相关配置文件
- /etc/percona-xtradb-cluster.conf.d #所在目录
- 配置文件说明
- mysqld.cnf #数据库服务运行参数配置文件
- mysqld_safe.cnf #Percona Server 5.7 配置文件
- wsrep.cnf #PXC集群配置文件
这里的提供数据库服务的软件是:Percona-XtraDB-Cluster-server
修改配置文件:
修改数据库服务运行参数配置文件
- mysqld.cnf(三台都要配置)
- 重要配置说明
- server-id=71 #server-id不允许重复
- datadir=/var/lib/mysql #数据库目录
- socket=/var/lib/mysql/mysql.sock #socker文件
- log-error=/var/log/mysqld.log #日志文件
- pid-file=/var/run/mysqld/mysqld.pid #进程pid
- log-bin #默认开启bin-log
- log_slave_updates #默认开启层级复制
- expire_logs_days=7 #默认保留日志7天
修改Percona Server 5.7 配置文件
- mysqld_safe.cnf
- 重要配置说明
- pid-file = /var/run/mysqld/mysqld.pid #pid文件位置及名称
- socket = /var/lib/mysql/mysql.sock #socket文件位置及名称
- 三台数据库服务器,使用默认配置即可
修改PXC集群配置文件
-
wsrep.cnf
-
重要配置说明
-
wsrep_cluster_address=gcomm:// #集群成员列表
-
wsrep_node_address=192.168.70.63 #本机IP地址
-
wsrep_cluster_name=pxc-cluster #集群名称,三台必须相同
-
wsrep_node_name=pxc-cluster-node-1 #本机主机名
-
wsrep_sst_auth=“sstuser:s3cretPass” #SST数据同步授权用户
-
#192.168.4.71
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=71 #修改server-id
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 #默认开启bin-log
log_slave_updates #默认开启层级复制
expire_logs_days=7 #默认保留日志7天
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.4.71 ,192.168.4.72 ,192.168.4.73 #在第八行左右添加集群成员列表
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.4.71 #添加本机IP
wsrep_cluster_name=pxccluster #集群名称,三台服务器的集群名称要相同
wsrep_node_name=pxc71 #与这个IP映射的主机名
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:123456" #做全量备份使用的用户和密码
#192.168.4.72
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=72 #修改server-id
datadir=/var/lib/mysql #数据库目录
socket=/var/lib/mysql/mysql.sock #socker文件
log-error=/var/log/mysqld.log #日志文件
pid-file=/var/run/mysqld/mysqld.pid #进程pid
log-bin #默认开启bin-log
log_slave_updates #默认开启层级复制
expire_logs_days=7 #默认保留日志7天
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73 #在第八行左右添加集群成员列表
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.4.72 #添加本机IP
wsrep_cluster_name=pxccluster #集群名称,三台服务器的集群名称要相同
wsrep_node_name=pxc72 #与这个IP映射的主机名
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:123456" #做全量备份使用的用户和密码
#192.168.4.73
vim /etc/percona-xtradb-cluster.conf.d/mysqld.cnf
[client]
socket=/var/lib/mysql/mysql.sock
[mysqld]
server-id=73 #修改server-id
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 #默认开启bin-log
log_slave_updates #默认开启层级复制
expire_logs_days=7 #默认保留日志7天
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
vim /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.4.71,192.168.4.72,192.168.4.73 #在第八行左右添加集群成员列表
binlog_format=ROW
default_storage_engine=InnoDB
wsrep_slave_threads= 8
wsrep_log_conflicts
innodb_autoinc_lock_mode=2
wsrep_node_address=192.168.4.73 #添加本机IP
wsrep_cluster_name=pxccluster #集群名称,三台服务器的集群名称要相同
wsrep_node_name=pxc73 #与这个IP映射的主机名
pxc_strict_mode=ENFORCING
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth="sstuser:123456" #做全量备份使用的用户和密码
启动服务
在一台服务器上执行即可(例:192.168.4.73)
- 启动集群服务
- 添加授权用户
systemctl start mysql@bootstrap.service #启动集群服务,进行数据初始化
grep pass /var/log/mysqld.log #查看数据库管理员初始登录密码
mysql -uroot -p'初始密码'
alter user root@'localhost' identified by "123456";
grant reload,lock tables,replication client,process on *.* to sstuser@"localhost" identified by "123456"; #添加授权用户,这个用户需要和配置文件一致
# reload 装载数据的权限
#lock tables 有锁表的权限
#replication client 查看服务状态的权限
#process 管理服务的权限
#也可以给all的权限
在其他2台服务器上执行
-
启动数据库服务
-
会自动同步71主机的授权用户急管理员root密码
#192.168.4.71\192.168.4.72
systemctl start mysql
ss -nultp | grep 3306
ss -nultp | grep 4567
mysql -uroot -p123456
select user,host from mysql.user;
在两台服务器上起不来的,请查看日志/var/log/mysqld.log
测试配置
查看集群信息(可在任意一台数据库服务器上执行)
- 执行SQL命令 show status like “%wsrep%”;
- 相关参数
- wsrep_incoming_addresses 192.168.4.73:3306,192.168.4.72:3306,192.168.4.71:3306 #成员列表
- wsrep_cluster_size 3 #集群服务器台数
- wsrep_cluster_status Primary #集群状态
- wsrep_ready ON #服务状态
- wsrep_connected ON #连接状态
测试集群功能
- 在任意一服务器上添加访问数据的授权用户,其余会自动同步
- 在客户端使用授权用户连接任意数据库服务器都可以存储数据,且可以查看到相同的数据
- 建表时,必须有主键字段
mysql -uroot -p123456
grant all on testdb.* to tom@"%" identified by "123456";
#在其余两台查看
mysql -uroot -p123456 -e "show grants for tom@'%'"
客户端测试
mysql -utom -p123456 -h192.168.4.72 #这里的IP是集群中的任意一个就行
create database testdb;
create table testdb.id(id int);
create table testdb.name(id int primary key auto_increment,name char(20) );
insert into testdb.id(id) values(10); #这条会报错,原因建表时没有主键
insert into testdb.name(name) values("jray");
insert into testdb.name(name) values("bob");
select * from testdb.name;
#这里会发现他的数据编号是2,且步长为3,这里是因为我们是第二台数据库服务器,且集群数量为3
在其他两台数据库查看数据是否同步成功
mysql -uroot -p123456 -e "select * from testdb.name"
测试高可用
测试故障自动恢复
- 任何1台数据库服务器宕机都不影响用户存取数据
- 服务器运行后自动同步宕机期间的数据
#192.168.4.71
#模拟宕机
systemctl stop mysql
systemctl status mysql
#在客户端连接71,进行测试
mysql -utom -p123456 -h192.168.4.71
#192.168.4.72,查看集群状态
mysql -uroot -p123456
show status like "%wsrep%";
#客户端连接集群其他机器,添加数据
mysql -utom -p123456 -h192.168.4.73
insert into testdb.name(name) values("mack");
insert into testdb.name(name) values("mack3");
select * from testdb.name;
这个时候我们可以看出71已经宕机了,然后在集群其他的机器写入数据,在恢复71查看数据
插入数据
恢复71的服务
systemctl start mysql
mysql -uroot -p123456
select * from testdb.name; ##查看数据是否同步成功
#查看集群状态
show status like "%wsrep%";
71宕机期间数据恢复正常,这一点比MHA好,MHA需要手动恢复
常见错误
failed to open gcomm backend connection: 110
gcs/src/gcs_core.cpp:gcs_core_open():209: Failed to open backend connection: -110 (Connection timed out)
解决方案
查看三台服务器的主机映射,是否正常,三台主机的hosts文件都要进行添加
查看三台主机的wsrep.cnf文件中的集群名称是否一致,一般这个问题就是由上面的配置错误引起的,去其他两台数据库服务器上,看默认路径下的MySQL是否初始化成功,如果成功初始化,请删除初始化文件,重启启动服务,重新初始化