在Linux系统上搭建高可用的分布式数据库,核心是通过数据多副本同步和故障自动转移机制,保障数据库服务在单节点故障时仍能正常对外提供服务。本文以MySQL的Group Replication分布式方案配合Keepalived实现高可用为例,演示完整的配置流程。

环境准备
准备3台运行CentOS 7及以上版本的Linux服务器,配置如下:
- 节点1:192.168.0.101,作为分布式集群的主节点
- 节点2:192.168.0.102,作为分布式集群的从节点1
- 节点3:192.168.0.103,作为分布式集群的从节点2
- 所有节点安装MySQL 8.0及以上版本,关闭防火墙或开放3306、33061端口
配置MySQL Group Replication分布式集群
所有节点基础配置
修改每个节点的MySQL配置文件my.cnf,添加以下分布式相关配置:
[mysqld] # 基础配置 server_id=101 # 每个节点的server_id必须唯一,节点2设为102,节点3设为103 gtid_mode=ON enforce_gtid_consistency=ON # 分布式复制配置 plugin_load_add='group_replication.so' group_replication_group_name="aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa" # 所有节点组名一致 group_replication_start_on_boot=OFF group_replication_local_address="192.168.0.101:33061" # 节点2填192.168.0.102:33061,节点3同理 group_replication_group_seeds="192.168.0.101:33061,192.168.0.102:33061,192.168.0.103:33061" group_replication_single_primary_mode=ON # 单主模式,只有一个节点可写 group_replication_enforce_update_everywhere_checks=OFF
初始化集群主节点
在节点1登录MySQL,执行以下命令初始化分布式集群:
-- 创建用于复制的用户 CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; -- 关闭二进制日志后配置复制通道 SET SQL_LOG_BIN=0; CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='Repl@123456' FOR CHANNEL 'group_replication_recovery'; SET SQL_LOG_BIN=1; -- 启动Group Replication SET GLOBAL group_replication_bootstrap_group=ON; START GROUP_REPLICATION; SET GLOBAL group_replication_bootstrap_group=OFF;
添加从节点到集群
在节点2和节点3登录MySQL,执行以下命令加入集群:
-- 创建复制用户 CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl@123456'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; -- 配置复制通道 SET SQL_LOG_BIN=0; CHANGE REPLICATION SOURCE TO SOURCE_USER='repl', SOURCE_PASSWORD='Repl@123456' FOR CHANNEL 'group_replication_recovery'; SET SQL_LOG_BIN=1; -- 启动Group Replication加入集群 START GROUP_REPLICATION;
验证集群状态
在任意节点执行以下SQL查看集群成员状态:
SELECT MEMBER_HOST,MEMBER_ROLE,MEMBER_STATE FROM performance_schema.replication_group_members;
如果输出中三个节点的MEMBER_STATE都为ONLINE,说明分布式集群部署成功。
配置Keepalived实现高可用
Keepalived用于提供虚拟IP(VIP),当主节点故障时自动将VIP漂移到可用的从节点,实现服务无感知切换。
安装Keepalived
所有节点执行以下命令安装Keepalived:
yum install -y keepalived
配置Keepalived
修改节点1的Keepalived配置文件/etc/keepalived/keepalived.conf:
global_defs {
router_id mysql_ha_1
}
vrrp_instance VI_1 {
state MASTER
interface eth0 # 服务器网卡名称,根据实际修改
virtual_router_id 51
priority 100 # 主节点优先级最高
advert_int 1
authentication {
auth_type PASS
auth_pass 123456
}
virtual_ipaddress {
192.168.0.200 # 虚拟IP,所有节点配置一致
}
}
virtual_server 192.168.0.200 3306 {
delay_loop 6
lb_algo rr
lb_kind DR
persistence_timeout 50
protocol TCP
real_server 192.168.0.101 3306 {
weight 1
notify_down /etc/keepalived/mysql_check.sh # 检测到MySQL故障时执行的脚本
TCP_CHECK {
connect_timeout 3
nb_get_retry 3
delay_before_retry 3
}
}
}
节点2和节点3的配置文件只需修改router_id为mysql_ha_2、mysql_ha_3,state改为BACKUP,priority分别设为90、80,real_server地址对应各自的节点IP即可。
创建MySQL状态检测脚本
所有节点创建/etc/keepalived/mysql_check.sh脚本,内容如下:
#!/bin/bash
# 检测MySQL是否可用,不可用则停止Keepalived触发VIP漂移
mysql -uroot -p'Root@123456' -e "select 1;" > /dev/null 2>&1
if [ $? -ne 0 ];then
systemctl stop keepalived
fi
给脚本添加执行权限:
chmod +x /etc/keepalived/mysql_check.sh
启动Keepalived
所有节点启动Keepalived并设置开机自启:
systemctl start keepalived systemctl enable keepalived
高可用验证
执行以下操作验证高可用效果:
- 在节点1执行
ip addr命令,确认VIP 192.168.0.200已经绑定到节点1的网卡上 - 使用客户端连接VIP的3306端口,执行写入操作,确认数据可以正常写入
- 手动停止节点1的MySQL服务,等待几秒后再次执行
ip addr,确认VIP已经漂移到节点2 - 再次连接VIP执行查询操作,确认数据可以正常读取,说明故障自动切换成功
注意事项
- 分布式集群的所有节点时间必须同步,建议配置NTP服务
- MySQL的
group_replication_group_seeds需要包含所有集群节点的地址,新增节点时需同步更新该配置 - Keepalived的检测脚本需要根据实际MySQL的root密码修改,确保可以正常执行状态检测
- 生产环境建议将分布式集群的节点部署在不同的物理机或可用区,避免单点硬件故障
Linux分布式数据库高可用KeepalivedMySQL_Group_Replication修改时间:2026-07-12 00:33:17