手动搭建分片集群

  • 一、启动
  • 1、启动集群
  • 2、手动分片
  • 3、测试
  • 其他、查看帮助有哪些功能



我们可以自己组建一套多节点的cluster,配置节点个数,主对应的副本机个数,分配槽位,如果某一个挂了,通过哨兵重新选举出一台主机,即我们可以自己手动搭建一套多主多从的集群,分片起到了扩容的效果,规避了redis单机容量有限的局限性,多个副本机避免了单机故障问题,满足可用性。

一、启动

1、启动集群

  • 编辑把端口改为8000开始,保存退出
[root@localhost create-cluster]# vi create-cluster 

#!/bin/bash

# Settings
PORT=8000
TIMEOUT=2000
NODES=6
REPLICAS=1
  • 在redis安装目录的utils下 ,按照readme里面的提示执行此脚本
./create-cluster start  -- 启动集群

redis-cli -cluster redis-cli -cluster create_数据

2、手动分片

执行,集群已经启动,创建客户端访问的集群,可以指定服务端不同的ip ,端口必须同配置后启动的端口保持一致。

redis-cli --cluster create   127.0.0.1:8001  127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 127.0.0.1:8006 --cluster-replicas 1

这是预分配提示,点yes才会真实分配,换成不同的ip这就是一个分布式集群了。

redis-cli -cluster redis-cli -cluster create_f5_02


输入yes [OK] All 16384 slots covered.

3、测试

[root@localhost create-cluster]# redis-cli -c -p 8001
127.0.0.1:8001> set k1 abc
-> Redirected to slot [12706] located at 127.0.0.1:8003
OK
127.0.0.1:8003> get k1
"abc"

同样,如果想让支持事务,那就人为把数据都存到一个机器上,通过redis提供的{}把这些相同表示的key存放到一台机器里,以满足对事务的要求,一般redis这种集群都是用作缓存而非数据库。

其他、查看帮助有哪些功能

一、查看帮助都有哪些功能

redis-cli --cluster help
显然下面的自动分片

这种分片集群,有一点要注意,可能会发生数据倾斜不均衡比较严重的时候,那就需要对集群做数据迁移:
1、可以分散到各个机器上一些
2、也可以加节点,让新节点共同分担数据。
为此redis提供了数据迁移的功能:
reshard ,就是重新分配slot的,用作数据迁移。
rebalance是均衡一下数据,以及加节点是 add-node,删节点 del-node.
此外如果迁移完数据之后,还可以查看集群消息:info

[root@localhost create-cluster]# redis-cli --cluster help
Cluster Manager Commands:
  create         host1:port1 ... hostN:portN
                 --cluster-replicas <arg>
  check          host:port
                 --cluster-search-multiple-owners
  info           host:port
  fix            host:port
                 --cluster-search-multiple-owners
  reshard        host:port
                 --cluster-from <arg>
                 --cluster-to <arg>
                 --cluster-slots <arg>
                 --cluster-yes
                 --cluster-timeout <arg>
                 --cluster-pipeline <arg>
                 --cluster-replace
  rebalance      host:port
                 --cluster-weight <node1=w1...nodeN=wN>
                 --cluster-use-empty-masters
                 --cluster-timeout <arg>
                 --cluster-simulate
                 --cluster-pipeline <arg>
                 --cluster-threshold <arg>
                 --cluster-replace
  add-node       new_host:new_port existing_host:existing_port
                 --cluster-slave
                 --cluster-master-id <arg>
  del-node       host:port node_id
  call           host:port command arg arg .. arg
  set-timeout    host:port milliseconds
  import         host:port
                 --cluster-from <arg>
                 --cluster-copy
                 --cluster-replace
  help           

For check, fix, reshard, del-node, set-timeout you can specify the host and port of any working node in the cluster.

二、数据迁移示例

-- reshard数据迁移,后面接的是8002,显然这台机器数据太多,需要迁移出一些到别的机器上
 [root@localhost create-cluster]# redis-cli --cluster reshard 127.0.0.1:8002  -- 随意输入一个节点,会带出下面的信息
>>> Performing Cluster Check (using node 127.0.0.1:8002)
M: c9647c8d2280e5abdbea93d38d89503f76ba20d6 127.0.0.1:8002
   slots:[5461-10922] (5462 slots) master
   13807411724459966465 additional replica(s)
S: 1b35d45ae18cf811140b8c510b64673d2b2e6680 127.0.0.1:8004
   slots: (0 slots) slave
   replicates 4ccb10a1b8904226e2190cbb64b6d9c1da1bb8fe
S: 474cf54d7736983f865b6693582cd97418c3135b 127.0.0.1:8005
   slots: (0 slots) slave
   replicates 3933358917aa41f513bebe01841ac87657e2b16e
M: 4ccb10a1b8904226e2190cbb64b6d9c1da1bb8fe 127.0.0.1:8003
   slots:[10923-16383] (5461 slots) master
   613248251000258561 additional replica(s)
S: 799422720be986055ffbf4126a85d1e6140a96ac 127.0.0.1:8006
   slots: (0 slots) slave
   replicates c9647c8d2280e5abdbea93d38d89503f76ba20d6
M: 3933358917aa41f513bebe01841ac87657e2b16e 127.0.0.1:8001
   slots:[0-5460] (5461 slots) master
   613249144353456129 additional replica(s)
[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)? 2200  -- 输入想要迁移的槽点数2200(数据分布在槽点上,也就是数据)
-- 这里输入要迁移到哪台机器上,切记,输入的是主节点的机器id,如果输入从节点的机器id会失败并退出;
-- 这里你也可以新启动一个节点,然后输入这个新节点的id
What is the receiving node ID? 799422720be986055ffbf4126a85d1e6140a96ac   -- 8003的id
*** The specified node (799422720be986055ffbf4126a85d1e6140a96ac) is not known or not a master, please retry.
[root@localhost create-cluster]# 3933358917aa41f513bebe01841ac87657e2b16e
-bash: 3933358917aa41f513bebe01841ac87657e2b16e: command not found
-- 我输入了主节点
What is the receiving node ID? 4ccb10a1b8904226e2190cbb64b6d9c1da1bb8fe
-- 这里会提示是把数据分配到这个id机器上,还是给所有机器都分摊点,如果分摊完毕可以直接输入done表示分摊完毕。
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: 输入了8001机器的id ,回车后输入了done回车,即分配完毕,这个位置也可以输入all

数据从8001 到8003,下到上,1到3
....
Moving slot 2193 from 127.0.0.1:8001 to 127.0.0.1:8003: 
Moving slot 2194 from 127.0.0.1:8001 to 127.0.0.1:8003: 
Moving slot 2195 from 127.0.0.1:8001 to 127.0.0.1:8003: 
Moving slot 2196 from 127.0.0.1:8001 to 127.0.0.1:8003: 
Moving slot 2197 from 127.0.0.1:8001 to 127.0.0.1:8003: 
Moving slot 2198 from 127.0.0.1:8001 to 127.0.0.1:8003: 
Moving slot 2199 from 127.0.0.1:8001 to 127.0.0.1:8003: 
[root@localhost create-cluster]# redis-cli --cluster info 127.0.0.1:8001
127.0.0.1:8001 (39333589...) -> 0 keys | 3261 slots | 1 slaves.
127.0.0.1:8002 (c9647c8d...) -> 0 keys | 5462 slots | 1 slaves.
127.0.0.1:8003 (4ccb10a1...) -> 1 keys | 7661 slots | 1 slaves.
[OK] 1 keys in 3 masters.



测试2  all
[root@localhost create-cluster]# redis-cli --cluster info 127.0.0.1:8003
127.0.0.1:8003 (4ccb10a1...) -> 1 keys | 5575 slots | 1 slaves.
127.0.0.1:8002 (c9647c8d...) -> 0 keys | 6923 slots | 1 slaves.
127.0.0.1:8001 (39333589...) -> 0 keys | 3886 slots | 1 slaves.
[OK] 1 keys in 3 masters.

redis-cli --cluster reshard 127.0.0.1:8002  -- 发现这儿的机器,随意写一个机子即可,没特殊含义,只是把下面数据带出来而已
......
What is the receiving node ID?输入8001的id
....
Source node #1:输入all就得到以下结果了,从all里的机器槽点,都分配给8001一部分
....
Moving slot 11700 from 127.0.0.1:8002 to 127.0.0.1:8001: 
.....
Moving slot 11700 from 127.0.0.1:8003 to 127.0.0.1:8001: 
[root@localhost create-cluster]# redis-cli --cluster info 127.0.0.1:8003
127.0.0.1:8003 (4ccb10a1...) -> 1 keys | 4683 slots | 1 slaves.
127.0.0.1:8002 (c9647c8d...) -> 0 keys | 5815 slots | 1 slaves.
127.0.0.1:8001 (39333589...) -> 0 keys | 5886 slots | 1 slaves.
[OK] 1 keys in 3 masters.
-- 查看槽点具体分配情况: redis-cli --cluster check 127.0.0.1:8002
[root@localhost create-cluster]# redis-cli --cluster check 127.0.0.1:8002
127.0.0.1:8002 (c9647c8d...) -> 0 keys | 5815 slots | 1 slaves.
127.0.0.1:8003 (4ccb10a1...) -> 1 keys | 4683 slots | 1 slaves.
127.0.0.1:8001 (39333589...) -> 0 keys | 5886 slots | 1 slaves.
[OK] 1 keys in 3 masters.
0.00 keys per slot on average.
>>> Performing Cluster Check (using node 127.0.0.1:8002)
M: c9647c8d2280e5abdbea93d38d89503f76ba20d6 127.0.0.1:8002
   slots:[1108-1113],[5000-7885],[8000-10922] (5815 slots) master
   13802169253018730497 additional replica(s)
S: 1b35d45ae18cf811140b8c510b64673d2b2e6680 127.0.0.1:8004
   slots: (0 slots) slave
   replicates 4ccb10a1b8904226e2190cbb64b6d9c1da1bb8fe
S: 474cf54d7736983f865b6693582cd97418c3135b 127.0.0.1:8005
   slots: (0 slots) slave
   replicates 3933358917aa41f513bebe01841ac87657e2b16e
M: 4ccb10a1b8904226e2190cbb64b6d9c1da1bb8fe 127.0.0.1:8003
   slots:[11701-16383] (4683 slots) master
   639232219025506305 additional replica(s)
S: 799422720be986055ffbf4126a85d1e6140a96ac 127.0.0.1:8006
   slots: (0 slots) slave
   replicates c9647c8d2280e5abdbea93d38d89503f76ba20d6
M: 3933358917aa41f513bebe01841ac87657e2b16e 127.0.0.1:8001
   slots:[0-1107],[1114-4999],[7886-7999],[10923-11700] (5886 slots) master
   639233112378703873 additional replica(s)
[OK] All nodes agree about slots configuration.
>>> Check for open slots...
>>> Check slots coverage...
[OK] All 16384 slots covered.

以上测试,我们可以手动分配槽点指定到某台机器,但是具体分配哪些个槽点这个人工干预不了。
数据迁移:
1、如果想停止某台机器,可通过此功能达到迁移数据的作用
2、如果整体数据量都偏多,可以新开一节点,然后其他节点都往这个节点里分配点槽点,
3、迁移过程需要手动操作。