1.主从复制ReplicationRedis支持主从复制模式。在主从复制模式下,Redis节点分为主节点(也称master)和从节点(也称slave)两种角色。该模式集群由一个主节点和多个从节点组成。原理:Master会同步数据给slave,slave不会同步数据给master。当slave启动时,它会连接到master同步数据。这是一个典型的分布式读写分离模型。我们可以使用master来处理写操作,slave来提供读操作。这样可以有效减少单机的并发访问数。实现主从复制模式非常简单。主节点不需要做任何修改,直接启动服务即可。从节点需要修改redis.conf配置文件,增加配置:slaveof<主节点ip地址><主节点端口号>,例如master的ip地址为192.168.200.129,端口号为6379,那么slave只需要在redis.conf文件中配置slaveof192.168.200.1296379即可。分别连接主节点和从节点,测试发现主节点的写操作,从节点立即可以看到相同的数据。但是在slave节点上进行写操作时,提示READONLYYoucan'twriteagainstareadonlyslave,不能向slave节点写入数据。现在我们可以通过这种方式配置多个从节点进行读操作,主节点进行写操作,实现读写分离。2.哨兵sentinel[?sent?nl]哨兵(sentinel)是redis集群中用来监控Master状态的工具。也是一个独立运行的进程。它是Redis的高可用性解决方案。sentinel哨兵模式在redis2.4以后的版本中已经集成。Sentinel可以监控一个或多个redismaster服务,以及这些master服务的所有slave服务;当一个master服务下线时,它会自动将master下的一个slave服务升级为master服务,以取代下线的master服务,请求的处理继续进行,剩下的slave开始从新的master复制数据。redis安装完成后会有一个redis-sentinel文件,这是启动sentinel的脚本文件,还有一个sentinel.conf文件,这是sentinel的配置文件。Sentinel工作模式:注:可能有同学会有疑惑。现在我们已经基于sentinel实现了高可用,但是如果sentinel挂了怎么办呢?其实sentinel本身也可以实现集群,也就是说sentinel也是高可用的。故障转移如下图所示:3.Redis内置集群集群RedisCluster是Redis的内置集群,是Redis3.0推出的实现方案。在Redis3.0之前,是没有这种内置集群的。RedisCluster是一种没有中心节点的集群架构,依靠Gossip协议来协调和自动修复集群的状态。Redis集群在设计的时候就考虑到了去中心化和中间件,也就是说集群中的每个节点都是平等的关系,是平等的,每个节点保存自己的数据和整个集群的状态。每个节点都连接到所有其他节点,并且这些连接保持活动状态,这确保了我们只需要连接到集群中的任何一个节点就可以从其他节点获取数据。Redis集群集群架构图如下:Hash槽用于分配数据。需要注意的是,在这种集群模式下,集群中每个节点存储的数据并不是全部数据,而只是一部分数据。那么数据是如何合理分配到不同节点的呢?Redis集群使用一种称为哈希槽(hashslot)的方法来分配数据。Redis集群默认分配16384个槽。当我们设置一个key时,我们会使用CRC16算法取模得到它所属的slot,然后将key分配给hashslot区间内的节点。具体算法为:CRC16(key)%16384。假设现在有三个节点组成了一个集群,分别是:A、B、C,它们可以是一台机器上的三个端口,也可以是三个不同的服务器。那么如果通过hashslot的方式分配16384个slot,三个节点承担的slot区间为:节点A覆盖0-5460节点B覆盖5461-10922那么节点C覆盖10923-16383那么,现在我们需要设置一个key,比如my_name:setmy_nameiceshi根据redis集群的hashslot算法:CRC16('my_name')%16384=2412。那么这个key的存储就会分配给节点A。Redis集群的主从模式为了保证数据的高可用,redis集群增加了主从模式。一个主节点对应一个或多个从节点。主节点提供数据访问,从节点从主节点拉取数据备份,当master节点挂掉时,会选择这些slave节点中的一个作为master节点,从而保证集群不会挂掉。redis集群加入主从模式后的效果如下:
