本次环境测试是一台ip为192.168.2.11的虚拟机
如果不清楚Redis的基础知识,可以先浏览 《Redis简单介绍与安装》
一、创建文件夹,并拷贝实例
mkdir redis-cluster
cp -r redis01 redis02
cp -r redis01 redis03
cp -r redis01 redis04
cp -r redis01 redis05
cp -r redis01 redis06
二、修改配置文件redis.cnf
vim redis.conf
port 6379 #端口唯一即可
cluster-enabled yes
cluster-config-file nodes.conf #文件名唯一即可
cluster-node-timeout 5000
appendonly yes
每个实例都要修改
本次测试6个实例的基本配置如下:
实例名 | 端口 | cluster-config-file名称 |
---|---|---|
redis01 | 6379 | nodes-6379.conf |
redis02 | 6380 | nodes-6380.conf |
redis03 | 6381 | nodes-6381.conf |
redis04 | 6382 | nodes-6382.conf |
redis05 | 6383 | nodes-6383.conf |
redis06 | 6384 | nodes-6384.conf |
三、获取ruby脚本
在源码目录redis/src下找到redis-trib.rb并复制到步骤1创建的文件夹中
四、执行ruby脚本
1) yum install ruby #ruby运行环境
2) yum install rubygems #ruby管理器
3) gem install redis
4) 启动所有的reid实例(可设置shell脚本统一启动),脚本截图如下:
5) ./redis-trib.rb create --replicas 1 ip:port1 ip:port2 ... ip:port6
本次测试执行命令:
./redis-trib.rb create --replicas 1 192.168.2.11:6379 192.168.2.11:6380 192.168.2.11:6381 192.168.2.11:6382 192.168.2.11:6383 192.168.2.11:6384
五、测试
redis01/bin/redis-cli -h 192.168.2.11 -p 6379
截图中看到,在端口为6379的实例中无法执行插入的操作,这是因为username的hash信息在6381上,当我们登陆到端口为6381的实例上时,可以正常设置数据。既然是集群,不管在哪个实例上都应该可以设置数据。因此,为了实现这个目的,我们应该在通过客户端连接实例的时候,设置重定向配置 -c 。
本次测试执行命令:
redis01/bin/redis-cli -h 192.168.2.11 -p 6379 -c
六、新增集群节点
根据步骤1和2配置新的redis实例,并启动
./redis-trib.rb add-node ip:port(新增节点) ip:port(集群中任意节点)
本次测试执行命令:
./redis-trib.rb add-node 192.168.2.11:6385 192.168.2.11:6379
如果在执行命令时,报错:
[ERR] Node 192.168.2.11:6385 is not empty. Either the node already knows other nodes (check with CLUSTER NODES) or contains some key in database 0.
解决:
先删除nodes-6385.conf文件,再连接上192.168.2.11:6385实例,键入flushdb清空数据库,再执行新增节点的命令。
七、添加插槽数
如果新增的集群节点为主节点且该主节点的插槽数为0,需要设置插槽数来保存数据。
本次测试过程中,由于在上一步的操作中,新增的节点都是从节点,因此没法模拟该步骤的操作,以下是执行的命令
./redis-trib reshard 192.168.2.11:6379 #从192.168.2.11:6379主节点中分配插槽数
执行后会提示需要输入分配的插槽数,接收插槽数的节点ID,输入完毕后再输入all,回车,redis集群会重新分配所有主节点的插槽数
八、删除集群节点
1.将需要删除的节点上的所有插槽转移到其他节点上
假设我们要删除192.168.2.11:6379主节点,执行命令:
./redis-trib reshard 192.168.2.11:6379 #和分配插槽数的命令一样
执行后提示需要输入分配的插槽数(由于要删除该节点,输入该节点插槽数的最大值即可),接收插槽数的节点ID,输入完成后再输入done,即可全部转移插槽数。
2.使用redis-trib.rb删除节点
./redis-trib.rb del-node ip:port 节点ID
即 ./redis-trib.rb del-node 192.168.2.11:6379 2b333babc81e70c0c79efa1cacef7d0203baaf3f