欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 教育 > 培训 > redis搭建一主一从+keepalived(虚拟IP)实现高可用

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

2025/5/4 5:51:58 来源:https://blog.csdn.net/qq_36984017/article/details/146364195  浏览:    关键词: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 123456appendonly 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 noappendonly 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 2weight -20timeout 5
}! ------------------- Redis虚拟IP实例 -------------------
vrrp_instance VI_REDIS {state MASTER                  # 从节点改为 BACKUPinterface eth0                # 网卡名用ip addr确认(如ens192)virtual_router_id 88          # 主从必须相同(1-255,不与其它服务冲突)priority 100                  # 主节点100,从节点设为更低值(如90)advert_int 1authentication {auth_type PASSauth_pass RedisHA@123     # 主从密码需一致(建议修改)}virtual_ipaddress {10.50.3.170/24 dev eth0           # 虚拟IP(掩码按实际网络调整)}track_script {chk_redis}# 确保启用抢占模式(主节点恢复后自动夺回VIP)preempt delay 300notify_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 2weight 2timeout 5
}! ------------------- Redis虚拟IP实例 -------------------
vrrp_instance VI_REDIS {state BACKUP                  # 从节点改为 BACKUPinterface eth0                # 网卡名用ip addr确认(如ens192)virtual_router_id 88          # 主从必须相同(1-255,不与其它服务冲突)priority 90                   # 主节点100,从节点设为更低值(如90)advert_int 1authentication {auth_type PASSauth_pass RedisHA@123     # 主从密码需一致(建议修改)}virtual_ipaddress {10.50.3.170/24 dev eth0}track_script {chk_redis}# 确保启用抢占模式(主节点恢复后自动夺回VIP)preempt delay 300notify_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; thenecho "$(date) - Redis进程不存在" >> $LOG_FILEexit 1
fi# 检查服务响应(增加超时3秒)
if ! timeout 3 redis-cli -a "$REDIS_PASS" ping 2>/dev/null | grep -q PONG; thenecho "$(date) - Redis服务无响应" >> $LOG_FILEexit 1
fiecho "$(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; thenecho "$(date) - Redis进程不存在" >> $LOG_FILEexit 1
fi# 检查服务响应(增加超时3秒)
if ! timeout 3 redis-cli -a "$REDIS_PASS" ping 2>/dev/null | grep -q PONG; thenecho "$(date) - Redis服务无响应" >> $LOG_FILEexit 1
fiecho "$(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; doredis-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来试下是否正常

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词