mysql8.0使用PXC实现高可用

1. 核心特性

  • 多主复制(Multi-Master Replication)

    • 所有节点都是可读写的,数据可以在任意节点上写入,并实时同步到其他节点。

    • 避免了传统主从复制中单点写入的限制。

  • 同步复制(Synchronous Replication)

    • 数据在写入时会被同步到所有节点,确保数据一致性。

    • 适合对数据一致性要求高的场景。

  • 高可用性(High Availability)

    • 如果某个节点故障,其他节点可以继续提供服务,无需手动切换。

    • 自动故障检测和恢复。

  • 数据一致性(Data Consistency)

    • 使用 Galera 的认证机制,确保所有节点的数据一致。

    • 支持真正的 ACID 事务。

  • 线性扩展(Linear Scalability)

    • 可以通过增加节点来扩展读写能力。

    • 适合高并发、大数据量的场景。

  • 兼容 MySQL

    • 完全兼容 MySQL 协议和工具,可以无缝替换 MySQL。

    • 支持 MySQL 的应用程序和驱动程序。


2. 架构和工作原理

  • PXC 基于 Galera Cluster 技术,采用 Write-Set Replication (WSREP) 协议实现数据同步。

  • 当一个节点接收到写操作时,它会将写操作广播到其他节点。

  • 其他节点验证并应用这些写操作,确保所有节点的数据一致。

  • 事务只有在大多数节点确认后才会提交。


3. 适用场景

  • 高可用性需求:如金融、电商等对数据库可用性要求高的场景。

  • 多写需求:需要多个节点同时写入数据的场景。

  • 数据一致性要求高:如分布式系统中需要强一致性的场景。

  • MySQL 替代方案:需要更高性能和可靠性的 MySQL 替代方案。


4. 优缺点

优点
  • 高可用性和数据一致性。

  • 多主架构,支持多点写入。

  • 兼容 MySQL,易于迁移。

  • 自动故障恢复,减少运维成本。

缺点
  • 同步复制可能导致写性能下降,尤其是在网络延迟较高的情况下。

  • 集群规模较大时,节点间的通信开销会增加。

  • 需要较高的硬件和网络配置。


5. 与 MHA、MGR 的对比

  • PXC vs MHA(Master High Availability)

    • MHA 是主从架构,PXC 是多主架构。

    • MHA 需要手动或半自动故障切换,PXC 是自动故障切换。

  • PXC vs MGR(MySQL Group Replication)

    • MGR 是 MySQL 官方提供的集群方案,PXC 是基于 Galera 的第三方方案。

    • MGR 支持单主和多主模式,PXC 是多主模式。

    • PXC 的成熟度和社区支持较好,MGR 是 MySQL 官方推荐方案。


6. 安装与部署

配置主机清单:在3台机器上编辑 /etc/hosts文件

删除 MariaDB 程序包:

yum -y remove mari*

下载 PXC 安装包

安装配置教程可以参考这个官方文档哦

安装 PXC 里面集成了 Percona Server 数据库,所以不需要安装数据库。

yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release enable-only pxc-80 release
percona-release enable tools release
yum install percona-xtradb-cluster

初始化数据库

应为使用的是8.0版本,部分配置需要在初始化数据库前进行配置,如忽略表名大小写等

[root@CentOS7-1 ~]# vim /etc/my.cnf

...

[mysqld]

server-id=11 #每台mysql的id不能相同

datadir=/var/lib/mysql

socket=/var/lib/mysql/mysql.sock

log-error=/var/log/mysqld.log

pid-file=/var/run/mysqld/mysqld.pid

Binary log expiration period is 604800 seconds, which equals 7 days

binlog_expire_logs_seconds=604800 #二进制日志过期时间为604800秒,等于7天

注意:pxc2和pxc3只需要server-id设置为12和13即可。

然后我们启动 mysql,修改密码。(三台机器都要)

systemctl start mysqld

tmp_pass=$(awk '/temporary password/ {print $NF}' /var/log/mysqld.log)

mysql -uroot -p${tmp_pass}

mysql> alter user root@localhost identified by '123456';

Query OK, 0 rows affected (0.01 sec)

授权用户

mysql -uroot -p123456

mysql> CREATE USER 'admin'@'%' IDENTIFIED WITH mysql_native_password BY 'Abc_123456';

Query OK, 0 rows affected (0.00 sec)

mysql> GRANT all privileges ON *.* TO 'admin'@'%';

Query OK, 0 rows affected (0.00 sec)

创建集群

所有节点停止mysqld服务:

systemctl stop mysqld

配置文件

[root@pxc1 ~]# vim /etc/my.cnf

...

######## 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://192.168.121.111,192.168.121.112,192.168.121.113 # PXC集群的所有ip

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=192.168.150.111 # 当前节点的IP

Cluster name

wsrep_cluster_name=pxc-cluster # PXC集群的名称

#If wsrep_node_name is not specified, then system hostname will be used

wsrep_node_name=pxc1 # 当前节点的名称

#pxc_strict_mode allowed values: DISABLED,PERMISSIVE,ENFORCING,MASTER

pxc_strict_mode=ENFORCING

SST method

wsrep_sst_method=xtrabackup-v2 # 同步方法

引导服务mysql目录下的*.pem拷贝给其它服务器:

默认情况下,系统变量pxc_encrypt_cluster_traffic设置为ON,意味着所有集群流量都使用证书进行保护,所以要求所有节点使用相同的密钥和证书文件,systemctl start mysql启动初始话过程中生成默认密钥和证书文件,并将其放在datadir数据目录下,这就造成故障节点和其他节点密钥和证书文件不一致,因此需要将故障节点的*.pem全部删除,并将某一个正常节点数据目录下的 *.pem文件全部复制到故障节点。

  1. scp /var/lib/mysql/*.pem pxc2:/var/lib/mysql/

  2. scp /var/lib/mysql/*.pem pxc3:/var/lib/mysql/

启动集群:

第一个节点需要以引导模式启动

systemctl start mysql@bootstrap.service

第二和第三个节点上正常启动数据库服务

  1. chown -R mysql.mysql /var/lib/mysql/

  2. systemctl start mysql

查看集群信息

mysql> show status like 'wsrep%';

可通过视图performance_schema.pxc_cluster_view、dstat工具监控同步状态。

mysql> select * from performance_schema.pxc_cluster_view;

查看PXC集群状态信息

mysql> show status like 'wsrep_cluster%';

mysql> show status where Variable_name in ('wsrep_cluster_size','wsrep_cluster_status','wsrep_connected','wsrep_ready');

节点下线

PXC 集群允许动态下线节点,但需要注意的是节点的启动命令和关闭命令必须一致。以引导模式启动的第一个节点必须以引导模式来进行关闭:

systemctl stop mysql@bootstrap.service

其他节点则可以按照正常方式关闭:

systemctl stop mysql

相关推荐
ChinaRainbowSea10 小时前
1. Linux下 MySQL 的详细安装与使用
linux·数据库·sql·mysql·adb
_院长大人_1 天前
Docker Mysql 数据迁移
mysql·adb·docker
m0_748232641 天前
mysql的主从配置
android·mysql·adb
沙漠蓝色披头2 天前
通过wifi无线方式,通过adb命令连接手机,用来传输文件和安装app
adb·智能手机
rkmhr_sef2 天前
万字详解 MySQL MGR 高可用集群搭建
android·mysql·adb
数据与人2 天前
MySQL误删控制文件导致系统无法正常启动
数据库·mysql·adb
蚰蜒螟2 天前
深入解析 MySQL 8 C++ 源码:二级索引回表操作
c++·mysql·adb
雾里看山3 天前
【MySQL】 基本查询(下)
android·mysql·adb
李长渊哦4 天前
MySQL 索引失效处理:原因分析与优化实战
android·mysql·adb
浩哲Zhe4 天前
SQL复习
java·sql·adb