这里我需要使用到 6.0.8 版本
docker pull redis:6.0.8
在 /app/redis 下创建redis创建配置文件 redis.conf
mkdir -p /app/redis
touch /app/redis/redis.conf
vim /app/redis/redis.conf
修改以下几项配置:
# 开启密码验证
requirepass 123456
# 允许redis外地连接,需要注释掉绑定的IP
# bind 127.0.0.1
# 关闭保护模式
protected-mode no
# 注释掉daemonize yes,或者配置成 daemonize no。因为该配置和 docker run中的 -d 参数冲突,会导致容器一直启动失败
daemonize no
# 开启redis数据持久化
appendonly yes
创建容器
docker run -d -p 6379:6379 --name redis --privileged=true \
-v /app/redis/redis.conf:/etc/redis/redis.conf \
-v /app/redis/data:/data \
redis:6.0.8 \
redis-server /etc/redis/redis.conf
查看容器是否创建成功
docker ps
docker exec -it redis /bin/bash
redis-cli
验证密码
auth 123456
测试结果
这里还是使用 6.0.8 版本进行安装,直接进入创建配置
使用docker搭建3主3从的Redis集群,每台主机都对应一台从机。
# 启动第1台节点
# --net host 使用宿主机的IP和端口,默认
# --cluster-enabled yes 开启redis集群
# --appendonly yes 开启redis持久化
# --port 6381 配置redis端口号
docker run -d --name redis-node-1 --net host --privileged=true -v /app/redis-cluster/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
# 启动第2台节点
docker run -d --name redis-node-2 --net host --privileged=true -v /app/redis-cluster/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
# 启动第3台节点
docker run -d --name redis-node-3 --net host --privileged=true -v /app/redis-cluster/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
# 启动第4台节点
docker run -d --name redis-node-4 --net host --privileged=true -v /app/redis-cluster/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
# 启动第5台节点
docker run -d --name redis-node-5 --net host --privileged=true -v /app/redis-cluster/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
# 启动第6台节点
docker run -d --name redis-node-6 --net host --privileged=true -v /app/redis-cluster/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
进入节点1(或其中任意一个节点):
docker exec -it redis-node-1 /bin/bash
构建主从关系:
# 宿主机IP:端口
redis-cli --cluster create 192.168.xxx.xxx:6381 192.168.xxx.xxx:6382 192.168.xxx.xxx:6383 192.168.xxx.xxx:6384 192.168.xxx.xxx:6385 192.168.xxx.xxx:6386 --cluster-replicas 1
redis尝试自动进行主从节点分配
因为我们的docker容器IP相同,所以会出现警告,可以直接忽略该警告
redis自动分配结果完成后,需要输入 Yes
确认配置信息
输入Yes
确认后,redis会向其他节点发送信息加入集群,并分配哈希槽
3.1 进入容器节点1(或集群中其他节点)
docker exec -it redis-node-1 /bin/bash
3.2 使用redis-cli连接到6381节点
redis-cli -p 6381
3.3 使用redis的相关命令查看集群状态:
cluster info
cluster_state
: 集群状态,这里是 "ok",表示集群正常。cluster_slots_assigned
: 集群中总共分配的槽数量,这里是 16384
。cluster_slots_ok
: 集群中正常工作的槽数量,也是 16384
,表示所有槽都正常。cluster_slots_pfail
: 集群中部分故障的槽数量,这里是 0
。cluster_slots_fail
: 集群中完全故障的槽数量,这里是 0
。cluster_known_nodes
: 集群已知节点数量,这里是 6
。cluster_size
: 集群规模,即节点的数量,这里是 3
。cluster_current_epoch
: 集群当前纪元,这里是 6
。cluster_my_epoch
: 当前节点的纪元,这里是 1
。cluster_stats_messages_*
: 不同类型的集群通信消息的统计信息,包括 ping、pong、meet 等。3.4 查看集群节点信息
cluster nodes
set k1 v1
当使用 redis-cli
连接redis集群时,需要添加 -c
参数,否则可能会出现读写出错。
原因:k1
经过计算得到的哈希槽为12706,但是当前连接的redis-server为6381
(即节点1),它的哈希槽为:[0,5460]
(在创建构建主从关系时redis有提示,也可以通过 cluster nodes
查看),所以会因为存不进去而报错。
执行 set k2 v2
可以成功,因为k2
计算出的哈希槽在[0-5460]
区间中。
解决方案:
使用-c
参数的redis-cli
命令连接即可
redis-cli -p 6381 -c
1. 进入容器节点1
docker exec -it redis-node-1 /bin/bash
2. 进行集群信息检查
# 输入任意一台主节点地址都可以进行集群检查
redis-cli --cluster check 192.168.xxx.xxx:6381
192.168.153.133:6382 (fc80d6d6...) -> 0 keys | 5462 slots | 1 slaves.
:
192.168.153.133:6382
是节点的 IP 地址和端口。(fc80d6d6...)
是节点的 ID。0 keys
表示节点当前拥有的键数量。5462 slots
是节点的槽位数量。1 slaves
是节点的从节点数量。[OK] 1 keys in 3 masters.
:
0.00 keys per slot on average.
:
Performing Cluster Check (using node 192.168.153.133:6382)
:
192.168.153.133:6382
。All nodes agree about slots configuration.
:
All 16384 slots covered.
:
# 启动第7台节点
docker run -d --name redis-node-7 --net host --privileged=true -v /app/redis-cluster/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
# 启动第8台节点
docker run -d --name redis-node-8 --net host --privileged=true -v /app/redis-cluster/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
docker exec -it redis-node-7 /bin/bash
# redis-cli --cluster add-node 本节点地址 要加入的集群中的其中一个节点地址
redis-cli --cluster add-node 192.168.xxx.xxx:6387 192.168.xxx.xxx:6381
redis-cli --cluster check 192.168.xxx.xxx:6381
redis-cli --cluster reshard 192.168.xxx.xxx:6381
您想移动多少个插槽(从1移动到16384)?4096
接收节点ID是什么?625d5d8f9a9870c4c68bd36f08b668647269d9c8
请输入所有源节点ID。
键入“all”以将所有节点用作哈希槽的源节点。
输入所有源节点ID后,请键入“done”。
源节点#1:all
重新分配完成后,查看集群信息
redis-cli --cluster check 192.168.xxx.xxx:6381
因为可能有些槽位中已经存储了 key
,完全的重新洗牌重新分配的成本过高,所以redis选择从前3个节点中匀出来一部分给节点7
redis-cli --cluster add-node 192.168.153.133:6388 192.168.153.133:6387 --cluster-slave --cluster-master-id
redis-cli --cluster check 192.168.xxx.xxx:6381
docker exec -it redis-node-1 /bin/bash
redis-cli --cluster check 192.168.xxx.xxx:6381
redis-cli --cluster del-node 192.168.xxx.xxx:6388 <6388节点ID>
redis-cli --cluster reshard 192.168.xxx.xxx:6381
How many slots do you want to move (from 1 to 16384)?
如果我们想直接把node7的4096个哈希槽全部分给某个节点,可以直接输入4096。 输入4096后,会让输入要接收这些哈希槽的节点ID。假如我们想把这4096个槽都分给Node1,直接输入node1节点的编号即可。 然后会提示,询问要从哪些节点中拨出一部分槽位凑足4096个分给Node1。这里我们输入node7的节点编号,回车后输入done。
node7上面没有了哈希槽,此时便可以将node7从集群中移除。(如果node7上面有哈希槽,直接从集群中移除会报错)
redis-cli --cluster del-node 192.168.xxx.xxx:6387
redis-cli --cluster check 192.168.153.133:6381