关系型数据库MySQL(五):Galara高可用

数据库高可用

一、Galera 高可用理论基础

1.1 什么是高可用?

高可用(High Availability, HA)指系统能够持续提供服务的能力,目标是最小化停机时间。在数据库领域,高可用通常通过 冗余节点 和 故障自动转移 实现。

1.2 Galera Cluster 简介

Galera Cluster 是一个基于 MySQL 的 多主同步复制集群,具有以下特点:

  • 多主架构:所有节点均可读写。
  • 强一致性:通过组通信(Group Communication)实现事务同步。
  • 自动故障转移:节点故障时自动重新选举。
  • 无单点故障:所有节点地位平等。
1.3 复制模式对比
复制类型 同步方式 一致性保障 性能影响 适用场景
异步复制 主节点异步推送 弱 低 跨地域备份
半同步复制 主节点等待从节点 中等 中 金融交易
组复制(Galera) 事务组提交 强 中高 高并发多活业务

二、Galera 核心原理

2.1 组通信协议

Galera 使用 组通信系统(GCS) 实现节点间消息传递,常用协议包括:

  • gcomm:Galera 自带的轻量级通信层。
  • Corosync:成熟的集群通信框架。
2.2 事务认证复制

每个事务在提交前需经过集群认证:

  1. 节点 A 发起事务。
  2. 事务写入集(WriteSet)广播至所有节点。
  3. 节点投票是否允许提交。
  4. 多数节点同意后,事务在所有节点提交。
2.3 SST 与 IST
  • SST(State Snapshot Transfer):全量数据同步,用于新节点加入。
  • IST(Incremental State Transfer):增量同步,用于落后节点追数据。

三、OpenEuler 环境部署 Galera 集群

3.1 环境准备
  • 操作系统:OpenEuler 22.03 LTS

  • 节点规划 :

    • Node1: 192.168.1.101
    • Node2: 192.168.1.102
    • Node3: 192.168.1.103
  • 软件依赖 :

    bash 复制代码
    sudo dnf install mariadb-server-galera rsync socat
3.2 配置文件详解

编辑 /etc/my.cnf.d/galera.cnf:

ini 复制代码
[mysqld]
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
wsrep_on=ON
wsrep_provider=/usr/lib64/galera/libgalera_smm.so
wsrep_cluster_address=gcomm://192.168.1.101,192.168.1.102,192.168.1.103
wsrep_cluster_name=galera_cluster
wsrep_node_address=192.168.1.101  # 当前节点IP
wsrep_node_name=node1             # 节点名称
wsrep_sst_method=rsync            # 同步方法
3.3 启动集群
  1. 初始化第一个节点 :

    bash 复制代码
    sudo galera_new_cluster
    systemctl start mariadb
  2. 加入其他节点 :

    bash 复制代码
    systemctl start mariadb
3.4 验证集群状态
sql 复制代码
SHOW STATUS LIKE 'wsrep%';

关键指标:

  • wsrep_cluster_size:集群节点数(应为3)
  • wsrep_local_state_comment:状态("Synced"表示正常)

四、运维实战案例

4.1 节点故障恢复

场景:Node2 宕机后重新加入。

bash 复制代码
# 在 Node2 上
sudo systemctl restart mariadb

观察日志:

log 复制代码
[Note] WSREP: Member 2.0 (node2) requested state transfer from 'node1'
[Note] WSREP: IST receiver started.
4.2 数据一致性验证

测试步骤:

  1. 在 Node1 创建表:

    sql 复制代码
    CREATE TABLE test (id INT, name VARCHAR(20));
  2. 在 Node3 插入数据:

    sql 复制代码
    INSERT INTO test VALUES (1, 'Galera');
  3. 在 Node2 查询:

    sql 复制代码
    SELECT * FROM test; -- 应返回 (1, 'Galera')
4.3 脑裂(Split-Brain)处理

预防配置:

ini 复制代码
wsrep_provider_options="pc.wait_prim=ON; pc.ignore_sb=OFF"

手动恢复:

  1. 关闭所有节点:

    bash 复制代码
    systemctl stop mariadb
  2. 重新引导集群:

    bash 复制代码
    galera_new_cluster # 在主节点执行

五、性能调优与监控

5.1 参数优化
ini 复制代码
# 减少网络延迟影响
wsrep_slave_threads=8
innodb_flush_log_at_trx_commit=2

# 提升 SST 效率
wsrep_sst_method=mariabackup
wsrep_sst_auth="sst_user:password"
5.2 监控工
  • Prometheus + Grafana :

    yaml 复制代码
    # prometheus.yml
    scrape_configs:
      - job_name: 'galera'
        static_configs:
          - targets: ['192.168.1.101:9104', '192.168.1.102:9104']
  • 关键指标 :

    • wsrep_flow_control_paused(流控暂停时间)
    • wsrep_replicated(复制事务数)

六、常见问题排查

6.1 节点无法加入集群

错误日志:

log 复制代码
[ERROR] WSREP: Failed to read from: ssl://0.0.0.0:4567

解决方案:

  1. 检查防火墙:

    bash 复制代码
    sudo firewall-cmd --add-port=4567/tcp --permanent
  2. 验证 wsrep_cluster_address 配置是否一致。

6.2 SST 失败

错误信息:

log 复制代码
[ERROR] WSREP: Process completed with error: wsrep_sst_rsync ...

处理步骤:

  1. 确保 rsync 已安装。

  2. 检查目标节点磁盘空间:

    bash 复制代码
    df -h /var/lib/mysql

七、总结

Galera Cluster 为 MySQL 提供了 强一致性多活架构,适合高并发业务场景。在 OpenEuler 系统上需注意:

  • 依赖包兼容性(如 mariadb-server-galera)。
  • 防火墙策略(4567、4444端口)。
  • 定期监控 wsrep 状态指标。

运维口诀 :

配置一致是基础,网络畅通是关键;

监控指标日日看,脑裂预防记心间。


附录:常用命令速查

bash 复制代码
# 查看集群状态
mysql -e "SHOW STATUS LIKE 'wsrep_cluster_size';"

# 强制移除故障节点
SET GLOBAL wsrep_provider_options='pc.bootstrap=1';
相关推荐
FungLeo15 小时前
成为全栈·基础补充·数据库迁移与事务:数据结构怎样安全演进
mysql·postgresql·sqlite·数据一致性·数据库事务·数据库迁移·成为全栈
Zan20 小时前
SQLite + SQLx 实战:为什么已经发布的数据库迁移文件,绝对不能再修改?
数据库·后端·面试
这个DBA有点耶21 小时前
数据同步的三个工程底线:DDL同步、断点续传、一致性校验——开源CDC的边界与KFS的路径
数据库·dba·代码规范
aiks_yuan1 天前
MySQL GROUP BY 很慢怎么优化:加了索引反而从 1 秒变 7 秒,Using temporary 该不该消(MySQL 8.2 实测 400 万行)
mysql
SelectDB1 天前
列式存储为什么适合分析类负载?原理、限制与日志场景应用
数据库
数据库小学妹1 天前
MySQL大字段治理:行溢出机制、覆盖索引与拆表
数据库·mysql·性能优化
爱吃奥利奥_wen1 天前
SQL Server 基础语法详解:从建库建表到约束与增删改查
服务器·数据库·oracle
这个DBA有点耶1 天前
MySQL 8.0不可见索引:删索引怕出事,不删又拖慢写入——中间态怎么用?
数据库·mysql·代码规范
测试界的小码农1 天前
【图数据库实战进阶(01):从零认识 Neo4j,搭建第一个图数据库项目】
数据库·neo4j