redis高可用

发布于:2025-09-11 ⋅ 阅读:(17) ⋅ 点赞:(0)

redis高可用

哨兵模式

哨兵也叫 sentinel,它的作用是能够在后台监控主机是否故障,如果故障了根据投票数自动将从库转换为主库。

主观宕机:

每个哨兵(Sentinel)进程会向其它哨兵(Sentinel)、 Master、 Slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定配置时间(此项可配置)内未得到回应,则暂时认为对方已离线,也就是所谓的”主观认为宕机”

(主观:是每个成员都具有的独自的而且可能相同也可能不同的意识)

客观宕机:

当“哨兵群”中的多数Sentinel进程在对Master主服务器做出SDOWN 的判断,并且通过 SENTINEL is-master-down-by-addr 命令互相交流之后,得出的Master Server下线判断,这种方式就是“客观宕机”

(客观:是不依赖于某种意识而已经实际存在的一切事物)

当master宕机后,sential会从剩下的从服务器节点中选择一台提升为 master,选举策略有三种:

  1. 选择优先级靠前的服务器。优先级的配置在 redis.conf 文件中的 replica-priority 配置,默认为 100,值越小优先级越高。
  2. 选择偏移量最大的。偏移量是指获得原主机数据最全的。
  3. 选择 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
#重启之后变为从

网站公告

今日签到

点亮在社区的每一天
去签到