因单机运行redis出现故障导致业务中断及数据丢失。故需要配置redis主从库甚至哨兵模式保障redis的高可用性
主从及哨兵模式配置说明
服务器名称及模式 | IP地址 |
---|---|
redis-master:6379 | 10.10.10.10 |
redis-slave:6379 | 10.10.10.11 |
redis-slave:6379 | 10.10.10.12 |
redis-sentinel:26379 | 10.10.10.10 |
redis-sentinel:26379 | 10.10.10.11 |
redis-sentinel:26379 | 10.10.10.12 |
配置从库
-
准备工作
在三台服务器上分别安装redis单机版,并配置启动项 -
配置从库(10.10.10.11 / 10.10.10.12)
vim /opt/redis/conf/redis.conf
## 新增配置项
replicaof 10.10.10.10 6379
如果希望从库持续为只读,可以添加配置项'replica-read-only yes'
- 重启服务(10.10.10.11 / 10.10.10.12)
systemctl restart redis.service
检测办法
- 打开三个命令窗口,分别连接三台redis
/opt/redis/bin/redis-cli -h 10.10.10.10 -p 6379 -a password
/opt/redis/bin/redis-cli -h 10.10.10.11 -p 6379 -a password
/opt/redis/bin/redis-cli -h 10.10.10.12 -p 6379 -a password
- 先通过
KEYS *
检测确认所有库中数据都为空
10.10.10.10:6379> KEYS *
(empty list or set)
10.10.10.11:6379> KEYS *
(empty list or set)
10.10.10.12:6379> KEYS *
(empty list or set)
- 在主节点上写入一个key值,并查询
10.10.10.10:6379> set a 1
OK
10.10.10.10:6379> KEYS *
1) "a"
10.10.10.10:6379> get a
"1"
- 从库节点上进行查询所有key值以及查询key值'a'
10.10.10.11:6379> KEYS *
1) "a"
10.10.10.11:6379> get a
"1"
10.10.10.12:6379> KEYS *
1) "a"
10.10.10.12:6379> get a
"1"
- redis主从库创建成功
仅配置redis的主从库,当redis-master故障期,不会自动切换主从关系,所以需要配置哨兵模式(sentinel)对其主从关系进行管理。
Redis的Sentinel最小配置是一主一从。建议配置三台(sentinel),如需扩展,需按照奇数进行扩增
- 添加(sentinel)配置参数(三台服务器配置一致)
cat << EOF > /opt/redis/conf/sentinel.conf
port 26379
daemonize yes
pidfile /var/run/redis/redis-sentinel.pid
logfile /data/redis/logs/sentinel.log
dir /data/redis/data/
sentinel monitor mymaster 10.10.10.10 6379 2
sentinel auth-pass mymaster password
#哨兵检测确认主节点下线 默认30秒
sentinel down-after-milliseconds mymaster 30000
#指定了在发生主备切换时,最多可以有多少个slave同时对新的master进行同步,
sentinel parallel-syncs mymaster 1
#故障转移的超时时间
sentinel failover-timeout mymaster 180000
#默认情况下,SENTINEL SET将无法更改通知脚本
sentinel deny-scripts-reconfig yes
EOF
chown -R redis:redis /data/redis /opt/redis /var/run/redis
- 全部启动Sentinel
启动顺序 master -> slave 1/2 -> sentinel 1/2/3
sudo -u redis /opt/redis/bin/redis-sentinel /opt/redis/conf/sentinel.conf
- 查看运行状态
/opt/redis/bin/redis-cli -p 26379
# 查看主库状态
> sentinel master mymaster
# 查看从库状态
> sentinel slaves mymaster
# 查看其它sentinel状态
> sentinel sentinels mymaster
- 测试主从切换
# 主节点关闭redis
systemctl stop redis
# 等待30秒,通过从库查看master机器状态
/opt/redis/bin/redis-cli -h 10.10.10.12 -p 6379 -a password info |grep master_host
master_host:10.10.10.11
在通过启动原主服务,关闭被提升为master的从库服务,查看是否有新的master机器被提升。
使用系统systemctl管理redis启动关闭以及异常关闭重启
- 创建启动文件
cat << EOF > /usr/lib/systemd/system/redis-sentinel.service
[Unit]
Description=redis-sentinel
After=network.target
[Service]
Type=forking
User=redis
ExecStart=/opt/redis/bin/redis-sentinel /opt/redis/conf/sentinel.conf
Restart=on-failure
RestartSec=10s
KillMode=control-group
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
- 启动并设置开机启动
systemctl start redis-sentinel.service
systemctl enable redis-sentinel.service