Percona XtraDB集群是一个完全开源的MySQL高可用性解决方案。 它将Percona服务器和Percona XtraBackup与Galera库集成,以实现同步多主复制。一个集群由节点组成,其中每个节点包含同一节点上同步的一组数据。 建议的配置至少有3个节点,但也可以有2个节点。 每个节点是一个常规的MySQL服务器实例(例如,Percona服务器)。 您可以将现有的MySQL服务器实例转换为节点,并使用此节点作为基础运行群集。 也可以从群集中分离任何节点,并将其用作常规MySQL服务器实例。
以上几点,足以说明PXC是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案。
– LOCK TABLES and UNLOCK TABLES is not supported in multi-master setups
– Lock functions, such as GET_LOCK(), RELEASE_LOCK(), and so on
PXC可以实现集群中数据的高度一致性,并且在每个节点上,生成的Binlog顺序都是一样的,这与Galera内部,实现的并发控制机制是分不开的。所有的上层到下层的同步、复制、执行、提交都是通过并发控制机制来管理的。这样才能保证上层的逻辑性,下层数据的完整性等。
当多个事务同时操作相同的数据资源时,这个资源在集群中是不受任何一个Session影响的,直到有一个Session对这个数据资源进行了成功的Commit操作,这时,其他的Session的所有操作实际上已经不可能成功了,当其他的事务尝试做Commit,会直接返回一个因为deadlock事务失败回滚的信息。
这与mysql默认的机制不同,在mysql innodb默认的情况下,当我们在其他事务中对某个id的数据进行update;此时我们发起一个事务对这个数据进行需要获得排它锁的操作,操作将会进行等待,直到超时失败或者现在持有排它锁的事务提交,当前事务将继续。
本文选择在CentOS7.0二进制安装Percona-XtraDB-Cluster-5.7.14版本,下载地址:
https://www.percona.com/downloads/Percona-XtraDB-Cluster-LATEST/Percona-XtraDB-Cluster-5.7.14-26.17/binary/tarball/Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101.tar.gz
切记选择ssl101版本,官方使用手册上有如下说明:
节点信息:
node | IP |
---|---|
node1 | 172.16.20.122 |
node2 | 172.16.20.123 |
node3 | 172.16.20.124 |
关闭防火墙:
systemctl stop firewalld.service
关闭selinux:
setenforce 0
安装pxc之前需安装percona xtrbackup和socat
Percona-XtraDB-Cluster-5.7.14要求xtrabackup版本最低为2.4.4
cd /usr/local/
wget https://www.percona.com/downloads/XtraBackup/Percona-XtraBackup-2.4.4/binary/tarball/percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
tar -zxvf percona-xtrabackup-2.4.4-Linux-x86_64.tar.gz
echo "export PATH= /usr/local/percona-xtrabackup-2.4.4-Linux-x86_64/bin:$PATH" >> /etc/profile
source /etc/profile
wget http://www.dest-unreach.org/socat/download/socat-1.7.3.2.tar.gz
tar -zxvf socat-1.7.3.2.tar.gz
cd socat-1.7.3.2
./configure --prefix=/usr/local/socat
make
make install
echo "export PATH=/usr/local/socat/bin:$PATH" >> /etc/profile
source /etc/profile
ln -s /usr/local/socat/bin/filan /usr/sbin/filan
ln -s /usr/local/socat/bin/procan /usr/sbin/procan
ln -s /usr/local/socat/bin/socat /usr/sbin/socat
三个节点操作:
tar -zxvf Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101.tar.gz
ln -s Percona-XtraDB-Cluster-5.7.14-rel8-26.17.1.Linux.x86_64.ssl101 pxc_mysql
groupadd mysql
useradd -M -g mysql -s /sbin/nologin/ -d /usr/local/mysql mysql
mkdir -p /usr/local/pxc_mysql/{data,logs,tmp}
mkdir -p /usr/local/pxc_mysql/logs/binlog
chown -R mysql:mysql /usr/local/pxc_mysql/data
chown -R mysql:mysql /usr/local/pxc_mysql/logs
chown -R mysql:mysql /usr/local/pxc_mysql/tmp
配置my.cnf
cp ./support-files/my-default.cnf my.cnf\
vim my.cnf
其中第一个节点:
wsrep_provider=/usr/local/pxc_mysql/lib/libgalera_smm.so #指定galera库离京
wsrep_cluster_name=pxc-nie #集群名称,所有节点必须一致
wsrep_cluster_address=gcomm://172.16.20.122,172.16.20.123,172.16.20.124 #指定在集群中的各节点的ip
wsrep_node_name=pxc_122 #指定本节点在集群中唯一标识的节点名
wsrep_node_address=172.16.20.122 #本节点地址
wsrep_sst_method=xtrabackup-v2 #SST方式,默认是xtrabackup-v2,也是5.7唯一支持的方式
wsrep_sst_auth=pxc:213456 #SST时用到的用户名密码
pxc_strict_mode=ENFORCING #开启严格模式,也是默认行为
binlog_format=ROW #binlog格式
default_storage_engine=InnoDB #默认存储引擎
innodb_autoinc_lock_mode=2 #自增锁模式
除了wsrep_node_name和wsrep_node_address其余节点都保持一样:
第二个节点:
wsrep_node_name=pxc_123
wsrep_node_address=172.16.20.123
第三个节点:
wsrep_node_name=pxc_124
wsrep_node_address=172.16.20.124
初始化三个节点:
/usr/local/pxc_mysql/bin/mysql_install_db --defaults-file=/usr/local/pxc_mysql/my.cnf --datadir=/usr/local/pxc_mysql/data
启动第一个节点:
/usr/local/pxc_mysql/bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --wsrep-new-cluster --user=mysql &
其中–wsrep-new-cluster参数表示此节点为新集群的第一个节点,不加入任何其他集群
启动之后,查找配置的错误日志中查找root密码,然后登陆数据库查看数据库当前状态:
mysql> show status like 'wsrep_local_state%';
+---------------------------+--------------------------------------+
| Variable_name | Value |
+---------------------------+--------------------------------------+
| wsrep_local_state_uuid | a9033817-c9fa-11e7-a3ff-9fbeea6850e3 |
| wsrep_local_state | 4 |
| wsrep_local_state_comment | Synced |
+---------------------------+--------------------------------------+
3 rows in set (0.12 sec)
mysql> show status like 'wsrep_cluster_%';
+--------------------------+--------------------------------------+
| Variable_name | Value |
+--------------------------+--------------------------------------+
| wsrep_cluster_conf_id | 1 |
| wsrep_cluster_size | 1 |
| wsrep_cluster_state_uuid | a9033817-c9fa-11e7-a3ff-9fbeea6850e3 |
| wsrep_cluster_status | Primary |
+--------------------------+--------------------------------------+
4 rows in set (0.01 sec)
mysql> show status like 'wsrep_ready';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| wsrep_ready | ON |
+---------------+-------+
1 row in set (0.01 sec)
前面的输出显示集群大小为1个节点,状态为primary,节点处于Synced状态,它已完全连接,可以进行write-set replication。
在将其他节点添加到新群集之前,需要为SST创建一个用户并为其提供必要的权限(之前的wsrep_sst_auth参数)。
mysql> CREATE USER ’pxc’@’localhost’ IDENTIFIED BY '213456’;
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO ’pxc’@’localhost’;
mysql> FLUSH PRIVILEGES;
此时依次启动第二、三个节点:
/usr/local/pxc_mysql/bin/mysqld_safe --defaults-file=/usr/local/pxc_mysql/my.cnf --user=mysql &
可以通过上述参数来查看当前集群节点数及状态,此时集群搭建完毕;
此时可以通过在其中一个节点创建库表,增删改数据,然后再其他节点查看数据是否同步一致来验证集群的正确性;略。
初始化数据库时,提示如下错误:
2017-10-11T09:12:38.319245Z 0 [Warning] --bootstrap is deprecated. Please consider using --initialize instead
2017-10-11T09:12:38.381641Z 0 [ERROR] Can't read from messagefile '/usr/share/mysql/english/errmsg.sys'
解决办法:
chown mysql:mysql /usr/share/mysql/english/errmsg.sys
启动第二个节点时遇到的问题:
问题一:
[ERROR] WSREP: Failed to read 'ready ' from: wsrep_sst_xtrabackup-v2 --role 'joiner' --address '172.16.20.124' --datadir '/usr/local/pxc_mysql/data/' --defaults-file '/usr/local/pxc_mysql/my.cnf' --defaults-group-suffix '' --parent '9297' ''
Read: '(null)'
WSREP_SST: [ERROR] The xtrabackup version is 2.4.1. Needs xtrabackup-2.4.4 or higher to perform SST (20171115 17:34:46.864)
解决办法:
执行:getenforce 0,更新xtrabackup版本
问题二:
[ERROR] WSREP: failed to open gcomm backend connection: 110: failed to reach primary view: 110 (Connection timed out)
解决办法:修改配置文件中错误
wsrep_cluster_address=gcomm://172.16.20.122,172.16.20.123,172.16.20.124
问题三:
[ERROR] WSREP: gcs/src/gcs_group.cpp:gcs_group_handle_join_msg():746: Will never receive state. Need to abort.
解决:要加入的集群中xtrabackup没有添加到/usr/sbin/下
问题四:
WSREP_SST: [ERROR] xtrabackup_checkpoints missing, failed xtrabackup/SST on donor (20171116 13:31:43.802)
WSREP_SST: [ERROR] Cleanup after exit with status:2 (20171116 13:31:43.806)
2017-11-16T05:31:43.817117Z 0 [ERROR] WSREP: Process completed with error: wsrep_sst_xtrabackup-v2 --role 'joiner' --address '172.16.20.123' --datadir '/usr/local/pxc_mysql/data/' --defaults-file '/usr/local/pxc_mysql/my.cnf' --defaults-group-suffix '' --parent '32322' '' : 2 (No such file or directory)
2017-11-16T05:31:43.817183Z 0 [ERROR] WSREP: Failed to read uuid:seqno from joiner script.
2017-11-16T05:31:43.817202Z 0 [ERROR] WSREP: SST script aborted with error 2 (No such file or directory)
2017-11-16T05:31:43.817285Z 0 [ERROR] WSREP: SST failed: 2 (No such file or directory)
2017-11-16T05:31:43.817301Z 0 [ERROR] Aborting
问题解决:
primary node备份不成功,通过查找primary node节点的错误日志发现:
WSREP_SST: [ERROR] xtrabackup finished with error: 1. Check /usr/local/pxc_mysql/data//innobackup.backup.log (20171116 13:31:43.763)
WSREP_SST: [ERROR] Cleanup after exit with status:22 (20171116 13:31:43.766)
然后查找/usr/local/pxc_mysql/data//innobackup.backup.log发现:
171116 13:31:43 version_check Connecting to MySQL server with DSN 'dbi:mysql:;mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/usr/local/pxc_mysql/tmp/mysql.sock' as 'pxc' (using password: YES).
Failed to connect to MySQL server: DBI connect(';mysql_read_default_group=xtrabackup;port=3306;mysql_socket=/usr/local/pxc_mysql/tmp/mysql.sock','pxc',...) failed: Access denied for user 'pxc'@'localhost' (using password: YES) at - line 1314.
171116 13:31:43 Connecting to MySQL server host: localhost, user: pxc, password: set, port: 3306, socket: /usr/local/pxc_mysql/tmp/mysql.sock
Failed to connect to MySQL server: Access denied for user 'pxc'@'localhost' (using password: YES).
解决:正确配置wsrep_sst_auth=pxc:123456,使innoxtrabackupex使用此用户名密码具有足够的权限(process,reload,replication slave)能正常备份;
参考:Galera Cluster—MySQL新型的高并发集群架构
Percona XTRAdb CLUSERT 运维实践 from sohu 徐国强
Percona XtraDB Cluster Documentation Release 5.7.16-27.19