PXC是Percona XtraDB Cluster的缩写,是 Percona 公司出品的免费MySQL集群产品。PXC的作用是通过mysql自带的Galera集群技术,将不同的mysql实例连接起来,实现多主集群。在PXC集群中每个mysql节点都是可读可写的,也就是主从概念中的主节点,不存在只读的节点。 Percona Server是MySQL的改进版本,使用 XtraDB 存储引擎,在功能和性能上较 MySQL 有着很显著的提升,如提升了在高负载情况下的 InnoDB 的性能,为 DBA 提供了一些非常有用的性能诊断工具,另外有更多的参数和命令来控制服务器行为。 PXC 是一套 MySQL 高可用集群解决方案,与传统的基于主从复制模式的集群架构相比 PXC 最突出特点就是解决了诟病已久的数据复制延迟问题,基本上可以达到实时同步。而且节点与节点之间,他们相互的关系是对等的。PXC 最关注的是数据的一致性,对待事物的行为时,要么在所有节点上执行,要么都不执行,它的实现机制决定了它对待一致性的行为非常严格,这也能非常完美的保证 MySQL 集群的数据一致性;
PXC特性和优点
A. 完全兼容 MySQL。 B. 同步复制,事务要么在所有节点提交或不提交。 C. 多主复制,可以在任意节点进行写操作。 D. 在从服务器上并行应用事件,真正意义上的并行复制。 E. 节点自动配置,数据一致性,不再是异步复制。 F. 故障切换:因为支持多点写入,所以在出现数据库故障时可以很容易的进行故障切换。 G. 自动节点克隆:在新增节点或停机维护时,增量数据或基础数据不需要人工手动备份提供,galera cluster会自动拉取在线节点数据,集群最终会变为一致;
PXC最大的优势:强一致性、无同步延迟
PXC的局限和劣势
复制只支持InnoDB 引擎,其他存储引擎的更改不复制
写入效率取决于节点中最慢的一台
PXC 常用端口
3306:数据库对外服务的端口号。
4444:请求SST的端口。
4567:组成员之间进行沟通的一个端口号
4568:用于传输IST。
名词解释: SST(State Snapshot Transfer): 全量传输 IST(Incremental state Transfer):增量传输
## 查找 mysql 数据库的 root 的临时密码 [root@Rocky8-1 ~]# grep 'temporary password' /var/log/mysqld.log 2023-07-14T03:27:22.398733Z 6 [Note] [MY-010454] [Server] A temporary password is generated for root@localhost: msobz!t#q18J
## 使用临时密码登录 MySQL [root@Rocky8-1 ~]# mysql -uroot -p'msobz!t#q18J'
## 更改 root 用户的密码 mysql> ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; Query OK, 0 rows affected (0.04 sec)
## 重新登录mysql [root@Rocky8-1 ~]# mysql -uroot -p'123456' mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 20 Server version: 8.0.32-24.2 Percona XtraDB Cluster (GPL), Release rel24, Revision 2119e75, WSREP version 26.1.4.3
Copyright (c) 2009-2023 Percona LLC and/or its affiliates Copyright (c) 2000, 2023, Oracle and/or its affiliates.
Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners.
Type 'help;' or '\h'forhelp. Type '\c' to clear the current input statement.
mysql>
## 关闭 MySQL 服务 [root@Rocky8-1 ~]# systemctl stop mysqld
# Binary log expiration period is 604800 seconds, which equals 7 days binlog_expire_logs_seconds=604800
######## wsrep ############### # Path to Galera library wsrep_provider=/usr/lib64/galera4/libgalera_smm.so
# Cluster connection URL contains IPs of nodes #If no IP is found, this implies that a new cluster needs to be created, #in order to do that you need to bootstrap this node wsrep_cluster_address=gcomm://10.0.0.11,10.0.0.12,10.0.0.13
# In order for Galera to work correctly binlog format should be ROW binlog_format=ROW
# Slave thread to use wsrep_slave_threads=8
wsrep_log_conflicts
# This changes how InnoDB autoincrement locks are managed and is a requirement for Galera innodb_autoinc_lock_mode=2
# Node IP address wsrep_node_address=10.0.0.11 # Cluster name wsrep_cluster_name=pxc-mysql
#If wsrep_node_name is not specified, then system hostname will be used wsrep_node_name=pxc-mysql-node-1
## 查看当前节点数量、状态 mysql> show status like 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 1 | +--------------------+-------+ 1 row inset (0.00 sec)
mysql> show status like 'wsrep_cluster_status'; +----------------------+---------+ | Variable_name | Value | +----------------------+---------+ | wsrep_cluster_status | Primary | +----------------------+---------+ 1 row inset (0.01 sec)
mysql> show status like 'wsrep_connected'; +-----------------+-------+ | Variable_name | Value | +-----------------+-------+ | wsrep_connected | ON | +-----------------+-------+ 1 row inset (0.00 sec)
添加其它节点
所有其他节点的数据和配置都会被第一个节点的数据覆盖
不要同时加入多个节点,避免数据或网络开销过大
1
[root@Rocky8-2 ~]# systemctl start mysqld
1
[root@Rocky8-3 ~]# systemctl start mysqld
查看集群状态
1 2 3 4 5 6 7 8
mysql> show status like 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 3 | +--------------------+-------+ 1 row inset (0.00 sec)
停止从节点
1 2 3 4 5 6 7 8 9 10
[root@Rocky8-3 ~]# systemctl stop mysqld
## 集群状态 mysql> show status like 'wsrep_cluster_size'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | wsrep_cluster_size | 2 | +--------------------+-------+ 1 row inset (0.00 sec)