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

文章目录

  • 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.mzph.cn/bicheng/23087.shtml

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

相关文章

基于Keil5移植LVGL,懂得原理之后什么开发板都可以移植

今天我们来移植一下LVGL,其实LVGL和Qt差不多,操作起来都很简单,看着官方文档都可以自己学习使用。 难就难在移植上面,移植个LVGL花了我三天才弄明白(虽然最后发现在一个很弱智的问题上耽误了我两天)&#…

oracle 打补丁遇到 check “CheckActiveFilesAndExecutables“ failed报错处理方法

该报错是因为打补丁的时候停止集群没有停止干净进程导致的 问题 处理方法 强制停止打补丁所在节点集群服务 查看grid和oracle相关进程是否停止干净,发现有未关闭的进程手动kill 处理完毕继续打补丁即可

跟着大佬学RE(四)

几个API函数 [ACTF新生赛2020]Universe_final_answer 一个很多方程组的函数,还有一个嗯,对input进行一些操作的函数 嗯,确实方程解出来得到 key 直接运行就可以得到 flag 了,不过还是去分析了一下。 v22 __readfsqword(0x28u);…

【深度学习】安全帽检测,目标检测,Faster RCNN训练

文章目录 资料环境尝试训练安全帽数据训练测试预测全部数据、代码、训练完的权重等资料见: 资料 依据这个进行训练: https://github.com/WZMIAOMIAO/deep-learning-for-image-processing/tree/master/pytorch_object_detection/faster_rcnn ├── bac…

nt9856_sensor_driver camera i2c无响应

前言 最新更换了不同的平台进行开发,所以一心在研究和学习中,没有太多的时间发布文章,最近开开始上手了,抽空把之前的工作记录进行总结和发布。从原来的高通和瑞芯微转到了国科和海思联咏,整体的架构不太一致&#xff…

【JVM】已验鼎真,鉴定为:妈妈加载的(双亲委派模型)

【JVM】已验鼎真,鉴定为:妈妈加载的(双亲委派模型) 在Java的世界中,类加载器(ClassLoader)是Java虚拟机(JVM)用来动态加载类的基础组件。双亲委派模型(Paren…

安装和使用conda

Conda 是一个开源的软件包管理系统和环境管理系统,用于安装多个版本的软件包及其依赖关系,并在它们之间轻松切换。可以创建多个环境,并在环境中使用不同的python版本,并安装环境专属的python依赖包,可以用来避免python…

MySQL中:cmd下输入命令mysql -uroot -p 连接数据库错误

目录 问题cmd下输入命令mysql -uroot -p错误 待续、更新中 问题 cmd下输入命令mysql -uroot -p错误 解决 配置环境变量:高级系统设置——环境变量——系统变量——path编辑——新建——MySQL.exe文件路径(如下图所示) phpstudy2018软件下&am…

王学岗鸿蒙开发(北向)——————(二)TS基本语法详解

1,Ts(TypeScript)语法相当于JAVAScript类型,鸿蒙arkTs是基于TS语言的,当然artTs也融合了其它的语言。 2,本篇文章是基于n9版本。注意,有些语法是已经不能用的。 3, 4,变量:用来存储数据,数字字母组成,数字不…

泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例

文章链接:泛微开发修炼之旅--07通过后端代码实现创建并发送待办、源码及示例

解决找不到api-ms-win-crt-runtime-l1-1-0.dll问题的5种方法

电脑已经成为我们生活和工作中不可或缺的工具,然而,由于各种原因,我们可能会遇到一些常见的问题,其中之一就是电脑缺失api-ms-win-crt-runtime-l1-1-0.dll文件。这个问题可能会导致电脑出现错误提示、程序无法正常运行等困扰。为了…

[Redis]Zset类型

Zset有序集合相对于字符串、列表、哈希、集合来说会有一些陌生。 它保留了集合不能有重复成员的特点,但与集合不同的是,有序集合中的每个元素都有一个唯一的浮点类型的分数(score)与之关联,着使得有序集合中的元素是可…

Python04:python代码设置作者/创建时间/文件名称

我们新建一个py文件时,如果希望文件开头有固定的内容,怎么设置呢? 比如代码作者、文件创建时间等。。。 1、点击左上角【Python】–>【Settings】设置 2、在弹出的新窗口找到【File and Code Templates】–>【Python Script】–>在右…

6_5 test

Lucene 存储引擎 https://www.cnblogs.com/tech-lee/p/15225276.html\ 规范 问问题的技巧 提问者:要实现怎样的目标?自己计划是如何实现这个目标的?问题出现在哪个环节?自己为了解决这个问题,已经做了哪些尝试和工…

【ubuntu软件版本管理】利用update-alternatives管理ubuntu软件

​ 我们有的时候希望在安装了新软件之后保留旧版本的软件,比如希望保留旧版本的gcc,以防以前写的C编译出问题,这时候就需要版本管理软件update-alternatives。 ​ 在此之前我们需要先弄清楚,什么是ubuntu的软件?拿C源…

推荐系统学习 一

参考:一文看懂推荐系统:召回08:双塔模型——线上服务需要离线存物品向量、模型更新分为全量更新和增量更新_数据库全量更新和增量更新流程图-CSDN博客 一文看懂推荐系统:概要01:推荐系统的基本概念_王树森 小红书-CSD…

Python 全栈体系【四阶】(五十七)

第五章 深度学习 十三、自然语言处理(NLP) 2. 传统NLP处理技术 2.4 关键词提取 关键词提取是提取出代表文章重要内容的一组词,对文本聚类、分类、自动摘要起到重要作用。此外,关键词提取还能使人们便捷地浏览和获取信息。现实…

Qt 的 d_ptr (d-pointer) 和 q_ptr (q-pointer)解析;Q_D和Q_Q指针

篇一: Qt之q指针(Q_Q)d指针(Q_D)源码剖析---源码面前了无秘密_qtq指针-CSDN博客 通常情况下,与一个类密切相关的数据会被作为数据成员直接定义在该类中。然而,在某些场合下,我们会…

这才是大模型价格战背后的真相

想必大家今天肯定被各家大模型厂商的降价新闻刷圈了,如果说 Meta Llama 3 的开源是国外大模型市场的搅局者,那 DeepSeek-V2 就是国内大模型市场的鲶鱼,但是价格战背后是大模型基础设施优化带来的物美价廉,还是浑水摸鱼的噱头&…

引擎:Shader

一、原理 创建Shader脚本,创建材质球,将物体的渲染效果Shader脚本挂载到材质球,最后把材质球挂到3d物体上面从而实现渲染。 二、模型边缘发光 原理:正对着摄像机的模型三角面边缘光最弱,垂直于摄像机的模型三角面边缘光…