切片集群:数据增多了,是该加内存还是加实例?

数据量大之后,redis响应时间变长

  • 使用 RDB 进行持久化时,Redis 会 fork 子进程来完成,fork 操作的用时和 Redis 的数据量是正相关的
  • fork 在执行时会阻塞主线程。数据量越大,fork 操作造成的主线程阻塞的时间越长

切片集群

  • 启动多个 Redis 实例组成一个集群,然后按照一定的规则,把收到的数据划分成多份,每一份用一个实例来保存

redis数据量增多的两种方案

  • 纵向扩展 scale up: 升级单个 Redis 实例的资源配置,包括增加内存容量、增加磁盘容量、使用更高配置的 CPU。纵向扩展会受到硬件和成本的限制
  • 横向扩展 scale out:横向增加当前 Redis 实例的个数。但是需要解决数据存储和访问的问题

数据库和实例对应的分布关系

  • Redis Cluster 方案, 采用无中心化的模式(无proxy,客户端与服务端直连)切片集群的一种实现方式
  • Twemproxy、Codis都是中心化模式(增加Proxy层)

Redis Cluster方案

  • Redis Cluster 方案采用哈希槽(Hash Slot),来处理数据和实例之间的映射关系
  • 一个切片集群共有 16384 个哈希槽,这些哈希槽类似于数据分区,每个键值对都会根据它的 key,被映射到一个哈希槽中
  • 用CRC16算法对key进行计算出一个16bit的值,然后模16384,得出槽的编号,然后根据槽的编号存储到对应的实例
  • 使用 cluster create 命令创建集群,此时,Redis 会自动把这些槽平均分布在集群实例上
  • 可以使用 cluster addslots 命令手动分配哈希槽
  • 在手动分配哈希槽时,需要把 16384 个槽都分配完,否则 Redis 集群无法正常工作
  • Redis 实例会把自己的哈希槽信息发给和它相连接的其它实例,来完成哈希槽分配信息的扩散。当实例之间相互连接后,每个实例就有所有哈希槽的映射关系
  • 客户端和集群实例建立连接后,实例就会把哈希槽的分配信息发给客户端
  • 客户端收到哈希槽信息后,会把哈希槽信息缓存在本地。当客户端请求键值对时,会先计算键所对应的哈希槽,然后就可以给相应的实例发送请求

Redis Cluster重定向机制

  • 客户端给一个实例发送数据请求后,实力上并没有对应的数据,客户端会给一个新实例发送操作命令,告诉客户端去哪个实例上查询
  • 如果实例上并没有这个键值对映射的哈希槽,那么,这个实例就会给客户端返回下面的 MOVED 命令响应结果,这个结果中就包含了新实例的访问地址 (error) MOVED 13320 172.16.19.5:6379,客户端在收到moved命令后,会更新本地缓存
  • 如果slot正在从一个实例迁移到另一个实例,客户端访问了这个slot,客户端就会收到一条 ASK 报错信息 (error) ASK 13320 172.16.19.5:6379
  • 客户端需要先给 172.16.19.5 这个实例发送一个 ASKING 命令。让这个实例允许执行客户端接下来发送的命令。然后,客户端再向这个实例发送 GET 命令,以读取数据
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值