文章目录
- 单机部署
- 数据分区方案
- 集群部署
- 集群容错测试
- 集群扩容测试
- 集群缩容测试
LXL:这玩意太枯燥,看完需要耐心 ~~~
单机部署
- 通过 dockerhub 查找 redis 镜像,选择 6.0.8 版本。
- 创建挂载目录,并赋予权限。
mkdir -p /var/docker_data/redis/data
mkdir -p /var/docker_data/redis/conf
chmod -R 770 /var/docker_data/redis
- redis 官网查找 6.0 版本的 redis.conf 配置文件,并修改。
# redis.conf 中修改如下内容:
# 开启 redis 密码认证
requirepass 123456
# 允许全部外链接(直接注释 bind)
bind 127.0.0.1
# 设置 redis 以非守护进程方式启动,否则与 docker -d 参数冲突
daemonize no
# 开启 AOF 持久化
appendonly yes
# 开启 redis 集群
cluster-enable yes
- 启动 redis 容器
docker run -d \
-p 6369:6379 \
--restart always \
--privileged \
--name redis6 \
--log-opt max-size=100m \ # 设置日志最大大小
--log-opt max-file=3 \ # 设置日志文件数量
-v /var/docker_data/redis/conf/redis.conf:/etc/redis/redis.conf \
-v /var/docker_data/redis/data:/data \
redis:6.0.8 redis-server /etc/redis/redis.conf
- 进入 redis 容器,使用 redis-cli 连接测试。
docker exec -it redis bash
数据分区方案
- 哈希取余分区。将 key 计算哈希值后取余,余数则对应存放到分区所在 redis 缓存中。该方法的缺点是当遇到扩缩容、故障停机问题时,无法可控重新规划分区,且 redis 集群中的数据需要重新洗牌。
- 一致性哈希算法分区。一致性哈希算法将整个哈希值组织成一个抽象的圆环,称为哈希环,哈希函数的输出值一般在0到INT_MAX(2^32-1)之间,这些输出值可以均匀地映射到哈希环边上。假设 0<=hash(key)<=11 ,那么整个哈希环看起来如图所示。数据将存入顺时针方向遇到的第一个节点,添加 redis 节点时,仅需要重新分配顺时针遇到的第一个节点的数据。减少 redis 节点时,将删除节点的全部数据存入下一台 redis 中,这会造成数据分布倾斜。
- 哈希槽分区。Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。哈希槽分区解决了上述两种方案的缺点,是目前 redis 集群默认使用的分区方案。
集群部署
- 设置防火墙,并启动 Docker 服务。
- 创建 6 个 redis 容器实例(这里使用简易创建,也可以参照单机部署)
docker run -d --name redis-node-1 --net host --privileged=true -v /root/docker_data/redis/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 /root/docker_data/redis/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 /root/docker_data/redis/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 /root/docker_data/redis/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 /root/docker_data/redis/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 /root/docker_data/redis/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386
- 进入 node-1 节点容器,构建 redis 集群关系。
# 进入 node-1 节点容器
docker exec -it redis-node-1 /bin/bash
# 构建 redis 集群关系
redis-cli --cluster create 192.168.88.186:6381 192.168.88.186:6382 192.168.88.186:6383 192.168.88.186:6384 192.168.88.186:6385 192.168.88.186:6386 --cluster-replicas 1
# --cluster-replicas 1 表示为每个master创建一个slave节点
# 下图 1~3 行构建 redis 集群时 分配哈希槽
- 以 node-1 节点为对接点,查看 redis 集群状态。
- 使用 redis-cli 客户端插入数据测试。
# 连接 redis-node-1 节点
root@MyCentOS001:/data # redis-cli -p 6381
# 设置 key-value 数据
127.0.0.1:6381> set key1 testdata1
(error) MOVED 9189 192.168.88.186:6382
# (error) MOVED 9189 192.168.88.186:6382
# 报错原因:目前 redis-cli 仅连接 redis-node-1,需添加 -c 参数优化路由
127.0.0.1:6381> exit
root@MyCentOS001:/data # redis-cli -p 6381 -c
127.0.0.1:6381> set key1 testdata1
-> Redirected to slot [9189] located at 192.168.88.186:6382
OK
# 数据计算哈希值为 9189 对应 redis-node-2 实例,插入成功
集群容错测试
- 使用 redis-cli --cluster check 命令查看集群状态。
- 停止 redis-node-1 实例后,再次查看集群状态,可看到 redis-node-1 的从节点 redis-node-5 在主节点停机后上位。
- 恢复 3 主 3 从状态,先启动 redis-node-1,后重启 redis-node-5 即可。
集群扩容测试
- 新增 redis-node-7、redis-node-8 进入 redis 集群。
docker run -d --name redis-node-7 --net host --privileged=true -v /root/docker_data/redis/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /root/docker_data/redis/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388
- 进入 redis-node-7 容器内,将其作为 master 节点加入 redis 集群。
docker exec -it redis-node-7 /bin/bash
# 将新增的 6387 作为 master 节点加入集群
redis-cli --cluster add-node 192.168.88.186:6387 192.168.88.186:6381
# 6387 就是将要作为 master 新增节点
#6381 原集群的主节点成员,相当于 redis-node-7 通过 redis-node-8 介绍加入集群
- 第一次查看 redis 集群状态,可以看到 redis-node-7 成功加入集群。
- 重新分配 redis 集群的哈希槽。
# 通过 redis-node-1 重分配哈希槽
redis-cli --cluster reshard 192.168.88.186:6381
- 第二次查看 redis 集群状态,可以看到 redis-node-7 已经持有三家分配给他的槽位。
- 添加 redis-node-8 为 redis-node-7 的从节点。
redis-cli --cluster add-node 192.168.88.186:6388 192.168.88.186:6387 --cluster-slave --cluster-master-id c32445c77b0a610f88b3abb1fff2dbe357b2f1d9
# redis-cli --cluster add-node ip:新slave端口 ip:新master端口 --cluster-slave --cluster-master-id 新主机节点ID
- 第三次查看 redis 集群状态,可以看到 4 主 4 从完成,扩容成功。
集群缩容测试
- 将 redis-node-8 移出集群。
redis-cli --cluster del-node 192.168.88.186:6388 e7ee49af8e227559fc134a171fbff5d75cdf4a45
# redis-cli --cluster del-node 从机IP:从机端口 redis-node-8节点ID
- 将 redis-node-7 的槽位清空,重新分配。此处不考虑槽位均衡,全部给 redis-node-1 节点。
# 通过 redis-node-1 控制 redis 集群的槽位
redis-cli --cluster reshard 192.168.88.186:6381
- 删除 redis-node-7。
redis-cli --cluster del-node 192.168.88.186:6387 c32445c77b0a610f88b3abb1fff2dbe357b2f1d9
- 查看 redis 集群状态信息,可以看到恢复 3 主 3 从,完成缩容测试。