Redis 学习六 集群之水平扩展和缩减

Redis 3.0 后的版本虽然有了集群的功能, 提供了比哨兵模式更高的性能与可用性, 但是在集群水平的扩展和缩减确实比较麻烦的, 今天就来学习一下 Redis 高可用集群如何做水平扩展与缩减,.
集群实例还是和上一章一样, 采用6个节点分布在三台虚拟机上, 三主三从的模式.

1. 首先启动整个集群

/usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8001/redis.conf
/usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8002/redis.conf
/usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8003/redis.conf
/usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8004/redis.conf
/usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8005/redis.conf
/usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8006/redis.conf

2. 接着链接8001端口的 redis 实例

 /usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan -c -h 192.168.50.88 -p 8001

3. 查看集群的状态

集群状态

从图里可以看出集群运行正常, 三个 master 节点和三个 slave 节点.

  • 8001 端口的实例节点存储 0-5460 这些 hash 槽
  • 8002 端口的实例节点存储 5461-10922 这些 hash 槽
  • 8003 端口的实例节点春初 10923-16383 这些 hash 槽

这三个 master 节点存储的所有 hash 槽组成 redis 集群的存储槽位, slave 节点是每个主节点的备份从节点, 不显示存储槽位.

4. 创建 8007 和 8008 节点

在上面集群基础上再新增一主 8007, 一从 8008. 并且复制 8001 文件夹下的 redis.conf 文件到 8007 和 8008 文件夹下.

[root@local_1 redis-cluster]# mkdir 8007 8008
[root@local_1 redis-cluster]# cd 8001
[root@local_1 8001]# cp redis.conf /usr/local/redis-cluster/8007/
[root@local_1 8001]# cp redis.conf /usr/local/redis-cluster/8008/
[root@local_1 8001]# vim /usr/local/redis-cluster/8007/redis.conf 

接着修改 8007 中的 redis.conf 文件, 使用命令

:/8001

查找redis.conf内所有包含8001的内容, 改为 8007
同理, 针对 8008 也是这样修改, 只是将redis.conf 中的内容改为 8008.
大概有以下四处需要修改.

port: 800x
pidfile /var/run/redis_800x.pid
dir /usr/local/redis-cluster/800x/
cluster-config-file nodes-800x.conf

5. 启动 8007 和 8008 节点

[root@local_1 8001]# /usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8007/redis.conf 
[root@local_1 8001]# /usr/local/src/redis-6.2.14/src/redis-server /usr/local/redis-cluster/8008/redis.conf
[root@local_1 8001]# ps -ef | grep redis
root      6891     1  0 03:43 ?        00:00:05 /usr/local/src/redis-6.2.14/src/redis-server *:8001 [cluster]
root      6898     1  0 03:43 ?        00:00:05 /usr/local/src/redis-6.2.14/src/redis-server *:8004 [cluster]
root      6958     1  0 04:18 ?        00:00:00 /usr/local/src/redis-6.2.14/src/redis-server *:8007 [cluster]
root      6965     1  0 04:18 ?        00:00:00 /usr/local/src/redis-6.2.14/src/redis-server *:8008 [cluster]
root      6980  6706  0 04:19 pts/0    00:00:00 grep --color=auto redis

6. 配置 8007 为主节点

使用 add-node 命令先将8007添加到集群中.

 /usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan --cluster add-node 192.168.50.88:8007 192.168.50.88:8001

前面的ip:port为新增节点,后面的ip:port为已知存在节.执行后输入内容如下

节点新增

接着查看集群状态

 /usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan -c -h 192.168.50.88 -p 8001
新集群状态

可以看到, 8007 暂时还没有进行 slot hash 槽位的分配, 这时需要为新节点手动分配 hash 槽.

7. 手动分配 hash 槽位

使用redis-cli 命令为 8007 分配 hash 槽. 需要找到集群中任意一个主节点, 对其进行重新分片的工作.

/usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan --cluster reshard 192.168.50.88:8001

输出内容如下

>>> Performing Cluster Check (using node 192.168.50.88:8001)
M: a6a10c95785bc6624d0bf7d8102d4985af41ac7f 192.168.50.88:8001
   slots:[0-5460] (5461 slots) master
   1 additional replica(s)
S: 2f75987f31a2b985521bec3a8e42bbb61db910c0 192.168.50.171:8006
   slots: (0 slots) slave
   replicates 43757801edfd97adbbb9f70a7e2a27c55ae75c0e
M: 43757801edfd97adbbb9f70a7e2a27c55ae75c0e 192.168.50.117:8002
   slots:[5461-10922] (5462 slots) master
   1 additional replica(s)
M: 85cbcc1dba0ecd812d4108bad9ed0cf34e6eef67 192.168.50.171:8003
   slots:[10923-16383] (5461 slots) master
   1 additional replica(s)
S: 9909cd1f0b53072c451a3ea98760940c5b179ac6 192.168.50.117:8005
   slots: (0 slots) slave
   replicates a6a10c95785bc6624d0bf7d8102d4985af41ac7f
M: 0485db294587639756bf9376862df4efb8085bf3 192.168.50.88:8007
   slots: (0 slots) master
S: 828314705c97d1dd006122b2a189868e7e177ab4 192.168.50.88:8004
   slots: (0 slots) slave
   replicates 85cbcc1dba0ecd812d4108bad9ed0cf34e6eef67
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)? 600

这里是询问需要多少个槽移动到新的节点上,自己设置,比如600个hash槽. 输入600. 按下回车. 接着会输出

What is the receiving node ID?  0485db294587639756bf9376862df4efb8085bf3

这是询问要把这600个 hash 槽移动到哪个节点上去, 这里需要指定节点ID, 指定的是上面输出内容中 8007 对应的节点 ID 0485db294587639756bf9376862df4efb8085bf3 然后按回车键, 接着继续回询问

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: all

这里输入all 意思是: 从所有主节点 8001, 8002, 8003 中分别抽取相应的槽位数指定到新节点中, 抽取的总槽数位600个. 接着按下回车, 会进行槽位抽取. 最后还会询问, 是否确认开始执行分片任务. 这里输入 yes.

Do you want to proceed with the proposed reshard plan (yes/no)? yes

结束后, 再查看下最新的集群状态.


分片后的集群状态

可以看到, 现在8007 已经有 hash 槽位了, 也就是说可以在 8007 上进行读写数据了, 到此 8007 已经成功加入到集群中成为了主节点.

7. 配置 8008 为 8007 的子节点

同理, 先将 8008 通过 add-node 的形式添加到集群中.

 /usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan --cluster add-node 192.168.50.88:8008 192.168.50.88:8001

然后查看是否添加成功.

8008添加到集群

看到是一个 master 节点, 也没有被分配任何 hash 槽, 需要执行 replicate 命令来指定当前节点(子节点)的主节点ID 是哪个, 那么就要先链接新添加的 8008 节点的客户端, 然后使用集群命令进行操作, 把自己指定到一个主节点8007下.
在 8008 客户端实例下执行.

192.168.50.88:8008> cluster replicate 0485db294587639756bf9376862df4efb8085bf3

0485db294587639756bf9376862df4efb8085bf3 是 8007 的 ID .

然后再使用 cluster nodes查看集群状态. 可以看到已经将8008变为了8007的子节点.

变为8007的子节点

8 删除8008 子节点

使用 del-node 命令删除节点. 指定删除节点ip和端口, 以及节点对应的id.

 /usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan --cluster del-node 192.168.50.88:8008 c7f59d3eaa4135083b697794f971426bcc8ff038

输出

>>> Removing node c7f59d3eaa4135083b697794f971426bcc8ff038 from cluster 192.168.50.88:8008
>>> Sending CLUSTER FORGET messages to the cluster...
>>> Sending CLUSTER RESET SOFT to the deleted node.

再去查看节点状态, 8008这个子节点已经被移除.


删除8008节点

9 删除8007 主节点

最后, 删除之前加入的主节点 8007. 步骤会稍微麻烦, 因为主节点里面有分配 hash 槽. 所以必须先把8007中hash 槽放入到其他的可用主节点中去.然后再进行移除节点操作, 不然会出现数据丢失问题.(目前只能将数据迁移到一个节点上, 暂时做不了平均分配功能.) 执行命令如下.

/usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan --cluster reshard 192.168.50.88:8007

输出内容

>>> Performing Cluster Check (using node 192.168.50.88:8007)
M: 0485db294587639756bf9376862df4efb8085bf3 192.168.50.88:8007
   slots:[0-198],[5461-5661],[10923-11121] (599 slots) master
M: 85cbcc1dba0ecd812d4108bad9ed0cf34e6eef67 192.168.50.171:8003
   slots:[11122-16383] (5262 slots) master
   1 additional replica(s)
M: 43757801edfd97adbbb9f70a7e2a27c55ae75c0e 192.168.50.117:8002
   slots:[5662-10922] (5261 slots) master
   1 additional replica(s)
S: 828314705c97d1dd006122b2a189868e7e177ab4 192.168.50.88:8004
   slots: (0 slots) slave
   replicates 85cbcc1dba0ecd812d4108bad9ed0cf34e6eef67
S: 9909cd1f0b53072c451a3ea98760940c5b179ac6 192.168.50.117:8005
   slots: (0 slots) slave
   replicates a6a10c95785bc6624d0bf7d8102d4985af41ac7f
M: a6a10c95785bc6624d0bf7d8102d4985af41ac7f 192.168.50.88:8001
   slots:[199-5460] (5262 slots) master
   1 additional replica(s)
S: 2f75987f31a2b985521bec3a8e42bbb61db910c0 192.168.50.171:8006
   slots: (0 slots) slave
   replicates 43757801edfd97adbbb9f70a7e2a27c55ae75c0e
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.
How many slots do you want to move (from 1 to 16384)?  600

询问要迁移多少槽位. 这里输入 600, 然后回车, 会接着询问要迁移到那里, 这里指定 8001 主节点的ID.

What is the receiving node ID? a6a10c95785bc6624d0bf7d8102d4985af41ac7f

接着输入数据源, 也就是 8007 的ID.

Please enter all the source node IDs.
  Type 'all' to use all the nodes as source nodes for the hash slots.
  Type 'done' once you entered all the source nodes IDs.
Source node #1: 0485db294587639756bf9376862df4efb8085bf3

回车后, 再输入 done 开始生成迁移计划.

Source node #2:  done

最后输入 yes, 开始迁移

Do you want to proceed with the proposed reshard plan (yes/no)? yes

然后再看一下集群状态.


槽位迁移

发现8007 下已经没有任何槽位信息了, 说明迁移成功.

最后直接使用 del-node 命令删除 8007节点即可.

 /usr/local/src/redis-6.2.14/src/redis-cli -a zhangsan --cluster del-node 192.168.50.88:8007 0485db294587639756bf9376862df4efb8085bf3

最后查询一次集群状态.


完全删除

大功告成

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,185评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,445评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,684评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,564评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,681评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,874评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,025评论 3 408
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,761评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,217评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,545评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,694评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,351评论 4 332
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,988评论 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,778评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,007评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,427评论 2 360
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,580评论 2 349

推荐阅读更多精彩内容