文章目录
- 单机部署
- 数据分区方案
- 集群部署
- 集群容错测试
- 集群扩容测试
- 集群缩容测试
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 从,完成缩容测试。