percona-xtradb-cluster(pxc)初步认识、部署及运维实践

一、PXC介绍

Percona XtraDB集群是一个完全开源的MySQL高可用性解决方案。 它将Percona服务器和Percona XtraBackup与Galera库集成,以实现同步多主复制。一个集群由节点组成,其中每个节点包含同一节点上同步的一组数据。 建议的配置至少有3个节点,但也可以有2个节点。 每个节点是一个常规的MySQL服务器实例(例如,Percona服务器)。 您可以将现有的MySQL服务器实例转换为节点,并使用此节点作为基础运行群集。 也可以从群集中分离任何节点,并将其用作常规MySQL服务器实例。

二、PXC特点及限制

2.1 特点

  • 多主架构:真正的多点读写的集群,在任何时候读写数据,都是最新的。
  • 同步复制:集群不同节点之间数据同步,没有延迟,在数据库挂掉之后,数据不会丢失。
  • 并发复制:从节点在APPLY数据时,支持并行执行,有更好的性能表现。
  • 故障切换:在出现数据库故障时,因为支持多点写入,切的非常容易。
  • 热插拔:在服务期间,如果数据库挂了,只要监控程序发现的够快,不可服务时间就会非常少。在节点故障期间,节点本身对集群的影响非常小。
  • 自动节点克隆:在新增节点,或者停机维护时,增量数据或者基础数据不需要人工手动备份提供,PXC会自动拉取在线节点数据,最终集群会变为一致。

以上几点,足以说明PXC是一个既稳健,又在数据一致性、完整性及高性能方面有出色表现的高可用解决方案。

2.2 缺点

  • 配置新节点的开销。 添加新节点时,必须从现有节点中的一个复制完整数据集。 如果是100GB,则复制100GB。
  • 这不能用作有效的写入缩放解决方案。 当您将写入流量运行到2个节点,而将所有流量运行到1个节点时,写入吞吐量可能会有所改善,但您不能期望太多。 所有写入仍然必须在所有节点上进行。
  • 重复的数据,3个节点就会有3个重复的数据。

2.3 使用限制

  • 复制只适用于InnoDB存储引擎。任何写入其他类型的表,包括系统(mysql.*)表复制。
  • 不支持的查询:
LOCK TABLES and UNLOCK TABLES is not supported in multi-master setups
– Lock functions, such as GET_LOCK(), RELEASE_LOCK(), and so on
  • 查询日志不能定向到表格。如果启用查询日志记录,则必须将日志转发到文件:log_output =file
  • 允许的最大事务大小由wsrep_max_ws_rows和wsrep_max_ws_size
    变量。 LOAD DATA INFILE处理将每隔10 000行提交一次。所以大transactions由于LOAD DATA将被拆分为一系列小型transactions。
  • 由于可能的提交回滚,XA事务不受支持。
  • 由于集群级乐观并发控制,事务发出COMMIT可能仍会中止阶段。
  • 整个集群的写入吞吐量受最弱节点的限制。如果一个节点变慢,则整个集群变慢。
  • 群集的最小建议大小是3个节点。第三个节点可以是一个arbitrator。
  • 不支持binlog_rows_query_log_events变量。
  • 在SST或XtraBackup中使用的备份锁可能会崩溃。

三、PXC原理介绍

PXC可以实现集群中数据的高度一致性,并且在每个节点上,生成的Binlog顺序都是一样的,这与Galera内部,实现的并发控制机制是分不开的。所有的上层到下层的同步、复制、执行、提交都是通过并发控制机制来管理的。这样才能保证上层的逻辑性,下层数据的完整性等。
这里写图片描述
当多个事务同时操作相同的数据资源时,这个资源在集群中是不受任何一个Session影响的,直到有一个Session对这个数据资源进行了成功的Commit操作,这时,其他的Session的所有操作实际上已经不可能成功了,当其他的事务尝试做Commit,会直接返回一个因为deadlock事务失败回滚的信息。
这与mysql默认的机制不同,在mysql innodb默认的情况下,当我们在其他事务中对某个id的数据进行update;此时我们发起一个事务对这个数据进行需要获得排它锁的操作,操作将会进行等待,直到超时失败或者现在持有排它锁的事务提交,当前事务将继续。

四、PXC安装部署过程简介

本文选择在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版本,官方使用手册上有如下说明:

  • ssl100: for all supported Debian and Ubuntu versions
  • ssl101: for supported Red Hat Enterprise Linux derivatives

节点信息:

node IP
node1 172.16.20.122
node2 172.16.20.123
node3 172.16.20.124

4.1安装准备

关闭防火墙:

systemctl stop firewalld.service

关闭selinux:

setenforce 0

安装pxc之前需安装percona xtrbackup和socat

4.1.1 percona xtrbackup安装

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
4.1.2 socat安装
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

4.2 安装

三个节点操作:

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 &

可以通过上述参数来查看当前集群节点数及状态,此时集群搭建完毕;
此时可以通过在其中一个节点创建库表,增删改数据,然后再其他节点查看数据是否同步一致来验证集群的正确性;略。

4.3 常见错误

初始化数据库时,提示如下错误:

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 <addr>' 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)能正常备份;

五、PXC主要参数说明及运维实践

  • wsrep_flow_control_paused
    这个变量标识当前节点落后于集群的程度,0.0-1.0,0.0为没有落后,1.0为flow control已经停止了。应该尽量保证这个变量值为0.0。 如果落后实在太厉害,则应该适当增加复制线程数wsrep_slave_threads,如果还没有改善,则应该从集群中删除最慢的节点。
  • wsrep_cert_deps_distance
    这个变量标识当前节点平均时间内并行执行的事务数,这个数据可以用来作为wsrep_slave_threads的参考,同时当并发量很高的时候,这个数值也会很大。srep_cert_deps_distance的值,与集群的稳定性息息相关。在当时的测试情况下,当该值超过1300,则集群崩溃的可能性非常大。
  • wsrep_flow_control_sent
    表示flow_control发出FC_PAUSE事件的次数,暂停的次数越多,表示接受到的请求频繁堵满slave队列,这种情况下不是队列长度不足,就是机器性能太差。(如果集群中多个机器都有 这个情况,则考虑调整slave队列长度的相关参数,如gcs.fc_limit等)
  • wsrep_local_recv_queue_avg
    这个参数表示本地节点平均的接收队列长度,如果这个参数不为0.0,则表示接收来的数据不能被及时应用(立即应用了则不会进入队列)。
  • wsrep_local_send_queue_avg
    这个参数表示本地节点发送数据的队列长度,如果这个参数不为0.0,则表示向外发送数据的速度比较慢,有堆积。
  • wsrep_slave_threads
    建议每个core启动4个复制线程,这个参数很大程度上受到I/O能力的影响,官方甚至在ThinkPad R51一个4200转硬盘、单核心的机器上设置32个线程,并且执行良好。 可以通过观察wsrep_cert_deps_distance这个状态变量来获得当前最佳的线程数,这个参数实际上表示单位时间平均多少个writesets能被执行掉。
  • wsrep_provider_options:gcs.fc_limi、gcs.fc_factor
    此变量用于复制流量控制。当从队列超过此限制时复制暂停或被取消。
  • wsrep_flow_control_paused_ns
    由于业务压力导致集群停止服务总共的时间(纳秒)
  • wsrep_flow_control_paused
    自从由于流量控制而暂停的最后状态查询以来的时间。
  • wsrep_flow_control_sent
    由于业务压力导致由本节点发送流量控制而暂停的次数
  • wsrep_flow_control_recv
    本节点接收到由于业务压力导致流量控制而暂停的次数

参考:Galera Cluster—MySQL新型的高并发集群架构
Percona XTRAdb CLUSERT 运维实践 from sohu 徐国强
Percona XtraDB Cluster Documentation Release 5.7.16-27.19

猜你喜欢

转载自blog.csdn.net/poxiaonie/article/details/78626411