Redis 虽然提供了哨兵(Sentinel)模式实现高可用,但本方案需要通过 VIP(虚拟IP)漂移 来决定当前的主节点,即 VIP 漂移到哪台服务器,哪台服务器即对外提供主服务。因此本方案采用 Redis + Keepalived 的方式实现双机热备:通过 Keepalived 管理 VIP 的漂移,当主节点发生故障时,VIP 自动切换到备用节点,使其接管主服务,从而保证服务的高可用性。
此操作默认两台服务器中 redis 和keepalived 完成初始化安装
服务器A:192.168.239.170
服务器B:192.168.239.180
1、配置redis
- 报错recis.conf包含以下配置
shell
# 指定redis监听的IP地址(0.0.0.0表示监听所有网卡)
bind 0.0.0.0
# 指定redis监听端口(默认为6379,可不改)
port 16379
# 设置 Redis 访问密码
requirepass 123456
# 主从复制认证密码(即该节点为从节点时,需要复制的主节点的密码)
masterauth 123456
# 开启 AOF 持久化
appendonly yes
- 若服务器开启了防火墙,需对 redis 放行
shell
firewall-cmd --zone=public --add-port=16379/tcp --permanent
firewall-cmd --reload
-
两台服务器均按上述配置后,重启redis
systemctl restart redis
2、配置keepalived
- 备份原配置文件
shell
mv /etc/keepalived/keepalived.conf /etc/keepalived/keepalived.conf.bak
- 创建配置文件
shell
vi /etc/keepalived/keepalived.conf
- 插入如下基础配置
- 按照注释说明修改为自己需要的配置
- 此处主、备服务器的初始状态均设为 BACKUP,实际 MASTER 由 priority 决定
- 建议主服务器priority设为100,备服务器priority设为90
shell
# 定义一个 VRRP 实例
vrrp_instance VI_1 {
# 初始状态为 BACKUP
# 实际 MASTER 由 priority 决定
state BACKUP
# 绑定的网卡
interface ens33
# VRRP 路由ID
# 同一组高可用节点必须一致
virtual_router_id 51
# 节点优先级
# 数值越大越容易成为 MASTER
priority 100
# VRRP 心跳发送间隔(秒)
advert_int 1
# 不抢占模式
# MASTER 恢复后不会自动抢回 VIP
nopreempt
# VRRP 认证配置
authentication {
# 认证方式
auth_type PASS
# 认证密码
# 主备必须一致
auth_pass 1111
}
# 配置虚拟IP(VIP)
# MASTER 节点会绑定这个IP
virtual_ipaddress {
192.168.239.200
}
# 当节点变为 MASTER 时执行脚本
# 通常用于启动 lsyncd
notify_master "/etc/keepalived/master.sh"
# 当节点变为 BACKUP 时执行脚本
# 通常用于停止 lsyncd
notify_backup "/etc/keepalived/backup.sh"
# keepalived 服务停止时执行脚本
# 防止 lsyncd 残留运行
notify_stop "/etc/keepalived/backup.sh"
}
- 创建节点变为 MASTER 时执行脚本
shell
vi /etc/keepalived/master.conf
- 插入如下内容
shell
#!/bin/bash
redis-cli -p 16379 -a 123456 SLAVEOF NO ONE
- 创建节点变为 BACKUP 或 keepalived 服务停止时执行脚本
shell
vi /etc/keepalived/backup.conf
- 插入如下内容
shell
#!/bin/bash
redis-cli -p 16379 -a 123456 SLAVEOF 192.168.239.200 16379
- 赋予上述脚本执行权限
shell
chmod +x /etc/keepalived/*.sh
- 设置开机自启
shell
systemctl enable keepalived
- 启动keepalived
shell
systemctl start keepalived
- 若服务器开启了防火墙,需对vrrp放行
shell
firewall-cmd --permanent --add-protocol=vrrp
firewall-cmd --reload
- 在主、备服务器均按上述流程安装并启用keepalived
- 通过使用以下命令查看主服务器是否存在VIP
shell
ip addr

- 停止主服务器的keepalived服务后,VIP会飘移至备服务器,且主服务器的redis变为从节点,备服务器的redis变为主节点

3、测试用例
- 在取得VIP的服务器中进入redis-cli
shell
redis-cli -p 16379 -a 123456
- 查看当前 Redis 实例的主从复制状态信息
-
role:表示当前 Redis 的角色(master-主节点)
-
connected_slaves:当前主库连接的从库数量
-
slave0 / slave1:每个从节点的信息
info replication
-

- 在另一台服务器中进入redis-cli
shell
redis-cli -p 16379 -a 123456
- 查看当前 Redis 实例的主从复制状态信息
-
role:表示当前 Redis 的角色(slave-从节点)
-
master_host:主节点IP
-
master_port:主节点端口
-
master_link_status:主从连接状态
info replication
-

-
以上显示表示主从连接成功
-
在主节点存入测试数据
set ha_test ok

-
在从节点查看是否有同步
get ha_test

- 将存在VIP的服务器重启 keepalived 服务,模拟主节点故障后恢复
shell
systemctl restart keepalived
- 查看 Redis 实例的主从复制状态信息是否发生变更,即主节点变更为从节点,从节点变更为主节点

- 在新主节点中插入测试信息,看新从节点能否同步到数据,如果能同步,即表示配置成功

至此,redis+keepalived对主备双机文件热备配置完成