基于 Docker_redis6.0.8 实现 Redis 集群扩缩容

news/2024/10/18 16:53:42/

文章目录

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

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

单机部署

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

在这里插入图片描述

数据分区方案

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

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

集群部署

  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 6381docker 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 6382docker 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 6383docker 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 6384docker 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 6385docker 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 集群时 分配哈希槽

在这里插入图片描述

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

在这里插入图片描述

  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> exitroot@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 命令查看集群状态。

在这里插入图片描述

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

在这里插入图片描述

  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 6387docker 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 成功加入集群。

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  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 从完成,扩容成功。

在这里插入图片描述

集群缩容测试

  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

在这里插入图片描述

  1. 删除 redis-node-7。
redis-cli --cluster del-node 192.168.88.186:6387 c32445c77b0a610f88b3abb1fff2dbe357b2f1d9
  1. 查看 redis 集群状态信息,可以看到恢复 3 主 3 从,完成缩容测试。

在这里插入图片描述


http://www.ppmy.cn/news/157564.html

相关文章

【CloudCompare教程】010:点云的裁剪功能(分段、裁剪、筛选)

本文讲解CloudCompare点云的裁剪功能(分段、裁剪、筛选)。 文章目录 一、点云的分段二、点云的裁剪三、点云的筛选一、点云的分段 加载案例点云数据,如下图所示: 选中图层点云,点击工具栏中的【分割】工具。 点击【激活线状选择】工具: 在需要裁剪的点云上绘制现状裁剪范…

2.1 Android ebpf编程规则

写在前面 有很多开源的库和框架可用于编写eBPF程序。而Android当然也支持BCC,不过这部分放到最后再讲。因为Android也实现了自己的eBPF加载器。从本章开始我们通过实例hello world一步步剖析在Android傻姑娘ebpf的编程,编译,加载以及在内核中实际的运行原理。加载器这一部分…

Redis系列---Redis网络模型1

我们都知道&#xff0c;redis的高性能是具有多方面的因数&#xff0c;如&#xff1a;运行在内存上&#xff0c;单线程命令&#xff0c;io多路复用技术等&#xff0c;对于redis高性能的探究&#xff0c;就需要深入的研究其工作原理&#xff0c;这就涉及到redis的网络模型了&…

寻找技术中国——渴望不再被扼住喉咙!

韩国模式&#xff1f;台湾模式&#xff1f; 核心技术&#xff0c;已经成为中国企业期求进一步成长抹不去的痛。 以成本优势进入制造环节的中国企业&#xff0c;正在面临盈利空间不断缩小的危机&#xff1a;家电企业的3C、6C认证之痛、几近被核心技术窒息的DVD之苦、日益频仍的低…

《卫报》长文解读机器的崛起:人类越来越无法掌控它们

来源&#xff1a;网易智能 摘要&#xff1a;技术正开始以智能和不可预知的方式运作&#xff0c;连它的创造者都无法捉摸。正当机器越来越多地改变全球事件时&#xff0c;我们该如何重新控制它们呢&#xff1f; 《卫报》网站今日撰文详述了机器的崛起。技术正开始以智能和不可预…

Vue.js 比较重要知识点总结二

概述 vue3 组合式API生命周期钩子函数有变化吗&#xff1f;Composition API 与 Options API 有什么区别&#xff1f;watch 和 watchEffect 的区别&#xff1f;vue2 如何升级到 vue3 ? vue3 组合式API生命周期钩子函数有变化吗&#xff1f; 选项式API 和 组合式API 生命周期…

Coursera自动驾驶2.3-2.4——传感器:IMU,GNSS,LiDAR

文章目录 一、3D几何和参考系1.旋转变换2.参考系 二、惯性测量单元1.陀螺仪2.加速计 三、全球导航卫星系统&#xff08;GNSS&#xff09;四、激光雷达1.激光雷达和测量模型&#xff08;1&#xff09;激光雷达概述&#xff08;2&#xff09;测量模型 2.点云3.平面拟合4.点云匹配…

如何将Chrome浏览器重置为默认设置?

如何将Chrome浏览器重置为默认设置&#xff1f; 将 Chrome 设置重置为默认设置 您可随时在 Chrome 中恢复您的浏览器设置。如果所安装的应用或扩展程序在您不知情的情况下更改了设置&#xff0c;那么您可能需要这样做。不过&#xff0c;您保存的书签和密码不会被清除或更改。 …