11-Docker-Redis集群部署

00-前言

在工作环境中,我们常常被要求配置多种集群,Redis 集群是最常见的入门需要掌握的集群配置方法,在之前的学习中,我们学习掌握了分布式存储的算法,本质上集群的部署就是通过分布式存储算法将数据分发部署好的不同的容器,因此在本篇文章中我们重点学习三主三从的 Redis 集群的配置。

01-集群部署设计

在初步的集群部署中,我们可以设计简单的三主三从流程图,然后针对不同的突发情况,继而再进行优化。

部署集群的大体步骤如下:

  1. 关闭防火墙+Docker 容器启动
  2. 新建 6 个容器实例
  3. 进入一台容器redis-node-1,并为 6 台容器制作集群关系
  4. 链接进一台容器,查看集群状态

02-集群部署操作

容器实例创建

首先需要创建 6 个容器实例,具体流程及命令如下:

docker run -d --name redis-node-1 --net host --privileged=true -v /data/redis/share/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 /data/redis/share/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 /data/redis/share/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 /data/redis/share/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 /data/redis/share/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 /data/redis/share/redis-node-6:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6386

以下是对这个命令的分析:

  1. docker run: 这是运行 Docker 容器的基本命令。
  2. -d: 这个选项指定容器以后台模式 (detached) 运行,即容器会在后台运行而不阻塞终端。
  3. --name redis-node-1: 这个选项指定容器的名称为 “redis-node-1”。
  4. --net host: 这个选项指定容器共享宿主主机的网络命名空间,这意味着容器将使用主机的网络配置。
  5. --privileged=true: 这个选项指定容器在特权模式下运行,这允许容器具有更高的系统权限。
  6. -v /data/redis/share/redis-node-1:/data: 这个选项用于挂载主机上的目录到容器内部。具体来说,它将主机上的 “/data/redis/share/redis-node-1” 目录挂载到容器内部的 “/data” 目录。
  7. redis:6.0.8: 这是要运行的 Docker 镜像的名称和版本。在这种情况下,它是 Redis 数据库的版本 6.0.8。
  8. --cluster-enabled yes: 这个选项指定 Redis 在容器内启用集群模式,允许多个 Redis 实例组成集群。
  9. --appendonly yes: 这个选项指定 Redis 使用 AOF(Append-Only 文件)持久化模式,将所有写操作追加到文件中,以增加数据的持久性。
  10. --port 6381: 这个选项指定容器内 Redis 服务器的端口号为 6381。这是 Redis 服务器监听客户端连接的端口。
这个命令会创建一个 Redis 容器,以后台模式在主机的网络命名空间下运行,容器具有特权模式,挂载主机上的目录到容器内部,使用 Redis 6.0.8 镜像,启用集群模式和 AOF 持久化,并监听端口 6381。

构建主从关系

创建完成 6 台容器后,我们需要进入主容器,进行主从关系的构建,具体命令如下:

docker exec -it redis-node-1 /bin/bash
redis-cli --cluster create 10.0.16.5:6381 10.0.16.5:6382 10.0.16.5:6383 10.0.16.5:6384 10.0.16.5:6385 10.0.16.5:6386 --cluster-replicas 1
以上命令的作用是命令要创建一个 Redis 集群,要将到集群的 Redis 节点的地址和端口列表。在这里,指定了六个节点,分别是 10.0.16.5 主机上的端口 6381 到 6386,这些节点将成为 Redis 集群的一部分。而`--cluster-replicas 1`指的是每个主节点应该有一个从节点<br />执行完成后,系统输出如下内容,要求我们确认以上配置:![image.png](https://cdn.nlark.com/yuque/0/2023/png/23199109/1699429627979-2a02f480-4d8d-42cf-a978-9e62064b8ddd.png#averageHue=%23201e45&clientId=ucbc5fdfb-4df2-4&from=paste&height=549&id=u8c16852b&originHeight=790&originWidth=1798&originalType=binary&ratio=1.440000057220459&rotation=0&showTitle=false&size=211914&status=done&style=none&taskId=ud2305581-3135-4030-9fca-0455b7df7ee&title=&width=1248.6110614957652)	当我们完成配置的确认后,会出现如下图所示的情况,`**All 16384 slots covered**`**表示槽位**分配正确。<br />![image.png](https://cdn.nlark.com/yuque/0/2023/png/23199109/1699429663966-f7091969-6cdf-47a2-be6a-aec13f8b8444.png#averageHue=%23201e45&clientId=ucbc5fdfb-4df2-4&from=paste&height=682&id=uab4993d8&originHeight=982&originWidth=1477&originalType=binary&ratio=1.440000057220459&rotation=0&showTitle=false&size=205648&status=done&style=none&taskId=ubbfec1c4-211b-4608-a5b5-ebe988e3757&title=&width=1025.6944036870107)

查看集群状态

构建完成好主从关系后,我们可以以主容器redis-node-1作为切入点,查看集群节点状态,具体命令如下:

docker exec -it redis-node-1 /bin/bash
redis-cli -p 6381
cluster info
cluster nodes

可以看到已经分配了 16384 的槽位,已经知道的节点为 6
image.png
并且通过cluster nodes命令,我们可以清晰地知道节点的主从关系:
image.png
通过构造的主从关系如下,需要注意,每次重新创建集群的时候情况可能是不一样的配对关系

当我们使用单机版本的命令链接我们的 redis 主机的时候,可能会发生槽位不匹配导致数据无法写入的情况,比如我们连接上node-1,输入以下命令,会出现报错:

redis-cli -p 6381
set k1 v1

image.png
为了解决以上出现的问题,我们需要以集群的方式去链接数据库,然后重新输入数据,会出现如下情况:

redis-cli -p 6381
set k1 v1

image.png

03-主从容错切换迁移案例

通过以上操作,我们初步部署了集群化的 redis,在这种情况下,我们要考虑的是假如说有一天机器宕机,我们的主从关系会如何,因此我们通过暂停redis-node-1机器,并等待心跳包发送完成后进行观察。
可以看到当redis-node-1挂掉之后,redis-node-5由 slave 服务器升为 master 服务器。
image.png
此时的主从关系更改为如下图所示:

当我们重新启动redis-node-1后,再次查看主从关系,会发现主从关系已经更改为如下图所示:

03-主从扩容及缩容案例

主从扩容

Redis 集群扩容是指在已经运行的 Redis 集群中增加更多的节点,以增加集群的容量、性能和可用性。这是一种在面临更高负载或需要更多存储容量时扩展 Redis 集群的方式。
Redis 集群中的扩容主要是通过添加新的节点实现的,这些新节点通常是通过添加主节点来存储更多的数据,添加分节点来提供数据的复制和冗余。在主从扩容的过程中,我们主要需要关注的是数据迁移的问题和哈希槽的重新分配问题。
首先我们需要创建两台 redis 容器,进行扩容前的准备,请注意,此时只是启动了容器,和我们的集群暂时是没有关系的:

docker run -d --name redis-node-7 --net host --privileged=true -v /data/redis/share/redis-node-7:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6387
docker run -d --name redis-node-8 --net host --privileged=true -v /data/redis/share/redis-node-8:/data redis:6.0.8 --cluster-enabled yes --appendonly yes --port 6388

然后我们需要进入到redis-node-7容器中,将其作为master服务器加入到原集群中,具体命令如下:

redis-cli --cluster add-node IP:6387 IP:6381
# 6387 新加入的集群
# 6381 原集群的老大

image.png
此时查看cluster nodes 发现redis-node-7虽然已经加入集群但是相较于其他的主服务器没有再分配好哈希槽:
image.png
因此我们需要重新哈希分配槽号,命令:redis-cli --cluster reshare IP:端口号,完成槽位的重新分配,执行完毕后槽位完成重新分配,原来三个容器从原来的容器量中匀了点槽位给到第四个槽位。
image.png
最后槽位完成分配后,我们需要为主容器redis-node-7添加从容器redis-node-8,具体命令如下:

# 具体格式为
redis-cli --cluster add-node 从容器IP:端口 主容器IP:端口 --cluster-slave --cluster-master-id 主容器ID
# 实际操作用例:
redis-cli --cluster add-node 10.0.16.5:6388 10.0.16.5:6387 --cluster-slave --cluster-master-id 1d933eccecd6572f64cba0e0e336b418430a9bd2

至此主存扩容成功,集群情况如下图所示:

主从缩容

通过主从扩容,我们获得了 4 主 4 从的集群案例,有时候我们可能因为流量下降遇到主从缩容的需求,达到按需使用的情景。
主从缩容的步骤如下:

  1. 先清除从节点,本次实验集群环境中的是redis-node-8

具体命令为如下所示:

# 删除从节点
redis-cli --cluster del-node 从节点IP:Port 从节点ID
  1. 然后我们需要对槽位进行重新分配,分配完成后再清除主节点,恢复三主三从。

如果我们想要将清楚好的槽号统一分配 给redis-node-1,代码如下图所示:

redis-cli --cluster reshard 分配给的目标IP:端口

输入完成后需要选择分配的槽位以及选择将槽位分配给谁,具体大致如下图所示:
image.png
在此基础上我们实现主容器的删除,至此主从缩容顺利实现:

redis-cli --cluster del-node 删除容器IP:Port 删除容器ID

image.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/123152.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

windows上 Nexus 批量上传 maven依赖npm依赖

windows上 Nexus 批量上传 maven依赖/npm依赖 前言&#xff1a;windows系统上要有git环境&#xff0c;不然sh文件执行不了 1.批量上传maven依赖 设置脚本&#xff0c;把脚本放在依赖包的根目录执行&#xff0c;脚本名为upload.sh #!/bin/bash# 定义变量 while getopts &quo…

零信任安全:构建无懈可击的网络防护体系

随着网络技术的飞速发展&#xff0c;信息安全问题日益凸显&#xff0c;传统的安全防护手段已经无法满足复杂多变的安全需求。在此背景下&#xff0c;零信任安全模型逐渐受到广泛关注。本文将探讨零信任安全的概念、优势以及如何构建无懈可击的网络防护体系。 一、零信任安全概念…

Flink(三)【运行时架构】

前言 今天学习 Flink 的一些原理性的东西&#xff0c;比较偏概念&#xff0c;但是十分重要。有人觉得上来框框敲代码才能学到东西&#xff0c;那是狗屁不通的道理&#xff08;虽然我以前也这么认为&#xff09;。个人认为&#xff0c;学习 JavaEE那些框架&#xff0c;你上来就敲…

图的基本操作

基本操作 Adjacent(G,x,y):判断图G是否存在边<x,y>或(x,y)Neighbors(G,x):列出图G中与结点x邻接的边InsertVertex(G,x):在图G中插入顶点xDeleteVertex(G,x):从图G中删除顶点xAddEdge(G,x,y):若无向边(x,y)或有向边<x,y>不存在&#xff0c;则向图G中添加该边Remove…

安卓学习记录

文章目录 Text_View基础属性字体阴影跑马灯**activity_main.xml**MyTextview button Text_View ctrl右键可以看到属性 代码整理采用的快捷键是ctrlaltL(电脑qq锁定快捷键&#xff0c;退一下qq就行了) 基础属性 字体阴影 <?xml version"1.0" encoding"utf-…

网络安全深入学习第八课——代理与端口转发

文章目录 一、什么是代理二、正向代理三、反向代理四、正向和反向代理模拟复现 一、什么是代理 代理服务器英文全称是Proxy Server&#xff0c;其功能就是代理网络用户去取得网络信息。 形象的说&#xff1a;它是网络信息的中转站。在一般情况下&#xff0c;我们使用网络浏览…

PyCharm 无法登陆 Codeium 的解决方法

PyCharm 登陆 Codeium PyCharm 无法登陆 Codeium 的问题描述PyCharm 使用 token 登陆 Codeium PyCharm 无法登陆 Codeium 的问题描述 使用 PyCharm 登录 Codeium 时&#xff0c;单击 Login 无反应&#xff0c;单击侧边栏的 Codeium 图标也一直显示连接失败。 PyCharm 使用 to…

RHCE8 资料整理(五)

RHCE8 资料整理 第五篇 系统管理第18章 进程管理18.1 进程介绍18.2 查看进程18.3 向进程发送信号18.4 进程优先级 第19章 日志19.1 rsyslog的配置19.2 查看日志 第20章 网络时间服务器20.1 时间同步必要性20.2 配置时间服务器20.3 配置客户端 第21章 计划任务21.1 at21.2 cront…

基于Pytorch框架的LSTM算法(一)——单维度单步滚动预测(2)

#项目说明&#xff1a; 说明&#xff1a;1time_steps滚动预测代码 y_norm scaler.fit_transform(y.reshape(-1, 1)) y_norm torch.FloatTensor(y_norm).view(-1)# 重新预测 window_size 12 future 12 L len(y)首先对模型进行训练&#xff1b; 然后选择所有数据的后wind…

如何做游戏软件开发?怎么和软件开发公司合作?

随着科技的发展和普及&#xff0c;游戏软件已经成为人们日常生活和工作中不可或缺的一部分&#xff0c;许多企业也开始涉足游戏软件开发领域&#xff0c;希望能够打造出一款受欢迎的游戏&#xff0c;那么&#xff0c;如何做游戏软件开发?怎么和软件开发公司合作呢?下面我们来…

cmake vs2022编译opencv4.5.2 x86 版本

cmake 编译opencv 452 x86 版本 where is the source code 选项放置你的源文件 where to build the binaries 放置你生成结果的文件夹 点击按钮Configure,弹出提示&#xff0c;选择Win32&#xff0c;finishi 等待生成 列表中出现红色的选项&#xff0c;根据你的需要取消或…

Django框架简介

文章目录 Django框架介绍MVC与MVT模型MVCMTV 版本问题运行django注意事项 Django的下载与基本命令下载Django方式一&#xff1a;在命令界面使用pip安装方式二&#xff1a;使用pycharm安装 Django的基础命令命令行操作pycharm操作 Django项目命令行操作与Pycharm操作的区别应用D…

关于变电站综合自动化系统的案例应用分析-安科瑞 蒋静

摘 要&#xff1a;变电站综合自动化系统是将变电站内的二次设备经过功能的组合和优化设计&#xff0c;利用先进的计算机技术、通信技术、信号处理技术&#xff0c;实现对全变电站的主要设备和输、配电线路的自动监视、测量、控制、保护、并与上级调度通信的综合性自动化功能。 …

浏览器加get请求导致参数+变空格

场景: 参数有号。取值也取的正确数值&#xff0c;但是传到后台 号就变成了空格 在传参的时候在参数外面包一层encodeURIComponent即可 encodeURIComponent(this.chooseRow.offerId)

SDL2 简单介绍以及Windows开发环境搭建

1.简介 SDL&#xff08;Simple DirectMedia Layer&#xff09;是一个跨平台的多媒体开发库&#xff0c;使用C语言写成&#xff0c;用于实现音频、图形、输入以及窗口功能的处理。它提供了一个简单、易用的API&#xff0c;可以帮助开发者快速构建跨平台的多媒体应用程序。 SDL…

蓝桥杯练习

即约分数 题目 思路 遍历所有的x&#xff0c;y&#xff0c;判断x/y是不是即越约分数。 代码 #include <iostream> using namespace std; int gcd(int x,int y) {int r;while(y!0){rx%y;xy;yr;}return x; } int main() {// 请在此输入您的代码int sum4039;//1/y和x/1都…

Vue 循环el-select 并且不能重复选择相同数据

根据已选择的属性 , 禁用相同属性的选项 ,如果重复则不能再选择 <template><div class"container"><h3>需求&#xff1a;一共4台车 每人只能选择不一样的车 选过的不能再选</h3><divv-for"(item, index) in person.model.selectList…

Microsoft Dynamics 365 CE 扩展定制 - 9. Dynamics 365扩展

在本章中,我们将介绍以下内容: Dynamics 365应用程序Dynamics 365通用数据服务构建Dynamics 365 PowerApp使用Flow在CDS和Dynamics 365之间移动数据从AppSource安装解决方案使用数据导出服务解决方案进行数据复制从CRM数据构建Power BI仪表板简介 多年来,Dynamics CRM已从一…

【遮天】荒古禁地采取圣药,姬老自己走上绝路,故事扣人心悬

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析国漫资讯。 深度爆料&#xff0c;《遮天》动漫第30话最新剧情解析&#xff0c;姬云峰&#xff0c;姬家的长老&#xff0c;地位崇高&#xff0c;深受家族成员的尊敬和信赖。他的智慧和经验在家族中享有极高的声望&#xf…

第三章:人工智能深度学习教程-基础神经网络(第四节-从头开始的具有前向和反向传播的深度神经网络 – Python)

本文旨在从头开始实现深度神经网络。我们将实现一个深度神经网络&#xff0c;其中包含一个具有四个单元的隐藏层和一个输出层。实施将从头开始&#xff0c;并实施以下步骤。算法&#xff1a; 1. 可视化输入数据 2. 确定权重和偏置矩阵的形状 3. 初始化矩阵、要使用的函数 4. 前…