Redis系列:高可用哨兵方案部署
共 6559字,需浏览 14分钟
·
2020-10-09 13:13
点击上方「蓝字」关注我们
Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决
监控(Monitoring):Sentinel 会不断地检查主服务器和从服务器是否运作正常。
提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
0x01: 高可用哨兵方案推演
服务器信息如下
这里只有一台虚拟主机,采用端口不一样的方式。如果大家有多台虚拟主机的话,也可以使用多台虚拟主机部署。
基于redis.conf创建主从配置文件
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-6739.conf
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-26379.conf
cp /usr/local/redis/etc/redis.conf /usr/local/redis/redis-26380.conf
基于sentinel.conf 创建哨兵配置文件,sentinel.conf配置文件可以在下载的redis源码目录找到
cp sentinel.conf /usr/local/redis/sentinel-36378.conf
cp sentinel.conf /usr/local/redis/sentinel-36379.conf
cp sentinel.conf /usr/local/redis/sentinel-36380.conf
主服务器配置
bind 127.0.0.1 192.168.122.1
port 6379
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/tmp/redis-6379.log"
dbfilename dump-6379.rdb
requirepass new2020
从服务器一配置
bind 127.0.0.1 192.168.122.1
port 26379
daemonize yes
pidfile /var/run/redis_26379.pid
logfile "/tmp/redis-26379.log"
dbfilename dump-26379.rdb
requirepass new2020
replicaof 127.0.0.1 6379
masterauth new2020
从服务器二配置
bind 127.0.0.1 192.168.122.1
port 26380
daemonize yes
pidfile /var/run/redis_26380.pid
logfile "/tmp/redis-26380.log"
dbfilename dump-26380.rdb
requirepass new2020
replicaof 127.0.0.1 6379
masterauth new2020
哨兵一配置
bind 127.0.0.1 192.168.122.1
protected-mode no
port 36378
daemonize yes
pidfile /var/run/redis-sentinel-36278.pid
logfile /tmp/redis-36378.log"
dir /tmp/36378
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
哨兵二配置
bind 127.0.0.1 192.168.122.1
protected-mode no
port 36379
daemonize yes
pidfile /var/run/redis-sentinel-36379.pid
logfile "/tmp/redis-36379.log"
dir /tmp/36379
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
哨兵三配置
bind 127.0.0.1 192.168.122.1
protected-mode no
port 36380
daemonize yes
pidfile /var/run/redis-sentinel-36380.pid
logfile "/tmp/redis-36380.log"
dir /tmp/36380
sentinel monitor mymaster 127.0.0.1 6379 2
sentinel auth-pass mymaster new2020
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
sentinel deny-scripts-reconfig yes
说明:
① 禁止保护模式
protected-mode no
② 配置监听的主服务器,这里sentinel monitor代表监控,mymaster代表服务器的名称,可以自定义,127.0.0.1代表监控的主服务器,6379代表端口,2代表只有两个或两个以上的哨兵认为主服务器不可用的时候,才会进行failover操作。
sentinel monitor mymaster 127.0.0.1 6379 2
③ sentinel author-pass定义服务的密码,mymaster是服务名称,new2020是Redis服务器密码
# sentinel auth-pass
sentinel auth-pass mymaster new2020
④ 判断主master的挂机时间(毫秒),超时未返回正确信息后标记为sdown状态
sentinel down-after-milliseconds master-1 3000
⑤ 选项指定了在执行故障转移时, 最多可以有多少个从服务器同时对新的主服务器进行同步,这个数字越小,完成故障转移所需的时间就越长
sentinel parallel-syncs mymaster 1
⑥ 若sentinel在该配置值内未能完成failover操作(即故障时master/slave自动切换),则认为本次failover失败。
sentinel failover-timeout mymaster 180000
⑦ 工作路径,注意路径不要和主重复
dir "/tmp/36379"
0x02:启动redis
安装如下顺序
首先是主Redis服务进程,然后再启动从机的服务进程,最后启动3个哨兵的服务进程。
主Redis启动
# 启动主Redis服务器进程
/usr/local/redis/bin/redis-server /usr/local/redis/redis-6379.conf
从Rdis启动
# 启动从Redis服务器进程
/usr/local/redis/bin/redis-server /usr/local/redis/redis-26379.conf
/usr/local/redis/bin/redis-server /usr/local/redis/redis-26380.conf
启动哨兵
# 启动启动Redis哨兵进程
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36378.conf
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36379.conf
/usr/local/redis/bin/redis-sentinel /usr/local/redis/sentinel-36380.conf
ps -ef | grep redis
如下图所示,说明启动成功
0x03:查看各服务的状态
查看主Redis状态
输入info命令,如果出现信息,说明一主两从搭建成功
# Replication
role:master
connected_slaves:2
slave0:ip=127.0.0.1,port=26379,state=online,offset=43689,lag=1
slave1:ip=127.0.0.1,port=26380,state=online,offset=43955,lag=0
master_replid:b92588e7ee2f1922498de16031b7649b3082b22b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:43955
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:43955
查看从Redis一状态
输入info命令
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_repl_offset:101019
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:b92588e7ee2f1922498de16031b7649b3082b22b
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:101019
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:101019
注,使用同样的方式可以看到从Redis二也是一样的。
查看哨兵Redis状态
输入info命令
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:6379,slaves=2,sentinels=3
注,使用同样的方式可以看到哨兵Redis二和哨兵Redis三也是一样的。
0x04:验证主从切换
1、首先关闭主Redis(6379)服务(shutdown)。
2、查看哨兵,发现端口号为263的从服务变成了主服务,sentinel自动完成了故障切换。
#查看主Reids的进程号
ps -ef | grep redis
#杀死主Redis进程
kill -9 7973
#连接哨兵一
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 36378
使用info sentinel命令
127.0.0.1:36378> info sentinel
# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0
master0:name=mymaster,status=ok,address=127.0.0.1:26379,slaves=2,sentinels=3
3、启动刚才被shutdown的6379服务并查看,发现它变成了从服务。
连接6379Redis服务
/usr/local/redis/bin/redis-cli -h 127.0.0.1 -p 6379
使用info replication命令
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:26379
master_link_status:down
master_last_io_seconds_ago:-1
master_sync_in_progress:0
slave_repl_offset:1
master_link_down_since_seconds:1601531690
slave_priority:100
slave_read_only:1
connected_slaves:0
master_replid:739195dc3c4b405905edb43b35cdd48e1589e48d
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:0
second_repl_offset:-1
repl_backlog_active:0
repl_backlog_size:1048576
repl_backlog_first_byte_offset:0
repl_backlog_histlen:0