zoukankan      html  css  js  c++  java
  • Redis-Cluster分片扩容

    redis分片
    分片场景
    在业务量相对较小的时候,可以将所有数据都存到一台机器上,只使用redis单机模式,不存在分片问题。如果业务的数据量超过一台物理机器的内存大小时,则会面对扩展问题,需要多台机器去存数据,此时,需要使用到redis的分片技术。

    如何分片
    redis通过分slot的方式进行分片。例如有A、B、C三台机器组成的一个集群。对于集群里面的节点而言,三者会全部覆盖16384个slots(2K字节bit)。对于每一个请求而言,会通过一个hash算法,得到一个2K字节(16384个slots)范围内的一个值,这个值则对应唯一一个节点,这个节点处理该请求。

    扩容场景
    当资源不够,需要增加节点时,需要对slots进行节点的重复分配。而此时,又不能停止对外服务,解决方案如何?
    假设原来有三个节点:A(0至5000),B(5001至10000),C(10001到16383)。现在需要增加第四个节点D节点进来,重新分配如下:

    需要将C节点的slots,从13000~16383的slot迁移到D节点中。redis通过提供一组命令原语完成迁移操作。

    迁移逻辑
    迁移工作,可以使用redis-trib管理软件进行迁移,具体原理如下:
    1、对目标节点,即是D节点发送cluster setslot import 命令,让目标节点做好准备接收迁移准备。
    2、对源节点,即是C节点,发送cluster setslot migrating命令,让源节点做好准备迁移准备。
    3、对源节点,发送cluster getkeysinslot <slot> <count>命令,获取对应slot的最多count个属于slot的key名。
    4、对于步骤3中获取的key,向源节点发送命令migrate <target ip> <target port> <key_name> 0 <timeout> 命令,将被选中的键原子地从源节点迁移到目标节点。
    5、重复上述3,4步骤,直到所有key都迁移成功

    迁移期间访问问题
    当在迁移过程中,如果被访问的slot,可能会有部分key存在在源节点,有部分在目标节点中。
    1、当客户端发送请求到源节点的时候,源节点会查看对应的key是否还在本节点,如果存在,则直接执行命令返回给客户。如果不存在,则会给客户端返回一个ASK错误,指引客户端往正在导入的目标slot去请求对应的key。客户端可以通过返回的ASK错误中的目标节点进行对应KEY的请求。
    2、当客户端发送请求到目标节点时。
    1)如果客户端请求时,带上ASKING标识,由目标节点会执行对应KEY的查询。正常情况下,如果是通过查询源slot,获取ASK错误之后,再到目标节点进行查询的时候,需要带上ASKING标识。
    2)如果客户端请求时,未带上ASKING标识,原由上,对应的slot还属于源节点,则目标节点会拒绝执行KEY查询,会返回一个MOVED错误给客户端,告诉客户端对应的KEY的slot属于源节点。正常情况下,如果第一次请求KEY到了正在迁移的目标节点,则会收到MOVED错误。

  • 相关阅读:
    (转)Hadoop MapReduce链式实践--ChainReducer
    (转)Permission denied: win7下面eclipse上传本地文件到DFS && 运行M/R程序时出现的同样的错误解决方法
    为什么需要注册OCX控件?
    WPF插件开发:使用FrameworkElementAdapters时VS报错的问题
    C# semphore的使用
    C# int可以表示的最大值
    WCF客户端从服务器下载数据
    C# 读取WAV文件(详细)
    C#读取wav文件
    VEMap.DeleteAllShapeLayers 方法
  • 原文地址:https://www.cnblogs.com/liujiliang/p/11202372.html
Copyright © 2011-2022 走看看