三十4、Redis扩容集群

                                          Redis扩容集群

这里写图片描述

一、准备新节点

新节点:css

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

新增两个节点800六、8007:node

#redis基本配置
port 8006
daemonize yes
pidfile /var/run/redis-8006.pid
dir /opt/module/redis-4.0.11/data
logfile "8006.log"
dbfilename "dump-8006.rdb"


#集群开关,默认是不开启集群模式。
cluster-enabled yes

#集群配置文件的名称,每一个节点都有一个集群相关的配置文件,持久化保存集群的信息。
#这个文件并不须要手动配置,这个配置文件有Redis生成并更新,每一个Redis集群节点须要一个单独的配置文件,
#请确保与实例运行的系统中配置文件名称不冲突
cluster-config-file nodes-8006.conf

#默认状况下,集群所有的slot有节点负责,集群状态才为ok,才能提供服务。设置为no,能够在slot没有所有分配的时候提供服务。
#不建议打开该配置,这样会形成分区的时候,小分区的master一直在接受写请求,而形成很长时间数据不一致。
#就是有一个节点挂了这个集群还能使用
cluster-require-full-coverage no

8007节点一致。redis

二、加入集群

2.一、节点加入集群的解释

这里写图片描述

这里写图片描述


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

add-node  new_host:new_port existing_host:existing_port
          --slave           --master-id <arg>


new_host:new_port                    新增节点的IP及端口
existing_host:existing_port          已知节点的IP及端口

目的是为了新节点和旧结点间进行meet操做,让整个集群知道新节点进来了

add-node有两个可选参数:ide

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


add-node流程以下:ui

  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.二、800六、8007两个节点加入案例:


先启动800六、8007两个节点:spa

redis-server redis-8006.conf
redis-server redis-8007.conf

先添加一个主节点8006:3d

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

结果:code

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

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

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

结果:

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

三、迁移槽和数据

这里写图片描述

这里写图片描述

3.一、迁移slot及数据语法


reshard命令能够在线把集群的一些slot从集群原来slot负责节点迁移到新的节点,利用reshard能够完成集群的在线横向扩容和缩容。

reshard          host:port
                  --slots <arg>                   --to <arg>                   --from <arg>                   --yes                   --pipeline <arg>                   --timeout <arg>

参数解释:

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

迁移前:

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

全部节点向8006节点迁移1364个slot:

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

槽点迁移后:

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