redis高可用
哨兵模式
哨兵也叫 sentinel,它的作用是能够在后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。
主观宕机:
每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、 Master、 Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则暂时认为对方已离线,也就是所谓的”主观认为宕机”
(主观:是每个成员都具有的独自的而且可能相同也可能不同的意识)
客观宕机:
当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN 的判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”
(客观:是不依赖于某种意识而已经实际存在的一切事物)
当master宕机后,sential会从剩下的从服务器节点中选择一台提升为 master,选举策略有三种:
- 选择优先级靠前的服务器。优先级的配置在 redis.conf 文件中的
replica-priority
配置,默认为 100,值越小优先级越高。 - 选择偏移量最大的。偏移量是指获得原主机数据最全的。
- 选择 runid 最小的从服务器。每个redis实例启动后都会随机生成一个40位的runid。
配置哨兵
重新配置主从同步
master
#下载redis
[root@master ~]# yum install redis -y
#配置文件
[root@master ~]# vim /etc/redis/redis.conf
#将以下三行的信息进行修改
bind 0.0.0.0
protected-mode no
daemonize no
#启动redis,并进入数据库查看当前信息
[root@master ~]# systemctl start redis
[root@master ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:0
master_failover_state:no-failover
master_replid:d94af252ef328378edb1ce7164c260f8c6710453
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
slave1
#配置文件
[root@slave1 ~]# vim /etc/redis/redis.conf
#将以下四行的信息进行修改
bind 0.0.0.0
protected-mode no
daemonize no
replicaof 192.168.70.20 6379 #IP为主的IP
#重启redis,并进入数据库查询从信息
[root@slave1 ~]# systemctl restart redis^C
[root@slave1 ~]# systemctl restart redis
[root@slave1 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.70.20
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:28
slave_repl_offset:28
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:78ac1480afde99294cb145f66cf594b0b8298217
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:28
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:28
slave2
#配置文件
[root@slave2 ~]# vim /etc/redis/redis.conf
bind 0.0.0.0
protected-mode no
daemonize no
replicaof 192.168.70.20 6379
[root@slave2 ~]# systemctl restart redis
[root@slave2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.70.20
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:854
slave_repl_offset:854
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:78ac1480afde99294cb145f66cf594b0b8298217
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:854
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:841
repl_backlog_histlen:14
配置哨兵
将一主两从三个主机都进行修改
#进入哨兵配置文件
[root@master ~]# vim /etc/redis/sentinel.conf
#将一下配置进行修改
sentinel monitor mymaster 192.168.70.20 6379 2 #将原本的127.0.0.1改为masterIP
sentinel down-after-milliseconds mymaster 30000
sentinel parallel-syncs mymaster 1
sentinel failover-timeout mymaster 180000
#在三台主机都启动哨兵
[root@redis-master ~]# redis-sentinel /etc/redis/sentinel.conf
[root@redis-slave1 ~]# redis-sentinel /etc/redis/sentinel.conf
[root@redis-slave2 ~]# redis-sentinel /etc/redis/sentinel.conf
测试
#重新打开一个master终端,并模拟宕机
[root@master ~]# redis-cli
127.0.0.1:6379> shutdown
not connected>
#在从1中进入redis查看
[root@slave1 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=192.168.70.22,port=6379,state=online,offset=26081,lag=1
master_failover_state:no-failover
master_replid:696d9bfa8765be166bc56b7ca24ffca2f686d8b3
master_replid2:79174a39c3a61f5e59633cd13e32527ed4ef6b9d
master_repl_offset:26081
second_repl_offset:22943
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:26081
#在从2中进行查看
[root@slave2 ~]# redis-cli
127.0.0.1:6379> info replication
# Replication
role:slave
master_host:192.168.70.21
master_port:6379
master_link_status:up
master_last_io_seconds_ago:1
master_sync_in_progress:0
slave_read_repl_offset:29916
slave_repl_offset:29916
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:696d9bfa8765be166bc56b7ca24ffca2f686d8b3
master_replid2:79174a39c3a61f5e59633cd13e32527ed4ef6b9d
master_repl_offset:29916
second_repl_offset:22943
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:15
repl_backlog_histlen:29902
#发现从1替换master成为主
再重启模拟宕机的master
[root@master ~]# systemctl start redis
#在新主查看
127.0.0.1:6379> info replication
# Replication
role:master
connected_slaves:2
slave0:ip=192.168.70.22,port=6379,state=online,offset=73379,lag=1
slave1:ip=192.168.70.20,port=6379,state=online,offset=73379,lag=1
master_failover_state:no-failover
master_replid:696d9bfa8765be166bc56b7ca24ffca2f686d8b3
master_replid2:79174a39c3a61f5e59633cd13e32527ed4ef6b9d
master_repl_offset:73379
second_repl_offset:22943
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:73379
#重启之后变为从