11-Docker-Redis集群部署

news2024/12/23 22:08:03

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

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

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

相关文章

2009-2018年全国各省财政透明度数据

2009-2018年全国各省财政透明度数据 1、时间&#xff1a;2009-2018年 2、指标&#xff1a;财政透明度 3、范围&#xff1a;31省 4、来源&#xff1a;财政透明度报告 5、指标解释&#xff1a; 财政透明度是公开透明的重要方面&#xff0c;体现了现代预算制度和法治政府的特…

09-MySQL主从复制

01-主从复制原理 MySQL主从复制是一种用于实现数据备份、读写分离和扩展性的技术。它基于二进制日志&#xff08;Binary Log&#xff09;来将主数据库上的更改操作同步到一个或多个从数据库。 MySQL主从复制的基本原理如下&#xff1a; 主服务器&#xff08;Master&#xff0…

HTTP协议详解-下(Tomcat)

如何构造 HTTP 请求 对于 GET 请求 地址栏直接输入点击收藏夹html 里的 link script img a…form 标签 通过 form 标签构造GET请求 <body><!-- 表单标签, 允许用户和服务器之间交互数据 --><!-- 提交的数据报以键值对的结果来组织 --><form action&quo…

JAVA开源项目 于道前端项目 启动步骤参考

1. 安装 启动过程有9个步骤&#xff1a; 1.1 安装 Node JS , V18版本的 &#xff08;安装步骤省略&#xff09; 1.2 安装 npm install -g yarn &#xff0c;node JS里边好像自带npm &#xff0c;通过npm的命令安装 yarn 1.3 切换到项目中去安装&#xff0c;npm install &a…

5G网络切片,到底是什么?

网络切片&#xff0c;是5G引入的一个全新概念。 一看到切片&#xff0c;首先想到的&#xff0c;必然是把一个完整的东西切成薄片。于是&#xff0c;切面包或者切西瓜这样的画面&#xff0c;映入脑海。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 然而…

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

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

【Data Grip】打开控制台编写sql语句

这里我从表打开&#xff08;也可以从其他地方打开都行&#xff0c;右键new,出现Query Console 点击即可)控制台&#xff0c;右键表 new 点击query console 在上面编写sql语句 编写完之后 点击绿色三角形运行

某平台简单尝试一次密码逆向

1、查看表单数据 发现密码加密 2、控制台搜索password 发现他在欺负我看不懂拼音 3、第一次断点调试失败 断点后随便填写账号密码登录&#xff0c;发现失败 4、控制台搜索 jiami 又找到了一个函数 5、断点成功 重新登录后断点成功 jiami function(password) {var e passw…

代码随想录训练营Day1:二分查找与移除元素

本专栏内容为&#xff1a;代码随想录训练营学习专栏&#xff0c;用于记录训练营的学习经验分享与总结。 文档讲解&#xff1a;代码随想录 视频讲解&#xff1a;二分查找与移除元素 &#x1f493;博主csdn个人主页&#xff1a;小小unicorn ⏩专栏分类&#xff1a;C &#x1f69a…

Django之三板斧的使用,全局配置文件介绍,request对象方法,pycharm链接数据库,Django链接数据库,ORM的增删改查

【1】三板斧(3个方法)的使用 Httpresponse() 括号内写什么字符串&#xff0c;返回的就是什么字符串返回的是字符串 render(request&#xff0c; 静态文件 ) request是固定的静态文件是写在templates文件夹里面的&#xff0c;如&#xff0c;HTML文件 redirect( 重定向的地址 ) 重…

EfficientNet 系列网络学习

EfficientNet V1 EfficientNet: Rethinking Model Scaling for Convolutional Neural Networks 增加网络参数的方式有三种&#xff1a;深度、宽度和输入图像的分辨率。探究这三种方式对网络性能的影响&#xff0c;以及如何同时缩放这三种因素是 EifficentNet的主要贡献。 单独…

内核移植笔记 Cortex-M移植

常用寄存器 PRIMASK寄存器 为1位宽的中断屏蔽寄存器。在置位时&#xff0c;它会阻止不可屏蔽中断&#xff08;NMI&#xff09;和HardFault异常之外的所有异常&#xff08;包括中断&#xff09;。 实际上&#xff0c;它是将当前异常优先级提升为0&#xff0c;这也是可编程异常/…

【代码随想录】算法训练营 第二十天 第六章 二叉树 Part 6

654. 最大二叉树 题目 给定一个不重复的整数数组 nums 。 最大二叉树 可以用下面的算法从 nums 递归地构建: 创建一个根节点&#xff0c;其值为 nums 中的最大值。递归地在最大值 左边 的 子数组前缀上 构建左子树。递归地在最大值 右边 的 子数组后缀上 构建右子树。 返回…

西部数码的域名如何实现DDNS功能

功能简介&#xff1a; 动态域名解析&#xff08;Dynamic DNS&#xff0c;简称DDNS&#xff09;可以让用户使用固定的域名来访问动态IP地址&#xff0c;解决因IP地址变化造成服务无法访问的情况。 本文将介绍如何使用西部数码的API实现DDNS功能&#xff0c;使您的域名始终指向您…

SpringCloudGateway--Sentinel限流、熔断降级

目录 一、概览 二、安装Sentinel 三、微服务整合sentinel 四、限流 1、流控模式 ①直接 ②关联 ③链路 2、流控效果 ①快速失败 ②Warm Up ③排队等待 五、熔断降级 1、慢调用比例 2、异常比例 3、异常数 一、概览 SpringCloudGateway是一个基于SpringBoot2.x的…

第一次pta认证P测试C++

第一题 试题编号&#xff1a;20210701-1 试题名称&#xff1a;标题统计 时间限制&#xff1a; 1.0s 内存限制&#xff1a; 128.0MB 【问题描述】 小明阅读了一篇特别优美的英文文章&#xff0c;读到最后总结段落的时候&#xff0c;突发奇 想&#xff0c;想要数一数这个段落中…

python+pytorch人脸表情识别

概述 基于深度学习的人脸表情识别&#xff0c;数据集采用公开数据集fer2013&#xff0c;可直接运行&#xff0c;效果良好&#xff0c;可根据需求修改训练代码&#xff0c;自己训练模型。 详细 一、概述 本项目以PyTorch为框架&#xff0c;搭建卷积神经网络模型&#xff0c;训…

数据采集中的基本参数

分辨率(resolution) 分度数量越多则分辨率越高&#xff0c;测量精度也越高 区间(range) 模数转换所能处理模拟信号电平的极限 应尽量使输入与此区间匹配&#xff0c;物尽其用 信号极限幅度集合 所测信号的最大值和最小值 应与输入信号的最大值和最小值相接近 LSB 最低有效…

python编程复习系列——week1(Input Output)

Input & Output 前言0、我们的第一个Python程序一、变量和数据类型1.变量是用来存储值的保留存储位置2.变量以特定的数据类型存储值。常见数据类型&#xff1a;3.字符串添加&#xff08;连接&#xff09;4.字符串乘法&#xff08;带数字&#xff09;&#xff01;5.从用户处…