redis+keepalived实现双机热备

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对主备双机文件热备配置完成

相关推荐
真实的菜40 分钟前
【无标题】Redis 从入门到精通(七):缓存设计与最佳实践 —— 穿透、击穿、雪崩与一致性终极指南
数据库·redis·缓存
念何架构之路41 分钟前
存储技术Redis
数据库·redis·缓存
Trouvaille ~2 小时前
【Redis篇】Redis 主从复制:数据同步的原理与实现
数据库·redis·缓存·中间件·高可用·主从复制·后端开发
真实的菜2 小时前
Redis 从入门到精通(五):哨兵模式(Sentinel)—— 自动故障转移的完整原理与实战
数据库·redis·sentinel
是小王同学啊~2 小时前
Redis 面试通关笔记:高频八股 + 生产实战 + 追问链路(下)
redis·面试题
zfoo-framework3 小时前
通过redis-cli+lua脚本查询redis数据
数据库·redis·lua
岳读3 小时前
Redis Windows 7.2.3 使用教程解压启动与测试步骤
redis
我是大猴子5 小时前
Redis为什么不适合做持久化和DB的区别在哪里
数据库·redis·缓存
huipeng9265 小时前
企业级微服务开发实战(二):微服务基础设施搭建与中间件部署
java·redis·mysql·spring cloud·微服务·nacos·rabbitmq
可乐ea5 小时前
【知识获取与分享社区项目 | 项目日记第 24 天】终章总结:从认证、发布、计数、Feed、搜索到 RAG:完整复盘一个知识社区后端系统
java·spring boot·redis·mysql·elasticsearch·ai·kafka