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

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

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

相关文章

计算机网络 ——数据链路层(广域网)

计算机网络 —— 广域网 什么是广域网PPP协议PPP协议的三个部分PPP协议的帧格式 HDLC协议HDLC的站HDLC的帧样式 PPP和HDLC的异同 我们今天来看广域网。 什么是广域网 广域网(Wide Area Network,简称WAN)是一种地理覆盖范围广泛的计算机网络…

php实现抖音小程序支付

开发者发起下单_小程序_抖音开放平台 第一步、抖音小程序发起支付 tt.pay_小程序_抖音开放平台 前端提交订单数据到后端接口,然后使用 tt.pay发起支付 请求参数 属性 类型 必填 说明 order_id string 是 担保交易服务端订单号 order_token string 是 …

css动画案例练习之会展开的魔方和交错的小块

这里写目录标题 一级目录二级目录三级目录 下面开始案例的练习,建议第一个动手操作好了再进行下一个一、交错的小块效果展示1.大致思路1.基本结构2.实现动态移动 2.最终版代码 二、会展开的魔方1.大致思路1.基本结构;2.静态魔方的构建3.让静态的魔方动起来 2.最终版…

Springboot高手之路01-AOP

文章目录 登录校验拦截器 基于拦截器实现登录校验功能全局异常处理器 登录校验 拦截器 拦截器是spring中提供的 所以第一步就是把拦截器交给spring管理 不管是过滤器还是拦截器都是需要配置路径 /** 拦截所有 拦截器放行直接是true 是否运行访问对应的web资源 拦截器实现Ha…

动态规划6:63. 不同路径 II

动态规划解题步骤: 1.确定状态表示:dp[i]是什么 2.确定状态转移方程:dp[i]等于什么 3.初始化:确保状态转移方程不越界 4.确定填表顺序:根据状态转移方程即可确定填表顺序 5.确定返回值 题解:63. 不同…

通用漏洞-基于同源策略的cors与jsonp域名接管

脚本参考:https://www.cnblogs.com/haorancracker/articles/17699536.html) 1.cors&jsonp 在csrf的学习中,我们了解到解决第三方网站采取的发包操作,最简单的策略就是同源策略sof,即为同协议,同域名,…

C++设计模式-单例模式,反汇编

文章目录 25. 单例模式25.1. 饿汉式单例模式25.2. 懒汉式单例模式25.2.1. 解决方案125.2.2. 解决方案2 (推荐写法) 运行在VS2022,x86,Debug下。 25. 单例模式 单例即该类只能有一个实例。 应用:如在游戏开发中&#x…

VS2022,DLL1调用lib,lib调用DLL2

DLL1调用lib,lib调用DLL2 问题1:为什么在dll1中需要引入dll2的.lib文件 当你有一个工程(dll1)调用静态库(lib),而静态库(lib)又调用另一个DLL(dll2&#xf…

BPTT算法详解:深入探究循环神经网络(RNN)中的梯度计算【原理理解】

引言 在深度学习领域中,我们经常处理的是独立同分布(i.i.d)的数据,比如图像分类、文本生成等任务,其中每个样本之间相互独立。然而,在现实生活中,许多数据具有时序结构,例如语言模型…

基于EasyX的贪吃蛇小游戏 - C语言

游戏基本功能演示: 1.主菜单界面 2.自定难度界面 在这里可以自行设定游戏的难度,包括蛇的移动速度,初始节数,以及默认模式,参考线(网格)。这些设定的数据都会在右上角的游戏属性栏中实时显示。…

二叉树的算法题目

二叉树的遍历题目 二叉树遍历一般包含三种分别为:根左右、左根右、左右根(又称为前序遍历、中序遍历、后序遍历) 方法一:使用递归遍历 方法二:使用迭代使用栈 我们以左根右(中序遍历&…

Spring系列-SpringMvc父子容器启动原理解析

1、Spring整合SpringMVC 特性: 说到Spring整合SpringMVC唯一的体现就是父子容器: 通常我们会设置父容器(Spring)管理Service、Dao层的Bean, 子容器(SpringMVC)管理Controller的Bean .子容器可以访问父容器的Bean, 父容器无法访…

【PCB]射频电路pcb设计

学习改变命运,技能成就未来!❤~~ 1射频信号的基础知识及工作原理介绍 射频的基础知识介绍 2射频板PCB的布局要求 3射频板布局要求 4屏蔽帐设计 5射频板的层叠阻抗设计 6射频板的PCB布线原则 7射频板的PCB布线要求 8射频板的设计实战

王道408数据结构CH1_绪论

概述 1.数据结构 1.1 数据结构三要素 逻辑结构 存储结构 顺序存储、链式存储、索引存储、散列存储 数据的运算

做自媒体素材哪里找?做自媒体必备的几个高质量素材网站分享

在自媒体的世界里,内容是王道。无论是视频还是文章,优秀的自媒体作品都需要有力的内容和高质量的素材作支撑。今天,我为大家整理了一些优质的素材网站,帮助每一位自媒体创作者,无论新手还是老手,都能找到适…

鸿蒙状态管理-@Builder自定义构建函数

Builder 将重复使用的UI元素抽象成一个方法 在build方法里调用 使其成为 自定义构建函数 Entry Component struct BuilderCase {build() {Column(){Row(){Text("西游记").fontSize(20)}.justifyContent(FlexAlign.Center).backgroundColor("#f3f4f5").hei…

Etcd Raft架构设计和源码剖析2:数据流

Etcd Raft架构设计和源码剖析2:数据流 | Go语言充电站 前言 之前看到一幅描述etcd raft的流程图,感觉非常直观,但和自己看源码的又有些不同,所以自己模仿着画了一下,再介绍一下。 下图从左到右依次分为4个部分&…

如何检查网站文件是否有病毒

本周有一个客户,购买Hostease的主机, 客户购买的是Linux虚拟主机,带cPanel面板的。询问我们的在线客服,他想检查下他的网站程序是否有病毒文件。Hostease虚拟主机附带病毒扫描软件功能,可以协助检查网站程序是否有病毒…

HTML静态网页成品作业(HTML+CSS)—— 节日端午节介绍网页(5个页面)

🎉不定期分享源码,关注不丢失哦 文章目录 一、作品介绍二、作品演示三、代码目录四、网站代码HTML部分代码 五、源码获取 一、作品介绍 🏷️本套采用HTMLCSS,未使用Javacsript代码,共有5个页面。 二、作品演示 三、代…

算法训练营第四十六天 | 卡码网52 携带研究材料、LeetCode 518 零钱兑换II、LeetCode 377 组合总和IV

写在前面 这次算法训练营题目,其实完全是按照代码随想录一路跟着来的,上面也有更好的、讲得更清楚的题解,有需要的小伙伴可以去那里看。 我这里是之前已经大体刷过一遍,为了应对有可能会考到的面试题,现在在跟着一个专…