Redis学习(二)之 Redis Cluster集群

news2025/2/23 23:27:07

        redis3.0以前的版本要实现集群一般是借助哨兵sentinel工具来监控master节点的状态,如果master节点异常,则会做主从切换,将某一台slave作为master,哨兵的配置略微复杂,并且性能和高可用等方面变现一般,特别是在主从切换的瞬间存在访问瞬断的情况,而且哨兵模式只有一个主节点对外提供服务,没法支持很高的并发,且单个主节点内存也不宜设置的过大,否则会导致持久化文件过大,影响数据恢复或主从同步的效率。

        redis3.0以后推出了高可用集群模式redis cluster。

 redis cluster集群是一个由多个主从节点集群组成的分布式服务集群,它具有复制高可用分片特性。cluster集群不需要sentinel 哨兵也能完成节点移除和故障转移的功能。需要将每个节点设置成集群模式,这种集群模式没有中心节点,可水平扩展,根据官方文档称可以线性扩展到上万个节点(官方推荐不超过1000个节点)。cluster集群的性能和高可用性均优于之前的哨兵模式,且配置非常简单。

redis cluster高可用集群搭建:

redis集群需要至少三个master节点,我们这里搭建三个master节点,并且给每个master再搭建一个slave节点,总共6个redis节点,搭建集群步骤如下:

三个主节点:6382、6383、6384

三个从节点:6385、6386、6387

step1:在redis-5.0.3文件夹下新建文件夹cluster,在cluster中新建6382、6383、6384、6385、6386、6387六个文件夹

将上篇文章中用到的redis.conf配置文件copy到6382下,修改下面内容:

  • daemonize yes
  • port 6382
  • pidfile  /var/run/redis_6382.pid
  • dir  /usr/local/redis-cluster/6382/
  • cluster-enabled yes #启动集群模式
  • cluster-config-file  nodes-6382.conf  #这里名字随便,最好就是node-端口.conf
  • cluster-node-timeout 10000
  • #bind 127.0.0.1
  • protected-mode no #关闭保护模式
  • appendonly yes

#如需设置密码需要增加如下配置:

  • requirepass  123456 #设置redis访问密码
  • masterauth  123456 #设置集群节点间访问密码

step2:将6382下的redis6382.conf复制到6383、6384文件夹下,修改相关配置

 step3:将6382下的redis6382.conf复制到6385、6386、6387三台从机文件夹下,修改同上

 step4:分别启动6个redis实例,然后检查是否启动成功

step5:用redis-cli创建整个redis集群(redis5之前版本集群是依靠ruby脚本redis-trib.rb实现的)

 src/redis-cli -a 123456 --cluster create --cluster-replicas 1 116.62.71.39:6382 116.62.71.39:6383 116.62.71.39:6384 116.62.71.39:6385 116.62.71.39:6386 116.62.71.39:6387

注意: --cluster create --cluster-replicas 这里面的1表示为每个主服务器创建一个从服务器

       

 可以看到6382、6383、6384是主机,其余三个是从机

step6:验证集群

连接任意一个客户端:src/redis-cli -a -c -h -p (-a访问服务端密码,-c表示集群,指定ip和端口)

例如:src/redis-cli -a 123456 -c -h ip -p 6382

 查看集群信息:cluster info

 查看节点列表:cluster nodes  可以看到主从关系

 set数据验证:

 

注意:关闭集群需要逐个redis进行关闭

例如:src/rediscli a 123456 c h 192.168.0.60 p 6382 shutdown

src/rediscli a 123456 c h 192.168.0.60 p 6383 shutdown

src/rediscli a 123456 c h 192.168.0.60 p 6384 shutdown 等等逐个关闭

Java操作redis集群:待补充:01:05

Redis cluster集群原理分析:

        redis cluster将所有数据划分为16384个 slots(槽位),每个节点负责其中一部分槽位。槽位信息存储于每个节点中。

        当redis cluster的客户端来连接集群时,它也会得到一份集群的槽位配置信息并将其缓存到客户端本地。这样当客户端要查找某个key时,可以直接定位到目标节点,同时因为槽位的信息可能会存在客户端与服务器不一致的情况,还需要纠正机制来实现槽位信息的校验调整。

槽位定位算法:cluster 默认会对key值使用crc16算法进行hash得到一个整数值,然后用这个整数值对16384进行取模来得到具体槽位 HASH_SLOT=CRC16(key)  mod  16384

 

 可以看到对key为name1进行计算出来的结果是相同的

跳转重定位:当客户端向一个错误的节点发出了指令,该节点会发现指令的key所在的槽位并不归自己管,这时它会向客户端发送一个特殊的跳转指令携带目标操作的节点地址,告诉客户端去连接这个节点获取数据。客户端收到指令后除了跳转正确的节点上去操作,还会同步更新纠正本地的槽位映射表缓存,后续所有key将使用新的槽位映射表。

 Redis集群节点间的通信机制:redis cluster节点间采取gossip协议进行通信

gossip通信的10000端口:redis cluster每个节点都有一个专门用于节点间gossip通信的端口,就是自己提供服务的端口号+10000,比如6379,那么用于节点间通信的就是16379端口。每个节点每隔一段时间就会往另外几个节点发送ping消息,同时其他节点收到ping消息后返回pong信息。

网络抖动:为了解决网络抖动导致的集群节点之间突然不可访问,然后很快又恢复正常的情况,cluster提供了一个配置 cluster-node-timeout ,表示当某个节点持续timeout时间失联时才认定该节点故障然后进行选举新的主节点。

redis cluster集群选举原理:当slave发现自己的master变为FAIL状态时,便尝试进行Failover,以期成为新的master ,由于挂掉的master可能会有多个slave,从而存在多个slave竞争成为master节点的过程,过程如下:

1、salve发现自己的master变为了FAIL

2、将自己记录的集群currentEpoch加1,并广播FAILOVER_AUTH_REQUEST信息

3、其他节点收到该信息,只有master响应,判断请求者的合法性,并发送FAILOVER_AUTH_ACK,对每一个epoch只发送一次ack

4、尝试failover的salve收集master返回的FAILOVER_AUTH_ACK

5、salve收到超半数master的ack后变成新的master(这也是集群需要至少三个主节点原因)

6、salve成为master后广播消息通知其他节点

注意:从节点并不是在主节点一进入FAIL状态就马上尝试进行选举,而是有一定延迟,一定的延迟确保我们等待FAIL状态在集群中传播,salve如果立即尝试选举的话其他master或许尚未意识到FAIL状态,可能拒绝投票。

延迟计算公式:DELAY = 500ms + random(0 ~ 500ms) + SLAVE_RANK * 1000ms

SLAVE_RANK表示此slave已经从master复制数据的总量的rank。Rank越小代表已复制的数据越新。这种方 式下,持有最新数据的slave将会首先发起选举(理论上)。

集群脑裂数据丢失问题:redis集群没有过半机制会有脑裂问题,网络分区导致脑裂后多个主节点对外提供写服务,一旦网络分区恢复,会将其中一个主节点变为从节点,这时会有大量数据丢失。

规避方法可以在redis配置里加上参数 min‐replicas‐to‐write 1 表示写数据成功最少同步的slave的数量,当然这个配置会一定程度上影响集群的可用性,比如slave要是少于1个,这个集群就算leader正常也不能提供服务了,需要根据场景权衡。

 

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

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

相关文章

使用html+css实现一个静态页面【传统文化茶带音乐6页】HTML学生个人网站作业设计

🎉精彩专栏推荐 💭文末获取联系 ✍️ 作者简介: 一个热爱把逻辑思维转变为代码的技术博主 💂 作者主页: 【主页——🚀获取更多优质源码】 🎓 web前端期末大作业: 【📚毕设项目精品实战案例 (10…

【MySQL篇】第四篇——数据类型

数值类型 整数类型 TINYINT类型 小数类型 FLOAT DECIMAL 日期和时间类型 字符串类型 CHAR VARCHAR 二进制类型 BIT 数据类型是指系统中所允许的数据类型。MySQL数据类型定义了列中可以存储什么数据以及该数据怎么样存储的规则。 数据库中的每个列都应该有适当的数据…

新手如何从零开始搭建配置Windows云服务器?

新手如何从零开始搭建配置Windows云服务器?本文是搭建 Windows 云服务器入门教程,主要介绍如何从零开始,以最简单的方式搭建和配置你的Windows 云服务器。如果您之前没有搭建云服务器的经验,建议您按照本文介绍的方式来购买和配置…

云小课|云小课带您快速了解LTS可视化查看

阅识风云是华为云信息大咖,擅长将复杂信息多元化呈现,其出品的一张图(云图说)、深入浅出的博文(云小课)或短视频(云视厅)总有一款能让您快速上手华为云。更多精彩内容请单击此处。 摘要: 可视化查看是日志分析的关键,通过可视化可…

基于SSM的药店管理系统

项目描述 临近学期结束,还是毕业设计,你还在做java程序网络编程,期末作业,老师的作业要求觉得大了吗?不知道毕业设计该怎么办?网页功能的数量是否太多?没有合适的类型或系统?等等。这里根据疫情当下,你想解决的问…

【Flink】入门Demo实现、Flink运行架构之运行时组件,任务提交流程,任务调度原理

文章目录一 快速上手1 创建maven项目2 引入依赖3 代码实现(1)从在线数据读取(2)从离线数据读取4 将程序提交到单点集群运行二 Flink运行架构1 Flink运行时组件(1)作业管理器(JobManager&#xf…

Qt TCP网络编程基本教程

首先介绍一下TCP:(Transmission Control Protocol 传输控制协议)是一种面向连接的、可靠的、基于字节流的传输层通信协议。相比而言UDP,就是开放式、无连接、不可靠的传输层通信协议。 下面,我一次进行客户端和服务器端…

STM32f103 SMO滑膜观测器的FOC驱动DIY

小时候玩航模了解到无刷电机,又从方波控制了解到FOC控制,在接触了一些开源项目的时候,感叹做的真好,不论是方波的还是Foc的启动都是那么丝滑,软件做的虽然好,但在这几年电机驱动芯片和部分型号的单片机价格…

【878. 第 N 个神奇数字】

来源:力扣(LeetCode) 描述: 一个正整数如果能被 a 或 b 整除,那么它是神奇的。 给定三个整数 n , a , b ,返回第 n 个神奇的数字。因为答案可能很大,所以返回答案 对 109 7 取模 后的值。 示…

亚马逊气候友好型承诺所有认证

【亚马逊气候友好型承诺所有认证】 亚马逊与广泛的外部认证合作,包括政府机构、非营利组织和独立实验室,以帮助我们区分更具可持续性的产品。亚马逊专注于信誉良好、透明且专注于保护自然世界的认证。我们将定期评估和重新评估认证环境,以确保…

若依框架的暴力破解漏洞

文章目录 漏洞描述漏洞复现修复建议漏洞描述 由于图片验证码未做好前后台的统一校验,可重复利用验证码,以及无登录错误次数限制等,导致攻击者可对账号与密码进行的穷举测试,从而获取网站登录访问权限 漏洞复现 第一步 抓包获取登录数据包,默认口令Admin123 第二步 发…

win10系统下使用openvino部署yolov5模型

文章目录前言一、环境1、硬件2、软件二、YOLO模型三、新建Qt项目1、pro文件2、main.cpp四、效果五、后记前言 上一篇介绍过使用onnxruntime实现模型推理部署,但在我的机器上视频效果仍不理想,本篇介绍使用openvino完成模型推理部署。   openvino是Inte…

Windows OpenGL ES 图像透明度

目录 一.OpenGL ES 图像透明度 1.原始图片2.效果演示 二.OpenGL ES 图像透明度源码下载三.猜你喜欢 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 基础 零基础 OpenGL ES 学习路线推荐 : OpenGL ES 学习目录 >> OpenGL ES 特效 零基础 Open…

linux下gcc编程11-window下clion编译调试nginx+集成lua-nginx-module+安装开源x-waf

nginx模块 nginx作为项目的7层代理入口,对于http请求的过滤,如sql注入,xss攻击等过滤功能较弱,研究了下开源的一些waf,完全开源的https://github.com/xsec-lab/x-waf,利用lua来过滤请求,同时拥…

TuckER 论文笔记

Modeling Relation Paths for Representation Learning of Knowledge Bases- Introduction- Background- Algorithm- Experiment- Conclusion- CodeIvana Balazevic, Carl Allen, Timothy M.Hospedales - Introduction TuckERuckER是一个相对简单但功能强大的线性模型&#xf…

网络营销中 SEO 的作用

与其有时间去阅读各种SEO知识,不如多做一些实际的测试和练习。在百度官方发布的网页质量白皮书中,其实重点介绍了网页速度对SEO优化的影响,前面也出现了一种叫做闪电算法的算法,对于移动排名1.5秒内加载首屏即可打开的网页&#x…

2022亚马逊云科技re:Invent科创风尚,抢占下一个万亿赛道

新风向:重塑科技创投格局 面向未来增长,聚焦投资风向,演绎全新技术。11月28日至12月2日,2022亚马逊云科技re:Invent即将重磅来袭,在美国拉斯维加斯再度盛启。改变世界的全新云技术、不同领域的优选实践,都…

【仿真建模】第一课:AnyLogic入门基础教程 - 行人库入门讲解

文章目录一、AnyLogic介绍二、设置2.1 设置中文三、新建项目四、行人库介绍五、创建新行人六、切换3D视角七、增加墙八、行人密度图一、AnyLogic介绍 二、设置 2.1 设置中文 三、新建项目 四、行人库介绍 点击面板,选择第三个图标,就是行人库 行人库分…

react--编程式导航、antd的使用

编程式 1. 借助路由对象中的history 获取: this.props.history.push(/xx/xx) | this.props.history.replace(/xx/xx) 2. 传递sreach参数 this.props.history.push(/xx/xx?xxx100&xx111) 3. 传state参数 this.props.history.push(/xx,{id:1,title:…

web前端期末大作业 HTML+CSS+JavaScript仿唯品会购物商城网页设计实例 企业网站制作

常见网页设计作业题材有 个人、 美食、 公司、 学校、 旅游、 电商、 宠物、 电器、 茶叶、 家居、 酒店、 舞蹈、 动漫、 服装、 体育、 化妆品、 物流、 环保、 书籍、 婚纱、 游戏、 节日、 戒烟、 电影、 摄影、 文化、 家乡、 鲜花、 礼品、 汽车、 其他等网页设计题目, A…