Java|Redis多种部署方式及交互原理

前言 Redis作为目前使用较为广泛的中间件之一,大量使用于缓存、分布式锁、业务排行榜甚至是持久化的场景中,性能及可用性是我们关注的重点,本文主要探索Redis部署的几种方式及交互原理。
部署方式 单节点 单节点(standalone)模式即在操作系统实例中单节点启动Redis进程如下图,暴露对应的服务端口号即可。缺点也比较明显,既无法保证高可用,也无法很好的支持横向扩展(只能增加宿主机配置)。
Java|Redis多种部署方式及交互原理
文章图片

主从部署 主从(master-slave)部署的方式如下图,一个master节点和n个slave节点,其中slave也可以有更多的slave节点,主从之间同步分为全量或增量。全量同步:master节点通过BGSAVE生成对应的RDB文件,然后发送给slave节点,slave节点接收到写入命令后将master发送过来的文件加载并写入;增量同步:即在master-slave关系建立开始,master每执行一次数据变更的命令就会同步至slave节点。; 在主从架构中,客户端针对写请求转发至master节点,读请求多走slave节点。相对于单节点部署,主从架构提高了Redis的性能。
Java|Redis多种部署方式及交互原理
文章图片

哨兵 哨兵(Sentinel)部署方式如下图,分别有哨兵集群与Redis的主从集群,哨兵作为操作系统中的一个监控进程,对应监控每一个Redis,如果master服务异常(ping pong其中节点没有回复且超过了一定时间),就会多个哨兵之间进行确认,如果超过一半确认服务异常,则对master服务进行下线处理,并且选举出当前一个slave节点来转换成master节点;如果slave节点服务异常,也是经过多个哨兵确认后,进行下线处理;相对于前面的单节点、主从,哨兵的部署方式使redis集群有了高可用的特性,但横向扩展能力依然是强依赖于宿主机。
Java|Redis多种部署方式及交互原理
文章图片

集群 Redis官方集群(cluster)部署方式如下图,属于“去中心化”的一种方式,多个master节点保存整个集群中的全部数据,而数据根据key进行crc-16校验算法进行散列,将key散列成对应16383个slot,而Redis cluster集群中每个master节点负责不同的slot范围。每个master节点下还可以配置多个slave节点,同时也可以在集群中再使用sentinel哨兵提升整个集群的高可用性。
Java|Redis多种部署方式及交互原理
文章图片

【Java|Redis多种部署方式及交互原理】对于Redis客户端来读写数据的流程,如常用的jedis客户端,首先获取集群中机器列表,然后随机向其中一个master节点发起数据读写请求,master节点接收到后,如果该key的校验后slot为自身的范围则直接进行操作,否则给jedis客户端返回一个重定向的异常,客户端便会连接正确的节点进行接下来的操作。
而由于Redis cluster中每个master节点对应的hash slot都是在集群建立时定死的即预分片效果,因此在对集群中增加节点、移除节点时注意相应的操作顺序(个人觉得Redis集群是分布式hash一致性算法的最佳实践场景,没有使用这个,但是官方推荐使用一些插件和开源代理中有相应的实现方案):
增加节点

  1. 增加对应机器配置;
  2. 分配对应slot;
  3. 进行slot数据迁移;
移除节点
  1. 将对应节点slot key进行迁移至目标slot的节点;
  2. 移除机器;
除此之外,由于集群中每个节点负责不同的slot,因此之前的单节点、主从等方式部署的集群中我们使用的批量操作Mget、Mset等不再集群模式下支持。Redis cluster部署模式很好的解决了Redis横向扩展的瓶颈问题。
阿里云Redis集群 我们当前使用的是阿里云集群,使用方式既可以是代理模式,也可以直连集群中的节点。代理模式在我们使用的视角中就相当于是非集群的直连master节点,并且也可以支持批量操作命令如Mget、Mset等,不用在使用jedis客户端时使用集群方式连接,并且与对应key slot节点的交互也全都proxy代理完成。
Java|Redis多种部署方式及交互原理
文章图片

阿里云集群不仅在横向扩展方面有着优秀的快速升配方案,而且在可用性上,有着跨机房、地域的灾备方案,即master节点下的slave节点会在多处部署,master出现异常时进行替换。
结语 本文探索了Redis 多种部署方式及其优劣性,为以后的选型及中间件配置选取可以提供相应参考。
参考 阿里云文档:
https://help.aliyun.com/document_detail/52228.html?spm=a2c4g.11186623.2.21.4ca07d2cKuofBV#section-h69-izd-531
redis多种部署实践:
https://blog.csdn.net/xxssyyyyssxx/article/details/72831909#comments_12414256
redis官网集群模式:
https://redis.io/topics/cluster-tutorial/

    推荐阅读