redis有哪些集群模式

介绍完他们的模式,现在来分析一下他们的原理:

Redis集群一般有5种:

redis 切换库_Redis切换库redis 切换库_Redis切换库


redis 切换库_Redis切换库


(Monitoring): 哨兵(sentinel) 会不断地检查你的Master和Sle是否运作正常。

1,主从

中间件的作用是将我们需要存入redis中的数据的key通过一套算法计算得出一个值。然后根据这个值找到对应的redis,将这些数据存在这个redis的中。

2,哨兵模式

3,Redis提供的Cluster集群模式(服务端)

4,Jedis sharding集群(客户端sharding)

5,利用中间件,比如豌豆荚的codis等

主从(Master-Sle Replication):

实现主从(Master-Sle Replication)的工作原理:Sle从服务启动并连接到Master之后,它将主动发送一个SYNC命令。Master服务主收到同步命令后将启动后台存盘进程,同时收集所有接收到的用于修改数据集的命令,在后台进程执行完毕后,Master将传送整个数据库文件到Sle,以完成一次完全同步。而Sle从服务在接收到数据库文件数据之后将其存盘并加载到内存中。此后,Master主继续将所有已经收集到的修改命令,和新的修改命令依次传送给Sles,Sle将在本次执行这些数据修改命令,从而达到最终的数据同步。

如果Master和Sle之间的链接出现断连现象,Sle可以自动重连Master,但是在连接成功之后,一次完全同步将被自动执行。

主从配置

修改从的配置文件:sleof ip port

如果设置了密码,就要设置:auth -password

哨兵模式:

该模式是从Redis的2.6版本开始提供的,但是当时这个版本的模式是不稳定的,直到Redis的2.8版本以后,这个哨兵模式才稳定下来,无论是主从模式,还是哨兵模式,这两个模式都有一个问题,不能水平扩容,并且这两个模式的高可用特性都会受到Master主内存的限制。

Sentinel(哨兵)进程是用于redis集群中Master主工作的状态,在Master主发生故障的时候,可以实现Master和Sle的切换,保证系统的高可用。

Sentinel(哨兵)进程的作用

提醒(Notification):当被的某个Redis出现问题时, 哨兵(sentinel) 可以通过 API 向或者其他应用程序发送通知。

自动故障迁移(Automatic failover):当一个Master不能正常工作时,哨兵(sentinel) 会开始一次自动故障迁移作,它会将失效Master的其中一个Sle升级为新的Master, 并让失效Master的其他Sle改为新的Master;当客户端试图连接失效的Master时,集群也会向客户端返回新Master的地址,使得集群可以使用现在的Master替换失效Master。Master和Sle切换后,Master的redis.conf、Sle的redis.conf和sentinel.conf的配置文件的内容都会发生相应的改变,即,Master主的redis.conf配置文件中会多一行sleof的配置,sentinel.conf的目标会随之调换。

Sentinel(哨兵)进程的工作方式

每个Sentinel(哨兵)进程以每秒钟一次的频率向整个集群中的Master主,Sle从以及其他Sentinel(哨兵)进程发送一个 PING 命令。

如果一个实例(instance)距离一次有效回复 PING 命令的时间超过 down-after-milliseconds 选项所指定的值, 则这个实例会被 Sentinel(哨兵)进程标记为主观下线(SDOWN)

如果一个Master主被标记为主观下线(SDOWN),则正在监视这个Master主的所有 Sentinel(哨兵)进程要以每秒一次的频率确认Master主的确进入了主观下线状态

当有足够数量的 Sentinel(哨兵)进程(大于等于配置文件指定的值)在指定的时间范围内确认Master主进入了主观下线状态(SDOWN), 则Master主会被标记为客观下线(ODOWN)

在一般情况下, 每个 Sentinel(哨兵)进程会以每 10 秒一次的频率向集群中的所有Master主、Sle从发送 INFO 命令。

当Master主被 Sentinel(哨兵)进程标记为客观下线(ODOWN)时,Sentinel(哨兵)进程向下线的 Master主的所有 Sle从发送 INFO 命令的频率会从 10 秒一次改为每秒一次。

若没有足够数量的 Sentinel(哨兵)进程同意 Master主下线, Master主的客观下线状态就会被移除。若 Master主重新向 Sentinel(哨兵)进程发送 PING 命令返回有效回复,Master主的主观下线状态就会被移除。

Redis Cluster集群模式

Redis Cluster是一种Sharding技术,3.0版本开始正式提供。

在这个图中,每一个蓝色的圈都代表着一个redis的。它们任何两个之间都是相互连通的。客户端可以与任何一个相连接,然后就可以访问集群中的任何一个。对其进行存取和其他作。

Redis集群数据分片

在redis的每一个上,都有这么两个东西,一个是插槽(slot)可以理解为是一个可以存储两个数值的一个变量这个变量的取值范围是:0-16383。还有一个就是cluster我个人把这个cluster理解为是一个集群管理的插件。当我们的存取的key到达的时候,redis会根据crc16的算法得出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,通过这个值,去找到对应的插槽所对应的,然后直接自动跳转到这个对应的上进行存取作。

Jedis sharding集群

Redis Sharding可以说是在Redis cluster出来之前业界普遍的采用方式,其主要思想是采用hash算法将存储数据的key进行hash散列,这样特定的key会被定为到特定的上。

庆幸的是,Ja Redis客户端驱动Jedis已支持Redis Sharding功能,即ShardedJedis以及结合缓存池的ShardedJedisPool

Jedis的Redis Sharding实现具有如下特点:

采用一致性哈希算法,将key和name同时hashing,然后进行映射匹配,采用的算法是MURMUR_HASH。采用一致性哈希而不是采用简单类似哈希求模映射的主要原因是当增加或减少时,不会产生由于重新匹配造成的rehashing。一致性哈希只影响相邻key分配,影响量小。

为了避免一致性哈希只影响相邻造成分配压力,ShardedJedis会对每个Redis根据名字(没有,Jedis会赋予缺省名字)会虚拟化出160个虚拟进行散列。根据权重weight,也可虚拟化出160倍数的虚拟。用虚拟做映射匹配,可以在增加或减少Redis时,key在各Redis移动再分配更均匀,而不是只有相邻受影响。

ShardedJedis支持keyTagPattern模式,即抽取key的一部分keyTag做sharding,这样通过合理命名key,可以将一组相关联的key放入同一个Redis,这在避免跨访问相关数据时很重要。

利用中间件

常用的中间件有这几种

Twemproxy

Codis

nginx