redis-主从模式加哨兵模式

 

redis安装请看:http://www.linux91.cn/c/linux___centos7_%E4%B8%8B_%E5%AE%89%E8%A3%85redis4_0

这章节只介绍redis主从配置跟哨兵配置,不会说明redis的安装 

 

redis主从模式

概要流程

  1. slave服务器配置master的连接信息(slaveof属性);
  2. slave连接上master,发送psync指令
  3. master判断是否为全量复制:如果是全量复制,则进入下一步;否则可以看增量复制的子流程。
  4. master启动一个后台线程,生成一份RDB快照文件,同时将从客户端收到的所有写命令缓存在内存中。
  5. RDB文件生成完毕之后,master会将RDB发送给slave。
  6. slave收到RDB文件之后,清空自己的旧数据,然后持久化到本地磁盘,再从本地磁盘加载到内存中。 7
  7. 最后salve node保存了RDB文件之后,master会将内存中缓存的写命令发送给slave,slave也会同步这些数据。
  8. 如果slave node开启了AOF,那么会立即执行BGREWRITEAOF,重写AOF 

增量复制子流程:如果全量复制过程中,master-slave网络连接断掉,salve重新连接master时,会触发增量复制;master直接从自己的backlog中获取部分丢失的数据,发送给slave node,默认backlog就是1MB;msater就是根据slave发送的psync中的offset来从backlog中获取数据的

断点续传:从redis 2.8开始,就支持主从复制的断点续传,如果主从复制过程中,网络连接断掉了,那么可以接着上次复制的地方,继续复制下去,而不是从头开始复制一份 master node会在内存中常见一个backlog,master和slave都会保存一个replica offset还有一个master id,offset就是保存在backlog中的。如果master和slave网络连接断掉了,slave会让master从上次的replica offset开始继续复制;如果没有找到对应的offset,那么就会执行一次full resynchronization。

无磁盘化复制:master在内存中直接创建rdb,然后发送给slave,不会在自己本地落地磁盘了 repl-diskless-sync repl-diskless-sync-delay,等待一定时长再开始复制,因为要等更多slave重新连接过来

过期key处理:slave不会过期key,只会等待master过期key。如果master过期了一个key,或者通过LRU淘汰了一个key,那么会模拟一条del命令发送给slave。

 

主从模式主要配置在于redis.conf配置文件

bind 192.168.0.20   ##本机IP
protected-mode yes
tcp-backlog 1024    ##连接数
daemonize yes       ##后台运行

slaveof 192.168.0.21 6379   ##这行配置,只需从配置,配置主的IP跟端口

 

启动的时候,主先启动,在启动从

 

 

 

 

redis哨兵模式

任务:

有了主从复制的实现以后,如果想对主服务器进行监控,那么在redis2.6以后提供了一个"哨兵"的机制。顾名思义,哨兵的含义就是监控redis系统的运行状态。可以启动多个哨兵,去监控redis数据库的运行状态。其主要功能有两点:   

  1. 监控所有节点数据库是否在正常运行。
  2. master数据库出现故障时,可以自动通过投票机制,从slave节点中选举新的master,实现将从数据库转换为主数据库的自动切换。    一个一主多从的Redis系统中,可以使用多个哨兵进行监控任务以保证系统足够稳健。此时,不仅哨兵会同时监控主数据库和从数据库,哨兵之间也会相互监控。在这里,建议大家哨兵至少部署3个,并且使用奇数个哨兵。    Redis的哨兵(sentinel) 系统用于管理多个 Redis 服务器,该系统执行以下三个任务:
    1. 监控(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Slave是否运作正常。
    2. 提醒(Notification):当被监控的某个 Redis出现问题时, 哨兵(sentinel) 可以通过 API 向管理员或者其他应用程序发送通知。
    3. 自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移操作,它会将失效Master的其中一个Slave升级为新的Master, 并让失效Master的其他Slave改为复制新的Master; 当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用Master代替失效Master。 

 

工作原理:

哨兵(sentinel) 是一个分布式系统,你可以在一个架构中运行多个哨兵(sentinel) 进程,这些进程使用流言协议(gossipprotocols)来接收关于Master是否下线的信息,并使用投票协议(agreement protocols)来决定是否执行自动故障迁移,以及选择哪个Slave作为新的Master.

每个哨兵(sentinel) 会向其它哨兵(sentinel)、master、slave定时发送消息,以确认对方是否”活”着,如果发现对方在指定时间(可配置)内未回应,则暂时认为对方已挂(所谓的”主观认为宕机” Subjective Down,简称sdown). 若“哨兵群”中的多数sentinel,都报告某一master没响应,系统才认为该master"彻底死亡"(即:客观上的真正down机,Objective Down,简称odown),通过一定的vote算法,从剩下的slave节点中,选一台提升为master,然后自动修改相关配置.

虽然哨兵(sentinel) 释出为一个单独的可执行文件 redis-sentinel ,但实际上它只是一个运行在特殊模式下的 Redis 服务器,你可以在启动一个普通 Redis 服务器时通过给定 --sentinel 选项来启动哨兵(sentinel).

哨兵(sentinel) 的一些设计思路和zookeeper非常类似   

  1. 监控 
    1. sentinel会每秒一次的频率与之前创建了命令连接的实例发送PING,包括主服务器、从服务器和sentinel实例,以此来判断当前实例的状态。down-after-milliseconds时间内PING连接无效,则将该实例视为主观下线。之后该sentinel会向其他监控同一主服务器的sentinel实例询问是否也将该服务器视为主观下线状态,当超过某quorum后将其视为客观下线状态。      
    2. 当一个主服务器被某sentinel视为客观下线状态后,该sentinel会与其他sentinel协商选出零头sentinel进行故障转移工作。每个发现主服务器进入客观下线的sentinel都可以要求其他sentinel选自己为领头sentinel,选举是先到先得。同时每个sentinel每次选举都会自增配置纪元,每个纪元中只会选择一个领头sentinel。如果所有超过一半的sentinel选举某sentinel领头sentinel。之后该sentinel进行故障转移操作。      
    3. 如果一个Sentinel为了指定的主服务器故障转移而投票给另一个Sentinel,将会等待一段时间后试图再次故障转移这台主服务器。如果该次失败另一个将尝试,Redis Sentinel保证第一个活性(liveness)属性,如果大多数Sentinel能够对话,如果主服务器下线,最后只会有一个被授权来故障转移。 同时Redis Sentinel也保证安全(safety)属性,每个Sentinel将会使用不同的配置纪元来故障转移同一台主服务器。     
  2. 故障转移      
    1. 首先是从主服务器的从服务器中选出一个从服务器作为新的主服务器。选点的依据依次是:网络连接正常->5秒内回复过INFO命令->10*down-after-milliseconds内与主连接过的->从服务器优先级->复制偏移量->运行id较小的。选出之后通过slaveif no ont将该从服务器升为新主服务器。      
    2. 通过slaveof ip port命令让其他从服务器复制该信主服务器。      
    3. 最后当旧主重新连接后将其变为新主的从服务器。注意如果客户端与就主服务器分隔在一起,写入的数据在恢复后由于旧主会复制新主的数据会造成数据丢失。      
    4. 故障转移成功后会通过发布订阅连接广播新的配置信息,其他sentinel收到后依据配置纪元更大来更新主服务器信息。Sentinel保证第二个活性属性:一个可以相互通信的Sentinel集合会统一到一个拥有更高版本号的相同配置上

哨兵机制是有缺点的

  1. 主从服务器的数据要经常进行主从复制,这样造成性能下降。
  2. 当主服务器宕机后,从服务器切换成主服务器的那段时间,服务是不能用的。

 

 

哨兵配置

配置 sentinel.conf 哨兵配置文件

bind 192.168.0.20 ##IP
daemonize yes  ##后台运行
sentinel monitor mymaster 192.168.0.21 6379 1  ##哨兵监控的master
sentinel down-after-milliseconds mymaster 5000  ##master或者slave多少时间(默认30秒)不能使用标记为down状态
sentinel failover-timeout mymaster 9000   ##若哨兵在配置值内未能完成故障转移操作,则任务本次故障转移失败。
sentinel auth-pass mymaster redispass  ##如果redis配置了密码,那这里必须配置认证,否则不能自动切换

 

启动哨兵

/usr/local/redis/src/redis-sentinel /usr/local/redis/sentinel.conf

 

 

 

 

 

转载请注明原文链接:redis-主从模式加哨兵模式

发表评论:

共有 0 条评论

 Top