MySQL双主Keepalived主备抢占配置手册

MySQL双主Keepalived主备抢占配置手册

  以下是为服务器(192.168.43.218 和 192.168.43.219)配置Keepalived高可用的完整手册,虚拟IP(VIP)为 192.168.43.222,并已按要求将虚拟路由器ID设置为 222。此配置能确保当一台MySQL服务器故障时,VIP自动漂移到另一台,实现高可用。

配置规划

组件

服务器 1 (Master-1)

服务器 2 (Master-2)

说明

真实IP

192.168.43.218

192.168.43.219

服务器的固定IP

虚拟IP (VIP)

192.168.43.222 (主)

192.168.43.222 (备)

对应用层提供服务的浮动IP

Keepalived角色

MASTER

BACKUP

初始状态

优先级 (priority)

150

100

MASTER优先级需高于BACKUP

虚拟路由器ID

222

222

关键修改点,确保全网唯一

网卡接口

需根据实际修改(如ens160、eth0)

需根据实际修改(如ens160、eth0)

使用ip a命令查看本机网卡名

安装Keepalived

在两台服务器上执行

# 安装Keepalived
yum install -y keepalived
#yum -y install keepalived ipvsadm mailx
systemctl enable keepalived
# 设置开机自启(暂不启动)
#systemctl enable keepalived
#groupadd -r keepalived_script
#useradd -r -g keepalived_script -s /sbin/nologin keepalived_script

 配置Keepalived  

主节点配置 (192.168.43.218)

编辑配置文件 /etc/keepalived/keepalived.conf,内容如下:


cat > /etc/keepalived/keepalived.conf << 'EOF'
# ================================================================
# db218 节点 keepalived 配置文件
# 角色:MASTER(初始写入节点)
# 虚拟 IP:192.168.43.222
# ================================================================


global_defs {
# 本机唯一标识,日志中便于定位
router_id mysql_218
# 启用性能优化选项
max_auto_priority


# 以 root 身份运行脚本,并启用脚本安全检查
script_user root
enable_script_security


# 跳过对通告地址的校验,加速切换
vrrp_skip_check_adv_addr
}


# ------------------------------------------------------------
# MySQL 健康检查脚本定义
# ------------------------------------------------------------
vrrp_script chk_mysql {
# 检查脚本路径
script "/etc/keepalived/check_mysql.sh"
interval 10 # 脚本执行间隔:给足MySQL启停时间
timeout 7 # 脚本超时时间:小于interval,预留3秒缓冲
weight -60 # 故障时降低60优先级,确保node2优先级更高
fall 2 # 连续2次失败判定为故障(减少误判)
rise 3 # 连续3次成功判定为恢复(确保稳定)
}


# 实例名字(自定义),同一对主备须同名,否则互相认不到。
vrrp_instance VI_1 {
state MASTER # 初始状态:BACKUP
interface ens160 # 绑定网卡,需与 ip a 看到的名称一致
virtual_router_id 222 # 主备必须相同,范围 1-255
priority 150 # 优先级,高于 BACKUP(100)
advert_int 2 # 心跳间隔 2 秒
#nopreempt # 非抢占式

# 优化ARP发送策略
garp_master_delay 5 # 成为主节点后延迟5秒发送ARP
garp_master_repeat 3 # 成为主节点后发送3次ARP


# 认证方式:简单密码(主备必须一致)
authentication {
auth_type PASS
auth_pass 8888
}


# 虚拟 IP/掩码及标签(label 方便 ip addr 查看)
virtual_ipaddress {
192.168.43.222/24 dev ens160 label ens160:1
}


# 使用单播代替组播,防止交换机禁组播,指向对端
unicast_src_ip 192.168.43.218 # 本地IP
unicast_peer {
192.168.43.219 # 对端IP
}


# 关联健康检查脚本
track_script {
chk_mysql weight 0 # weight 0:仅触发状态判定,不叠加权重
}
}
EOF

 

备节点配置 (192.168.43.219)

配置文件路径相同,内容如下(注意修改router_id和优先级):


cat > /etc/keepalived/keepalived.conf << 'EOF'
# ================================================================
# db219 节点 keepalived 配置文件
# 角色:BACKUP(初始只读节点)
# 虚拟 IP:192.168.43.222(故障时漂移到本机)
# ================================================================


global_defs {
# 本机唯一标识,日志中便于定位
router_id mysql_219
# 启用性能优化选项
max_auto_priority

# 以 root 身份运行脚本,并启用脚本安全检查
script_user root
enable_script_security


# 跳过对通告地址的校验,加速切换
vrrp_skip_check_adv_addr
}


# ------------------------------------------------------------
# MySQL 健康检查脚本定义
# ------------------------------------------------------------
vrrp_script chk_mysql {
# 检查脚本路径
script "/etc/keepalived/check_mysql.sh"
interval 10 # 脚本执行间隔:给足MySQL启停时间
timeout 7 # 脚本超时时间:小于interval,预留3秒缓冲
weight -60 # 故障时降低60优先级,确保node2优先级更高
fall 2 # 连续2次失败判定为故障(减少误判)
rise 3 # 连续3次成功判定为恢复(确保稳定)
}


# 实例名字(自定义),同一对主备须同名,否则互相认不到。
vrrp_instance VI_1 {
state BACKUP # 初始状态:BACKUP
interface ens160 # 绑定网卡,需与 ip a 看到的名称一致
virtual_router_id 222 # 主备必须相同,范围 1-255
priority 100 # 优先级低于 MASTER (150)
advert_int 2 # 心跳间隔 2 秒
#nopreempt # 非抢占式

# 优化ARP发送策略
garp_master_delay 5 # 成为主节点后延迟5秒发送ARP
garp_master_repeat 3 # 成为主节点后发送3次ARP


# 认证方式:简单密码(主备必须一致)
authentication {
auth_type PASS
auth_pass 8888
}

# 虚拟 IP/掩码及标签(label 方便 ip addr 查看)
virtual_ipaddress {
192.168.43.222/24 dev ens160 label ens160:1
}


# 使用单播代替组播,防止交换机禁组播,指向对端
unicast_src_ip 192.168.43.219 # 本地IP
unicast_peer {
192.168.43.218 # 对端IP
}

# 关联健康检查脚本
track_script {
chk_mysql weight 0 # weight 0:仅触发状态判定,不叠加权重
}
}
EOF

 

配置MySQL健康检查脚本(关键步骤)

为确保VIP仅在MySQL服务正常时切换,需创建健康检查脚本。在两台服务器上创建 /etc/keepalived/check_mysql.sh

# 创建专用账号
CREATE USER 'checkuser'@'localhost' IDENTIFIED BY 'xrvLovfnp$4%svbS';
GRANT USAGE ON *.* TO 'checkuser'@'localhost';
# 测试是否可以成功执行
mysql -hlocalhost -ucheckuser -p'xrvLovfnp$4%svbS' -e "select 1"
cat >/etc/keepalived/check_mysql.sh << 'EOF'
#!/bin/bash
# MySQL健康检查脚本:测试MySQL连接是否正常
MYSQL_CMD=$(which mysql)
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="checkuser"
CHECK_SQL="SELECT 1;"
if $MYSQL_CMD -h "$MYSQL_HOST" -P "$MYSQL_PORT" -u "$MYSQL_USER" -p'xrvLovfnp$4%svbS' -e "$CHECK_SQL" > /dev/null 2>&1; then
    exit 0  # MySQL正常,脚本返回0
else
    exit 1  # MySQL异常,脚本返回非0,触发优先级降低
fi
EOF

chmod 755 /etc/keepalived/check_mysql.sh

启动服务与验证

验证keepalived服务

# 主节点(218)启动
systemctl start keepalived

# 在备节点(219)启动
systemctl start keepalived

验证VIP绑定  

# 在主节点执行,应看到VIP绑定在网卡上
ip addr|grep 192
# 在备节点执行,不应看到VIP
ip addr|grep 192

检查服务状态 

systemctl status keepalived  # 查看服务是否活跃
tail -f /var/log/messages    # 监控Keepalived日志,确认无错误

故障转移测试 

模拟主节点故障-keepalived关闭

# 在主节点停止Keepalived:
systemctl stop keepalived

#观察备节点日志:应看到VIP漂移到备节点.
tail -f /var/log/messages,

在备节点执行,确认VIP已绑定。
ip addr|grep 192

恢复测试-keepalived开启

# 重启主节点的Keepalived:
systemctl start keepalived

# 由于主节点优先级更高,VIP应自动漂回(抢占模式)。
ip addr|grep 192

模拟主节点故障-mysqld关闭

# 在主节点查看
systemctl stop mysqld
systemctl status mysqld
ip addr|grep 192
tail -f /var/log/messages

# 在备节点查看
ip addr|grep 192
tail -f /var/log/messages

恢复测试-mysqld开启

# 在主节点查看
systemctl start mysqld
systemctl status mysqld
ip addr|grep 192
tail -f /var/log/messages

# 在备节点查看
ip addr|grep 192
tail -f /var/log/messages
# 快捷命令
systemctl status mysqld
systemctl status keepalived.service 

systemctl start mysqld
systemctl start keepalived.service

systemctl stop mysqld
systemctl stop keepalived.service 


systemctl restart mysqld
systemctl restart keepalived.service 

ip addr|grep 192

 

经多次测试,已经达到预期效果!

 

 
posted @ 2025-10-31 10:25  davie2020  阅读(7)  评论(0)    收藏  举报