当前位置: 首页 > article >正文

redis搭建一主一从+keepalived(虚拟IP)实现高可用

redis搭建一主一从+keepalived(虚拟IP)实现高可用

前提
有两台机器:如 10.50.3.141 10.50.3.142,虚拟ip如:10.50.3.170

安装redis(两台机器执行):

# 启用Remi仓库(CentOS 7)
sudo yum install -y https://rpms.remirepo.net/enterprise/remi-release-7.rpm

# 安装Redis 6.x
sudo yum --enablerepo=remi install redis -y

# 验证版本
redis-server --version

配置Redis主从
vim /etc/redis.conf
主节点的配置文件

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised no
pidfile /var/run/redis_6379.pid
loglevel notice
logfile /var/log/redis/redis.log
databases 16
save 60 100
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename dump.rdb
dir /var/lib/redis
# 从节点同步密码
masterauth 123456
slave-serve-stale-data no
slave-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
slave-priority 100
#配置正确的redis连接密码
requirepass 123456

appendonly yes
appendfilename "appendonly.aof"
appendfsync always
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

#这是虚拟IP
replicaof 10.50.3.170 6379

从节点的配置文件

bind 0.0.0.0
protected-mode yes
port 6379
tcp-backlog 511
timeout 0
tcp-keepalive 300
daemonize no
supervised systemd
pidfile "/var/run/redis_6379.pid"
loglevel notice
logfile "/var/log/redis/redis.log"
databases 16
save 60 100
stop-writes-on-bgsave-error yes
rdbcompression yes
rdbchecksum yes
dbfilename "dump.rdb"
dir "/var/lib/redis"
# 从节点同步密码
masterauth "123456"
replica-serve-stale-data yes
replica-read-only yes
repl-diskless-sync no
repl-diskless-sync-delay 5
repl-disable-tcp-nodelay no
replica-priority 100
#配置正确的redis连接密码
requirepass "123456"
slave-serve-stale-data no

appendonly yes
appendfilename "appendonly.aof"
appendfsync always
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

# Generated by CONFIG REWRITE
latency-tracking-info-percentiles 50 99 99.9
user default on sanitize-payload #ea2c0ed04d278df4c7b5f9de01217a0c8122313ecc7514483f3e4af9f702029a ~* &* +@all

重启Redis服务(两台服务器执行)

sudo systemctl restart redis
sudo systemctl enable redis

安装Keepalived(两台服务器执行)​

sudo yum install keepalived -y

配置Keepalived虚拟IP
主节点的配置文件
vim /etc/keepalived/keepalived.conf

global_defs {
    router_id REDIS_HA_MASTER     # 主节点标识(从节点改为REDIS_HA_SLAVE)
    vrrp_skip_check_adv_addr      # 允许忽略广播地址检查
    #vrrp_strict                  # 必须注释,否则VIP无法绑定
}

! ------------------- Redis健康检查配置 -------------------
vrrp_script chk_redis {
    script "/usr/local/bin/check_redis.sh"
    interval 2
    weight -20
    timeout 5
}

! ------------------- Redis虚拟IP实例 -------------------
vrrp_instance VI_REDIS {
    state MASTER                  # 从节点改为 BACKUP
    interface eth0                # 网卡名用ip addr确认(如ens192)
    virtual_router_id 88          # 主从必须相同(1-255,不与其它服务冲突)
    priority 100                  # 主节点100,从节点设为更低值(如90)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass RedisHA@123     # 主从密码需一致(建议修改)
    }
    virtual_ipaddress {
        10.50.3.170/24 dev eth0           # 虚拟IP(掩码按实际网络调整)
    }
    track_script {
        chk_redis
    }
    # 确保启用抢占模式(主节点恢复后自动夺回VIP)
    preempt delay 300
    notify_master "/usr/local/bin/master.sh"
    notify_backup "/usr/local/bin/backup.sh"
}

从节点的配置文件

global_defs {
    router_id REDIS_HA_SLAVE     # 主节点标识(从节点改为REDIS_HA_SLAVE)
    vrrp_skip_check_adv_addr      # 允许忽略广播地址检查
    #vrrp_strict                  # 必须注释,否则VIP无法绑定
}

! ------------------- Redis健康检查配置 -------------------
vrrp_script chk_redis {
    script "/usr/local/bin/check_redis.sh"
    interval 2
    weight 2
    timeout 5
}

! ------------------- Redis虚拟IP实例 -------------------
vrrp_instance VI_REDIS {
    state BACKUP                  # 从节点改为 BACKUP
    interface eth0                # 网卡名用ip addr确认(如ens192)
    virtual_router_id 88          # 主从必须相同(1-255,不与其它服务冲突)
    priority 90                   # 主节点100,从节点设为更低值(如90)
    advert_int 1
    authentication {
        auth_type PASS
        auth_pass RedisHA@123     # 主从密码需一致(建议修改)
    }
    virtual_ipaddress {
        10.50.3.170/24 dev eth0
    }
    track_script {
        chk_redis
    }
    # 确保启用抢占模式(主节点恢复后自动夺回VIP)
    preempt delay 300
    notify_master "/usr/local/bin/master.sh"
    notify_backup "/usr/local/bin/backup.sh"
}

配置健康检查及切换脚本
主节点
/usr/local/bin/check_redis.sh

REDIS_PASS="123456"
LOG_FILE="/var/log/redis_health.log"

# 检查Redis进程
if ! pgrep -x redis-server >/dev/null; then
    echo "$(date) - Redis进程不存在" >> $LOG_FILE
    exit 1
fi

# 检查服务响应(增加超时3秒)
if ! timeout 3 redis-cli -a "$REDIS_PASS" ping 2>/dev/null | grep -q PONG; then
    echo "$(date) - Redis服务无响应" >> $LOG_FILE
    exit 1
fi

echo "$(date) - 状态正常" >> $LOG_FILE
exit 0

/usr/local/bin/master.sh

#!/bin/bash
redis-cli -a 123456 replicaof no one

/usr/local/bin/backup.sh

#!/bin/bash
redis-cli -a 123456 replicaof 10.50.3.170 6379

从节点
/usr/local/bin/check_redis.sh

REDIS_PASS="123456"
LOG_FILE="/var/log/redis_health.log"

# 检查Redis进程
if ! pgrep -x redis-server >/dev/null; then
    echo "$(date) - Redis进程不存在" >> $LOG_FILE
    exit 1
fi

# 检查服务响应(增加超时3秒)
if ! timeout 3 redis-cli -a "$REDIS_PASS" ping 2>/dev/null | grep -q PONG; then
    echo "$(date) - Redis服务无响应" >> $LOG_FILE
    exit 1
fi

echo "$(date) - 状态正常" >> $LOG_FILE
exit 0

/usr/local/bin/master.sh

#!/bin/bash
# 提升为主节点时,强制所有其他节点成为本节点的从节点
redis-cli -a 123456 REPLICAOF NO ONE
# 更新其他节点的复制关系(假设节点列表已知)
for node in 10.50.3.141; do
    redis-cli -h $node -a 123456 REPLICAOF 10.50.3.170 6379
done

/usr/local/bin/backup.sh

#!/bin/bash
redis-cli -a 123456 replicaof 10.50.3.170 6379

启动Keepalived

sudo systemctl start keepalived
sudo systemctl enable keepalived

验证

redis-cli -a 123456 SET testkey "hello"
redis-cli -a 123456 GET testkey

主节点 systemctl stop redis
ip addr  看是否漂移到从节点,然后set get key来试下是否正常

http://www.kler.cn/a/596055.html

相关文章:

  • 用 pytorch 从零开始创建大语言模型(零):汇总
  • 【css酷炫效果】纯CSS实现悬浮弹性按钮
  • CSS-文本属性1
  • C# HTTP 文件上传、下载服务器
  • v-自定义权限指令与v-if互相影响导致报错Cannot read properties of null (reading ‘insertBefore‘)
  • dcat-admin已完成项目部署注意事项
  • 4(四) Jmeter自动化报表html生成
  • 人工智能在电子信息工程信号处理中的应用调研
  • 抖音用户视频批量下载工具开发全解析
  • Powershell WSL部署ubuntu22.04.5子系统
  • 【css酷炫效果】纯CSS实现动态云雾效果
  • Proteus 使用入门指南
  • 19.哈希表的实现
  • 和鲸科技受邀赴中国气象局气象干部培训学院湖南分院开展 DeepSeek 趋势下的人工智能技术应用专题培训
  • thread【QT】
  • window.postMessage使用
  • webpack使用详细步骤
  • 【Qt】Qt + Modbus 服务端学习笔记
  • 大腾智能受邀出席2025华为云城市峰会暨东莞市人工智能大模型中心开服活动
  • 快速查询手机是否处于联网状态?