Redis Partition分区-翻译

宋鑫    2017-11-14

本文:Redis Partition分区-翻译,原创于:宋鑫的官方网站,转载请注明出处,谢谢。

Redis Partition分区-翻译

为什么分区有用

  1. 能使用更大的内存数据库
  2. 水平扩展集群,使用更多计算机的内核,宽带

分区基本概念

现在有4个Redis实例,R0,R1,R2,R3,可以使用以下方式进行分区

1.根据范围

将ID,如0到1000分到R1,1000到2000分到R2这样。

缺点:
需要一个表映射,还要维护这个表,表也要防止单点故障,性能也会下降。

2.哈希分区

将ID进行哈希取值后,对4(Redis实例个数)取模,余数就是对应的Redis实例。

缺点:
映射关系不能变,挂掉的实例上的数据提供无法服务,无法在线动态添加,删除节点等。
可用一致性hash解决以上部分缺点问题。

预分区哈希

我们可以在刚开始的时候,在一台机器上启用很多个redis实例,比如64个。
然后等数据量增大后,将一台机器上的一半实例迁移到另外一台机器上。
后续可以继续像这样进行扩展。迁移时按照一下步骤:

  1. 新服务器上启动空闲Redis实例
  2. 将数据配置移动到新服务器的新Redis实例上
  3. 停止客户端
  4. 集群配置中更改成新实例的服务器ip
  5. 发送SLAVEOF NO ONE命令到新服务器上的slave实例
  6. 更新客户端配置并重启
  7. 关闭之前服务器上的旧Redis实例

分区的不同实现

  1. 客户端进行分区
    客户端直接计算出,Key应该去哪个实例读写
  2. 代理进行分区
    客户端请求发送到代理,代理选择正确的Redis实例提供服务
  3. 路由查询分区
    客户端发送请求到任意一个Redis实例,这个实例会转发到正确的节点。

Redis分区的缺点

  1. 对不同节点上的几个key的同时操作一般都不支持
  2. 无法支持不同节点上多个key的事务原子性
  3. 不支持单key,大量值的分区
  4. 数据处理更加复杂,比如要处理多个RDB/AOF文件的合并,备份
  5. 添加,删除节点进行扩容,收缩都非常复杂

Redis分区实现方案

  1. Redis Cluster
  2. Twemproxy
  3. 客户端支持的一致性哈希

参考和扩展阅读

Partitioning: how to split data among multiple Redis instances.


文章有用?分享给你的朋友们,让更多的人受益


更多精彩干货,尽请关注我的个人微信公众号
wechat