前言
上节我们讲了Redis的主从复制,但redis的主从复制无法实现master和slave的自动切换,当master出现故障时,redis高可用无法实现自动故障转移,需要手动切换。所以本节我们来学习下redis的哨兵机制,redis哨兵机制可以实现master故障自动切换 。
1.redis哨兵机制
Sentinel进程是用于监控redis集群中Master主服务器工作的状态,在Master主服务器发生故障的时候,可以实现Master和Slave服务器的切换,保证系统的高可用,其已经被集成在redis2.6+的版本中,的哨兵模式到了2.8版本之后就稳定了下来。
如上图。 哨兵(Sentinel)是一个分布式系统,可以在一个架构中运行多个哨兵(sentinel)进程,这些进程使用流言协议(gossip protocols)来接收关于Master主服务器是否下线的信息,并使用投票协议(Agreement Protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master。每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、Master、Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(可配置的)内未得到回应,则暂时认为对方已掉线,也就是所谓的”主观认为宕机”,主观是每个成员都具有的独自的而且可能相同也可能不同的意识,英文名称:Subjective Down,简称SDOWN。有主观宕机,肯定就有客观宕机。当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN的判断,并且通过SENTINEL is-master-down-by-addr命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”,客观是不依赖于某种意识而已经实际存在的一切事物,英文名称是:ObjectivelyDown, 简称ODOWN。通过一定的vote算法,从剩下的slave从服务器节点中,选一台提升为Master服务器节点,然后自动修改相关配置,并开启故障转移(failover)。
Sentinel机制可以解决master和slave角色的切换问题。
1.1 配置redis哨兵机制
需要手动先指定某一台服务器为master,然后将其他slave服务器使用命令配置为master服务器的slave,哨兵的前提是已经手动实现了一个redis master-slave的运行环境。
#配置redis哨兵机制拓扑图
1.2 三台主机安装redis
#主机node20安装redis服务
[root@node20 ~]# yum -y install gcc gcc-c++
[root@node20 ~]# cd /usr/local/src/
[root@node20 src]# ls
redis-4.0.14.tar.gz
[root@node20 src]# tar -zxvf redis-4.0.14.tar.gz
[root@node20 src]# cd redis-4.0.14
[root@node20 src]# make
[root@node20 redis-4.0.14]# make PREFIX=/apps/redis install
[root@node20 redis-4.0.14]# mkdir /apps/redis/{etc,logs,data,run}
[root@node20 redis-4.0.14]# cp redis.conf /apps/redis/etc/
[root@node20 redis-4.0.14]# vim /apps/redis/etc/redis.conf
bind 0.0.0.0
protected-mode no
requirepass 123456
logfile "/apps/redis/logs/redis.log"
dir /apps/redis/data
[root@node20 redis-4.0.14]# vim /usr/lib/systemd/system/redis.service
[Unit]
Description=Redis persistent key-value database
After=network.target
After=network-online.target
Wants=network-online.target
[Service]
#ExecStart=/usr/bin/redis-server /etc/redis.conf --supervised systemd
ExecStart=/apps/redis/bin/redis-server /apps/redis/etc/redis.conf --supervised systemd
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s QUIT $MAINPID
Type=notify
User=redis
Group=redis
RuntimeDirectory=redis
RuntimeDirectoryMode=0755
[Install]
WantedBy=multi-user.target
[root@node20 redis-4.0.14]# useradd -s /sbin/nologin -M redis
[root@node20 redis-4.0.14]# chown -R redis.redis /apps/redis/
[root@node20 redis-4.0.14]# systemctl daemon-reload
[root@node20 redis-4.0.14]# systemctl start redis
[root@node20 redis-4.0.14]# systemctl enable redis
Created symlink from /etc/systemd/system/multi-user.target.wants/redis.service to /usr/lib/systemd/system/redis.service.
[root@node20 redis-4.0.14]# ss -tnl | grep 6379
LISTEN 0 128 *:6379 *:*
[root@node20 redis-4.0.14]# ln -sv /apps/redis/bin/redis-* /usr/bin/
‘/usr/bin/redis-benchmark’ -> ‘/apps/redis/bin/redis-benchmark’
‘/usr/bin/redis-check-aof’ -> ‘/apps/redis/bin/redis-check-aof’
‘/usr/bin/redis-check-rdb’ -> ‘/apps/redis/bin/redis-check-rdb’
‘/usr/bin/redis-cli’ -> ‘/apps/redis/bin/redis-cli’
‘/usr/bin/redis-sentinel’ -> ‘/apps/redis/bin/redis-sentinel’
‘/usr/bin/redis-server’ -> ‘/apps/redis/bin/redis-server’
#主机node21安装redis服务
[root@node21 ~]# yum -y install gcc gcc-c++
[root@node21 ~]# cd /usr/local/src/
[root@node21 src]# ls
redis-4.0.14.tar.gz
[root@node21 src]# tar -zxvf redis-4.0.14.tar.gz
[root@node21 src]# cd redis-4.0.14
[root@node21 src]# make
[root@node21 redis-4.0.14]# make PREFIX=/apps/redis install
[root@node21 redis-4.0.14]# mkdir /apps/redis/{etc,logs,data,run}
[root@node21 redis-4.0.14]# cp redis.conf /apps/redis/etc/
[root@node21 redis-4.0.14]# vim /apps/redis/etc/redis.conf
bind 0.0.0.0
protected-mode no
requirepass 123456
masterauth 123456
slaveof 10.0.0.20 6379
logfile "/apps/redis/logs/redis.log"
dir /apps/redis/data
[root&