文章目录

  • 单机部署
  • 数据分区方案
  • 集群部署
  • 集群容错测试
  • 集群扩容测试
  • 集群缩容测试


LXL:这玩意太枯燥,看完需要耐心 ~~~

单机部署

  1. 通过 dockerhub 查找 redis 镜像,选择 6.0.8 版本。
  2. 创建挂载目录,并赋予权限。
mkdir -p /var/docker_data/redis/data
mkdir -p /var/docker_data/redis/conf

chmod -R 770 /var/docker_data/redis
  1. 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
  1. 启动 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
  1. 进入 redis 容器,使用 redis-cli 连接测试。
docker exec -it redis bash

docker单机弹性扩容 docker集群动态扩容_docker单机弹性扩容

数据分区方案

  1. 哈希取余分区。将 key 计算哈希值后取余,余数则对应存放到分区所在 redis 缓存中。该方法的缺点是当遇到扩缩容、故障停机问题时,无法可控重新规划分区,且 redis 集群中的数据需要重新洗牌。

docker单机弹性扩容 docker集群动态扩容_数据库_02

  1. 一致性哈希算法分区。一致性哈希算法将整个哈希值组织成一个抽象的圆环,称为哈希环,哈希函数的输出值一般在0到INT_MAX(2^32-1)之间,这些输出值可以均匀地映射到哈希环边上。假设 0<=hash(key)<=11 ,那么整个哈希环看起来如图所示。数据将存入顺时针方向遇到的第一个节点,添加 redis 节点时,仅需要重新分配顺时针遇到的第一个节点的数据。减少 redis 节点时,将删除节点的全部数据存入下一台 redis 中,这会造成数据分布倾斜。

docker单机弹性扩容 docker集群动态扩容_docker单机弹性扩容_03

  1. 哈希槽分区。Redis 集群中内置了 16384 个哈希槽,redis 会根据节点数量大致均等的将哈希槽映射到不同的节点。当需要在 Redis 集群中放置一个 key-value 时,redis 先对 key 使用 crc16 算法算出一个结果,然后把结果对 16384 求余数,这样每个 key 都会对应一个编号在 0-16383 之间的哈希槽,也就是映射到某个节点上。哈希槽分区解决了上述两种方案的缺点,是目前 redis 集群默认使用的分区方案。

docker单机弹性扩容 docker集群动态扩容_docker单机弹性扩容_04

集群部署

  1. 设置防火墙,并启动 Docker 服务。
  2. 创建 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
  1. 进入 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 集群时 分配哈希槽

docker单机弹性扩容 docker集群动态扩容_数据_05

  1. 以 node-1 节点为对接点,查看 redis 集群状态。

docker单机弹性扩容 docker集群动态扩容_docker_06

  1. 使用 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 实例,插入成功

集群容错测试

  1. 使用 redis-cli --cluster check 命令查看集群状态。

docker单机弹性扩容 docker集群动态扩容_docker单机弹性扩容_07

  1. 停止 redis-node-1 实例后,再次查看集群状态,可看到 redis-node-1 的从节点 redis-node-5 在主节点停机后上位。

docker单机弹性扩容 docker集群动态扩容_redis_08

  1. 恢复 3 主 3 从状态,先启动 redis-node-1,后重启 redis-node-5 即可。

集群扩容测试

  1. 新增 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
  1. 进入 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 介绍加入集群
  1. 第一次查看 redis 集群状态,可以看到 redis-node-7 成功加入集群。

docker单机弹性扩容 docker集群动态扩容_数据_09

  1. 重新分配 redis 集群的哈希槽。
# 通过 redis-node-1 重分配哈希槽
redis-cli --cluster reshard 192.168.88.186:6381

docker单机弹性扩容 docker集群动态扩容_数据_10

  1. 第二次查看 redis 集群状态,可以看到 redis-node-7 已经持有三家分配给他的槽位。

docker单机弹性扩容 docker集群动态扩容_docker单机弹性扩容_11

  1. 添加 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

  1. 第三次查看 redis 集群状态,可以看到 4 主 4 从完成,扩容成功。

docker单机弹性扩容 docker集群动态扩容_数据库_12

集群缩容测试

  1. 将 redis-node-8 移出集群。
redis-cli --cluster del-node 192.168.88.186:6388 e7ee49af8e227559fc134a171fbff5d75cdf4a45
# redis-cli --cluster del-node 从机IP:从机端口 redis-node-8节点ID
  1. 将 redis-node-7 的槽位清空,重新分配。此处不考虑槽位均衡,全部给 redis-node-1 节点。
# 通过 redis-node-1 控制 redis 集群的槽位
redis-cli --cluster reshard 192.168.88.186:6381

docker单机弹性扩容 docker集群动态扩容_redis_13

  1. 删除 redis-node-7。
redis-cli --cluster del-node 192.168.88.186:6387 c32445c77b0a610f88b3abb1fff2dbe357b2f1d9

  1. 查看 redis 集群状态信息,可以看到恢复 3 主 3 从,完成缩容测试。

docker单机弹性扩容 docker集群动态扩容_数据库_14