环境版本
- Ubuntu20
- docker-ce
- redis5.05
搭建步骤
1、创建模板文件
首先需要创建一个文件夹用来存放模板文件和各redis节点的配置文件,我这里存放在/home/redis-cluster下
以此模板为源文件,生成不同端口的redis.conf文件
文件名 redis-cluster.tmpl
创建好后上传到/home/redis-cluster
port ${PORT}
protected-mode no
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
cluster-announce-ip 192.168.44.136
cluster-announce-port ${PORT}
cluster-announce-bus-port 1${PORT}
appendonly yes
2、生成redis集群配置文件
注:不通的服务器,要在不通的服务器上执行
for port in `seq 7001 7006`; do \
mkdir -p ./${port}/conf \
&& PORT=${port} envsubst < ./redis-cluster.tmpl > ./${port}/conf/redis.conf \
&& mkdir -p ./${port}/data; \
done
2、生成redis集群配置文件
配置文件生成后,为各配置文件执行创建docker容器
for port in `seq 7001 7006`; do \
docker run -d -ti \
-v /home/redis-cluster/${port}/conf/redis.conf:/usr/local/etc/redis/redis.conf \
-v /home/redis-cluster/${port}/data:/data \
--restart always --name redis-${port} --net host \
--sysctl net.core.somaxconn=1024 redis redis-server /usr/local/etc/redis/redis.conf; \
done
3、用redis-cli创建整个redis集群
redis5之前的搭建是依靠ruby,redis5以后redis-cli脚本已经内置于redis /user/local/bin/目录下
1、随便进入一个redis容器内部
docker exec -it redis-7001 /bin/bash
2、找见redis-cli文件目录
/user/local/bin/
3、执行如下命令创建集群
redis-cli --cluster create \
192.168.44.140:7001 \
192.168.44.140:7002 \
192.168.44.140:7003 \
192.168.44.140:7004 \
192.168.44.139:7001 \
192.168.44.139:7002 \
192.168.44.139:7003 \
192.168.44.139:7004 \
--cluster-replicas 1
注:
- IP地址为你创建redis容器的IP,端口为各容器开放端口,不同服务期可以端口一样,前提IP不通
- 参数–cluster-replicas 1表示给每个主节点配置一个从节点 0 代表不创建从节点
到此集群搭建完成。
集群验证
# 进入某一容器
docker exec -it redis-7001 /bin/bash
# 以集群模式登录 Redis -c 集群模式 -h 节点ip -p 端口
redis-cli -c -h 192.168.44.140 -p 7001
# 查看集群信息
cluster info
#查看集群节点信息
cluster nodes
#查看集群插槽
cluster slots
添加节点
节点添加顺序,先添加redis容器->添加主节点->为主节点分配插槽->添加从节点
1、添加redis容器
将上面的机器暂命名为机器A,另外准备一台机器暂命名为机器B。
我在机器B上按照以上方法准备了两个redis容器(注意机器B的防火墙)
启动之后,这两个redis节点为孤立的节点
2、添加主节点
进入机器A中任意一个已运行的redis容器
docker exec -it renode1 /bin/bash
执行以下命令
redis-cli --cluster add-node 机器B:7011 机器A:7011 -a 123456
前面的机器B 为要添加的节点
前面的机器A 为已经存在的节点
输出如下:
注意:此时该节点只是作为主节点添加到了集群中,但是没有分配槽点,是不可存储数据的,如果要存储数据,在key被分配时参与槽点计算,需要进行分配槽点操作。
查看新加入的这个节点的信息
redis-cli -c -a 123456 -h 192.168.10.168 -p 7011 cluster nodes
可以发现和其他主节点相比,新加入的主节点没有数据槽
3、为主节点添加槽点
redis-cli --cluster reshard 需要分配槽的ip:需要分配槽的port
执行以下命令分配数据槽
redis-cli --cluster reshard 192.168.10.166:7011 -a 123456
192.168.10.166:7011为需要分配的槽IP和端口,-a后面的是密码
注意点:
#表示分配多少个槽给192.168.10.166:7011,这里4096表示分配4096个
How many slots do you want to move (from 1 to 16384)? 4096
#表示需要填写接收节点的node id的值,此处为192.168.10.166:7011节点的值
#这个值就是上图中画红线前面的值
What is the receiving node ID? 515fc836d7f6349e3278c43d665f449c6818720f
#all:表示随机从一些主节点中抽取槽分配给192.168.10.166:7011节点
#done:表示从那一个主节点分配槽给192.168.10.166:7011节点
Source node #1: all
添加一个从节点
经过上面的操作192.168.10.166:7011成为了一个主节点
但是目前还没有从节点,现在给它增加一个从节点192.168.10.166:7012。
4、添加从节点
执行以下命令
redis-cli --cluster add-node 192.168.10.166:7012 192.168.10.166:7011 -a 123456
#192.168.10.166:7012为需要添加的节点信息
#192.168.10.166:7011为已经存在的节点信息
# 进入 192.168.10.166:7012 这个节点
redis-cli -c -a 123456 -h 192.168.10.166 -p 7012
# 将从节点添加到主节点上
cluster replicate 515fc836d7f6349e3278c43d665f449c6818720f
这里的515fc836d7f6349e3278c43d665f449c6818720f是192.168.10.166:7011的节点id
至此7012就作为了7011节点的从节点,可以执行 cluster nodes 命令查看
删除节点
1、删除一个从节点
删除从从节点:192.168.10.166:7012
执行命令
redis-cli --cluster del-node 192.168.10.166:7012 bde834ee8a1e3f19f671a2f71fdd4d9a03127453 -a 123456
这个bde834ee8a1e3f19f671a2f71fdd4d9a03127453是从节点:192.168.10.166:7012的节点id值
2、删除一个主节点
删除主节点稍微麻烦一点,如果主节点中存在槽,那么需要先将槽分配给其它的主节点。
如果主节点被删除从节点将会自动代替主节点,如果主节点有分配的槽点(slot)那么先去掉分配的槽点(slot),然后再删除节点;
以下是删除主节点:192.168.10.166:7011的步骤
1、移除槽
redis-cli --cluster reshard 192.168.10.166:7011 -a 123456
可以在集群检查信息中看到7011的插槽数量
这里的4999代表了7011插槽的数量
slots:[0-1665],[5461-7127],[10923-12588] (4999 slots) master
2、删除主节点
执行以下命令删除节点
redis-cli --cluster del-node 192.168.10.166:7011 515fc836d7f6349e3278c43d665f449c6818720f -a 123456
这个515fc836d7f6349e3278c43d665f449c6818720f是主节点:192.168.10.166:7011的节点id值
查看是否成功删除节点
redis-cli -c -a 123456 -h 192.168.10.168 -p 7011 cluster nodes