三十四、Redis扩容集群

约定不等于承诺〃 2022-05-15 03:18 313阅读 0赞

# Redis扩容集群

这里写图片描述
###1、准备新节点
新节点:

  • 集群模式
  • 配置和其他节点统一
  • 启动后是孤儿节点

新增两个节点8006、8007:

  1. #redis基本配置
  2. port 8006
  3. daemonize yes
  4. pidfile /var/run/redis-8006.pid
  5. dir /opt/module/redis-4.0.11/data
  6. logfile "8006.log"
  7. dbfilename "dump-8006.rdb"
  8. #集群开关,默认是不开启集群模式。
  9. cluster-enabled yes
  10. #集群配置文件的名称,每个节点都有一个集群相关的配置文件,持久化保存集群的信息。
  11. #这个文件并不需要手动配置,这个配置文件有Redis生成并更新,每个Redis集群节点需要一个单独的配置文件,
  12. #请确保与实例运行的系统中配置文件名称不冲突
  13. cluster-config-file nodes-8006.conf
  14. #默认情况下,集群全部的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,可以在slot没有全部分配的时候提供服务。
  15. #不建议打开该配置,这样会造成分区的时候,小分区的master一直在接受写请求,而造成很长时间数据不一致。
  16. #就是有一个节点挂了这个集群还能使用
  17. cluster-require-full-coverage no

8007节点一致。

###2、加入集群

#####2.1、节点加入集群的解释

这里写图片描述

这里写图片描述

add-node命令可以将新节点加入集群,节点可以为master,也可以为某个master节点的slave:

  1. add-node new_host:new_port existing_host:existing_port
  2. --slave
  3. --master-id <arg>
  4. new_host:new_port 新增节点的IP及端口
  5. existing_host:existing_port 已知节点的IP及端口
  6. 目的是为了新节点和旧结点间进行meet操作,让整个集群知道新节点进来了

add-node有两个可选参数:

  1. --slave:设置该参数,则新节点以slave的角色加入集群
  2. --master-id:这个参数需要设置了--slave才能生效,--master-id用来指定新节点的master节点。如果不设置该参数,则会随机为节点选择master节点。

add-node流程如下:

  1. 通过load_cluster_info_from_node方法转载集群信息,check_cluster方法检查集群是否健康。
  2. 如果设置了–slave,则需要为该节点寻找master节点。设置了–master-id,则以该节点作为新节点的master,如果没有设置–master-id,则调用get_master_with_least_replicas方法,寻找slave数量最少的master节点。如果slave数量一致,则选取load_cluster_info_from_node顺序发现的第一个节点。load_cluster_info_from_node顺序的第一个节点是add-node设置的existing_host:existing_port节点,后面的顺序根据在该节点执行cluster nodes返回的结果返回的节点顺序。
  3. 连接新的节点并与集群第一个节点握手。
  4. 如果没设置–slave就直接返回ok,设置了–slave,则需要等待确认新节点加入集群,然后执行cluster replicate命令复制master节点。

#####2.2、8006、8007两个节点加入案例:

先启动8006、8007两个节点:

  1. redis-server redis-8006.conf
  2. redis-server redis-8007.conf

先添加一个主节点8006:

  1. ./redis-trib.rb add-node 127.0.0.1:8006 127.0.0.1:8000

结果:

  1. f8b5360af3341fc0f87b9492b4a3d69689ef1072 127.0.0.1:8006@18006 myself,master - 0 1535032508000 0 connected

为8006主节点添加一个从节点8007:

  1. ./redis-trib.rb add-node --slave --master-id f8b5360af3341fc0f87b9492b4a3d69689ef1072 127.0.0.1:8007 127.0.0.1:8000

结果:

  1. [root@redis src]# redis-cli -p 8006 cluster nodes
  2. 7979884fe3020a77decb542b5f841dce99fa555e 127.0.0.1:8007@18007 slave f8b5360af3341fc0f87b9492b4a3d69689ef1072 0 1535032756000 0 connected
  3. f8b5360af3341fc0f87b9492b4a3d69689ef1072 127.0.0.1:8006@18006 myself,master - 0 1535032753000 0 connected

###3、迁移槽和数据
这里写图片描述

这里写图片描述

####3.1、迁移slot及数据语法

reshard命令可以在线把集群的一些slot从集群原来slot负责节点迁移到新的节点,利用reshard可以完成集群的在线横向扩容和缩容。 ``` reshard host:port —slots —to —from —yes —pipeline —timeout ``` 参数解释:

  1. host:port:这个是必传参数,用来从一个节点获取整个集群信息,相当于获取集群信息的入口。
  2. --from <arg>:需要从哪些源节点上迁移slot,可从多个源节点完成迁移,以逗号隔开,传递的是节点的node id
  3. 还可以直接传递--from all,这样源节点就是集群的所有节点,不传递该参数的话,则会在迁移过程中提示用户输入。
  4. --to <arg>slot需要迁移的目的节点的node id,目的节点只能填写一个,不传递该参数的话,则会在迁移过程中提示用户输入。
  5. --slots <arg>:迁移到目标节点的slot总数量,不传递该参数的话,则会在迁移过程中提示用户输入。
  6. --yes:设置该参数,可以在打印执行reshard计划的时候,提示用户输入yes确认后再执行reshard
  7. --timeout <arg>:设置migrate命令的超时时间。
  8. --pipeline <arg>:定义cluster getkeysinslot命令一次取出的key数量,不传的话使用默认值为10

迁移前:

  1. 7979884fe3020a77decb542b5f841dce99fa555e 127.0.0.1:8007@18007 slave f8b5360af3341fc0f87b9492b4a3d69689ef1072 0 1535032756000 0 connected
  2. f8b5360af3341fc0f87b9492b4a3d69689ef1072 127.0.0.1:8006@18006 myself,master - 0 1535032753000 0 connected
  3. a2d034b74c9cec4cd8398e8b23ae2d2ab124d49d 127.0.0.1:8000@18000 slave 9d1cb9fea95f1b205fc7a5ecb20125259765d6ca 0 1535032755246 7 connected
  4. fd17cbac4a5ca1942490d3734a73387341e80fb7 127.0.0.1:8005@18005 slave f5960002d40cf3711eca7146719c4f568115f76c 0 1535032756000 3 connected
  5. 1f0d813205ea17d9b254488215bd48612c0ff2b5 127.0.0.1:8001@18001 master - 0 1535032755000 2 connected 5461-10922
  6. 9d1cb9fea95f1b205fc7a5ecb20125259765d6ca 127.0.0.1:8003@18003 master - 0 1535032757258 7 connected 0-5460
  7. f5960002d40cf3711eca7146719c4f568115f76c 127.0.0.1:8002@18002 master - 0 1535032756252 3 connected 10923-16383
  8. 93ae6d9a42bf485a955d2387b0a0d659e2c12902 127.0.0.1:8004@18004 slave 1f0d813205ea17d9b254488215bd48612c0ff2b5 0 1535032758265 2 connected

所有节点向8006节点迁移1364个slot:

  1. ./redis-trib.rb reshard --slots 4096 --to f8b5360af3341fc0f87b9492b4a3d69689ef1072 --from all --yes 127.0.0.1:8000

槽点迁移后:

  1. 7979884fe3020a77decb542b5f841dce99fa555e 127.0.0.1:8007@18007 slave f8b5360af3341fc0f87b9492b4a3d69689ef1072 0 1535035117200 9 connected
  2. f8b5360af3341fc0f87b9492b4a3d69689ef1072 127.0.0.1:8006@18006 myself,master - 0 1535035113000 9 connected 0-1363 5461-6826 10923-12286
  3. a2d034b74c9cec4cd8398e8b23ae2d2ab124d49d 127.0.0.1:8000@18000 slave 9d1cb9fea95f1b205fc7a5ecb20125259765d6ca 0 1535035116193 7 connected
  4. fd17cbac4a5ca1942490d3734a73387341e80fb7 127.0.0.1:8005@18005 slave f5960002d40cf3711eca7146719c4f568115f76c 0 1535035114000 3 connected
  5. 1f0d813205ea17d9b254488215bd48612c0ff2b5 127.0.0.1:8001@18001 master - 0 1535035114000 2 connected 6827-10922
  6. 9d1cb9fea95f1b205fc7a5ecb20125259765d6ca 127.0.0.1:8003@18003 master - 0 1535035114000 7 connected 1364-5460
  7. f5960002d40cf3711eca7146719c4f568115f76c 127.0.0.1:8002@18002 master - 0 1535035115000 3 connected 12287-16383
  8. 93ae6d9a42bf485a955d2387b0a0d659e2c12902 127.0.0.1:8004@18004 slave 1f0d813205ea17d9b254488215bd48612c0ff2b5 0 1535035115189 2 connected

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L25ld2JpZV85MDc0ODY4NTI_size_16_color_FFFFFF_t_70_pic_center

发表评论

表情:
评论列表 (有 0 条评论,313人围观)

还没有评论,来说两句吧...

相关阅读

    相关 Redis动态扩容

    之前我们已经搭建好了redis集群,如果随着业务量并发的增长,需要实现动态扩容 (还是按照之前模拟搭建集群的方式,我们在同一台机器上,通过不同的端口来搭建成redis集群)

    相关 redis 扩容方案

    team中的一个同学在其项目中使用了Redis作为缓存,将热点数据存放在Redis中。为了提升性能,写Redis时采用了管道的方式,平时使用时,Redis的性能、资源使用都能符

    相关 redis扩容

    导读: a) 此文不介绍集群的部署 b) 扩容有两种方式,一种是纵向扩容:修改maxmemory,一种是横向扩容:增加节点。这里只介绍横向扩容 c) 此文利用r