redis高可用方案

自带 哨兵机制 Sentinel

开源方案 html

Codis/Twemproxynode

http://blog.720ui.com/2016/redis_action_04_cluster/redis

https://blog.csdn.net/shmiluwei/article/details/51958359app

Sentinel的做用:

A、Master 状态监测负载均衡

B、若是Master 异常,则会进行Master-slave 转换,将其中数据最新的一个Slave做为Master,将以前的Master做为Slave ui

C、Master-Slave切换后,master_redis.conf、slave_redis.conf和sentinel.conf的内容都会发生改变,即master_redis.conf中会多一行slaveof的配置,sentinel.conf的监控目标会随之调换 阿里云

 

Sentinel的工做方式:

1):每一个Sentinel以每秒钟一次的频率向它所知的Master,Slave以及其余 Sentinel 实例发送一个 PING 命令 
2):若是一个实例(instance)距离最后一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel 标记为主观下线。 
3):若是一个Master被标记为主观下线,则正在监视这个Master的全部 Sentinel 要以每秒一次的频率确认Master的确进入了主观下线状态。 
4):当有足够数量的 Sentinel(大于等于配置文件指定的值)在指定的时间范围内确认Master的确进入了主观下线状态, 则Master会被标记为客观下线 
5):在通常状况下, 每一个 Sentinel 会以每 10 秒一次的频率向它已知的全部Master,Slave发送 INFO 命令 
6):当Master被 Sentinel 标记为客观下线时,Sentinel 向下线的 Master 的全部 Slave 发送 INFO 命令的频率会从 10 秒一次改成每秒一次 
7):若没有足够数量的 Sentinel 赞成 Master 已经下线, Master 的客观下线状态就会被移除。 
若 Master 从新向 Sentinel 的 PING 命令返回有效回复, Master 的主观下线状态就会被移除。spa

https://www.cnblogs.com/jaycekon/p/6237562.html.net

 

高可用方案 Sentinel 结点至少须要3台集群,由于Redis的设定是只有当超过50%的Sentinel进程能够连通并投票选取新的master时,才会真正发生主从切换。htm

多个Sentinel能够引入虚拟IP(Virtual IP,VIP)简化客户端访问复杂度

https://mp.weixin.qq.com/s/76veueX7a2vfUjmZP5Pg5g

 

注意:redis单个结点最好内存不要设置过大,由于master挂掉以后,选举出新的master后,其它slave结点须要挂靠在新的master结点上,此时slave的redis结点会清空内容,从master上复制rdb文件来全量同步,这样若是内存过大,同步时间太长。

https://mp.weixin.qq.com/s/fpupqLp-wjR8fQvYSQhVLg

 

阿里云 Redis 容灾体系介绍

https://www.jianshu.com/p/ac8718f5aecd?utm_campaign=hugo&utm_medium=reader_share&utm_content=note&utm_source=weixin-timeline&from=timeline&isappinstalled=0

 

 

redis sharding方案

  Redis Cluster 是Redis的集群实现,内置数据自动分片机制,集群内部将全部的key映射到16384=16*1024个Slot中,集群中的每一个Redis Instance负责其中的一部分的Slot的读写。集群客户端链接集群中任一Redis Instance便可发送命令,当Redis Instance收到本身不负责的Slot的请求时,会将负责请求Key所在Slot的Redis Instance地址返回给客户端,客户端收到后自动将原请求从新发往这个地址,对外部透明。一个Key到底属于哪一个Slot由crc16(key) % 16384 决定。

  关于负载均衡,集群的Redis Instance之间能够迁移数据,以Slot为单位,但不是自动的,须要外部命令触发。

  关于集群成员管理,集群的节点(Redis Instance)和节点之间两两按期交换集群内节点信息而且更新,从发送节点的角度看,这些信息包括:集群内有哪些节点,IP和PORT是什么,节点名字是什么,节点的状态(好比OK,PFAIL,FAIL,后面详述)是什么,包括节点角色(master 或者 slave)等。

  关于可用性,集群由N组主从Redis Instance组成。主能够没有从,可是没有从 意味着主宕机后主负责的Slot读写服务不可用。一个主能够有多个从,主宕机时,某个从会被提高为主,具体哪一个从被提高为主,协议相似于Raft,参见这里。如何检测主宕机?Redis Cluster采用quorum+心跳的机制。从节点的角度看,节点会按期给其余全部的节点发送Ping,cluster-node-timeout(可配置,秒级)时间内没有收到对方的回复,则单方面认为对端节点宕机,将该节点标为PFAIL状态。经过节点之间交换信息收集到quorum个节点都认为这个节点为PFAIL,则将该节点标记为FAIL,而且将其发送给其余全部节点,其余全部节点收到后当即认为该节点宕机。从这里能够看出,主宕机后,至少cluster-node-timeout时间内该主所负责的Slot的读写服务不可用。

 

http://blog.csdn.net/shmnh/article/details/72868328