Redis集群

本次环境测试是一台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

这两步必须严格执行,否则数据会丢失!

原文地址:https://www.cnblogs.com/moonlightL/p/7403389.html