在主从复制中,数据库分为两类:主数据库(master)和从数据库(slave)。node
当slave启动后,主动向master发送SYNC命令。master接收到SYNC命令后在后台保存快照(RDB持久化)和缓存保存快照这段时间的命令,而后将保存的快照文件和缓存的命令发送给slave。slave接收到快照文件和命令后加载快照文件和缓存的执行命令。redis
为了在主节点子集发生故障或没法与大多数节点通讯时保持可用,Redis Cluster使用主从模型,其中每一个哈希槽具备从1(主节点自己)到N个副本(N个) -1个其余从属节点)。在具备节点A,B,C的示例集群中,若是节点B失败,则集群将没法继续,由于咱们再也不有办法为5501-11000范围内的哈希槽提供服务。算法
可是,在建立集群(或稍后)时,咱们向每一个主节点添加一个从属节点,以便最终集群由做为主节点的A,B,C和做为从属节点的A1,B1,C1组成,若是节点B发生故障,系统将可以继续。数据库
节点B1复制B,而且B发生故障,群集会将节点B1提高为新的主节点,并将继续正常运行。缓存
可是请注意,若是节点B和B1同时失败,则Redis Cluster没法继续运行。安全
解决问题:服务器
解决Redis单例下,数据体量大与数据备份形成的性能瓶颈问题,redis cluster 主从模型很好的解决这个问题。能够将读写操做分离到不一样redis实例上,提升系统的吞吐量 网络
引入新的问题:并发
一、配置重连问题dom
不一样的redis实例,须要不一样的ip和端口对应,若是某个实例下线了,须要从新更改配置进行重连
二、故障转移问题
若是某个结点故障下线,没法进行故障转移,好比某个master下线,对应的slave结点也只能进行读操做,没法进行写操做,替代不了master的功能。
特色以下:
缺点以下:
master节点在主从模式中惟一,若master挂掉,则redis没法对外提供写服务,不具有高可用性。
Redis 的 Sentinel 系统用于管理多个 Redis 服务器(instance)。
监控(Monitoring): Sentinel 会不断地检查你的主服务器和从服务器是否运做正常。
提醒(Notification): 当被监控的某个 Redis 服务器出现问题时, Sentinel 能够经过 API 向管理员或者其余应用程序发送通知。
自动故障迁移(Automatic failover): 当一个主服务器不能正常工做时, Sentinel 会开始一次自动故障迁移操做, 它会进行选举,将其中一个从服务器升级为新的主服务器, 并让失效主服务器的其余从服务器改成复制新的主服务器; 当客户端试图链接失效的主服务器时, 集群也会向客户端返回新主服务器的地址, 使得集群可使用新主服务器代替失效服务器。
解决问题:
Sentinel哨兵模式,确实实现自动故障切换。提供稳定的服务,解决主从模型引入的新问题。
未解决的问题:
在哨兵模式中,仍然只有一个Master节点。当并发写请求较大时,哨兵模式并不能缓解写压力。
特色以下:
从Redis 3.0
以后版本支持 Redis Cluster
集群,Redis Cluster采用无中心结构,每一个节点保存数据和整个集群状态,每一个节点都和其余全部节点链接。
目标:
高性能:
采用了主从复制的机制,Master 节点失效时 Slave 节点自动提高为 Master 节点。若是 Cluster 中有N个 Master 节点,每一个 Master 拥有1个 Slave 节点,那么这个 Cluster 的失效几率为 1/(2*N-1),可用几率为 1-1/(2*N-1)。
高可扩展:
可支持多达1000
个服务节点。随时能够向 Cluster 中添加新节点,或者删除现有节点。Cluster 中每一个节点都与其它节点创建了相互链接
一致性:
Redis Cluster没法保证强一致性。实际上,这意味着在某些状况下,Redis Cluster可能会丢失系统承认给客户端的写入。
Redis Cluster可能丢失写入的第一个缘由是由于它使用异步复制。这意味着在写入期间会发生如下状况:
B在回复客户端以前不会等待B1,B2,B3的确认,由于这会对Redis形成延迟性的延迟,所以,若是您的客户端写了一些东西,B会确认写,可是在崩溃以前崩溃因为可以将写操做发送到其从属服务器,所以一个从属服务器(未接收到写操做)能够升级为主服务器,从而永远丢失该写操做。
特色以下:
密钥空间被划分为16384个插槽,有效地设置了16384个主节点的群集大小的上限(可是建议的最大节点大小约为1000个节点)。
群集中的每一个主节点都处理16384个哈希槽的子集。当没有正在进行的集群从新配置时(即哈希槽从一个节点移动到另外一个节点),该集群是稳定的。当群集稳定时,单个哈希槽将由单个节点提供服务(可是,服务节点能够具备一个或多个从属设备,在发生网络分裂或故障的状况下能够替换该从属设备,而且能够用于扩展)可接受过期数据的读取操做)。
键映射到哈希槽的基本算法:HASH_SLOT = CRC16(key) mod 16384
哈希标签是一种确保在同一哈希槽中分配多个密钥的方法。这用于在Redis Cluster中实现多键操做。
为了实现哈希标签,在某些状况下,密钥的哈希槽以略有不一样的方式计算。若是密钥包含一个“{...}”图案仅之间子 {
和}
,以得到散列时隙被散列。可是,因为可能存在屡次出现{
或}
算法由如下规则很好地指定:
{
字符。}
字符的右{
{
和的第一次出现之间存在一个或多个字符}
。每一个节点在集群中都有惟一的名称。节点名称是160位随机数的十六进制表示形式,是在节点首次启动时得到的(一般使用/ dev / urandom)。节点将其ID保存在节点配置文件中,并将永久使用相同的ID,或者至少在系统管理员未删除节点配置文件或经过CLUSTER RESET命令请求硬重置的状况下使用该ID 。
节点ID用于标识整个集群中的每一个节点。给定节点能够更改其IP地址,而无需也更改节点ID。群集还可以检测IP /端口的更改,并使用在群集总线上运行的八卦协议进行从新配置。
节点ID并非与每一个节点关联的惟一信息,而是惟一始终全局一致的信息。每一个节点还具备如下关联的信息集。一些信息与该特定节点的集群配置详细信息有关,而且最终在整个集群中保持一致。某些其余信息(例如上次对节点执行ping操做)则是每一个节点本地的。
每一个节点都维护着有关群集中其余节点的如下信息:节点ID,节点的IP和端口,一组标志,若是将节点标志为slave
,则该节点的主节点是什么?对节点执行ping操做,最后一次接收到pong时,将显示该节点的当前 配置时期(在本规范的后面部分进行说明),连接状态以及最终服务的哈希槽集。
每一个Redis Cluster节点都有一个额外的TCP端口,用于接收来自其余Redis Cluster节点的传入链接。此端口与用于从客户端接收传入链接的普通TCP端口处于固定偏移量。要得到Redis Cluster端口,应在常规命令端口中添加10000。例如,若是Redis节点正在端口6379上侦听客户端链接,则群集总线端口16379也将打开。
节点到节点的通讯仅使用群集总线和群集总线协议进行:群集协议是由不一样类型和大小的帧组成的二进制协议。未公开记录集群总线二进制协议,由于它不打算供外部软件设备使用该协议与Redis Cluster节点通讯。可是,您能够经过阅读Redis Cluster源代码中的cluster.h
和cluster.c
文件来获取有关集群总线协议的更多详细信息 。
Redis Cluster是一个完整的网格,其中每一个节点都使用TCP链接与其余每一个节点链接。
在N个节点的群集中,每一个节点都有N-1个传出TCP链接和N-1个传入链接。
这些TCP链接始终保持活动状态,而且不会按需建立。当节点但愿对集群总线中的ping作出回应时,会在等待足够长的时间以将节点标记为不可访问以前进行Pong响应,它将尝试经过从头开始从新链接来刷新与该节点的链接。
虽然Redis Cluster节点造成一个完整的网格,可是节点使用八卦协议和配置更新机制以免在正常状况下在节点之间交换太多消息,所以交换的消息数量不是指数级的。
节点始终接受群集总线端口上的链接,即便收到ping节点不受信任,甚至会在收到ping时回复ping。可是,若是不将发送节点视为群集的一部分,则接收节点将丢弃全部其余数据包。
一个节点仅以两种方式将另外一个节点做为群集的一部分:
这意味着只要咱们在任何链接图中加入节点,它们最终将自动造成彻底链接图。这意味着群集可以自动发现其余节点,但前提是存在系统管理员强制创建的信任关系。
这种机制使群集更加健壮,但能够防止更改IP地址或其余与网络相关的事件后,不一样的Redis群集意外混合。