一、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,若节点间网络连接不稳定可能出现脑裂情况。