Redis sentinel and cluster

Redis的部署方式有三种,单机,哨兵监控下的主从复制 和集群

单机不说,如果出现宕机的情况,服务就挂了。

Redis是多线程还是单线程的?

分模块说,Redis作为内存数据库的瓶颈是内存和网络,而不再cpu,Redis的核心——执行命令是单线程的,Redis4中加入了后台删除()的功能,Redis6Bata版本中对于I/O的操作支持多线程(原来是IO多路复用)。

https://www.cnblogs.com/caohongchang/p/13285948.html

sentinel

Redis-sentinel本身也是一个独立运行的进程,它能监控多个master-slave集群,发现master宕机后能进行切换。

sentinel哨兵功能实现如下:
(1)monitoring: 监控redis是否正常运行,每一秒发送一次发送PING 命令
(2)notification:通知application错误信息
(3)failover: 故障切换,当某个master死掉,选择另外一个slave升级为master,更新master-slave关系。多个sentinel先选举领头Sentinel,在通过slaveof no one 设置主服务器,通过slaveof [address port]设置从服务器。如果下线的原master重新上线,sentinel可以把它设置为新的从服务器。
(4)configurationprovider:client通过sentinel获取redis地址,并在failover时更新地址

sentinels and slaves autodiscovery(redis2.8及以上)
配置文件中只配置master地址,slave地址和sentinel地址可以自动发现。
(1)sentinels——sentinel之间通过redis pub/sub交换信息获得。
(2)slaves——询问master获得。

Redis可以通过slaveof no one 设置主服务器,通过slaveof [address prot] 设置从服务器,address和port 是主服务器的地址。

redis-cluster(集群模式)

Redis集群是Redis提供的分布式数据库方案,集群通过分片(sharding)的方式l来进行数据共享,并提供复制和故障转移功能。

通过meet操作来建立集群,节点之间会相互通信,meet操作是节点之间完成相互通信的基础,meet操作有一定的频率和规则。

把整个数据按照规则分成多个子集存储在多个不同几点上,每个节点负责自己整个数据的一部分。

Redis Cluster并没有采用一致性HASH,而是采用哈希分区规则中的虚拟槽分区。

槽是集群内数据管理和迁移的基本单位,共有16384个槽位,每一个实节点负责维护一部分槽以及槽所映射的键值数据。所有的键根据哈希函数映射到0 ~ 16383,计算公式:slot = CRC16(key) & 16384。至于为什么是16384 – 2的14次方?

为什么redis集群的最大槽数是16384个?

why redis-cluster use 16384 slots?

可以把Redis想象成分区表,单机Redis只维护一个表,Redis集群维护16384个分区表,插入数据时会根据slot = CRC16(key) & 16384来决定Key Value应该存在哪个槽。

关于集群节点宕机

集群中用于处理槽的节点是主节点,集群中每一个主机点会有复制主节点的从节点。从节点在主节点下线时,代替下线的节点处理命令请求。

从节点升为主节点,有选举机制产生(投票),集群中N个主节点进行投票,从节点获得票数大于等于N/2+1,则升为主节点,否则重新投票。

集群进入fail状态的必要条件

某个主节点和所有从节点全部挂掉

如果集群超过半数以上master挂掉,无论是否有slave,集群都会进入fail状态。

如果集群任意master挂掉,且这个master没有slave

- 下一页