首先关闭防火墙,确认本机docker服务是否启动。
1 新建6个redis的docker容器实例
docker run -d --name redis-node-1 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-1:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6381
docker run -d --name redis-node-2 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-2:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6382
docker run -d --name redis-node-3 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-3:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6383
docker run -d --name redis-node-4 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-4:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6384
docker run -d --name redis-node-5 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-5:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6385
docker run -d --name redis-node-6 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
–net host 使用宿主机的IP和端口,默认
–priviledged =true 获取宿主机的root用户权限
–cluster-enabled yes 开启redis集群
–appendonly yes 开启持久化
–port 6381 redis端口号
2进入其中一台容器内并为6台机器构建集群关系
进入容器
docker exec -it redis-node-1 /bin/bash
构建集群关系
redis-cli --cluster create 192.168.1.5:6381 192.168.1.5:6382 192.168.1.5:6383 192.168.1.5:6384 192.168.1.5:6385 192.168.1.5:6386 --cluster-replicas 1
命令中192.168.1.5是本机ip,采用本机ip会报connection refused,此处暂时换成127.0.0.1继续
redis-cli --cluster create 127.0.0.1:6381 127.0.0.1:6382 127.0.0.1:6383 127.0.0.1:6384 127.0.0.1:6385 127.0.0.1:6386 --cluster-replicas 1
–cluster-replicas1 表示为每个master创建一个slave
如图所示,最终生成的的集群关系如下表
主节点 | 从节点 |
---|---|
6381 | 6386 |
6382 | 6384 |
6383 | 6385 |
3进入某个容器内部,查看集群状态
redis-cli -p 6381
>cluster info
>cluster nodes
4主从容错切换迁移
redis-cli -p 6381 -c
-c集群登录
给6381赋值
set k1 v1
set k2 v2
退出redis
查看集群状态
redis-cli --cluster check 127.0.0.1:6381
将6381宕机,
进入容器2,查看集群节点
可以发现6386变成了主节点。
再启动6381,可以发现6381变成了从节点,而6386仍是主节点。
如果需要回复,则关闭6381和6386,先重启6381,再重启6386
5扩容
新增节点6387和节点6388
docker run -d --name redis-node-7 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /Users/hukeling/code-tech/docker/data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
进入6387,将6387作为主节点加入集群
docker exec -it redis-node-7 /bin/bash
redis-cli --cluster add-node 127.0.0.1:6387 127.0.0.1:6381
检查集群状态
发现6387的哈希槽号是空的
重新分派槽号
redis-cli --cluster reshard 127.0.0.1:6381
给6387分配槽号4096个
接收id填6387的id
来源选all
查看状态发现6387的槽号是其他三个每个节点分了一部分给6387,因为从新分配的成本太高了。
给6387分配从节点
redis-cli --cluster add-node 127.0.0.1:6388 127.0.0.1:6387 --cluster-slave --cluster-master-id bc42ebf764312c67ef6931503bfa1cdbed285414
查看集群状态发现扩容成功
6缩容
先清楚节点6388
# id是6388的id
redis-cli --cluster del-node 127.0.0.1:6388 ab0fe8c0a2c7d59b9fee98afdf2681d7331de923
清出来的槽号重新分配
redis-cli --cluster reshard 127.0.0.1:6381
把6387的4096个槽号分给6381
6387槽号变为0
再删除6387
redis-cli --cluster del-node 127.0.0.1:6387 bc42ebf764312c67ef6931503bfa1cdbed285414