一、PXC介绍


1.1 关于PXC

PXC(Percona XtraDB Cluster)是MySQL数据库的一种高可用集群策略,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性。

1.2 PXC的特性和优点

  • 完全兼容MySQL
  • 同步复制,事务要么在所有节点提交或者不提交
  • 多主复制,可以在任意节点进行写操作
  • 在从服务器上并行应用事件,真正意义上的并行复制
  • 节点自动配置,数据一致性,不再是异步复制
  • 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换
  • 自动节点克隆:在新增节点或者停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉去在线节点数据,集群最终会变为一致

1.3 PXC的局限和劣势

  • 复制只支持InnoDB引擎,其他存储引擎的更改不复制
  • 写入效率取决于节点中最慢的一台
  • 不能有效解决写缩放问题,所有的写操作都将发生在所有节点上
  • 每次新增节点都需要复制完整的数据库备份到新节点
  • 有多少个节点就有多少重复的数据
  • 不支持表级锁
  • query log日志不能存在表里面,必须存放在文件
  • 不支持在没有主键的表上DELETE操作,在没有主键的表上select limit也会在不同节点上返回不同的值
  • 由于集群是基于乐观的并发控制(optimistic concurrency control),事务冲突的情况可能会在commit阶段发生,当多个节点修改同时同一行数据,只有其中一个节点能够成功,失败的节点将终止,并且返回死锁
  • 不支持XA事务,因为XA事务有可能在commit的时候出现异常发生rollback
  • 如果DDL语句有问题,很可能会破坏整个集群,需要非常特殊的对待DDL语句

二、PXC5.7安装


官方文档

[Note] 确认服务器的以下端口开放,并且未被其他进程占用,PXC需要使用这些端口来进行节点间沟通。

- 3306
 - 4444
 - 4567
 - 4568
Ubuntu或基于Debian
如果已经安装了MySQL,apparmor配置文件可能会阻碍PXC节点间沟通
sudo apt-get remove apparmor

添加源
sudo apt-get update
sudo apt-get install -y wget gnupg2 lsb-release curl
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb
sudo apt-get update

从apt安装
sudo apt-get install percona-xtradb-cluster-57
CentOS或Red Hat

SELinux安全模块可以约束对PXC集群的数据访问。最好的解决方案是通过运行以下命令将模式从强制改为允许 setenforce 0

  • 从yum安装
sudo yum install Percona-XtraDB-Cluster-57

三、配置PXC


停止MySQL服务
sudo systemctl stop mysql

  

示例节点

Node

Host

IP

Node 1

pxc1

192.168.227.148

Node 2

pxc2

192.168.227.149

Node 3

pxc3

192.168.227.150

配置第一个节点
  • Ubuntu或Debian添加到 /etc/mysql/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib/libgalera_smm.so
wsrep_cluster_name=pxc-cluster # 所有节点保持一致

wsrep_cluster_address=gcomm://192.168.227.148,192.168.227.149,192.168.227.150 # 所有节点IP,所有节点保持一致

wsrep_node_name=pxc1 # 节点名称,唯一 
wsrep_node_address=192.168.227.148 # 当前节点IP

wsrep_sst_method=xtrabackup-v2  # PXC同步方式
wsrep_sst_auth=sstuser:iiecas # PXC同步账号
pxc_strict_mode=ENFORCING
binlog_format=ROW 

default_storage_engine=InnoDB 
innodb_autoinc_lock_mode=2
  • CentOS或Red Hat添加到 /etc/percona-xtradb-cluster.conf.d/wsrep.cnf
[mysqld]
wsrep_provider=/usr/lib64/galera3/libgalera_smm.so 
wsrep_cluster_name=pxc-cluster # 所有节点保持一致

wsrep_cluster_address=gcomm://192.168.227.148,192.168.227.149,192.168.227.150 # 所有节点IP,所有节点保持一致

wsrep_node_name=pxc1 # 节点名称,唯一 
wsrep_node_address=192.168.227.148 # 当前节点IP

wsrep_sst_method=xtrabackup-v2  # PXC同步方式
wsrep_sst_auth=sstuser:iiecas # PXC同步账号
pxc_strict_mode=ENFORCING
binlog_format=ROW 

default_storage_engine=InnoDB 
innodb_autoinc_lock_mode=2
配置剩余节点

剩余节点修改以下两项

wsrep_node_name=pxc2 # 节点名称,唯一
 wsrep_node_address=192.168.227.149 # 当前节点IP
启动第一个节点
Ubuntu或Debian
/etc/init.d/mysql bootstrap-pxc

CentOS或Red Hat
systemctl start mysql@bootstrap



创建PXC同步账户
CREATE USER 'sstuser'@'localhost' IDENTIFIED BY 'iiecas';
GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO
'sstuser'@'localhost';
FLUSH PRIVILEGES;

其他节点

正常启动mysql

service mysql start
查看PXC状态

可在mysql中通过执行以下命令查看PXC状态

mysql>show status like 'wsrep%';
+----------------------------------+--------------------------------------+
| Variable_name                    | Value                                |
+----------------------------------+--------------------------------------+
| wsrep_local_state_uuid           | 75f17970-465a-11eb-bd1e-83dedd47aa3a |
| wsrep_protocol_version           | 9                                    |
| wsrep_last_applied               | 0                                    |
| wsrep_last_committed             | 0                                    |
| wsrep_replicated                 | 0                                    |
| wsrep_replicated_bytes           | 0                                    |
| wsrep_repl_keys                  | 0                                    |
| wsrep_repl_keys_bytes            | 0                                    |
| wsrep_repl_data_bytes            | 0                                    |
| wsrep_repl_other_bytes           | 0                                    |
| wsrep_received                   | 2                                    |
| wsrep_received_bytes             | 144                                  |
| wsrep_local_commits              | 0                                    |
| wsrep_local_cert_failures        | 0                                    |
| wsrep_local_replays              | 0                                    |
| wsrep_local_send_queue           | 0                                    |
| wsrep_local_send_queue_max       | 1                                    |
| wsrep_local_send_queue_min       | 0                                    |
| wsrep_local_send_queue_avg       | 0.000000                             |
| wsrep_local_recv_queue           | 0                                    |
| wsrep_local_recv_queue_max       | 2                                    |
| wsrep_local_recv_queue_min       | 0                                    |
| wsrep_local_recv_queue_avg       | 0.500000                             |
| wsrep_local_cached_downto        | 0                                    |
| wsrep_flow_control_paused_ns     | 0                                    |
| wsrep_flow_control_paused        | 0.000000                             |
| wsrep_flow_control_sent          | 0                                    |
| wsrep_flow_control_recv          | 0                                    |
| wsrep_flow_control_interval      | [ 100, 100 ]                         |
| wsrep_flow_control_interval_low  | 100                                  |
| wsrep_flow_control_interval_high | 100                                  |
| wsrep_flow_control_status        | OFF                                  |
| wsrep_cert_deps_distance         | 0.000000                             |
| wsrep_apply_oooe                 | 0.000000                             |
| wsrep_apply_oool                 | 0.000000                             |
| wsrep_apply_window               | 0.000000                             |
| wsrep_commit_oooe                | 0.000000                             |
| wsrep_commit_oool                | 0.000000                             |
| wsrep_commit_window              | 0.000000                             |
| wsrep_local_state                | 4                                    |
| wsrep_local_state_comment        | Synced                               |
| wsrep_cert_index_size            | 0                                    |
| wsrep_cert_bucket_count          | 22                                   |
| wsrep_gcache_pool_size           | 1320                                 |
| wsrep_causal_reads               | 0                                    |
| wsrep_cert_interval              | 0.000000                             |
| wsrep_open_transactions          | 0                                    |
| wsrep_open_connections           | 0                                    |
| wsrep_ist_receive_status         |                                      |
| wsrep_ist_receive_seqno_start    | 0                                    |
| wsrep_ist_receive_seqno_current  | 0                                    |
| wsrep_ist_receive_seqno_end      | 0                                    |
| wsrep_incoming_addresses         | 192.168.227.148:3306                 |
| wsrep_cluster_weight             | 1                                    |
| wsrep_desync_count               | 0                                    |
| wsrep_evs_delayed                |                                      |
| wsrep_evs_evict_list             |                                      |
| wsrep_evs_repl_latency           | 0/0/0/0/0                            |
| wsrep_evs_state                  | OPERATIONAL                          |
| wsrep_gcomm_uuid                 | dc0142e3-465d-11eb-a10b-8a33e043e7a3 |
| wsrep_cluster_conf_id            | 1                                    |
| wsrep_cluster_size               | 1                                    |
| wsrep_cluster_state_uuid         | 75f17970-465a-11eb-bd1e-83dedd47aa3a |
| wsrep_cluster_status             | Primary                              |
| wsrep_connected                  | ON                                   |
| wsrep_local_bf_aborts            | 0                                    |
| wsrep_local_index                | 0                                    |
| wsrep_provider_name              | Galera                               |
| wsrep_provider_vendor            | Codership Oy <info@codership.com>    |
| wsrep_provider_version           | 3.45(ra60e019)                       |
| wsrep_ready                      | ON                                   |
+----------------------------------+--------------------------------------+

  


Note

实际使用中可搭配高可用代理服务和keepalived,若节点间网络连接不稳定可能出现脑裂情况。