Redis Cluster集群搭建
搭建一个redis Cluster至少需要两个redis实例,我使用的是 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005 六个redis实例
修改配置项
打开所有实例的redis.conf,修改以下配置项并启动所有的实例。
port 7001
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
集群环境构建
一、使用客户端命令
1.命令
//集群(cluster)
CLUSTER INFO 打印集群的信息
CLUSTER NODES 列出集群当前已知的所有节点(node),以及这些节点的相关信息。
//节点(node)
CLUSTER MEET <ip> <port> 将 ip 和 port 所指定的节点添加到集群当中,让它成为集群的一份子。
CLUSTER FORGET <node_id> 从集群中移除 node_id 指定的节点。
CLUSTER REPLICATE <node_id> 将当前节点设置为 node_id 指定的节点的从节点。
CLUSTER SAVECONFIG 将节点的配置文件保存到硬盘里面。
//槽(slot)
CLUSTER ADDSLOTS <slot> [slot ...] 将一个或多个槽(slot)指派(assign)给当前节点。
CLUSTER DELSLOTS <slot> [slot ...] 移除一个或多个槽对当前节点的指派。
CLUSTER FLUSHSLOTS 移除指派给当前节点的所有槽,让当前节点变成一个没有指派任何槽的节点。
CLUSTER SETSLOT <slot> NODE <node_id> 将槽 slot 指派给 node_id 指定的节点,如果槽已经指派给另一个节点,那么先让另一个节点删除该槽>,然后再进行指派。
CLUSTER SETSLOT <slot> MIGRATING <node_id> 将本节点的槽 slot 迁移到 node_id 指定的节点中。
CLUSTER SETSLOT <slot> IMPORTING <node_id> 从 node_id 指定的节点中导入槽 slot 到本节点。
CLUSTER SETSLOT <slot> STABLE 取消对槽 slot 的导入(import)或者迁移(migrate)。
//键 (key)
CLUSTER KEYSLOT <key> 计算键 key 应该被放置在哪个槽上。
CLUSTER COUNTKEYSINSLOT <slot> 返回槽 slot 目前包含的键值对数量。
CLUSTER GETKEYSINSLOT <slot> <count> 返回 count 个 slot 槽中的键。
2. 添加节点到集群中去
连接到其中的一个redis实例(127.0.0.1:7000),执行以下命令
127.0.0.1:7000>cluster meet 127.0.0.1:7001
127.0.0.1:7000>cluster meet 127.0.0.1:7002
127.0.0.1:7000>cluster meet 127.0.0.1:7003
127.0.0.1:7000>cluster meet 127.0.0.1:7004
127.0.0.1:7000>cluster meet 127.0.0.1:7005
再执行以下语句,查看当前的节点数目
127.0.0.1:7000> cluster nodes
8eff8fd6273daa6c030a4239f7d5cffb025b720c 127.0.0.1:7000 myself,master - 0 0 3 connected
cbbc8039fed4eb699fa60d4205b463cabc15d95c 127.0.0.1:7001 master - 0 1461222806314 5 connected
aab79155d3b4f12346bd64f0f24c954d62f75a55 127.0.0.1:7002 master - 0 1461222805312 4 connected
9bffed9df65bb085af540d907cc35e2bf6b313a6 127.0.0.1:7003 master - 0 1461222807316 1 connected
f21c7d98f3858c0528e93f998a3ba4c19c0db280 127.0.0.1:7004 master - 0 1461222804308 0 connected
a4616441a6f54fdd82971e9b109f02db4522b165 127.0.0.1:7005 master - 0 1461222806815 2 connected
有myselef master标示的是当前节点
3. 槽分配
127.0.0.1:7000>cluster addsolts 0 1 2...
采用命令行的方法进行槽分配时,有一点不太友好,就是你如需要一一指出分配给改节点的所有槽,这一点太麻烦了,要是改节点分配的槽过多,有好几百的话,就会很麻烦。但是还有一种简便的方法,就是修改nodes.conf的槽区间。
二、使用redis-trib.rb
1.安装redis-trib
redis-trib运行在ruby环境中,需要安装ruby。安装的过程如下。依次执行如下命令,即可完成安装。
[root@redis1 src]# yum install ruby
[root@redis1 src]# yum install rubygems
[root@redis1 src]# gem install redis
2.构建集群
[root@redis1 src]#./src/redis-trilb.rdb create --replicas 1 127.0.0.1:7000 127.0.0.1:7001 127.0.0.1:7002 127.0.0.1:7003 127.0.0.1:7004 127.0.0.1:7005
选项–replicas 1 表示我们希望为集群中的每个主节点创建一个从节点
3.新增节点
[root@redis1 redis-3.0.0]# ./src/redis-trilb.rdb add-node 127.0.0.1:7006 127.0.0.1:7000
127.0.0.1:7006是新增的节点
127.0.0.1:7000是集群中的任意一个节点。
通过查看cluster nodes list 可以发现此时新增的节点(192.168.6.4:7000)还没有分配槽。
4.分配槽
[root@redis1 src]#./src/redis-trib.rb reshard 127.0.0.1:7006
输入以上内容后,在客户端会出现以下信息
How many slots do you want to move (from 1 to 16384)? 1000 //设置slot数1000
What is the receiving node ID? 03ccad2ba5dd1e062464bc7590400441fafb63f2 //新节点node 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:all // all 表示全部节点重新洗牌,也可以输入你需要重新分配的节点id 再输入 done
Do you want to proceed with the proposed reshard plan (yes/no)? yes //确认重新分
完成以上操作后,一个新的并可以正常使用的节点就添加到集群中去了。
5. 给新增的节点添加从节点
[root@redis1 redis-3.0.0]#./src/redis-trib.rb add-node --slave --master-id 711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb 127.0.0.1:7007 127.0.0.1:7000
711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb 是前面添加的节点,可以通过cluster nodes 查看
127.0.0.1:7007 是新增的从节点
127.0.0.1:7000为集群中任意一个节点即可
6. 删除节点
6.1 删除从节点
[root@redis1 redis-3.0.0]#./src/redis-trib.rb del-node 127.0.0.1:7007 '0f4c5f090f573d9465a7c0542e9632ecd831080b'
127.0.0.1:7007 待删除的节点
0f4c5f090f573d9465a7c0542e9632ecd831080b 待删除的节点id
6.2 删除主节点
6.2.1 重新分配槽
删除主节点之前,需要重新分配槽,把待删除节点的槽移动到别的节点上去
[root@redis1 redis-3.0.0]#./src/redis-trib.rb reshard 127.0.0.1:7006 (待删除节点的)
输入以上命令后控制台会出现以下内容
How many slots you want to move (from 1 to 16384)? 1000 //被删除master的所有slot数量
What is the receiving node ID? 5d8ef5a7fbd72ac586bef04fa6de8a88c0671052 //接收6378节点slot的master
Please enter all the source node IDs.
Type 'all' all the nodes source nodes the hash slots.
Type 'done' once you entered all the source nodes IDs.
Source node #1:03ccad2ba5dd1e062464bc7590400441fafb63f2 //被删除master的node-id
Source node #2:done
Do you want to proceed with the proposed reshard plan (yes/no)? yes //取消slot后,reshard
6.2.2 删除节点
[root@redis1 redis-3.0.0]# ./src/redis-trib.rb del-node 127.0.0.1:7006 '711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb'
127.0.0.1:7006 待删除的主节点
711e17d3f8b0a107d9b4b88ce920c06e4e3a85cb 待删除的节点id
7.检测状态
通过以下命令可以检测当前集群的分布状态
[root@redis1 redis-3.0.0]# ./src/redis-trib.rb check 127.0.0.1:7000
127.0.0.1:7000集群中的任意节点
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。