Sentinel是Redis的高可用性(HA)解决方案,由一个或多个Sentinel实例组成的Sentinel系统可以监视任意多个主服务器,以及这些主服务器属下的所有从服务器,并在被监视的主服务器进行下线状态时,自动将下线主服务器属下的某个从服务器升级为新的主服务器,然后由新的主服务器代替已下线的主服务器继续处理命令请求。
-
Redis提供的sentinel(哨兵)机制,通过sentinel模式启动redis后,自动监控master/slave的运行状态,基本原理是:心跳机制+投票裁决
-
监控(Monitoring):Sentinel 会不断地检查主服务器和从服务器是否运作正常。
-
提醒(Notification):当被监控的某个 Redis 服务器出现问题时, Sentinel 可以通过 API 向管理员或者其他应用程序发送通知。
自动故障迁移(Automatic failover):当一个主服务器不能正常工作时, Sentinel 会开始一次自动故障迁移操作, 它会将失效主服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可以使用新主服务器代替失效服务器。
服务器信息如下
这里只有一台虚拟主机,采用端口不一样的方式。如果大家有多台虚拟主机的话,也可以使用多台虚拟主机部署。
基于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-passsentinel 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
如下图所示,说明启动成功
查看主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