Redis 主从高可用集群

发布时间: 更新时间: 总字数:992 阅读时间:2m 作者: IP上海 分享 网址

Redis 主从高可用集群搭建

环境信息

  • vip:
    • 100.80.0.131
  • 两台服务器:
    • 主: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

配置主服务器

  • /etc/redis/redis.conf
bind 0.0.0.0
protected-mode yes
daemonize yes
# 设置认证密码
requirepass yourpassword
# 如果从库需要密码连接主库
masterauth yourpassword
appendonly yes
  • 重启服务
sudo systemctl restart redis-server

配置从服务器

  • /etc/redis/redis.conf
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
  • 修改文件权限,并启动 keepalived
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
  • vip
$ ip -br a
ens33            UP             100.80.0.132/24 100.80.0.131/32
  • redis 节点信息
$ 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模式,当主恢复时不抢占

Home Archives Categories Tags Statistics
本文总阅读量 次 本站总访问量 次 本站总访客数