Login
网站首页 > 文章中心 > 其它

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

作者:小编 更新时间:2023-08-11 23:12:58 浏览量:225人看过

、主从复制高可用


Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复-图1

#主从复制存在的问题: 1 主从复制,主节点发生故障,需要做故障转移,可以手动转移:让其中一个slave变成master 2 主从复制,只能主写数据,所以写能力和存储能力有限
哨兵是对Redis的系统的运行情况的监控,它是一个独立进程,它会独立运行,功能有二个

通过发送命令,让Redis服务器返回监控其运行状态,包括主服务器和从服务器.

当哨兵监测到master宕机,会自动将slave切换成master,然后通过发布订阅模式通知其他的从服务器,修改配置文件,让它们切换主机.

第二段:架构说明

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复-图2

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

流程

1 多个sentinel发现并确认master有问题

2 选举触一个sentinel作为领导

3 选取一个slave作为新的master

4 通知其余slave成为新的master的slave

5 通知客户端主从变化

6 等待老的master复活成为新master的slave

第三段:配置哨兵

一般配置多个哨兵,除了监控各个redis服务器之外,哨兵之间也会互相监控.

①环境配置

redis默认的sentinel.conf文件

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

port 26379    #此端口号是该哨兵文件的端口号,每个哨兵文件的端口号不同
daemonize no
dir /root/data 
protected-mode no
bind 0.0.0.0
logfile "redis6379_sentinel.log"

#sentinel monitor代表监控,mymaster是给主库取得别名,ip地址代表监控的主库,6379是主库的端口号,2代表有两个或者两个以上的哨兵认为主库不可用时,才会进行换库 sentinel monitor mymaster 12⑦0.0.1 6379 2

#此配置指需要多少时间,一个master才会被sentinel主观认定是不可用的,单位是毫秒,默认是30秒 sentinel down-after-milliseconds mymaster 30000

#此配置值在发生故障时,最多可以有几个slave同时对新的master进行同步,这个数字越小完成故障处理的时间越短 sentinel parallel-syncs mymaster 1

sentinel failover-timeout mymaster 180000


需要三个哨兵,所以创建三个sentinel.conf

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

第四段:启动哨兵

①首先需要先把redis的主从服务器启动:redis-server redis.conf

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

如果发生了故障,sentinel的配置文件会自动进行相应的更改.

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

# Sentinel
sentinel_masters:1
sentinel_tilt:0
sentinel_running_scripts:0
sentinel_scripts_queue_length:0
sentinel_simulate_failure_flags:0

#主节点是mymaster,ip和端口是12⑦0.0.1和6379,有2个从节点,4个哨兵 master0:name=mymaster,status=ok,address=12⑦0.0.1:6379,slaves=2,sentinels=4

这样就是配置成功了

第五段:python中使用哨兵模式

import redis
from redis.sentinel import Sentinel

# 连接哨兵服务器(主机名也可以用域名)
# 101.132.16⑦242是远程服务器的ip地址
sentinel = Sentinel([('101.132.16⑦242', 26379),
                 ('101.132.16⑦242', 26380),
                 ('101.132.16⑦242', 26381)
                socket_timeout=5)

print(sentinel)       #Sentinel
# 获取主服务器地址
master = sentinel.discover_master('mymaster')
print(master)      #('12⑦0.0.1', 6379)

# 获取从服务器地址
slave = sentinel.discover_slaves('mymaster')
print(slave)       #[('12⑦0.0.1', 6380), ('12⑦0.0.1', 6381)]

# 获取主服务器进行写入
master = sentinel.master_for('mymaster', socket_timeout=0.5)   #获取主服务器,往里面写入值
w_ret = master.set('foo', 'bar')  

slave = sentinel.slave_for('mymaster', socket_timeout=0.5)  #获取从服务器,往里面获取值
r_ret = slave.get('foo')
print(r_ret)

出现这种错误,可能是阿里云没设置哨兵端口号

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

在阿里云中设置哨兵端口号

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

出现time out报错可能是因为代码中timeout时间设置太短了

时间设置长一点就行

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

第六段:主服务故障转移

①先关闭主服务器redis,过一会查看一下sentinel日志.

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

15637:X 12 Jan 2020 21:44:3⑧983 # +sdown master mymaster 12⑦0.0.1 6379    #发现master服务已经不能用
15637:X 12 Jan 2020 21:44:39.063 # +new-epoch 1
15637:X 12 Jan 2020 21:44:39.065 # +vote-for-leader c8391221c81f7c2b0c0ed04bb7de6ae84a8f7afd 1   #投票选举哪个哨兵当leader
15637:X 12 Jan 2020 21:44:39.066 # +odown master mymaster 12⑦0.0.1 6379 #quorum 3/2   #3个哨兵有2哨兵投票不能使用了
15637:X 12 Jan 2020 21:44:39.066 # Next failover delay: I will not start a failover before Sun Jan 12 21:50:40 2020
15637:X 12 Jan 2020 21:44:40.066 # +config-update-from sentinel c8391221c81f7c2b0c0ed04bb7de6ae84a8f7afd 12⑦0.0.1 26381 @ mymaster 12⑦0.0.1 6379 

                          #26381哨兵当leader修改配置,6381升级为master 15637:X 12 Jan 2020 21:44:40.066 # +switch-master mymaster 12⑦0.0.1 6379 12⑦0.0.1 6381 #主数据库从6379转变为6381 15637:X 12 Jan 2020 21:44:40.066 * +slave slave 12⑦0.0.1:6380 12⑦0.0.1 6380 @ mymaster 12⑦0.0.1 6381 #添加6380为6381的从库 15637:X 12 Jan 2020 21:44:40.066 * +slave slave 12⑦0.0.1:6379 12⑦0.0.1 6379 @ mymaster 12⑦0.0.1 6381 #添加6379为6381的从库 15637:X 12 Jan 2020 21:45:10.088 # +sdown slave 12⑦0.0.1:6379 12⑦0.0.1 6379 @ mymaster 12⑦0.0.1 6381 #发现6379已经宕机,等待6379的恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

15637:X 12 Jan 2020 23:47:40.287 # -sdown slave 12⑦0.0.1:6379 12⑦0.0.1 6379 @ mymaster 12⑦0.0.1 6381   #6379已经恢复服务
15637:X 12 Jan 2020 23:47:50.234 * +convert-to-slave slave 12⑦0.0.1:6379 12⑦0.0.1 6379 @ mymaster 12⑦0.0.1 6381   #将6379设置为6381的slave

第七段:从服务故障转移

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

Redis_六)——高可用之哨兵sentinel配置与启动及主从服务宕机与恢复

版权声明:倡导尊重与保护知识产权。未经许可,任何人不得复制、转载、或以其他方式使用本站《原创》内容,违者将追究其法律责任。本站文章内容,部分图片来源于网络,如有侵权,请联系我们修改或者删除处理。

编辑推荐

热门文章