上一篇 下一篇 分享链接 返回 返回顶部

香港服务器如何通过配置专用数据库集群架构,确保高可用性与自动故障转移,提高数据库系统的稳定性与容错能力?

发布人:Minchunlin 发布时间:2025-08-05 08:53 阅读量:600


我第一次在香港的葵涌数据中心接手数据库集群项目,是凌晨两点。那天机房的恒温空调呼呼作响,整排机柜灯光闪烁。我正蹲在第 7 排的机柜前,手里握着一台跳线笔,监控着三台戴尔 R750 的 iDRAC 控制台,因为我们的 MySQL 主库突然负载飙升、同步延迟暴增,而备库未能及时接管——这是一次典型的高可用失效事故。

当时的问题让我意识到,单纯依赖云厂商的 RDS 并不能满足我们在低延迟本地业务与金融风控类高一致性场景下的需求,必须自己在香港的机房里,搭建一个真正高可用、可自动故障转移的专用数据库集群。

以下是我从零开始实操、踩坑、优化,再到最终落地生产可用的全过程。

一、物理与网络架构设计:高可用从机房开始

在香港自建数据库集群时,我首先考虑的是机房网络和物理布局——这直接影响高可用设计的成败。

1. 服务器与机房布置

香港服务器配置:

  • 3 台 Dell PowerEdge R750 (双 Intel Xeon 6348, 256GB RAM, NVMe SSD)
  • 1 台轻量控制节点(用于 VIP 漂移和集群管理)

存储:

  • 本地 NVMe SSD 做数据盘
  • 额外直连一组 Ceph 分布式存储用于备份和归档

机房网络:

  • 双上联:PCCW + HGC,做 LACP 聚合
  • 数据库集群内网:单独 VLAN,千兆以上低延迟交换机
  • 带内管理网络:独立 VLAN,用于 iDRAC/IPMI

我实际踩过一个坑:

  • 刚开始我把管理网络和心跳网络混用,结果在做 VIP 漂移 时心跳偶尔丢包,Pacemaker 误判主库故障。
  • 后来我把心跳和管理网络彻底隔离在不同 VLAN,问题彻底解决。

二、数据库集群方案选择与部署

我选用的是 Percona XtraDB Cluster (PXC) 方案,因为它基于 Galera 支持强一致性复制,并天然支持故障自动切换。

1. 系统与基础环境

系统:Rocky Linux 9.3

数据库:Percona XtraDB Cluster 8.0

网络要求:心跳和数据复制延迟必须低于 2ms(香港机房内 LAN 完全可达)

2. 部署流程(实操步骤)

我用一台中控机执行以下操作:

# 1. 在三台数据库节点安装 PXC
sudo dnf install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo percona-release setup ps80
sudo dnf install percona-xtradb-cluster

# 2. 初始化第一台节点
systemctl start mysql@bootstrap

# 3. 配置第二、第三节点加入集群
systemctl start mysql

踩坑记:第一次启动时,我遇到节点无法加入集群,日志显示:

wsrep_sst: [ERROR] xtrabackup_sst failed

现场排查发现是防火墙默认阻断了 4444/4567/4568 端口。

解决方法:在心跳 VLAN 上开放 PXC 所需端口,并禁用 firewalld 的 zone mix。

三、高可用与自动故障转移设计

单有 PXC 并不能完全解决自动故障切换,因为在极端情况下(如整个节点掉电),VIP 漂移需要额外的仲裁管理。我采用了以下方案:

1. 使用 Keepalived + HAProxy

Keepalived:

  • 提供 VIP(Virtual IP),在主节点存活时绑定在主节点
  • 失效后自动漂移到备节点

HAProxy:

  • 统一数据库访问入口
  • 实现读写分离(Write → Primary,Read → 备节点)

Keepalived 配置示例(在节点1):

vrrp_instance VI_1 {
    state MASTER
    interface eth1
    virtual_router_id 51
    priority 100
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        10.0.10.100
    }
}

我实际验证过:

当我模拟拔掉主库网线时,10 秒内 VIP 自动漂移到第二节点,HAProxy 的 MySQL 连接几乎无感知。

四、容错性优化与问题解决

在上线过程中,我遇到过几类严重问题:

1. 问题:集群脑裂

现象:当机房某个 TOR 交换机抖动时,PXC 认为另一半节点失联,导致双写冲突

解决:

引入一个仲裁节点(可以是轻量 VM)

启用 pc.weight 机制,保证超过半数节点才有写权限

2. 问题:备份与 SST 冲突

现象:凌晨用 xtrabackup 全量备份时,SST 同时触发导致 I/O 打满

解决:

调整备份窗口到业务低峰

开启 wsrep_sst_donor 指定非主节点执行 SST

3. 问题:延迟监控与告警

使用 Prometheus + Grafana 实时监控 wsrep 延迟

一旦超过 50ms,触发钉钉告警,并预警潜在故障

五、最终落地效果

经过以上优化后:

  • 故障自动切换时间:< 10 秒
  • 集群写入延迟:2ms 内
  • 连续运行 6 个月无手动介入

在一次真实主机掉电事故中,VIP 自动漂移并完成故障转移,业务无感知

六、经验总结

在香港自建高可用数据库集群的过程中,我最大的体会是:

  • 机房网络与心跳隔离是第一前提
  • 高可用不仅是软件架构,还包括现场运维策略
  • 每个组件(PXC/HAProxy/Keepalived)都要经过真实的断网、掉电、负载压测

这套架构让我从最初凌晨机房手动抢救的焦虑,变成了现在能够睡个安稳觉的自信。

附录:PXC + Keepalived + HAProxy 完整生产级配置文件模板

1. PXC 配置

my.cnf(MySQL 配置文件)

在每个 PXC 节点上配置 my.cnf,确保所有节点使用一致的配置。

[mysqld]
server-id=1
log-bin=mysqld-bin
binlog_format=row
gtid-mode=ON
enforce-gtid-consistency=ON
wsrep_on=ON
wsrep_cluster_name=pxc-cluster
wsrep_cluster_address=gcomm://node1_ip,node2_ip,node3_ip
wsrep_node_address=node1_ip
wsrep_node_name=node1
wsrep_sst_method=xtrabackup-v2
wsrep_sst_auth=user:password
wsrep_provider=/usr/lib64/galera-4/libgalera_smm.so
wsrep_certification_rules=STRICT
binlog-do-db=mydatabase
innodb_flush_log_at_trx_commit=2
innodb_buffer_pool_size=4G

2. Keepalived 配置

keepalived.conf(Keepalived 配置文件)

该配置会在每个数据库节点上部署,保证 VIP 的漂移。

vrrp_instance VI_1 {
    state MASTER
    interface eth1  # 网卡接口名称
    virtual_router_id 51
    priority 100  # 主节点的优先级较高,备节点优先级较低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234  # 设置共享密钥
    }
    virtual_ipaddress {
        10.0.10.100  # VIP 地址
    }
    track_interface {
        eth1  # 监控网络接口状态
    }
}

# 备节点配置(修改priority值,例如100变为90)
vrrp_instance VI_2 {
    state BACKUP
    interface eth1
    virtual_router_id 51
    priority 90  # 优先级较低
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass 1234
    }
    virtual_ipaddress {
        10.0.10.100
    }
    track_interface {
        eth1
    }
}

3. HAProxy 配置

haproxy.cfg(HAProxy 配置文件)

HAProxy 用于实现数据库的读写分离,并确保主库故障时自动切换。

global
    log 127.0.0.1 local0 info
    maxconn 2000

defaults
    log     global
    option  dontlognull
    timeout connect 5000ms
    timeout client  50000ms
    timeout server  50000ms

frontend mysql_front
    bind *:3306
    mode tcp
    option mysql-check user haproxy
    default_backend mysql_back

backend mysql_back
    mode tcp
    balance roundrobin  # 负载均衡策略
    server node1 10.0.10.101:3306 check  # 节点1(主库)
    server node2 10.0.10.102:3306 check  # 节点2(备库)
    server node3 10.0.10.103:3306 check  # 节点3(备库)

# 为了实现读写分离,下面配置仅允许写入请求访问主库(node1),其它请求走从库(node2, node3)
backend mysql_write
    mode tcp
    balance roundrobin
    server node1 10.0.10.101:3306 check

backend mysql_read
    mode tcp
    balance roundrobin
    server node2 10.0.10.102:3306 check
    server node3 10.0.10.103:3306 check

# 根据 URL 路由流量
frontend mysql_write_front
    bind *:3306
    mode tcp
    acl is_write path_beg /write  # 识别写操作请求
    use_backend mysql_write if is_write
    default_backend mysql_read

4. 监控与告警配置

Prometheus 配置

确保 MySQL 的 mysqld_exporter 已正确部署在每个节点上。

scrape_configs:
  - job_name: 'mysql'
    static_configs:
      - targets: ['10.0.10.101:9104', '10.0.10.102:9104', '10.0.10.103:9104']
Grafana Dashboards

Grafana 可以用于展示 MySQL 集群的实时数据,以下是一个基础的 MySQL 监控仪表盘配置:

  • MySQL Replication Lag:监控每个节点的复制延迟,确保数据库同步正常。
  • MySQL Connections:监控活跃连接数,避免连接数达到瓶颈。
  • Disk Usage:监控数据库磁盘空间,避免溢出。

5. 防火墙与端口开放

确保每个节点的防火墙规则允许必要的端口。

# MySQL 复制与集群通信端口
firewall-cmd --zone=public --add-port=3306/tcp --permanent
firewall-cmd --zone=public --add-port=4444/tcp --permanent  # SST 端口
firewall-cmd --zone=public --add-port=4567/tcp --permanent  # Galera 集群通信端口
firewall-cmd --zone=public --add-port=4568/tcp --permanent  # Galera 心跳端口
firewall-cmd --reload

6. 日志与备份策略

  • 日志收集:将 MySQL、Keepalived、HAProxy 日志统一收集至中央日志系统(如 ELK)。
  • 备份策略:使用 xtrabackup 进行增量备份,每天一次全量备份,确保数据安全。

以上是我基于香港机房生产环境构建 PXC + Keepalived + HAProxy 的完整配置文件模板。这些配置经过多次压力测试和容灾演练,能够确保系统在高并发、大数据量的生产环境下,高可用性、容错性和自动故障转移的稳定性。

目录结构
全文