PXC(Percona XtraDB Cluster)集群安装

Percona XtraDB Cluster 是 MySQL 高可用性和可扩展性的解决方案。Percona Server 是MySQL的改进版本,使用 XtraDB 存储引擎,在功能和性能上较 MySQL 有着很显著的提升,如提升了在高负载情况下的 InnoDB 的性能,Percona XtraDB Cluster 完全兼容 MySQL 和 Percona Server。

Percona XtraDB Cluster 提供的特性有:

  • 同步复制,事务要么在所有节点提交或不提交。
  • 多主复制,可以在任意节点进行写操作。
  • 在从服务器上并行应用事件,真正意义上的并行复制。
  • 节点自动配置。
  • 数据一致性,不再是异步复制。
  • 每个节点都包含完整的数据副本。
  • 无需集中管理。可以在任何时间点失去任何节点,但是集群将照常工作。
  • 应用程序的兼容性:无需更改应用程序。

PXC 同时也有缺点如下:

  • 加入新节点,开销大。需要复制完整的数据。
  • 不能有效的解决写缩放问题,所有的写操作都将发生在所有节点上。
  • 有多少个节点就有多少重复的数据。

PXC安装环境

操作系统: CentOS 6.x 64位 最小化安装

集群最小化要求3个 Node

IP 主机名 Node Name
192.168.122.11 db1.test.com db_01
192.168.122.12 db2.test.com db_02
192.168.122.13 db3.test.com db_03

在 DNS 里解析主机名,或者在 host 文件里加入下面的内容

192.168.122.11 db1.test.com
192.168.122.12 db2.test.com
192.168.122.13 db3.test.com

开放 iptables 端口限制

1
2
3
4
5
6
7
#注意只暴露给内网对应的设备
iptables -I INPUT -p tcp --dport 3306 -j ACCEPT
iptables -I INPUT -p tcp --dport 4444 -j ACCEPT
iptables -I INPUT -p tcp --dport 4567 -j ACCEPT

#记得保存
/etc/init.d/iptables save

关闭 selinux

1
2
setenforce 0
sed -i 's/SELINUX=.*/SELINUX=disabled/' /etc/selinux/config

PXC安装过程

在每个Node上执行下面的操作

1
2
3
4
5
6
7
8
9
10
11
#安装 epel 源
yum install http://mirrors.yun-idc.com/epel/6/i386/epel-release-6-8.noarch.rpm

#安装 percona 官方源
yum install http://www.percona.com/downloads/percona-release/redhat/0.1-3/percona-release-0.1-3.noarch.rpm

#这里是安装的5.6,如果要安装5.5把下面的56换成55即可
yum install Percona-XtraDB-Cluster-server-56

#mysql 加入自启动
chkconfig --level 3 mysql on

启动 db_01 的数据库并创建 sst 用户

1
2
3
4
5
/etc/init.d/mysql start

#创建 sst 用户,不能用下面的弱密码
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'password'; GRANT RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'sstuser'@'localhost';
FLUSH PRIVILEGES;

db_01 的 my.cnf 里加入以下配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
server-id = 1911
wsrep_provider=/usr/lib64/libgalera_smm.so
wsrep_cluster_address="gcomm://"
wsrep_sst_auth="sstuser:password"
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_name=Percona
wsrep_sst_method=xtrabackup-v2
wsrep_node_name=db_01
wsrep_slave_threads=4
binlog_format=ROW
log_slave_updates
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
default_storage_engine=InnoDB

重启 db_01 数据库

1
/etc/init.d/mysql restart

在其它 Node 的 my.cnf 加下面的配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#注意Server-id 应该每个机器不一样
server-id = 1911
wsrep_provider=/usr/lib64/libgalera_smm.so
#这里指定到db_01的主机名 db1.test.com
wsrep_cluster_address="gcomm://db1.test.com"
wsrep_sst_auth="sstuser:password"
wsrep_provider_options="gcache.size=2G"
wsrep_cluster_name=Percona
#指定SST方式,支持rsync(最快,需要锁表),mysqldump 和 xtrabackup
#从 5.5.33-23.7.6 起支持 xtrabackup-v2
#5.6 默认是 xtrabackup-v2 ,可以不配置这上选项,但不能配置为 xtrabackup
wsrep_sst_method=xtrabackup-v2
#节点的名称,每个机器要区别开来
wsrep_node_name=db_01
wsrep_slave_threads=4
binlog_format=ROW
log_slave_updates
innodb_locks_unsafe_for_binlog=1
innodb_autoinc_lock_mode=2
default_storage_engine=InnoDB

启动其它节点的数据库

1
/etc/init.d/mysql start

故障集

日志显示:

1
2
3
4
5
6
7
8
9
10
11
12
2015-11-06 16:53:32 2294 [Note] WSREP: (dbc8e586, 'tcp://0.0.0.0:4567') listening at tcp://0.0.0.0:4567
2015-11-06 16:53:32 2294 [Note] WSREP: (dbc8e586, 'tcp://0.0.0.0:4567') multicast: , ttl: 1
2015-11-06 16:53:32 2294 [Note] WSREP: EVS version 0
2015-11-06 16:53:32 2294 [Note] WSREP: gcomm: connecting to group 'Percona', peer 'db1.test.com:'
2015-11-06 16:53:32 2294 [ERROR] WSREP: Permission denied
2015-11-06 16:53:32 2294 [ERROR] WSREP: failed to open gcomm backend connection: 13: error while trying to listen 'tcp://0.0.0.0:4567?socket.non_blocking=1', asio error 'Permission denied': 13 (Permission denied) at gcomm/src/asio_tcp.cpp:listen():783
2015-11-06 16:53:32 2294 [ERROR] WSREP: gcs/src/gcs_core.cpp:gcs_core_open():206: Failed to open backend connection: -13 (Permission denied)
2015-11-06 16:53:32 2294 [ERROR] WSREP: gcs/src/gcs.cpp:gcs_open():1379: Failed to open channel 'Percona' at 'gcomm://db1.test.com': -13 (Permission denied)
2015-11-06 16:53:32 2294 [ERROR] WSREP: gcs connect failed: Permission denied
2015-11-06 16:53:32 2294 [ERROR] WSREP: wsrep::connect(gcomm://db1.test.com) failed: 7
2015-11-06 16:53:32 2294 [ERROR] Aborting
2015-11-06 16:53:32 2294 [Note] WSREP: Service disconnected.

解决方法:
关闭 selinux

日志显示:

1
2
3
4
5
6
7
8
9
10
11
12
2015-11-06 16:22:33 9716 [Note] WSREP: REPL Protocols: 7 (3, 2)
2015-11-06 16:22:33 9716 [Note] WSREP: Service thread queue flushed.
2015-11-06 16:22:33 9716 [Note] WSREP: Assign initial position for certification: 4, protocol version: 3
2015-11-06 16:22:33 9716 [Note] WSREP: Service thread queue flushed.
2015-11-06 16:22:33 9716 [Warning] WSREP: Failed to prepare for incremental state transfer: Local state UUID (00000000-0000-0000-0000-000000000000) does not match group state UUID (0055f119-8434-11e5-b4c5-52dd3f2636cd): 1 (Operation not permitted) at galera/src/replicator_str.cpp:prepare_for_IST():482. IST will be unavailable.
2015-11-06 16:22:33 9716 [Note] WSREP: Member 1.0 (db_02) requested state transfer from '*any*'. Selected 0.0 (db_01)(SYNCED) as donor.
2015-11-06 16:22:33 9716 [Note] WSREP: Shifting PRIMARY -> JOINER (TO: 4)
2015-11-06 16:22:33 9716 [Note] WSREP: Requesting state transfer: success, donor: 0
2015-11-06 16:22:35 9716 [Note] WSREP: 0.0 (db_01): State transfer to 1.0 (db_02) complete.
2015-11-06 16:22:35 9716 [Note] WSREP: Member 0.0 (db_01) synced with group.
WSREP_SST: [ERROR] xtrabackup process ended without creating '/var/lib/mysql//xtrabackup_galera_info' (20151106 16:22:35.663)
WSREP_SST: [INFO] Contents of datadir (20151106 16:22:35.664)

解决方法:
将my.cnf 里的配置 wsrep_sst_method=xtrabackup-v2

PXC局限性

  1. 目前的复制仅仅支持InnoDB存储引擎。任何写入其他引擎的表,包括mysql.*表将不会复制。但是DDL语句会被复制的,因此创建用户将会被复制,但是insert into mysql.user…将不会被复制的。
  2. DELETE操作不支持没有主键的表。没有主键的表在不同的节点顺序将不同,如果执行SELECT…LIMIT… 将出现不同的结果集。
  3. 在多主环境下LOCK/UNLOCK TABLES不支持。以及锁函数GET_LOCK(), RELEASE_LOCK()…
  4. 查询日志不能保存在表中。如果开启查询日志,只能保存到文件中。
  5. 允许最大的事务大小由wsrep_max_ws_rows和wsrep_max_ws_size定义。任何大型操作将被拒绝。如大型的LOAD DATA操作。
  6. 由于集群是乐观的并发控制,事务commit可能在该阶段中止。如果有两个事务向在集群中不同的节点向同一行写入并提交,失败的节点将中止。对于集群级别的中止,集群返回死锁错误代码(Error: 1213 SQLSTATE: 40001 (ER_LOCK_DEADLOCK)).
  7. XA事务不支持,由于在提交上可能回滚。
  8. 整个集群的写入吞吐量是由最弱的节点限制,如果有一个节点变得缓慢,那么整个集群将是缓慢的。为了稳定的高性能要求,所有的节点应使用统一的硬件。
  9. 集群节点建议最少3个。
  10. 如果DDL语句有问题将破坏集群。