Docker 部署 Redis Cluster 高性能高可用分片集群

news2025/1/17 21:13:48

文章目录

  • 1、环境准备
  • 2、Cluster 集群讲解
    • 2.1、Cluster 介绍
    • 2.2、Cluster 和哨兵模式区别
    • 2.3、Cluster 如何分散存储数据
  • 3、Cluster 搭建流程
    • 3.1、安装 Docker
    • 3.2、启动 Redis 容器
    • 3.3、创建 Cluster 集群
  • 4、Cluster 集群测试
    • 4.1、读写操作
    • 4.2、故障转移

1、环境准备

准备6台2核2G阿里云ECS服务器(可用虚拟机代替),开放安全组端口号:22,6379

  • 服务器1(主):172.21.180.99
  • 服务器2(主):172.21.180.100
  • 服务器3(主):172.21.180.101
  • 服务器4(从):172.21.180.102
  • 服务器5(从):172.21.180.103
  • 服务器6(从):172.21.180.104

在这里插入图片描述

2、Cluster 集群讲解

2.1、Cluster 介绍

阿里云的Redis集群服务方案,采用的就是 Redis Cluster 集群模式

Cluster 模式是 Redis 3.0 之后推出的集群方案,采用多主多从的应用集群,承载大量应用缓存数据,由于采用无中心结构,集群中每个节点保存数据和集群的状态,每个节点之间都是互相连接的,采用gossip协议相互通信、交换节点数据信息。(企业首选Redis集群方案 👍)

Redis官方推荐 Cluster 集群最低配置是3主3从(其中1主可以n从),一般来说3主3从就能满足90%以上场景了,每个Redis主节点之间存储的缓存数据是不同的,主节点与对应的从节点数据是主从同步的,所以只要 Cluster 集群规模够大,不论多少GB、TB缓存数据都能够存储。

从节点在集群中不进行工作(备用),从节点只提供故障转移功能。当主节点宕机时就会将从节点晋升为主节点,如果比较看重集群高可用性,可以1主多从代替1主1从,极大提升Cluster 集群高可用特性。
在这里插入图片描述

2.2、Cluster 和哨兵模式区别

哨兵模式是基于主从模式方案的,所以每个节点存储的是全量数据,也就是说每个Redis节点中保存的是所有的数据(Cluster每个主节点存储的是分片数据)。

Cluster 模式不仅提供了高性能读写,还能像哨兵模式那样提供故障转移,所以Cluster模式不需要主从模式 + 哨兵模式那样保证高可用特性,Cluster模式集群本身就具备故障转移高可用机制,而且也不存在单节点内存限制这个问题,也就是说当缓存的数据量非常大时,一台Redis主服务器存放不下的情况时,主从模式 + 哨兵模式就不能满足需求了,这时候就需要Cluster模式,不论多大数据,哪怕TB级别,只要Cluster集群的主节点数量够多,就能够进行存储,非常牛!

所以!Cluster模式不需要和哨兵模式一起使用,多此一举。主从模式哨兵模式适合一起使用。

2.3、Cluster 如何分散存储数据

Redis Cluster 集群采用 Hash Slot(哈希槽)分配存储所有的缓存数据,哈希槽总共有16384个槽位,初始化 Cluster 集群时就会将所有缓存数据平均规划给每一台Redis主节点。

当客户端向Cluster集群发送读写请求时,Cluster集群会使用CRC16算法计算Key键,然后对16384取模就能得到Hash槽位编号。就知道本次读写请求在哪台主节点上了,通过数据分片负载均衡故障转移实现大规模数据存储和高性能和高可用要求场景。

为什么采用16384作为槽总数呢(了解)?

是因为在Redis集群中槽分配数据会在集群中分发,保证每个节点都能知道分配情况
而16384 = 16k,发送心跳包时使用char进行bitmap压缩后是2k(2k = 2 * 1024 * 8bit = 16k)
通过Redis Cluster集群不会超过10000个主节点,所以使用16384是足够的

在这里插入图片描述

3、Cluster 搭建流程

3.1、安装 Docker

安装好Docker环境,Docker环境配置参考该文章第一节:

https://blog.csdn.net/weixin_46594796/article/details/122750009

3.2、启动 Redis 容器

在6台服务器上,创建Redis宿主机配置文件:

# 创建文件夹,用于容器文件挂载
mkdir /data
mkdir /data/redis
mkdir /data/redis/data
mkdir /data/redis/conf

# 创建配置文件
cd /data/redis/conf
vim redis.conf

redis 配置内容如下:

# 不能设置密码,否则集群启动时会连接不上
# Redis服务器可以跨网络访问
bind 0.0.0.0
# 修改端口号
port 6379
# Redis后台启动(Docker 中的 Redis 需要将 daemonize 设置为 no)
daemonize no
# 开启aof持久化
appendonly yes
# 关闭保护模式
protected-mode no

# ======================集群相关=====================
# 开启集群
cluster-enabled yes
# 集群的配置 配置文件首次启动自动生成
cluster-config-file nodes.conf 
# 请求超时,默认15000
cluster-node-timeout 15000 
# 集群节点映射端口
cluster-announce-port 6379 
# 集群节点总线端口,节点之间互相通信,常规端口+1万,用port + 10000
cluster-announce-bus-port 16379

在6台服务器上,设置Redis配置文件权限:

chmod 754 /data/redis/conf/redis.conf

在6台服务器上,启动创建Redis容器:

# 下拉镜像、启动容器
docker run -p 6379:6379 -p 16379:16379 --name redis \
-v /data/redis/data:/data \
-v /data/redis/conf:/usr/local/etc/redis \
-e TZ="Asia/Shanghai" \
-d --restart=always \
redis:6.0.2 redis-server /usr/local/etc/redis/redis.conf

3.3、创建 Cluster 集群

通过下述命令,访问任意进入一台Redis容器:

docker exec -it redis /bin/bash

然后在容器内部,执行下述命令,创建Redis集群:

# 主节点:172.21.180.99 | 172.21.180.100 | 172.21.180.101
# 从节点:172.21.180.102 | 172.21.180.103 | 172.21.180.104
# 1主1从:--cluster-replicas 1
redis-cli --cluster create 172.21.180.99:6379  172.21.180.100:6379  172.21.180.101:6379  172.21.180.102:6379  172.21.180.103:6379  172.21.180.104:6379 --cluster-replicas 1

集群构建成功!
在这里插入图片描述
输入下述命令,查看集群节点信息:

# 查询 Redis Cluster 集群信息
redis-cli cluster nodes

172.21.180.99 :0~5460槽,从节点为 172.21.180.103
172.21.180.100 :5461~10922槽,从节点为 172.21.180.104
172.21.180.101 :10923~16383槽,从节点为 172.21.180.102
在这里插入图片描述

4、Cluster 集群测试

4.1、读写操作

随意进入一个节点的Redis容器内部,连接到 redis:

# 进入容器
docker exec -it redis bash

# 连接 redis(一定要 -c,否则无法重定向)
redis-cli -c

# 存储数据
set a b

写入数据计算的哈希槽为 15495,在172.21.180.101节点上:
在这里插入图片描述
执行读命令:

get a

读取数据计算的哈希槽为 15495,在172.21.180.101节点上:
在这里插入图片描述

4.2、故障转移

当主服务器挂掉后,会发生什么现象呢?那我在这里通过命令停止 172.21.180.99 的Redis容器:

# 停止容器
docker stop 容器id

此时查看从节点日志 172.21.180.103 :

# 查看日志
docker logs -f 容器id

通过日志发现,无法连接到 172.21.180.99 主节点,经过选举自己变成主节点:
在这里插入图片描述

最后 172.21.180.103 变成了主节点:
在这里插入图片描述
并可以将数据添加到这个新晋升的主节点中:
在这里插入图片描述
如果这对主从节点都宕机了,那整个集群也无法提供服务了!
在这里插入图片描述
所以如果服务资源足够的情况下,尽可能为一个主建立多个从,否则主从都挂掉了,整个集群都不可用了!

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

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

相关文章

Linux系统中qfile调用seek无法更新指定位置文件内容

一、问题描述 最近在移植qt程序到银河麒麟系统中,发现在Windows下调用seek接口更新二进制文件功能在麒麟系统中总是无法实现更新,调用的QFile接口也并未报错。 原代码实现方式如下: if (!m_writeFile->open(QIODevice::WriteOnly | QIODe…

GLM-4本地部署的实战教程

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

必应bing国内广告怎样开户投放呢?

企业都在寻找高效、精准的营销渠道以扩大品牌影响力,提升市场占有率,作为全球第二大搜索引擎,微软旗下的必应Bing凭借其卓越的搜索技术和庞大的用户基础,成为了众多企业拓展市场的首选广告平台。在中国,必应Bing广告以…

为什么3D渲染有的模型是黑的?---模大狮模型网

在3D建模和渲染的过程中,遇到模型渲染出来是黑色的情况并不罕见。这可能是由于多种原因导致的,包括但不限于材质设置问题、灯光配置不当、渲染设置错误等。 一、材质设置问题 材质丢失或错误:如果模型在导入或创建时材质没有正确加载或设置&…

AIGC实战!7个超热门的 Midjourney 关键词教程

一、剪纸风格 核心词: paper art(剪纸艺术) 关键技巧: 主体物:可以换成任意主角,Chinese illustration (中国风插画);艺术风格:paper art (剪纸…

Qt各发布版本介绍与选择

一.Qt各个主要版本介绍 1.Qt4 Qt4的第一个版本是Qt 4.0,发布于2005年6月1日。 Qt 4的最后一个版本是Qt 4.8.7,发布时间是2015年6月10日。 2.Qt5 (1)Qt5的第一个版本是Qt 5.0,发布于2012年12月19日。 (2&…

提高工作效率的神器有哪些?

在这个人工智能技术蓬勃发展的时代,很多AI工具极大地提升我们的工作效率,比如很多人在用的ChatGPT、Kimi,它们几乎无所不能,小编在日常工作也用它们,建议想抓住AI风口,或者是想用这些工具提升自己的朋友去学…

【云原生】Docker Compose 使用详解

目录 一、前言 二、Docker Compose 介绍 2.1 Docker Compose概述 2.2 Docker Compose特点 2.3 Docker Compose使用场景 三、Docker Compose 搭建 3.1 安装docker环境 3.2 Docker Compose安装方式一 3.2.1 下载最新版/如果不是最新可替换最新版本 3.2.2 设置权限 3.2.…

c++------类和对象(下)包含了this指针、构造函数、析构函数、拷贝构造等

文章目录 前言一、this指针1.1、this指针的引出1.2、 this指针的特性 二、类的默认的六个构造函数2.1、构造函数简述2.2构造函数 三、析构函数3.1、析构函数引出3.2、特点: 四、拷贝构造4.1、引入4.2、特征:4.3、默认拷贝构造函数 总结 前言 在本节中&a…

随身WiFi十大热门品牌优缺点分析!哪个品牌的随身wifi更值得买?随身wifi推荐测评!

格行随身wifi 【品牌特点】:服务好,性价比高,随身WiFi行业的“海底捞” 【优点】:专注物联网行业15年,产品和服务双驱动,综合实力和客户口碑领先 【缺点】:产品相对聚焦,产品类型…

springboot 实现kafka多源配置

文章目录 背景核心配置自动化配置类注册生产者、消费者核心bean到spring配置spring.factoriesyml配置使用 源码仓库 背景 实际开发中,不同的topic可能来自不同的集群,所以就需要配置不同的kafka数据源,基于springboot自动配置的思想&#xf…

springboot 图形验证码 前后端分离解决方案 easy-captcha

easy-captcha介绍 easy-captcha&#xff0c;提供了Java图形验证码&#xff0c;支持gif、中文、算术等类型&#xff0c;可用于Java Web、JavaSE等项目&#xff0c;是个很好用的工具库&#xff0c;文档比较完备。 用法 添加maven依赖 <!--图形验证码--><dependency&g…

Postman 加密接口测试 | 使用Rsa、Aes对参数加密

前言 做接口加密的测试也是上次遇到的&#xff0c;在这之前&#xff0c;都是在浏览器登录后&#xff0c;从请求头中复制 token 过来测试.... 说真的&#xff0c;一瞬间我都有点诧异&#xff0c;这样也太麻烦了吧~&#xff0c;因而也就产生了这篇文章。 还有一些问题&#xf…

Java学习Lambda表达式

Lambda表达式 有且只有一个未实现的方法叫做Lambda表达式&#xff0c;可以实现函数式编程 // 这个注解是用来检查你写的函数是否是函数式接口 FunctionalInterfaceinterface Myinterface {int sum(int a, int b);default String priteTitle(String name, int age, String sex)…

Docker 简介和安装

目录 Docker 是什么 跟普通虚拟机的对比 打包、分发、部署 Docker 部署的优势 Docker 通常用来做什么 重要概念&#xff1a;镜像、容器 安装 镜像加速源 Docker 是什么 Docker 是一个应用打包、分发、部署的工具 你也可以把它理解为一个轻量的虚拟机&#xff0c;它只虚…

友思特案例 | 自动快速定位:使用波长选择器测量滤光片的关键光学性能指标

导读 光学滤光片检测的手动调节校准的传统方法存在诸多不确定误差和高昂的成本消耗。友思特全自动可调谐光源检测解决方案&#xff0c;可全自动调节波长带宽&#xff0c;快速收集光谱数据&#xff0c;缩短检测时间、降低质检成本&#xff0c;实现极高的准确率和快速检测效率。…

有关Qt的调用其他cpp文件出现的小问题

一开始出现了运行mainwindow文件过程调用其他cpp文件&#xff0c;而导致运行的ui界面卡住&#xff0c;后来发现在两个cpp文件中都进行了界面的初始化而导致界面的某些控件二次使用&#xff0c;所以会卡住。 ui->setupUi(this); 在Qt框架中&#xff0c;ui->setupUi(this)…

ECS搭建redis4.0集群版

在 CentOS 上安装 Redis 4.0 集群版涉及多个步骤&#xff0c;包括安装 Redis、配置集群并启动它。下面将详细介绍整个过程&#xff1a; 1. 系统更新 首先&#xff0c;保证系统是最新的。 sudo yum update2. 安装依赖项 安装构建 Redis 所必需的依赖&#xff1a; sudo yum …

YOLOv5改进 |损失函数 | 替换CIoU损失函数为EIoU【附完整代码 】

&#x1f4a1;&#x1f4a1;&#x1f4a1;本专栏所有程序均经过测试&#xff0c;可成功执行&#x1f4a1;&#x1f4a1;&#x1f4a1; 在目标检测领域内&#xff0c;尽管YOLO系列的算法傲视群雄&#xff0c;但在某些方面仍然存在改进的空间。在YOLOv5的损失函数中&#xff0c;…

<Rust><iced>基于rust使用iced库构建GUI实例:动态改变主题色

前言 本专栏是Rust实例应用。 环境配置 平台&#xff1a;windows 软件&#xff1a;vscode 语言&#xff1a;rust 库&#xff1a;iced、iced_aw 概述 本篇构建了这样的一个实例&#xff0c;可以动态修改UI的主题&#xff0c;通过菜单栏来选择预设的自定义主题和官方主题&#…