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错误。

  • 相关阅读:
    查看文件(或文件夹)被哪个进程使用【文件已在另一程序中打开】
    MinGW32和64位交叉编译环境的安装和使用
    MinGW下编译openssl, json-c
    曲演杂坛--SQLCMD下执行命令失败但没有任何错误提示的坑
    Python2.6下基于rsa的加密解密
    MySQL--使用xtrabackup进行备份还原
    Python--过滤Mysql慢日志
    MySQL--将MySQL数据导入到SQL Server
    Python--命令行参数解析Demo
    python--同一mysql数据库下批量迁移数据
  • 原文地址:https://www.cnblogs.com/liujiliang/p/11202372.html
Copyright © 2011-2022 走看看