Redis集群原理与容器化部署

1、集群原理简介1.1、什么是集群?什么是分区?
集群简单的说就是将同一个服务部署在不同的机器上 , 从而提高服务的横向扩展能力 。
分区就是将数据分布在多个实例(服务器)上 , 让每一个实例都只存储一部分数据 , 从而达到增大总的存储数据量的效果 。
1.2、为什么要实用集群?
为什么要实用集群呢?主从+哨兵模式不是已经很好了吗 , 已经高可用了吗?
但是主从+哨兵虽然解决了高可用问题 , 但是没有解决数据分区存储问题 。因为我们存储的数据量大小取决于主服务器的存储容量 。那么集群模式将数据分区存储就是为了实现数据存储量可以横向扩展 。
1.3、数据分区的优点与缺点?
优点
 

  • 1、性能提升
    • 单机redis的网络I/O能力和计算能力是有限的 , 将请求分发到多台机器 , 充分利用多台机器的计算能力和带宽 , 有助于redis总体的服务能力 。
  • 2、存储能力横向扩展
    • 即使Redis的存储能力已经能满足大部分需求 , 但是随着key的数量不断增加 , 单台机器受限于机器本身的存储容量 , 将数据分散到多台机器存储使得Redis服务可以横向扩展 。
 
缺点
 
  • 1、管理更加复杂
    • Redis数据分散到多台机器 , 管理起来自然会更加的复杂 。还涉及到数据迁移等工作 , 增大了操作难度 。
  • 2、分散后的数据节点宕机使得集群缺少部分数据(可以使用主从解决)
1.4、分区方式 
一般按照分区键(ID)进行分区 , 分区方式一般有范围分区和Hash分区方式 。
1.4.1、范围分区
根据ID数字额范围分区 , 比如:1-10000 , 100001-20000...90001-100000 。每个范围分到不同得Redis实例中 。
优点
【Redis集群原理与容器化部署】实现简单 , 方便迁移和扩展
缺点
数据分布不均匀 , 可以少数节点占据了大多数的数据 。性能损失比较严重 。
非数字型的key , 比如UUID就无法使用 , 当然 , 可以使用雪花算法代替ID的生成 。雪花算法是数值且能够排序 。
1.4.2、Hash分区
利用简单的hash算法就可以 , 比如根据key求hash值 , 对Redis实例的总数执行取模操作 , 从而计算落在哪个Redis实例上 。
优点
支持所有key类型, key分布均匀, 性能比较好
缺点
迁移复杂 , 需要重新计算 , 扩展较差(但是可以利用一致性hash环拓展) 。而Hash算法在客户端链接服务端时 , 被广泛使用(比如:JedisPool) 。
1.5、客户端分区
对于给定一个key, 客户端可以直接选择正确的节点进行读写 。许多客户端都实现了客户端分区(比如:RedisPool) , 当然 , 也可以自己编码是现实 。
Redis集群原理与容器化部署

文章插图
 
客户端有很多种计算key的落地到那个Redis实例的算法 , 这个时最普通的hash算法 。
1.5.1、普通hash算法
计算公式:hash(key)%N;hash:可以采用hash算法 , 比如CRC32、CRC16等;N:是Redis主机个数 。
优点
数据分布均匀 , 实现简单
缺点
节点数量固定 , 扩展的话需要重新计算hash 。
查询必须采用分片的key来查询 , 一旦key变化了 , 数据就查询不出来了 , 所以不要轻易改变key的分区 。
1.5.1、一致性hash算法1.5.1.1、算法简介
普通hash是对主机数量取模 , 而一致性hash是对2^32(4 294 967 296)取模(一个足够大的hash表) 。
我们把2^32想象成一个圆 , 就像钟表一样 , 钟表的圆可以理解成由60个点组成的圆 , 而此处我们把这个圆想象成由2^32个点组成的圆 , 示意图如下:
Redis集群原理与容器化部署

文章插图


推荐阅读