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

news2025/1/9 2:28:19

文章目录

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

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

在这里插入图片描述

数据分区方案

  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 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 集群时 分配哈希槽

在这里插入图片描述

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

在这里插入图片描述

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

在这里插入图片描述

  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.coloradmin.cn/o/599568.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

MicroPython应用基础-使用Thonny IDE

MicroPython应用基础-使用Thonny IDE 文章目录 MicroPython应用基础-使用Thonny IDE引言Thonny简介使用Thonny连接到MicroPython开发板使用Thonny的REPL窗口运行Python语句在Thonny中保存Python程序文件至MicroPython开发板中运行使用Thonny的注意要点 引言 在很长一段时间内&…

[论文分享]TimeMAE:解耦掩码自编码器时间序列的自监督表示

论文题目&#xff1a;TimeMAE: Self-Supervised Representations of Time Series with Decoupled Masked Autoencoders 论文地址&#xff1a;https://arxiv.org/abs/2303.00320 代码地址&#xff1a;https://github.com/Mingyue-Cheng/TimeMAE 1 摘要 利用自监督预训练增强基于…

Flume和Kafka的组合使用

一.安装Kafka 1.1下载安装包 通过百度网盘分享的文件&#xff1a;复制链接打开「百度网盘APP 即可获取」 链接&#xff1a;https://pan.baidu.com/s/1vC6Di3Pml6k1KMbnK0OE1Q?pwdhuan 提取码&#xff1a;huan 也可以访问官网&#xff0c;下载kafka2.4.0的安装文件 1.2解…

Hadoop3.1.3安装(单机、伪分布)

系列文章目录 Ubuntu常见基本问题 Hadoop3.1.3安装&#xff08;单机、伪分布&#xff09; Hadoop集群搭建 文章目录 系列文章目录一、环境1、创建hadoop用户 二、更新apt三、安装SSH、配置SSH无密码登陆四、安装Java环境五、安装 Hadoop3.1.3六、Hadoop单机配置(非分布式)七、…

chatgpt赋能python:Python为什么被吹得这么神?

Python为什么被吹得这么神&#xff1f; Python是一个开源、跨平台的高级编程语言&#xff0c;由Guido van Rossum于1989年在荷兰创造。Python在近几年因其方便易用、高效稳定和丰富的生态体系而备受欢迎。Python被广泛应用于数据科学、人工智能、机器学习、Web开发、自动化测试…

启动虚拟机并安装Linux系统

我们刚刚新建的虚拟机相当于一个裸机&#xff0c;还没有安装操作系统在里面&#xff0c;下面我们来看一下怎么进行Linux系统的安装。 在VMware Workstation工具的主界面选择虚拟机Spark01&#xff0c;单击鼠标右键在弹出的菜单中选择“设置”打开“虚拟机设置”对话框。如下图…

程序设计综合实习(C语言):学生成绩文件管理

一、目的 1&#xff0e;掌握文件指针的概念和运用 2&#xff0e;掌握文件的相关操作&#xff1a;打开、读、写、关闭 3&#xff0e;掌握文件的定位操作 二、实习环境 Visual Stdio 2022 三、实习内容与步骤 1&#xff0e;定义一个结构体数组&#xff0c;存放10个学生的学号&a…

ABB Drive Composer Pro 2.8.1 Crack

Drive Composer 是 ABB 通用架构驱动器的启动和维护工具。该工具用于查看和设置驱动器参数&#xff0c;以及监控和调整过程性能。 Drive Composer入门版提供了设置参数、基本监控、从 PC 对驱动器进行本地控制以及事件记录器处理等基本功能。 Drive Composer pro是成熟的调试和…

蓝桥杯ABC组 数论知识合集

Note Of Note 同余方程中是可以正常进行分数的约分和去分母的 e x g c d exgcd exgcd 在使用时要保证 a , b a,b a,b 都是非负数 a a a 与 b b b 互质不代表 a , b a,b a,b 都为质数&#xff08; 4 4 4 和 5 5 5 互质&#xff0c;但是 4 4 4 不是质数&#xff09;两个相邻…

第3章“程序的机器级表示”:控制

文章目录 3.6 控制3.6.1 条件码3.6.2 访问条件码3.6.3 跳转指令及其编码3.6.4 翻译条件分支3.6.5 循环do-while 循环while循环for循环 3.6.6 switch 语句 3.6 控制 截止目前&#xff0c;考虑了 访问数据和 操作数据 的方法。程序执行的另一个很重要的部分就是控制被执行操作的…

Maven高级5-私服

1. 简介 一台独立的服务器&#xff0c;用于解决团队内部的资源共享与资源同步问题&#xff08;模拟了中央服务器&#xff09;&#xff1b; https://help.sonatype.com/repomanager3/download 命令行启动服务器 在nexus.exe目录&#xff08;bin目录&#xff09;下启动cmd&#…

【认知提升思维篇】之 反刍思维--恶性思考的根源

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;普本…

代码随想录算法训练营第五十一天 | 力扣 309.最佳买卖股票时机含冷冻期, 714.买卖股票的最佳时机含手续费

309.最佳买卖股票时机含冷冻期 题目 309. 最佳买卖股票时机含冷冻期 给定一个整数数组prices&#xff0c;其中第 prices[i] 表示第 i 天的股票价格 。​ 设计一个算法计算出最大利润。在满足以下约束条件下&#xff0c;你可以尽可能地完成更多的交易&#xff08;多次买卖一…

Vulnhub | 实战靶场渗透测试 - PRIME: 1

0x00 免责声明 本文仅限于学习讨论与技术知识的分享&#xff0c;不得违反当地国家的法律法规。对于传播、利用文章中提供的信息而造成的任何直接或者间接的后果及损失&#xff0c;均由使用者本人负责&#xff0c;本文作者不为此承担任何责任&#xff0c;一旦造成后果请自行承担…

“本草”大模型开源,ChatGPT时代,连AI私人医生都出现了?

大家好,我是千与千寻,也可以叫我千寻,今天给大家分享的ChatGPT新应用项目,是ChatGPT模型在医学领域的应用,什么,医学领域? 是的,没错,是医学领域的ChatGPT应用,我们都知道ChatGPT是OpenAI开源的一个智能对话式引擎,今天给大家分享的项目叫“本草”。 “本草”模型是…

IIC协议与OLED

1.认识OLED 1、OLED概述&#xff1a; OLED&#xff08;Organic Light-Emitting Diode&#xff0c;有机发光二极管&#xff09;是一种显示技术&#xff0c;利用有机材料的发光特性来产生光。OLED显示器由一系列有机材料层组成&#xff0c;当电流通过时&#xff0c;这些材料会发…

【性能调优】真实体验 “系统调用是重开销”

实践背景是开发云原生背景下的指纹识别插件&#xff0c;主要针对的是镜像、容器等云时代的软件资产。 信息安全语境下的 指纹识别 指的是定位软件的特征&#xff0c;如名称、版本号、开源许可证等&#xff0c;就像指纹是人的独特生物凭证&#xff0c;这些特征是软件的独特电子凭…

六一儿童节 全网最全的微服务+Outh2套餐,你确定不来试一试?(入门到精通,附源码)满足你的味蕾需要(二)

咱们废话不多说&#xff0c;直接开干&#xff01;&#xff01;&#xff01; 目录 一、项目目录 二、Token 三、授权服务器oauth 1.pom 2.application 3.OauthApp启动类 4.DiyUserDetails 5.MyUserDetailService 6.KeyPairController 7.TokenConfig 8.WebSecurityCo…

LNMP架构

LNMP架构 一、LNMP架构原理二、LNMP部署1、安装 Nginx 服务1.安装依赖包2.创建运行用户3.编译安装4.优化路径5.添加 Nginx 系统服务 2、安装 MySQL 服务1.安装Mysql环境依赖包2.创建运行用户3.编译安装4.修改mysql 配置文件5.更改mysql安装目录和配置文件的属主属组6.设置路径环…

电子模块|压力传感器模块HX711---硬件介绍

电子模块|压力传感器模块HX711---硬件介绍与C51&&STM32驱动 实物照片模块简介模块特点 硬件模拟输入供电电源时钟选择串口通讯复位和断电HX711相关部分的 PCB 设计 实物照片 模块简介 HX711是一款专为高精度称重传感器而设计的24位A/D转换器芯片。与同类型其它芯片相比…