Redis的部署模式
前言
今天开会讲到我们使用的是Redis的Cluster模式,发现对redis的部署模式还不是非常清晰。Redis有很多种部署模式,如:master/slave(主从)模式、sentinel(哨兵)模式、cluster(集群)模式等,这里一一搞清楚。
1、单节点模式
主要用于平时自己试玩,如写个小demo。
2、master/slave模式
向master节点写入数据,然后同步到slave节点。
一个master可以有多个slave,但一个slave只能有一个master。
2.1、主从模式的作用:
- 通过在从节点上冗余一份数据来保证主节点故障时数据高可用
- 读写分离:在从节点读;主节点写
2.2、关于容灾:
- slave节点挂了:不影响其他slave节点的读,也不影响master节点的写和读。
- master节点挂了:不影响slave的读;只是master不再提供写服务,也不会在slave里进行选主,直到master节点恢复后才再次提供写服务。
master挂了,redis集群写操作就停了,这就是master/slave模式的致命缺点。
3、sentinel模式
sentinel模式,即哨兵。就是说主从模式中主挂了后,slave不能选主,那么我就安排一个或多个sentinel来做,sentinel发现master节点挂了后,sentinel就会从slave中重新选举一个master。
sentinel模式是建立在主从模式的基础上的,如果只有一个redis节点,那么sentinel就没有任何意义。
当master节点挂了后,sentinel会在slave中选一个作为master,并修改他们的配置文件,其他slave的配置文件也会被修改,比如slaveof属性会指向新的master。当Master节点重新启动后,它将不再是Master而是作为slave来接收新的master节点的同步数据。
sentinel因为是一个进程,也有挂掉的可能,所以sentinel也会启动多个,形成一个sentinel集群。
一个sentinel或sentinel集群可以管理多个主从redis。sentinel最好不要和redis部署在同一个机器,不如redis服务器挂了,sentinel也挂了。
当使用sentinel模式时,客户端不是直接连redis,而是连sentinel的IP和Port,由sentinel来提供具体的可提供服务的redis, 这样当master节点挂掉后,sentinel就会感知,并将新的master节点提供给使用者。
semtinel模式基本可以满足一般生产的需求,具备高可用性。但当数据量过大到一台服务器存放不下的时候,主从模式或sentinel模式就不能满足需求了,这个时候需要对存储的数据进行分片,将数据存储到多个Redis实例中,这时需要用到cluster模式。
4、cluster模式
随着业务的增加,使用sentinel模式,不可避免的要对redis进行扩容。redis sentinel模式的水平扩容一致都是程序员心中的痛点,因为水平扩容牵涉到数据的迁移。迁移过程一方面要保证自己业务是可用的,一方面要尽量不丢失数据,所以数据能不迁移就不迁移,这时redis cluster模式应运而生了。
redis cluster模式是redis的分布式解决方案,当遇到单机内存、并发、流量等瓶颈时,可以采用cluster模式,达到负载均衡的目的。分布式集群,首先要解决吧整个数据集按照分区规则映射到多个节点的问题,即把数据集花费到多个节点,每个节点负责整个数据的一个子集。redis cluster采用哈希分区规则中的虚拟槽分区。虚拟槽分区巧妙地使用了分区空间,使用分段度良好的哈希函数,把所有的数据映射到一个固定范围内的整数集合,整数定义为槽(slot)。redis cluter的slot的范围是0~16383。槽是集群内数据管理和迁移的基本单位。采用大范围的槽的目的是为了方便数据的拆分和集群的扩展,每个节点负责一定数量的槽。redis cluster的所有key根据hash函数映射到0~16383,计算公式:lost = CRC16(key) & 16383。每个实节点负责维护一部分槽以及槽所映射的key/value数据。
下图真心了一个五个节点构成的集群,每个节点评价大约负责3276个槽,以及通过计算公式映射到对应节点的对应槽的过程。
cluster模式总结:
cluster可以说是sentinel模式和主从模式的结合体,通过cluster可以实现主从和master重选功能,所以如果配置两个副本和三个分片的话,就需要6个redis实例。因为redis的数据是根据一定规则分片到cluster不同机器的,当数据量过大时,可以新增机器进行扩容。
cluster模式适合数据量巨大的缓存需求,当数据量不是很大使用sentinel模式即可。