Redis-06 Redis高可用集群架构原理与搭建

news2024/11/25 3:04:07

        前面章节搭建了Redis【主-从】架构和【主-从】+ 哨兵架构,已可满足部分企业场景应用,但都有其对应的弊端,本章节将讲解更优生产架构:Redis集群架构。不仅包含哨兵架构的自动选举功能,还能降低主从架构下主节点的单节点压力,且更易于拓展。

1,集群架构原理

        Redis集群架构的架构图如下:

       Redis集群是由多个【主-从】架构合并组成的分布式服务集群,将每个【主-从】设置为集群节点,使得集群架构具有复制、高可用、数据分片的特性。

        数据分片原理

        Redis集群的数据分片,是指将数据分散存储在多个节点上,以减轻单节点读写压力,提高数据存储能量条。Redis集群将数据存储位置为划分为16834个slots(槽位),编号是:0~16383。16384个槽位是官方根据性能评估出的最好结果,便于拓展,理论上可以更多。

        每个集群中的节点【主-从】负责一部分槽位,数据存储时,通过对key做CRC16算法,结果再对16384取模,得出key的槽位值(HASH_SLOT = CRC16(key)  mod 16384),再将【K-V】数据存储到对应槽位的节点上。如上图:集群共有三个节点,则第一节点master槽位:0~5460,第二个节点maseter槽位:5461~10922,第三个节点maseter槽位:10923~16383。当客户端连接集群时,会将集群各节点槽位信息缓存至客户端本地,提升定位节点效率。

        跳转重定向:当集群节点数量发生变化,节点槽位也会发生变化,若客户端对错误节点发送操作指令时,节点会将该key对应槽位与自身负责槽位作对比,不在自身负责槽位范围内,节点会向客户端发送跳转指令,并携带目标节点地址。客户端收到指令后将向正确节点重发指令,并更新本地槽位缓存。

        集群选举原理

        集群里每个【主-从】架构中的Redis节点与其他【主-从】的节点相互之间都有通讯,通讯机制采用的是gossip协议,保证通讯结果的最终一致性。需注意:当主节点宕机后,从节点的选举,只有从节点与其他【主-从】架构的“主”节点的通讯结果有效。选举步骤如下图:

1,主1宕机后,等待主2、主3与主1的下次通讯,确保主2、主3通过通讯失效判定主1宕机;

2,从1-A、从1-B标记故障转移请求次数(currentEpoch = 1),然后向主2、主3发送故障转移请求,即请求自己升级为新的主节点(主4),如从1-A的1,2请求,从1-B的3,4请求;

3,主2、主3收到升级请求后判断请求的合法性,合法后,只回复最先收到的升级请求,后来的升级请求不做回复;

4,当从1-A 或 从1-B收到超过主节点半数的同意升级请求的返回后,则升级为新的主节点。即如果从1-A收到主2、主3的同意返回,则从1-A升级为主节点(同理,从1-B升级为主节点)。

注意:上图中总主节点数为3,如果从1-A、从1-B收到的同意请求返回数相同,即各自收到一条同意,则重新发起一次选举,即重复234步(故障转移请求次数  +1,发送请求,等待回复,判断结果数量,升级主节点)

        根据上述步骤可知,选举机制中的【过半判断】取决于 集群中主节点数量,如果只有两个主节点,主1宕机后,从1-A、从1-B收到的ACK数量永远只能等于主节点总数量的一般,则永远无法升级为主节点,主1所在服务将不可用。故集群中Redis主节点至少需要三个,才可满足宕机选举的过半机制。

2,Redis集群搭建 

         根据前文选举原理可知,Redis集群至少需要三个节点,本章则搭建三个【主-从】节点的集群,共6个Redis服务。

        1,添加Redis节点配置文件

复制六份redis.conf文件,分别为redis-8000.conf, redis-8001.conf, redis-8002.conf, redis-8003.conf, redis-8004.conf, redis-8005.conf

 cp config/master-slave/redis-6379.conf config/cluster/redis-8000.conf

         2,修改配置文件

以redis-8000.conf举例,其余5个配置文件只需修改内容里的端口即可

bind 0.0.0.0                     // 不限IP
port 8000  

protected-mode no        // 关闭IP保护模式,通过密码访问
daemonize yes               // 后台运行


pidfile /var/run/redis_8000.pid
logfile "/opt/mydata/redis-5.0.0/logs/redis-cluster-8000.log"
dir /opt/mydata/redis-5.0.0/data/cluster/8000/       
 // 数据存储位


masterauth 123456       // 集群节点间访问密码
requirepass 123456      // Redis服务端访问密码

// 持久化配置
appendonly yes
appendfilename "appendonly.aof"
appendfsync everysec

// 集群配置
cluster-enabled yes                                      // 开启使用集群架构
cluster-config-file nodes-8000.conf            // 记录集群节点信息文件
cluster-node-timeout 15000                         // 

        3,启动6个节点

src/redis-server config/cluster/redis-8000.conf

        4,配置主从和集群

        此时6个节点还没有主从关系,也没有建立起集群间的通讯,通过如下命令建立:

 src/redis-cli -a 123456 --cluster create 127.0.0.1:8000 127.0.0.1:8001 127.0.0.1:8002 127.0.0.1:8003 127.0.0.1:8004 127.0.0.1:8005 --cluster-replicas 1

// -a password: 连接服务端密码

// --cluster create: 创建集群命令。cluster create host1:port1...hostN:portN

// --cluster-replicas N: N表示为每个master创建几个slave.本案例设置为1,结构为一主一从,则6/2,共有三个【主-从】结构。如果N=2,结构为一主两从,则6/3,共两个一主两从的结构。即Redis会根据后面的主机与N做适配。

        生产环境搭建时,至少需要三台Redis服务器,Redis会自动将主从非配在不同的机器上,以保证每个【主-从】架构至少有一个节点可正常访问。

        5,验证集群

        5.1,连接任意一个客户端:

src/redis-cli -a 123456 -c -h 127.0.0.1 -p 8000
// -a 访问服务端密码

// -c 集群模式,访问的是集群的节点

// -h 指定host

// -p 指定端口

        5.2,验证: cluster info(查看集群信息)、cluster nodes(查看节点列表)

        5.3,数据操作验证

        5.4,关闭集群需逐个进行关闭,使用命令:

src/rediscli a 123456 c h 127.0.0.1 p 8000 shutdown

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

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

相关文章

【Linux】一些Shell脚本编程基础题

目录 一、比较两个数的大小 二、求1-100的素数和 三、编写shell脚本,输入一个数字n并计算1~n的和,同时要求如果输入的数字小于1,则重新输入,直到输入正确的数字为止。 四、编写一个shell脚本用来进行成绩等级评定,…

Java代码实现PKCS5填充

1. 前言 如果你也在做加解密相关的需求,比如调用国密标准0018接口的对称加密/解密接口。就会遇到需要自己填充数据原文为16字节的整数倍(因为SM4分组算法的加密数据长度必须是其密钥大小的整数倍,SM4密钥大小是128bit,即&#xff…

mv_zhao直线

# 线段检测例程 # # 这个例子展示了如何在图像中查找线段。对于在图像中找到的每个线对象, # 都会返回一个包含线条旋转的线对象。# find_line_segments()找到有限长度的线(但是很慢)。 # Use find_line_segments()找到非无限的线&#xff08…

动态规划 —— 路径问题-最小路径和

1. 最小路径和 题目链接: 64. 最小路径和 - 力扣(LeetCode)https://leetcode.cn/problems/minimum-path-sum/description/ 2. 算法原理 状态表示:以莫一个位置位置为结尾 dp[i,j]表示:到达[i,j…

利用GPU加速在Orange Pi 5上跑LLMs:人工智能爱好者High翻了!

本期视频将会给人工智能爱好者们带来超级震撼! 视频中,我们将深入了解利用GPU加速在Orange Pi 5上跑LLMs的精彩世界。最近知乎上的一篇文章《利用GPU加速,在Orange Pi上跑LLMs》引起了我们的注意,这篇文章主要展示了GPU加速的LLM…

界面控件Kendo UI for Angular 2024 Q3亮点 - 全新的页面模板

随着最新的2024 Q3版本,Progress使用户能够使用现成的页面模板和构建块更快地构建令人惊叹的应用程序,使您的Telerik和Kendo UI开发体验更好。 Telerik和Kendo UI 2024 Q3版本将焦点放在新推出的页面模板和构建块上,每个页面模板和构建块都预…

鸿道Intewell操作系统架构介绍之Intewell-Hyper I 虚拟化构型

鸿道Intewell-Hyper I 虚拟化构型是鸿道Intewell-V虚拟化架构下的构型体系!鸿道Intewell-V是科东软件自主研发的实时虚拟化操作系统,包括鸿道Intewell-Hyper I 和鸿道Intewell-Hyper II。鸿道Intewell-V可以实现多个操作系统在同一物理硬件上并行运行&am…

聊一聊Qt中的Slider和ProgressBar

目录 QAbstractSilder 主要属性 设置值 信号 其他功能 API QSlider 主要功能 控制刻度 信号 用户交互 键盘操作 API QProgressBar API QScrollBar 详细描述 QDial API 一个示例 Slider和ProgressBar从某种程度上都是反应了自己对目标控件的进度状态。在Qt中…

蓝牙BLE开发——红米手机无法搜索蓝牙设备?

解决 红米手机,无法搜索附近蓝牙设备 具体型号当时忘记查看了,如果你遇到有以下选项,记得打开~ 设置权限

讲一讲 kafka 的 ack 的三种机制?

大家好,我是锋哥。今天分享关于【K讲一讲 kafka 的 ack 的三种机制?】面试题?希望对大家有帮助; 讲一讲 kafka 的 ack 的三种机制? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 Kafka的消息确认机制&…

SpringFactoriesLoader

1.什么是SPI (面试题) SPI全名Service Provider interface,翻译过来就是“服务提供接口”,再说简单就是提供某一个服务的接口, 提供给服务开发者或者服务生产商来进行实现。 Java SPI 是JDK内置的一种动态加载扩展点的实现。 这个机制在一…

直接内存、死锁、方法句柄

直接内存 1. 不是虚拟机运行时数据区的一部分,也不是《Java虚拟机规范》中定义的内存区域 2. 直接内存是在Java堆外、直接向系统申请的内存区间 3. 来源于NIO,通过存在堆中的DirectByteBuffer操作Native内存 4. 通常,访问直接内存的速度会优于Java堆&am…

(七)JavaWeb后端开发1——Maven

目录 1.Maven概述 2.Maven依赖管理 2.1依赖配置 2.2依赖传递 2.3依赖范围 2.4生命周期 1.Maven概述 maven是一款管理和构建java项目的工具 Maven的作用: 依赖管理:方便快捷的管理项目依赖的资源(jar包),避免版本冲突问题统一项目结构…

设计一个灵活的RPC架构

RPC架构 RPC本质上就是一个远程调用,需要通过网络来传输数据。传输协议可以有多种选择,但考虑到可靠性,一般默认采用TCP协议。为了屏蔽网络传输的复杂性,需要封装一个单独的数据传输模块用来收发二进制数据,这个单独模…

Web应用安全—信息泄露

从书本和网上了解到Web应用安全的信息泄露的知识,今天跟大家分享点。 robots.txt泄漏敏感信息 漏洞描述:搜索引擎可以通过robots文件可以获知哪些页面可以爬取,哪些页面不可以爬取。Robots协议是网站国际互联网界通行的道德规范&#xff0c…

二、Go快速入门之数据类型

📅 2024年4月27日 📦 使用版本为1.21.5 Go的数据类型 📖官方文档:https://go.dev/ref/spec#Types 1️⃣ 布尔类型 ⭐️ 布尔类型只有真和假,true和false ⭐️ 在Go中整数0不会代表假,非零整数也不能代替真&#…

vue+element上传图片

一、html页面上传图片 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title> <…

22_快速diff算法

目录 处理相同的前置元素和后置元素处理相同的前置元素和后置元素-挂载处理相同的前置元素和后置元素-卸载判断是否需要进行 DOM 移动操作如何移动元素 处理相同的前置元素和后置元素 快速 diff 算法是需要经过预处理的&#xff0c;什么是预处理呢&#xff1f;我们来看一下下面…

Redis-事务、锁

文章目录 数据库的事务、锁介绍数据库的锁数据库的事务 Redis的事务介绍Redis的事务操作例子Redis的锁介绍1. 加锁2. 释放锁乐观锁和悲观锁悲观锁&#xff08;Pessimistic Locking&#xff09;乐观锁&#xff08;Optimistic Locking&#xff09;Redis中的锁机制 3. Redlock算法…

微服务基础拆分实践(第一篇)

目录 前言 一、认识微服务 1.1 单体架构 VS 微服务架构 1.2 微服务的集大成者&#xff1a;SpringCloud 1.3 微服务拆分原则 1.4 微服务拆分方式 二、微服务拆分入门步骤 &#xff1a;以拆分商品模块为例 三、服务注册订阅与远程调用&#xff1a;以拆分购物车为例 3.1 …