使用sentinel实现redis主从架构高可用

本文详细介绍Redis Sentinel如何监控主从架构,实现自动故障转移,确保高可用性。Sentinel可从多个从节点中选举新的主节点,客户端通过查询Sentinel获取最新主节点信息。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1  sentinel的工作过程:

              sentinel安装在另外的主机上,sentinel主机既能监控又能提供配置功能,向sentinel指明主redis服务器即可(仅监控主服务器),sentinel可以从主服务中获取主从架信息,并分辨从节点,sentinel可以监控当前整个主从服务器架构的工作状态,一旦发现master离线的情况,sentinel会从多个从服务器中选择并提升一个从节点成为主节点,当主节点被从节点取代以后,那么IP地址则发生了,客户所连接之前的主节点IP则不无法连接,此时可以向sentinel发起查询请求,sentinel会告知客户端新的主节点的IP,所以sentinel是redis在主从架构中实现高可用的解决方,sentinel为了误判和单点故障,sentinel也应该组织为集群,sentinel多个节点同时监控redis主从架构,一旦有一个sentinel节点发现redis的主节点不在线时,sentinel会与其他的sentinel节点协商其他的sentinel节点是否也为同样发现redis的主节点不在线的情况,如果sentinel的多个点节点都发现redis的主节点都为离线的情况,那么则判定redis主节点为离线状态,以此方式避免误判,同样也避免了单点故障

2、 sentinel:

       用于管理多个redis服务实现HA;

       监控多个redis服务节点

自动故障转移

sentinel也是一个分布式系统,可以在一个架构中运行多个sentinel进程,多个进程之间使用“流言协议”接收redis主节点是否离线,并使用“投票协议”是否实现故障转移,选择哪一个redis的从服务器成为主服务器

启用sentinel:

       redis-sentinel可以理解为运行有着特殊代码的redis,redis自身也可以运行为sentinel,sentinel也依赖配置文件,用于保存sentinel不断收集的状态信息

       程序:

              redis-sentinel /path/to/file.conf

              redis-server  /path/to/file.conf --sentinel

 

运行sentinel的步骤:

                     (1) 服务器自身初始化(运行redis-server中专用于sentinel功能的代码);

                     (2) 初始化sentinel状态,根据给定的配置文件,初始化监控的master服务器列表;

                     (3) 创建连向master的连接;

3、专用配置文件:/etc/redis-sentinel.conf

(1) # sentinel monitor <master-name> <ip> <redis-port> <quorum> //此项可以出现多次,可以监控多组redis主从架构,此项用于监控主节点 <master-name> 自定义的主节点名称,<ip> 主节点的IP地址,<redis-port>主节点的端口号,<quorum>主节点对应的quorum法定数量,用于定义sentinel的数量,是一个大于值尽量使用奇数,如果sentinel有3个,则指定为2即可,如果有4个,不能够指定为2,避免导致集群分裂,注意,<master-name>为集群名称,可以自定义,如果同时监控有多组redis集群时,<master-name>不能同样

(2) sentinel down-after-milliseconds <master-name> <milliseconds>  //sentinel连接其他节点超时时间,单位为毫秒(默认为30秒)

(3)sentinel parallel-syncs <master-name> <numslaves>     //提升主服务器时,允许多少个从服务向新的主服务器发起同步请求

(4)sentinel failover-timeout <master-name> <milliseconds>     //故障转移超时时间,在指定时间没能完成则判定为失败,单位为毫秒(默认为180秒)

4、专用命令:

       SENTINEL masters       //列出所有监控的主服务器

       SENTINEL slaves <master name>            //获取指定redis集群的从节点

       SENTINEL get-master-addr-by-name <master name>           //根据指定master的名称获取其IP

       SENTINEL reset           //用于重置,包括名称,清除服务器所有运行状态,故障转移、等等

       SENTINEL failover <master name>          //手动向某一组redis集群发起执行故障转移

5、配置(使用单台主机进行配置):

       # mkdir /etc/redis -pv

       # cp /etc/redis.conf /etc/redis

       # cd /etc/redis

       # cp redis.conf redis.conf2

       # mv redis.conf redis.conf3

       # mkdir -pv /redis/db{2,3}

       # chown -R redis. /redis/db*

6、配置redis实例1:

       # vim /etc/redis.conf

       修改:

       # bind 127.0.0.1

       改为:

       bind 0.0.0.0

 

       修改:

       daemonize no

       改为:

       daemonize yes

7、配置redis实例2:

       # vim /etc/redis/redis.conf2

       修改:

       # bind 127.0.0.1

       改为:

       bind 0.0.0.0

 

       修改:

       port 6379

       改为:

       port 6380

 

       修改:

       daemonize no

       改为:

       daemonize ye

 

       修改:

       pidfile /var/run/redis_6379.pid

       改为:

       pidfile /var/run/redis_6380.pid

 

       修改:

       logfile /var/log/redis/redis.log

       改为:

       logfile /var/log/redis/redis_6380.log

 

       修改:

       dir /var/lib/redis

       改为:

       dir /redis/db2

 

       修改:

       # slaveof <masterip> <masterport>

       改为:

       slaveof 192.168.1.63 6379

8、配置redis实例3:

       # vim /etc/redis/redis.conf3

       修改:

       # bind 127.0.0.1

       改为:

       bind 0.0.0.0

 

       修改:

       port 6379

       为:

       port 6381

 

       修改:

       daemonize no

       改为:

       daemonize ye

 

       修改:

       pidfile /var/run/redis_6379.pid

       改为:

       pidfile /var/run/redis_6381.pid

 

       修改:

       logfile /var/log/redis/redis.log

       改为:

       logfile /var/log/redis/redis_6381.log

 

       修改:

       dir /var/lib/redis

       改为:

       dir /redis/db3

 

       修改:

       # slaveof <masterip> <masterport>

       改为:

       slaveof 192.168.1.63 6379

 

       启动实例1:

       # systemctl start redis

 

       启动实例2:

       # redis-server /etc/redis/redis.conf2

 

       启动实例3:

       # redis-server /etc/redis/redis.conf3

 

       # redis-cli             //查看到以下内容则为成功

 

       127.0.0.1:6379> info replication

       # Replication

       role:master

       connected_slaves:2

       slave0:ip=192.168.1.63,port=6380,state=online,offset=28,lag=1

       slave1:ip=192.168.1.63,port=6381,state=online,offset=28,lag=1

9、启用sentinel:

       # vim /etc/redis-sentinel.conf

       修改:

       # bind 127.0.0.1 192.168.1.1

       改为:

       bind 0.0.0.0

 

       修改:

       sentinel monitor mymaster 127.0.0.1 6379 2

       改为:

       sentinel monitor mymaster 192.168.1.63 6379 1

 

       # systemctl start redis-sentinel.service

 

       登录redis-sentinel:

       # redis-cli -h 192.168.1.63 -p 26379

 

       192.168.1.63:26379> 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=192.168.1.63:6379,slaves=2,sentinels=1

 

       192.168.1.63:26379> sentinel masters              //获取主节点及从节点的信息

       1)  1) "name"

              2) "mymaster"

              3) "ip"

              4) "192.168.1.63"

              5) "port"

              6) "6379"

              7) "runid"

               8) "824e49626453b61077bf2cfa36c9bb464bbcd595"

              9) "flags"

              10) "master"

 

              192.168.1.63:26379> sentinel slaves mymaster        //获取mymaster集群的从节点信息

10、测试:

       # systemctl stop redis               //关闭主服务

 

       192.168.1.63:26379> 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=192.168.1.63:6381,slaves=2,sentinels=1  //由此可见6381的成为了主

 

启动主服务:

       # systemctl start redis

 

       192.168.1.63:26379> 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=192.168.1.63:6381,slaves=2,sentinels=1

 

       # redis-cli -h 192.168.1.63 -p 6381

       192.168.1.63:6381> info replication

       # Replication

       role:master

       connected_slaves:2

       slave0:ip=192.168.1.63,port=6380,state=online,offset=224567,lag=0

       slave1:ip=192.168.1.63,port=6379,state=online,offset=224706,lag=0

              由以上测试可见,主的故障离线后,sentinel重新选了其 一个从的成为了新的主节点,在原来的主节点重新上线后,仍然不会恢复为主节点

       注意:

              将来客户端应连接sentinel,向sentinel发请求去寻址,并根据sentinel的反馈,进行连接新的redis主节点,这一点需要使用redis专用客户端来实现。redis客户端会根据sentinel返回的新节点IP进行连接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值