MySQL高级讲座篇之:高可用架构的探索:MGR与PXC的实现原理与集群选型。

各位观众老爷,大家好!我是今天的主讲人,江湖人称“数据库老司机”,今天咱们聊聊MySQL高可用架构的那些事儿,重点是MGR(MySQL Group Replication)和PXC(Percona XtraDB Cluster)。都是扛把子的选手,但特性、优缺点各异,选哪个,得根据你的实际情况。

咱们直接上干货!

一、高可用架构的必要性:别等到“宕机”才后悔

先问大家一个问题:你的数据值多少钱?你的业务中断一分钟,损失多少?

别跟我说不值钱,现在这个时代,数据就是金钱!单点故障的MySQL服务器就像一个随时可能爆炸的定时炸弹,别侥幸,炸一次,你就知道啥叫“欲哭无泪”了。

高可用架构,就是通过冗余和故障转移机制,保证数据库持续可用。即使一台服务器挂了,另一台也能顶上,业务照常运行,老板照常发工资(当然,如果老板也挂了,那就…)。

二、MGR:MySQL官方的“亲儿子”,强一致性的代表

MGR,MySQL Group Replication,是MySQL官方提供的基于Paxos协议的分布式一致性方案。简单来说,就是一群MySQL节点组成一个组,每个事务都要经过组内多数节点的同意才能提交。

  1. MGR的核心原理:Paxos协议的变种

    Paxos协议太复杂?没关系,记住核心思想:提案(Proposal)、接受(Accept)、提交(Commit)。

    • 提案:主节点(Primary,虽然MGR可以自动选主,但概念上还是有主节点)发起一个事务提案。
    • 接受:组内其他节点收到提案后,如果没问题(没有冲突),就接受这个提案。
    • 提交:当超过半数的节点接受了提案,主节点就提交这个事务。

    这就保证了数据在多个节点上的一致性。

  2. MGR的模式:单主模式(Single-Primary)和多主模式(Multi-Primary)

    • 单主模式:只有一个节点可以写数据,其他节点只读。优点是简单,避免写冲突;缺点是写性能受主节点限制。
    • 多主模式:所有节点都可以写数据。优点是写性能高;缺点是容易产生写冲突,需要冲突检测机制。

    一般情况下,推荐使用单主模式,除非你的应用场景对写性能要求极高,且能容忍一定的冲突风险。

  3. MGR的优点:

    • 强一致性:数据一致性是MGR最大的优势,保证了数据不会丢失或错乱。
    • 自动故障转移:主节点挂了,会自动选出新的主节点,无需人工干预。
    • MySQL官方支持:是MySQL官方提供的解决方案,兼容性好,文档齐全。
    • 易于管理:相比其他方案,MGR的配置和管理相对简单。
  4. MGR的缺点:

    • 性能开销:为了保证一致性,每个事务都需要经过多轮通信,性能会有一定损耗。
    • 对网络要求高:网络延迟会影响事务提交速度,对网络环境要求较高。
    • 脑裂问题:虽然MGR有内置的脑裂防护机制,但极端情况下仍可能发生脑裂,需要额外监控和处理。
  5. MGR的配置示例(基于MySQL 8.0):

    假设我们有三个节点:node1 (192.168.1.101),node2 (192.168.1.102),node3 (192.168.1.103)。

    • 通用配置(所有节点):

      # 编辑 MySQL 配置文件 (my.cnf 或 my.ini)
      [mysqld]
      server-id=1  # 每个节点的 server-id 必须唯一
      gtid_mode=ON
      enforce_gtid_consistency=ON
      log_slave_updates=ON
      binlog_checksum=NONE
      binlog_format=ROW
      transaction_write_set_extraction=XXHASH64
      loose-group_replication_group_name="aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee" # 所有节点必须相同
      loose-group_replication_start_on_boot=ON
      loose-group_replication_bootstrap_group=OFF # 只有第一个节点启动时需要设置为 ON
      loose-group_replication_local_address="192.168.1.101:33061" # 每个节点的地址和端口
      loose-group_replication_group_seeds="192.168.1.101:33061,192.168.1.102:33061,192.168.1.103:33061" # 所有节点地址和端口
      plugin_load_add = group_replication.so # 加载插件

      解释:

      • server-id:每个节点的唯一标识,必须不同。
      • gtid_mode=ON:开启 GTID (Global Transaction Identifier),用于全局事务标识。
      • enforce_gtid_consistency=ON:强制 GTID 一致性。
      • log_slave_updates=ON:从节点也要记录 binlog,用于数据同步。
      • binlog_format=ROW:使用 ROW 格式的 binlog,保证数据一致性。
      • transaction_write_set_extraction=XXHASH64:使用 XXHASH64 算法提取事务的 write set,用于冲突检测。
      • loose-group_replication_group_name:MGR 组的唯一标识,所有节点必须相同。
      • loose-group_replication_start_on_boot:开机自动启动 MGR。
      • loose-group_replication_group_seeds:MGR 组的成员列表,所有节点都要能访问到。
      • loose-group_replication_local_address:本节点的 MGR 地址和端口。
    • 初始化第一个节点 (node1):

      # 登录 MySQL
      mysql -u root -p
      
      # 设置 group_replication_bootstrap_group=ON
      SET GLOBAL group_replication_bootstrap_group=ON;
      
      # 启动 MGR
      START GROUP_REPLICATION;
      
      # 设置 group_replication_bootstrap_group=OFF
      SET GLOBAL group_replication_bootstrap_group=OFF;
      
      # 修改 root 密码 (重要!)
      ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword';
      ALTER USER 'root'@'%' IDENTIFIED BY 'YourNewPassword';
      

      解释:

      • SET GLOBAL group_replication_bootstrap_group=ON:只有第一个节点启动时需要设置,用于初始化 MGR 组。
      • START GROUP_REPLICATION:启动 MGR。
      • SET GLOBAL group_replication_bootstrap_group=OFF:初始化完成后,需要关闭这个选项。
    • 加入其他节点 (node2 和 node3):

      # 登录 MySQL
      mysql -u root -p
      
      # 启动 MGR
      START GROUP_REPLICATION;
      
      # 修改 root 密码 (重要!)
      ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword';
      ALTER USER 'root'@'%' IDENTIFIED BY 'YourNewPassword';

      解释:

      • 直接启动 MGR 即可,会自动加入现有组。
    • 验证 MGR 状态:

      # 登录任何一个节点
      mysql -u root -p
      
      # 查看 MGR 状态
      SELECT * FROM performance_schema.replication_group_members;
      
      # 查看 MGR 拓扑
      SELECT * FROM performance_schema.replication_group_member_stats;

      如果看到所有节点的状态都是 ONLINE,恭喜你,MGR 集群搭建成功!

三、PXC:Percona XtraDB Cluster,基于Galera的“开源明星”

PXC,Percona XtraDB Cluster,是Percona公司基于Galera Cluster技术开发的MySQL高可用解决方案。Galera Cluster是一个同步复制的集群方案,保证所有节点上的数据完全一致。

  1. PXC的核心原理:Galera Cluster的同步复制

    Galera Cluster采用同步复制,每个事务在提交之前,都会同步到所有节点。只有所有节点都成功写入,事务才能提交。

    • Write-Set复制:Galera Cluster复制的是事务的Write-Set,而不是整个binlog。Write-Set包含了事务修改的数据和元数据。
    • 认证(Certification):在提交事务之前,Galera Cluster会对Write-Set进行认证,检查是否存在冲突。如果存在冲突,事务将被回滚。
    • 流控(Flow Control):Galera Cluster使用流控机制来防止节点之间的数据差异过大。如果某个节点落后太多,会被暂停写入,直到追上其他节点。
  2. PXC的优点:

    • 真正的多主架构:所有节点都可以读写,没有主从之分。
    • 近乎同步复制:数据一致性非常高,延迟很低。
    • 自动节点加入:新节点加入集群时,会自动从现有节点复制数据。
    • 开源免费:PXC是开源的,可以免费使用。
  3. PXC的缺点:

    • 对网络要求极高:同步复制对网络延迟非常敏感,网络不稳定会导致性能下降。
    • 写冲突处理:虽然有冲突检测机制,但仍可能发生写冲突,需要应用层处理。
    • 事务大小限制:为了保证性能,Galera Cluster对事务大小有限制。
    • 复杂性较高:PXC的配置和管理相对复杂,需要一定的经验。
  4. PXC的配置示例(基于Percona XtraDB Cluster 8.0):

    假设我们有三个节点:node1 (192.168.1.101),node2 (192.168.1.102),node3 (192.168.1.103)。

    • 通用配置(所有节点):

      # 编辑 MySQL 配置文件 (my.cnf 或 my.ini)
      [mysqld]
      server-id=1 # 每个节点 server-id 必须唯一
      binlog_format=ROW
      default_storage_engine=InnoDB
      innodb_autoinc_lock_mode=2
      query_cache_size=0
      query_cache_type=0
      bind-address=0.0.0.0 # 监听所有地址
      
      # Galera 配置
      wsrep_on=ON
      wsrep_cluster_name="my_pxc_cluster" # 集群名称,所有节点必须相同
      wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103" # 集群节点地址
      wsrep_node_name="node1" # 节点名称,每个节点必须唯一
      wsrep_node_address="192.168.1.101" # 节点地址
      wsrep_provider=/usr/lib64/galera4/libgalera_smm.so # Galera 库文件路径
      wsrep_sst_method=xtrabackup-v2 # SST 方法,用于节点加入时的全量数据复制
      wsrep_sst_auth="sstuser:YourSSTPassword" # SST 用户名和密码

      解释:

      • server-id:每个节点的唯一标识,必须不同。
      • binlog_format=ROW:使用 ROW 格式的 binlog,保证数据一致性。
      • wsrep_on=ON:开启 Galera 集群。
      • wsrep_cluster_name:PXC 集群名称,所有节点必须相同。
      • wsrep_cluster_address:PXC 集群节点地址,用逗号分隔。
      • wsrep_node_name:节点名称,每个节点必须唯一。
      • wsrep_node_address:节点地址。
      • wsrep_provider:Galera 库文件路径,根据实际情况修改。
      • wsrep_sst_method:SST (State Snapshot Transfer) 方法,用于节点加入时的全量数据复制。
      • wsrep_sst_auth:SST 用户名和密码,用于数据复制的身份验证。
    • 创建 SST 用户:

      # 登录 MySQL
      mysql -u root -p
      
      # 创建 SST 用户
      CREATE USER 'sstuser'@'%' IDENTIFIED BY 'YourSSTPassword';
      GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'sstuser'@'%';
      GRANT SELECT ON performance_schema.* TO 'sstuser'@'%';
      FLUSH PRIVILEGES;
      
      # 修改 root 密码 (重要!)
      ALTER USER 'root'@'localhost' IDENTIFIED BY 'YourNewPassword';
      ALTER USER 'root'@'%' IDENTIFIED BY 'YourNewPassword';

      解释:

      • CREATE USER 'sstuser'@'%' IDENTIFIED BY 'YourSSTPassword':创建 SST 用户。
      • GRANT REPLICATION CLIENT, PROCESS ON *.* TO 'sstuser'@'%':授权 SST 用户复制权限。
      • GRANT SELECT ON performance_schema.* TO 'sstuser'@'%':授权 SST 用户访问 performance_schema。
    • 初始化第一个节点 (node1):

      # 停止 MySQL 服务
      systemctl stop mysql
      
      # 以安全模式启动 MySQL
      mysqld_safe --wsrep-new-cluster &
      
      # 等待几分钟,直到 MySQL 启动完成

      解释:

      • mysqld_safe --wsrep-new-cluster:以安全模式启动 MySQL,并初始化 PXC 集群。
    • 启动其他节点 (node2 和 node3):

      # 启动 MySQL 服务
      systemctl start mysql

      解释:

      • 直接启动 MySQL 服务,会自动加入现有集群。
    • 验证 PXC 状态:

      # 登录任何一个节点
      mysql -u root -p
      
      # 查看 PXC 状态
      SHOW STATUS LIKE 'wsrep%';

      关键指标:

      • wsrep_cluster_size:集群节点数量。
      • wsrep_cluster_status:集群状态,Primary 表示正常。
      • wsrep_ready:节点状态,ON 表示就绪。

      如果看到 wsrep_cluster_size 等于 3,wsrep_cluster_statusPrimarywsrep_readyON,恭喜你,PXC 集群搭建成功!

四、MGR vs PXC:如何选择?

特性 MGR PXC
一致性 强一致性 近乎同步复制
架构 单主/多主 多主
性能 相对较低 较高
网络要求 较高 极高
冲突处理 较少冲突,自动处理 可能发生写冲突,需要应用层处理
事务大小限制 无限制 有限制
复杂性 相对简单 较高
官方支持 MySQL官方提供 Percona公司提供
适用场景 对数据一致性要求极高,对性能要求不高 对性能要求高,对数据一致性要求较高

总结:

  • 选择MGR: 如果你的业务对数据一致性要求是“宁可慢,也要准”,且网络环境一般,那就选择MGR。比如:金融交易、支付系统等。
  • 选择PXC: 如果你的业务对性能要求很高,可以容忍一定的冲突风险,且网络环境非常好,那就选择PXC。比如:高并发的Web应用、游戏服务器等。

五、高可用架构的注意事项:别只顾着“搭积木”

  • 监控是关键:无论选择哪种架构,都需要完善的监控系统,实时监控集群状态、性能指标、错误日志等。
  • 备份与恢复:定期备份数据,并测试恢复流程,确保在灾难发生时可以快速恢复。
  • 容量规划:根据业务增长预测数据量和访问量,提前规划集群容量,避免出现瓶颈。
  • 版本升级:及时升级MySQL版本,获取最新的安全补丁和性能优化。
  • 安全加固:加强数据库的安全防护,防止未经授权的访问和攻击。

六、结语:高可用,永无止境

高可用架构不是一蹴而就的,需要不断学习、实践、优化。没有最好的方案,只有最适合你的方案。希望今天的讲座能帮助你更好地理解MGR和PXC,并为你的业务选择合适的高可用架构。

感谢各位的观看!下次再见!

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注