Redis容灾部署哨兵(sentinel)机制配置详解及原理介绍
2017-04-26 00:22
701 查看
1.为什么要用到哨兵
2.什么是哨兵
3.Sentinel集群搭建
3.1 Sentinel集群拓扑图
多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控
3.2 在保证Redis主从架构集群可用的前提下,复制三份配置文件
3.3 分别配置哨兵
3.4 启动哨兵进程
3.5 哨兵模式常用命令
3.6 查看配置中是否多了如下内容
3.7 Java代码测试哨兵
3.8 测试Sentinel是否正常工作
3.8.1 测试集群环境如下
3.8.2 关闭端口为6379的Redis
3.8.3 查看新的集群架构
3.8.4 重新启动端口号为6379的Redis 查看集群架构
该过程是6379Redis宕机->6380切换成Master->6379和6381切换为6380的SLAVE->6379重新启动->6379为6380SLAVE
3.8.5 Sentinel日志分析
26379日志
26380日志
26381日志
4.Sentinel原理介绍
首先解释2个名词:SDOWN和ODOWN.
SDOWN:subjectively down,直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
ODOWN:objectively down,直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
SDOWN与ODOWN转换过程:
i.每个sentinel实例在启动后,都会和已知的slaves/master以及其他sentinels建立TCP连接,并周期性发送PING(默认为1秒),在交互中,如果redis-server无法在”down-after-milliseconds”时间内响应或者响应错误信息,都会被认为此redis-server处于SDOWN状态.
ii.SDOWN的server为master,那么此时sentinel实例将会向其他sentinel间歇性(一秒)发送”is-master-down-by-addr <ip> <port>”指令并获取响应信息,如果足够多的sentinel实例检测到master处于SDOWN,那么此时当前sentinel实例标记master为ODOWN…其他sentinel实例做同样的交互操作.配置项”sentinel monitor <mastername><masterip> <masterport> <quorum>”,如果检测到master处于SDOWN状态的slave个数达到<quorum>,那么此时此sentinel实例将会认为master处于ODOWN.
每个sentinel实例将会间歇性(10秒)向master和slaves发送”INFO”指令,如果master失效且没有新master选出时,每1秒发送一次”INFO”;”INFO”的主要目的就是获取并确认当前集群环境中slaves和master的存活情况.
经过上述过程后,所有的sentinel对master失效达成一致后,开始failover.
Sentinel与slaves”自动发现”机制:
在sentinel的配置文件中,都指定了port,此port就是sentinel实例侦听其他sentinel实例建立链接的端口.在集群稳定后,最终会每个sentinel实例之间都会建立一个tcp链接,此链接中发送”PING”以及类似于”is-master-down-by-addr”指令集,可用用来检测其他sentinel实例的有效性以及”ODOWN”和”failover”过程中信息的交互.在sentinel之间建立连接之前,sentinel将会尽力和配置文件中指定的master建立连接.sentinel与master的连接中的通信主要是基于pub/sub来发布和接收信息,发布的信息内容包括当前sentinel实例的侦听端口.
哨兵(Sentinel)主要是为了解决在主从复制架构中出现宕机的情况,主要分为两种情况: 1.从Redis宕机 这个相对而言比较简单,在Redis中从库重新启动后会自动加入到主从架构中,自动完成同步数据。在Redis2.8版本后,主从断线后恢复 的情况下实现增量复制。 2.主Redis宕机 这个相对而言就会复杂一些,需要以下2步才能完成 i.第一步,在从数据库中执行SLAVEOF NO ONE命令,断开主从关系并且提升为主库继续服务 ii.第二步,将主库重新启动后,执行SLAVEOF命令,将其设置为其他库的从库,这时数据就能更新回来 由于这个手动完成恢复的过程其实是比较麻烦的并且容易出错,所以Redis提供的哨兵(sentinel)的功能来解决
2.什么是哨兵
Redis-Sentinel是用于管理Redis集群,该系统执行以下三个任务: 1.监控(Monitoring):Sentinel会不断地检查你的主服务器和从服务器是否运作正常 2.提醒(Notification):当被监控的某个Redis服务器出现问题时,Sentinel可以通过API向管理员或者其他应用程序发送通知 3.自动故障迁移(Automatic failover):当一个主服务器不能正常工作时,Sentinel 会开始一次自动故障迁移操作,它会将失效主 服务器的其中一个从服务器升级为新的主服务器,并让失效主服务器的其他从服务器改为复制新的主服务器;当客户端试图连接失效的主 服务器时,集群也会向客户端返回新主服务器的地址,使得集群可以使用新主服务器代替失效服务器
3.Sentinel集群搭建
3.1 Sentinel集群拓扑图
多个哨兵,不仅同时监控主从数据库,而且哨兵之间互为监控
3.2 在保证Redis主从架构集群可用的前提下,复制三份配置文件
进入redis所在目录 # cd /opt/redis/redis-3.2.8 创建6379、6380、6381目录,分别将安装目录下的sentinel.conf拷贝到这三个目录下 # mkdir -p /opt/redis/6379 && cp sentinel.conf /opt/redis/6379/26379.conf # mkdir -p /opt/redis/6380 && cp sentinel.conf /opt/redis/6380/26380.conf # mkdir -p /opt/redis/6381 && cp sentinel.conf /opt/redis/6381/26381.conf
3.3 分别配置哨兵
修改sentinel配置文件 vim /opt/redis/6379/26379.conf 修改内容: # 添加守护进程模式 daemonize yes # 添加指明日志文件名 logfile "/opt/redis/6379/sentinel26379.log" # 修改工作目录 dir "/opt/redis/6379" # 修改启动端口 port 26379 # 关闭保护模式 protected-mode no # 修改sentinel monitor sentinel monitor redis-test-master 192.168.29.128 6379 2 # 将配置文件中mymaster全部替换redis-test-master 依次修改26380,26381配置 说明: redis-test-master:监控主数据的名称,自定义即可,可以使用大小写字母和“.-_”符号 192.168.29.128:监控的主数据库的IP 6379:监控的主数据库的端口 2:最低通过票数
3.4 启动哨兵进程
redis-sentinel /opt/redis/6379/26379.conf 或者 redis-server /opt/redis/6379/26379.conf --sentinel redis-sentinel /opt/redis/6380/26380.conf 或者 redis-server /opt/redis/6380/26380.conf --sentinel redis-sentinel /opt/redis/6380/26380.conf 或者 redis-server /opt/redis/6381/26381.conf --sentinel
3.5 哨兵模式常用命令
1.查看sentinel的基本状态信息 127.0.0.1:26379> INFO 2.列出所有被监视的主服务器,以及这些主服务器的当前状态 127.0.0.1:26379> SENTINEL MASTERS redis-test-master 3.列出给定主服务器的所有从服务器,以及这些从服务器的当前状态 127.0.0.1:26379> SENTINEL SLAVES redis-test-master 4.返回给定名字的主服务器的IP地址和端口号 127.0.0.1:26379> SENTINEL GET-MASTER-ADDR-BY-NAME redis-test-master 5.重置所有名字和给定模式pattern相匹配的主服务器,重置操作清除主服务器目前的所有状态,包括正在执行中的故障转移,并移除目 前已经发现和关联的,主服务器的所有从服务器和Sentinel 127.0.0.1:26379> SENTINEL RESET redis-test-master 6.当主服务器失效时,在不询问其他Sentinel意见的情况下,强制开始一次自动故障迁移,但是它会给其他Sentinel发送一个最新的配 置,其他sentinel会根据这个配置进行更新 127.0.0.1:26379> SENTINEL FAILOVER redis-test-master 7.查看其它哨兵信息 127.0.0.1:26379> SENTINEL sentinels redis-test-master
3.6 查看配置中是否多了如下内容
3.7 Java代码测试哨兵
public class RedisTest { public static void main(String[] args) { Set<String> sentinels = new HashSet<String>(); sentinels.add(new HostAndPort("192.168.29.128", 26379).toString()); sentinels.add(new HostAndPort("192.168.29.128", 26380).toString()); sentinels.add(new HostAndPort("192.168.29.128", 26381).toString()); JedisSentinelPool sentinelPool = new JedisSentinelPool("redis-test-master", sentinels); System.out.println("Current master: " + sentinelPool.getCurrentHostMaster().toString()); Jedis master = sentinelPool.getResource(); master.set("username", "RobertoHuang"); sentinelPool.returnResource(master); Jedis master2 = sentinelPool.getResource(); String value = master2.get("username"); System.out.println("username: " + value); master2.close(); sentinelPool.destroy(); } } 输出结果: Current master: 192.168.29.128:6379 username: RobertoHuang
3.8 测试Sentinel是否正常工作
3.8.1 测试集群环境如下
3.8.2 关闭端口为6379的Redis
3.8.3 查看新的集群架构
3.8.4 重新启动端口号为6379的Redis 查看集群架构
该过程是6379Redis宕机->6380切换成Master->6379和6381切换为6380的SLAVE->6379重新启动->6379为6380SLAVE
3.8.5 Sentinel日志分析
26379日志
26380日志
26381日志
4.Sentinel原理介绍
首先解释2个名词:SDOWN和ODOWN.
SDOWN:subjectively down,直接翻译的为”主观”失效,即当前sentinel实例认为某个redis服务为”不可用”状态.
ODOWN:objectively down,直接翻译为”客观”失效,即多个sentinel实例都认为master处于”SDOWN”状态,那么此时master将处于ODOWN,ODOWN可以简单理解为master已经被集群确定为”不可用”,将会开启failover
SDOWN与ODOWN转换过程:
i.每个sentinel实例在启动后,都会和已知的slaves/master以及其他sentinels建立TCP连接,并周期性发送PING(默认为1秒),在交互中,如果redis-server无法在”down-after-milliseconds”时间内响应或者响应错误信息,都会被认为此redis-server处于SDOWN状态.
ii.SDOWN的server为master,那么此时sentinel实例将会向其他sentinel间歇性(一秒)发送”is-master-down-by-addr <ip> <port>”指令并获取响应信息,如果足够多的sentinel实例检测到master处于SDOWN,那么此时当前sentinel实例标记master为ODOWN…其他sentinel实例做同样的交互操作.配置项”sentinel monitor <mastername><masterip> <masterport> <quorum>”,如果检测到master处于SDOWN状态的slave个数达到<quorum>,那么此时此sentinel实例将会认为master处于ODOWN.
每个sentinel实例将会间歇性(10秒)向master和slaves发送”INFO”指令,如果master失效且没有新master选出时,每1秒发送一次”INFO”;”INFO”的主要目的就是获取并确认当前集群环境中slaves和master的存活情况.
经过上述过程后,所有的sentinel对master失效达成一致后,开始failover.
Sentinel与slaves”自动发现”机制:
在sentinel的配置文件中,都指定了port,此port就是sentinel实例侦听其他sentinel实例建立链接的端口.在集群稳定后,最终会每个sentinel实例之间都会建立一个tcp链接,此链接中发送”PING”以及类似于”is-master-down-by-addr”指令集,可用用来检测其他sentinel实例的有效性以及”ODOWN”和”failover”过程中信息的交互.在sentinel之间建立连接之前,sentinel将会尽力和配置文件中指定的master建立连接.sentinel与master的连接中的通信主要是基于pub/sub来发布和接收信息,发布的信息内容包括当前sentinel实例的侦听端口.
相关文章推荐
- Redis容灾部署哨兵(sentinel)机制配置详解及原理介绍
- Redis高可用方案哨兵机制------ 配置文件sentinel.conf详解
- LVS原理详解及部署之四:keepalived介绍
- Redis Sentinel实现的机制与原理详解
- spark部署、计算模型、内部执行原理、工作机制详解
- Redis容灾部署(哨兵Sentinel)
- Redis Sentinel实现的机制与原理详解
- Tomcat结构介绍,server.xml配置详解,连接器并发,乱码解决,虚拟主机配置,项目部署方式。
- LVS原理详解及部署之四:keepalived介绍
- 推荐:Redis Sentinel实现的机制与原理详解
- Redis Sentinel实现的机制与原理详解
- redis sentinel(哨兵) 配置详解-redis集群管理
- LVS原理详解及部署之四:keepalived介绍
- LVS原理详解及部署之四:keepalived介绍
- LVS原理详解及部署之四:keepalived介绍
- Redis Sentinel实现的机制与原理详解
- 详解Google搜索工作机制原理 解密google算法
- [JavaScript]类之三---详解javascript类继承机制的原理
- X11介绍和/etc/X11/xorg.conf配置详解