MySQL高级讲座篇之:如何设计一个基于`Galera Cluster`的无单点故障集群?

各位观众老爷们,晚上好!我是你们今晚的MySQL讲师,咱们今天不聊源码八卦,专啃硬骨头,聊聊如何打造一个坚如磐石,刀枪不入,没了谁地球都照常转的MySQL Galera Cluster 集群。

先说清楚,今天讲的是“无单点故障”,不是绝对意义上的“永生不死”。 毕竟,理论上讲,太阳系毁灭了,集群也得跟着凉凉。 但在可接受的范围内,我们要让这个集群尽可能皮实,能扛住各种突发情况。

一、Galera Cluster 是个什么玩意儿?

Galera Cluster 简单来说,就是一个多主复制(Multi-Master Replication)的解决方案。 传统的MySQL主从复制,主挂了,就得手动切换,费时费力。 Galera不一样,每个节点都可以读写,数据实时同步,某个节点挂了,应用可以自动切换到其他节点,基本无感。

想象一下:你有三台服务器,分别叫 node1, node2, node3。 它们都安装了MySQL,并且组成了Galera Cluster。 你往node1里插入一条数据,这条数据会立刻同步到node2和node3。 如果node1突然宕机了,你的应用可以立刻连接到node2或者node3,继续愉快地工作,完全不用担心数据丢失。

二、设计理念:不仅仅是安装

很多人觉得Galera Cluster就是装几个MySQL,改几个配置那么简单。 图样图森破! 要想打造一个真正的无单点故障集群,需要从架构、硬件、网络、监控、备份、容灾等多个维度进行考虑。

1. 硬件选型:别省那点钱!

服务器配置越高越好? 不一定。 关键在于均衡。 CPU、内存、磁盘IO,都要匹配。 比如,CPU太弱,同步数据慢; 内存太小,扛不住高并发; 磁盘IO不行,写入速度慢。

  • CPU: 至少8核,主频越高越好。
  • 内存: 至少16GB,推荐32GB或更高。
  • 磁盘: SSD是王道! IOPS越高越好。 RAID10可以考虑,兼顾性能和冗余。

2. 网络:高速公路,畅通无阻

Galera Cluster 对网络要求非常高。 节点之间需要高速、低延迟的网络连接。

  • 带宽: 至少千兆,推荐万兆。
  • 延迟: 越低越好。 同机房最佳,跨机房延迟是噩梦。
  • 专用网络: 强烈建议使用专用网络,避免与其他业务争抢带宽。

3. 架构设计:三节点起步,多多益善?

  • 节点数量: 至少3个节点。 为什么? 2个节点会遇到“脑裂”问题,谁说了算? 3个节点可以投票,少数服从多数。 奇数个节点更好,可以避免平票。
  • 节点分布: 尽量分散在不同的物理机房或者可用区,避免单点故障。
  • 负载均衡: 使用HAProxy或者Keepalived等负载均衡器,将读写请求分发到不同的节点。

三、实战演练:手把手教你搭建

假设我们有三台服务器,IP地址分别是:

  • node1: 192.168.1.101
  • node2: 192.168.1.102
  • node3: 192.168.1.103

1. 安装MySQL (以CentOS 7为例)

# 安装MySQL Yum Repository
sudo yum install -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm

# 安装MySQL Server
sudo yum install -y mysql-community-server

2. 安装Galera Cluster

# 安装Galera Cluster
sudo yum install -y galera mariadb-wsrep-galera-server

3. 配置MySQL (所有节点)

修改 /etc/my.cnf.d/server.cnf 文件 (路径可能略有不同,取决于你的MySQL版本):

[mysqld]
binlog_format=ROW
default_storage_engine=InnoDB
innodb_autoinc_lock_mode=2
bind-address=0.0.0.0  # 允许所有IP连接,生产环境请限制IP
wsrep_on=ON
wsrep_cluster_name=galera_cluster  # 集群名称,所有节点必须一致
wsrep_cluster_address="gcomm://192.168.1.101,192.168.1.102,192.168.1.103"  # 集群节点IP地址
wsrep_node_address=@@SERVER_IP@@  # 当前节点IP地址,需要替换成实际IP
wsrep_node_name=@@SERVER_HOSTNAME@@  # 当前节点主机名,需要替换成实际主机名
wsrep_sst_method=rsync  # SST方法,建议使用rsync或者xtrabackup
wsrep_provider=/usr/lib64/galera/libgalera_smm.so  # Galera Provider路径
innodb_flush_log_at_trx_commit=1  # 确保数据一致性

注意:

  • @@SERVER_IP@@@@SERVER_HOSTNAME@@ 需要替换成实际的IP地址和主机名。
  • wsrep_sst_method 是State Snapshot Transfer的方法,用于新节点加入集群时的数据同步。 rsync 简单易用,但是速度较慢。 xtrabackup 速度快,但是需要安装Percona XtraBackup。
  • innodb_flush_log_at_trx_commit=1 确保数据一致性,但是会降低性能。 在对数据一致性要求不高的场景下,可以考虑设置为2,提高性能。

4. 启动集群 (只在一个节点上执行)

在第一个节点 (比如 node1) 上执行:

sudo systemctl stop mysql
sudo galera_new_cluster
sudo systemctl start mysql

5. 启动其他节点 (在其他节点上执行)

在其他节点 (比如 node2 和 node3) 上执行:

sudo systemctl start mysql

6. 验证集群状态

连接到任意一个节点,执行以下SQL语句:

SHOW STATUS LIKE 'wsrep%';

关注以下几个关键参数:

  • wsrep_cluster_size: 集群节点数量,应该等于3
  • wsrep_cluster_status: 集群状态,应该是 Primary
  • wsrep_ready: 节点状态,应该是 ON

四、高可用架构:负载均衡,自动切换

仅仅搭建一个Galera Cluster 还不够,还需要一个负载均衡器,将读写请求分发到不同的节点,并且在节点宕机时自动切换。

1. HAProxy

HAProxy是一个高性能的TCP/HTTP负载均衡器。 它可以监控后端节点的健康状态,并且自动将请求转发到健康的节点。

安装HAProxy (以CentOS 7为例)

sudo yum install -y haproxy

配置HAProxy

修改 /etc/haproxy/haproxy.cfg 文件:

frontend mysql_frontend
    bind *:3306  # 监听所有IP的3306端口
    mode tcp
    option tcplog
    default_backend mysql_backend

backend mysql_backend
    mode tcp
    balance roundrobin  # 轮询算法
    option tcp-check
    server node1 192.168.1.101:3306 check inter 2000 rise 2 fall 3  # 节点1
    server node2 192.168.1.102:3306 check inter 2000 rise 2 fall 3  # 节点2
    server node3 192.168.1.103:3306 check inter 2000 rise 2 fall 3  # 节点3

注意:

  • check inter 2000 rise 2 fall 3 表示每2秒检查一次节点健康状态,连续2次成功认为节点健康,连续3次失败认为节点宕机。
  • balance roundrobin 表示使用轮询算法分发请求。 也可以使用其他算法,比如 leastconn (最少连接数)。

启动HAProxy

sudo systemctl start haproxy
sudo systemctl enable haproxy

2. Keepalived

Keepalived是一个VRRP (Virtual Router Redundancy Protocol) 协议的实现。 它可以创建一个虚拟IP地址,并且在主节点宕机时自动切换到备节点。

安装Keepalived (在两台服务器上安装)

sudo yum install -y keepalived

配置Keepalived (Master节点)

修改 /etc/keepalived/keepalived.conf 文件:

! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy"   # cheaper than pidof
    interval 2                    # check every 2 seconds
    weight 2
}

vrrp_instance VI_1 {
    state MASTER
    interface eth0  # 网卡名称,需要替换成实际网卡名称
    virtual_router_id 51  # VRRP ID,Master和Backup必须一致
    priority 100  # 优先级,Master必须高于Backup
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100/24  # 虚拟IP地址
    }

    track_script {
        chk_haproxy
    }
}

配置Keepalived (Backup节点)

修改 /etc/keepalived/keepalived.conf 文件:

! Configuration File for keepalived

global_defs {
    router_id LVS_DEVEL
}

vrrp_script chk_haproxy {
    script "killall -0 haproxy"   # cheaper than pidof
    interval 2                    # check every 2 seconds
    weight 2
}

vrrp_instance VI_1 {
    state BACKUP
    interface eth0  # 网卡名称,需要替换成实际网卡名称
    virtual_router_id 51  # VRRP ID,Master和Backup必须一致
    priority 90  # 优先级,Backup必须低于Master
    advert_int 1

    authentication {
        auth_type PASS
        auth_pass 1111
    }

    virtual_ipaddress {
        192.168.1.100/24  # 虚拟IP地址
    }

    track_script {
        chk_haproxy
    }
}

注意:

  • interface eth0 需要替换成实际的网卡名称。
  • virtual_ipaddress 是虚拟IP地址,客户端连接时应该连接这个IP地址。
  • priority 优先级,Master必须高于Backup。
  • track_script 监控HAProxy的健康状态,如果HAProxy宕机,Keepalived会切换到Backup节点。

启动Keepalived

sudo systemctl start keepalived
sudo systemctl enable keepalived

五、监控与告警:防患于未然

没有监控的集群,就像没有眼睛的士兵,随时可能掉进坑里。 需要对集群的各个方面进行监控,并且设置告警,及时发现问题。

1. 监控指标

  • MySQL:
    • CPU 使用率
    • 内存使用率
    • 磁盘 IO
    • QPS (Queries Per Second)
    • TPS (Transactions Per Second)
    • 连接数
    • Galera Cluster 状态 (wsrep_cluster_size, wsrep_cluster_status, wsrep_ready)
  • HAProxy:
    • CPU 使用率
    • 内存使用率
    • 连接数
    • 后端节点健康状态
  • 服务器:
    • CPU 使用率
    • 内存使用率
    • 磁盘使用率
    • 网络流量

2. 监控工具

  • Prometheus + Grafana: 强大的监控和可视化工具。
  • Zabbix: 企业级的监控解决方案。
  • Nagios: 老牌的监控工具。

3. 告警方式

  • 邮件: 简单易用。
  • 短信: 紧急告警。
  • 电话: 最高级别的告警。

六、备份与恢复:数据是命根子

即使集群再坚固,也难免遇到意外。 定期备份数据,是保证数据安全的重要手段。

1. 备份策略

  • 全量备份: 定期进行全量备份,比如每周一次。
  • 增量备份: 每天进行增量备份,只备份自上次全量备份以来修改的数据。

2. 备份工具

  • mysqldump: MySQL自带的备份工具,简单易用。
  • Percona XtraBackup: 高性能的备份工具,支持在线备份。

3. 备份存储

  • 本地磁盘: 速度快,但是存在单点故障风险。
  • 远程存储: 安全性高,但是速度较慢。

七、容灾演练:模拟故障,检验成果

定期进行容灾演练,模拟各种故障场景,检验集群的容灾能力。

1. 模拟场景

  • 节点宕机: 模拟某个节点突然宕机。
  • 网络故障: 模拟节点之间的网络连接中断。
  • 磁盘故障: 模拟某个节点的磁盘损坏。

2. 演练步骤

  • 停止节点: 使用 systemctl stop mysql 停止某个节点。
  • 断开网络: 使用 iptables 模拟网络连接中断。
  • 模拟磁盘损坏: 使用 dd 命令向磁盘写入垃圾数据。

3. 观察结果

  • 应用是否正常运行?
  • 数据是否丢失?
  • 切换时间是否符合预期?

八、总结:无单点故障,任重道远

打造一个无单点故障的Galera Cluster集群,不是一蹴而就的事情,需要从架构、硬件、网络、监控、备份、容灾等多个维度进行考虑。 希望今天的讲座能帮助大家更好地理解Galera Cluster,并且能够应用到实际工作中。

记住,没有银弹! 只有不断学习,不断实践,才能打造一个真正坚如磐石的MySQL集群。

今天的讲座就到这里,谢谢大家! 散会! 别忘了点赞,关注,投币三连哦! (咳咳,串台了…)

发表回复

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