Redis 主从高可用集群搭建
环境信息
- vip:
- 两台服务器:
- 主:100.80.0.132
- 从:100.80.0.133
redis 部署
sudo apt update
sudo apt install redis-server -y
- 确保防火墙允许 Redis 端口(默认 6379):
sudo ufw allow 6379/tcp
sudo ufw enable
配置主服务器
bind 0.0.0.0
protected-mode yes
daemonize yes
# 设置认证密码
requirepass yourpassword
# 如果从库需要密码连接主库
masterauth yourpassword
appendonly yes
sudo systemctl restart redis-server
配置从服务器
bind 0.0.0.0
protected-mode yes
daemonize yes
# 设置认证密码
requirepass yourpassword
# 如果从库需要密码连接主库
masterauth yourpassword
appendonly yes
# 下面仅从服务配置,主服务器IP和端口
replicaof 100.80.0.132 6379
sudo systemctl restart redis-server
sudo systemctl enable redis-server
验证主从
$ redis-cli -a yourpassword
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=100.80.0.133,port=6379,state=online,offset=56,lag=1
master_failover_state:no-failover
master_replid:f7fc9997eea1a2a319c35deabf2a2e5c80e3efb2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:56
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:56
127.0.0.1:6379>
$ redis-cli -a yourpassword
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:100.80.0.132
master_port:6379
master_link_status:up
master_last_io_seconds_ago:9
master_sync_in_progress:0
slave_read_repl_offset:98
slave_repl_offset:98
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f7fc9997eea1a2a319c35deabf2a2e5c80e3efb2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:98
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:84
127.0.0.1:6379>
keepalived 部署
apt install keepalived -y
主节点配置
/etc/keepalived/keepalived.conf
,下面配置参考互联网
! Configuration File for keepalived
global_defs {
# 当前主机标识
router_id LVS_DEVEL
# 严格模式,一般不开启
# vrrp_strict
# 指定脚本执行用户
script_user root
enable_script_security
}
vrrp_script redis_check {
# 检查脚本,参数:[密码]
script "/usr/local/keepalived/redis_check.sh yourpassword"
# 检查时间间隔
interval 2
# 脚本执行结果导致的优先级变更
# 负数表示脚本退出状态非零时要减少的优先级
weight -20
# 重复执行的多少次才认为是成功或失败
rise 3
fall 3
}
vrrp_instance VI_1 {
# 初始状态
state MASTER
# 绑定的网卡
interface ens33
# 集群的统一标识
virtual_router_id 51
# 初始优先级
priority 100
# 心跳检查时间间隔,默认 1s
advert_int 1
# 认证配置
authentication {
# 认证模式:PASS
auth_type PASS
# 密码
auth_pass 1111
}
# 虚拟 IP
virtual_ipaddress {
100.80.0.131 dev ens33
}
# 状态检查脚本
track_script {
redis_check
}
# 当前节点变为 MASTER 时执行,参数:[密码]
notify_master "/usr/local/keepalived/redis_master.sh yourpassword"
# 当前节点变为 BACKUP 时执行,参数:[密码] [主节点 IP] [主节点端口]
notify_backup "/usr/local/keepalived/redis_slave.sh yourpassword 100.80.0.133 6379"
# 当发现节点故障时执行
notify_fault "/usr/local/keepalived/redis_falut.sh"
# 当停止 VRRP 时执行
notify_stop "/usr/local/keepalived/redis_stop.sh"
}
/usr/local/keepalived/redis_check.sh
#!/bin/bash
CMD_RES=`redis-cli -a $1 PING 2>/dev/null`
LOG_FILE="/var/log/redis-ha.log"
if [ "$CMD_RES"x == "PONG"x ]; then :
echo "[CHECK] `date`, SUCCESS" >> $LOG_FILE 2>&1
exit 0
else
echo "[CHECK] `date`, ERROR" >> $LOG_FILE 2>&1
exit 1
fi
/usr/local/keepalived/redis_master.sh
#!/bin/bash
CMD="redis-cli"
LOG_FILE="/var/log/redis-ha.log"
echo "[MASTER] `date`" >> $LOG_FILE
echo "Run REPLICAOF NO ONE cmd" >> $LOG_FILE
$CMD -a $1 REPLICAOF NO ONE >> $LOG_FILE 2>&1
/usr/local/keepalived/redis_slave.sh
#!/bin/bash
CMD="redis-cli"
LOG_FILE="/var/log/redis-ha.log"
echo "[BACKUP] `date`" >> $LOG_FILE
echo "Being slave wait to sync data" >> $LOG_FILE
sleep 1
echo "Run REPLICAOF cmd" >> $LOG_FILE
$CMD -a $1 REPLICAOF $2 $3 >> $LOG_FILE 2>&1
/usr/local/keepalived/redis_falut.sh
#!/bin/bash
LOG_FILE="/var/log/redis-ha.log"
echo "[FAULT] `date`" >> $LOG_FILE
/usr/local/keepalived/redis_stop.sh
#!/bin/bash
LOG_FILE="/var/log/redis-ha.log"
echo "[STOP] `date`" >> $LOG_FILE
chmod a+x -R /usr/local/keepalived/
systemctl start keepalived
systemctl enable keepalived
# 查看 ens33 上有 vip
$ ip -br a
ens33 UP 100.80.0.132/24 100.80.0.131/32 ...
从节点
配置同主节点
scp -r /etc/keepalived/keepalived.conf 100.80.0.135:/etc/keepalived
scp -r /usr/local/keepalived 100.80.0.133:/usr/local
修改如下配置:
vrrp_instance VI_1 {
state BACKUP
interface ens33
priority 90
...
notify_backup "/usr/local/keepalived/redis_slave.sh yourpassword 100.80.0.132 6379"
}
chmod a+x -R /usr/local/keepalived/
systemctl start keepalived
journalctl -u keepalived.service -f
切换
$ journalctl -u keepalived.service -f
Keepalived_vrrp[3163]: (VI_1) Entering BACKUP STATE (init)
Keepalived_vrrp[3163]: VRRP_Script(redis_check) succeeded
Keepalived_vrrp[3163]: (VI_1) Entering MASTER STATE
$ ip -br a
ens33 UP 100.80.0.132/24 100.80.0.131/32
$ redis-cli -a yourpassword
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:100.80.0.132
master_port:6379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_read_repl_offset:1848
slave_repl_offset:1848
master_link_down_since_seconds:160
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:f7fc9997eea1a2a319c35deabf2a2e5c80e3efb2
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:1848
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:1834
127.0.0.1:6379>
说明
可以为 keepalived 配置 nopreempt
模式,当主恢复时不抢占