吃透Redis系列:高可用的哨兵模式
共 4103字,需浏览 9分钟
·
2024-04-16 11:39
欢迎关注微信公众号:互联网全栈架构
一
哨兵模式介绍
哨兵模式(Sentinel)是Redis提供的高可用解决方案,作为一个分布式系统,它包含了多个Sentinel节点和Redis节点,这些Sentinel节点会监控Redis节点的状态(通常为主从复制),如果发现master节点不可用时,会自动将其中一个slave节点提升为master节点,从而实现了自动故障转移。
总体来讲,哨兵模式的主要功能有如下几个方面:
监控:Sentinel会不断检查Redis的主、从服务器是否正常工作;
通知:如果Redis实例有故障,会通知到系统管理员或者相关程序;
自动故障转移:如果主节点不可用,自动把其中一个从节点提升为主节点;
二
环境搭建
接下来我们演示一下Redis哨兵模式的搭建,为了简化起见,哨兵只有一个实例,而Redis服务器有三个,分别为一主两从。同时,都在一台服务器上搭建,如果在正式的生产环境,需要在不同的服务器上进行配置,这样才能实现真正的高可用,不管是在一台或者多台服务器上搭建,操作步骤和配置项几乎完全一样。
先搭建三个Redis服务,一主两从,因为是在一台服务器上操作,通过端口来区分不同的服务,分别为6379、6380、6381,拷贝三份Redis配置文件,按照redis_6379.conf这样的方式命名。修改的主要信息如下:
port 6379
pidfile /var/run/redis_6379.pid
logfile "6379.log"
dbfilename "dump6379.rdb"
分别启动三个服务和客户端:
./redis-server redis_6379.conf &
./redis-server redis_6380.conf &
./redis-server redis_6381.conf &
./redis-cli -h 127.0.0.1 -p 6379
./redis-cli -h 127.0.0.1 -p 6380
./redis-cli -h 127.0.0.1 -p 6381
把端口为6380和6381的服务,设置为6379的从服务器。在新版本中也可以使用命令replicaof,在客户端执行下面的命令(也可以写在配置文件中):
slaveof 127.0.0.1 6379
在6380上执行info replication,它已经成了从服务器
127.0.0.1:6380> info replication
# Replication
role:slave
master_host:127.0.0.1
master_port:6379
master_link_status:up
master_last_io_seconds_ago:6
master_sync_in_progress:0
slave_read_repl_offset:14
slave_repl_offset:14
slave_priority:100
slave_read_only:1
replica_announced:1
connected_slaves:0
master_failover_state:no-failover
master_replid:4f5754021bbd189c622c14321af8d80840432bd7
master_replid2:0000000000000000000000000000000000000000
master_repl_offset:14
second_repl_offset:-1
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:14
另外,如果主服务器需要密码,还需要在配置文件.conf中加上masterauth的配置项。
这样,一主两从的服务就搭建好了,在主服务器上执行一些命令,可以看到,它的数据也同步到了两台从服务器上。
创建配置文件:sentinel.conf
port 26379
# sentinel monitor <master-name> <ip> <port> <quorum>
# master-name: 被监控的redis master名称
# quorum: 认定master下线的哨兵个数
sentinel monitor redis_6379 127.0.0.1 6379 1
# redis master的密码
sentinel auth-pass redis_6379 123456
# 判定主观下线的时间长度,单位为毫秒
sentinel down-after-milliseconds redis_6379 5000
三
测试
环境搭建好了,我们来测试一下,先启动哨兵服务:
./redis-sentinel sentinel.conf
在日志里面可以看到,选举6379端口的redis服务为master:
在6380、6381客户端执行命令info replication,也可以看出它们是从服务器,而6379是master。
接下来我们把6379的服务关掉,直接在对应的客户端执行shutdown,在6380的客户端看看它的复制信息(info replication):
127.0.0.1:6380> info replication
# Replication
role:master
connected_slaves:1
slave0:ip=127.0.0.1,port=6381,state=online,offset=60102,lag=0
master_failover_state:no-failover
master_replid:78b90907468c5721834570114a74ff9bcce302c5
master_replid2:fb94f4afa0b3535b79e54f9287f60150b76cd9d5
master_repl_offset:60102
second_repl_offset:2694
repl_backlog_active:1
repl_backlog_size:1048576
repl_backlog_first_byte_offset:1
repl_backlog_histlen:60102
发现6380端口对应的服务已经成为了master,对6381是其对应的slave,如果再把6379的服务启动起来,它也成为了6380的slave。
可以看出,Redis的哨兵模式可以进行自动故障转换,当master宕机以后,自动把其中的一个slave提升为master,从而继续对外提供服务,当然,这样的切换需要一定的时间。
四
总结
哨兵模式是Redis提供的一个高可用架构,它有一组专门的哨兵进程来监控Redis主从节点,并在发现故障后自动进行转移,从而实现了Redis服务的高可用,系统的健壮性也更高。
然而,哨兵模式也有它的缺点,比如增加维护成本,容量有限等,相应地,Redis官方还提供集群模式,我们会在后续的文章中进行介绍,敬请期待。
创作不易,烦请点赞分享,感谢!
推荐阅读: