Redis集群(Clustering in Redis)工作机制详解

Redis集群工作机制详解

在这里插入图片描述

Redis 集群是用于提高 Redis 可扩展性和高可用性的解决方案。

维基百科:Scalability is the property of a system to handle a growing amount of work by adding resources to the system.

可扩展性是系统的一种允许通过增加系统资源来处理不断增长的工作量的属性。

在这里插入图片描述

The two most common scaling strategies are vertical scaling and horizontal scaling.
最常见的两种扩展策略是垂直扩展和水平扩展。
在这里插入图片描述

  • Vertical scaling,or also called scaling up,means adding more resources like CPUS or memory to your server.
    垂直扩展,也称为向上扩展,意味着向服务器添加更多的资源,如cpu或内存。

在这里插入图片描述

  • Horizontal scaling,or scaling out,implies adding more servers to your pool of resources.
    水平扩展,或者说向外扩展,意味着向资源池中添加更多服务器。
    It’s the difference between just getting a bigger server and deploying a whole fleet of servers.
    这就是购买一台更大的服务器和部署一群服务器之间的区别。

在这里插入图片描述

Redis-horizontal scaling

Since Redis is mostly single-threaded,a single Redis server instance cannot make use of the multiple cores of your server CPU for command processing.

由于Redis主要是单线程的,单个Redis服务器实例无法利用服务器CPU的多核进行命令处理。

But if we split the data between two Redis instances,our system can process requests in parallel,effectively doubling the throuoghput.

但是如果我们在两台Redis服务器实例之间分割数据,系统就可以并行处理请求,从而有效的使吞吐量加倍。

In fact,performance will scale close to linearly by adding more Redis instances to the system.

事实上,通过向系统添加更多的redis服务器,性能将接近线性扩展。

This patten of splitting data between multiple servers for the purpose of scaling is called sharding.

这种为了扩展而在多个服务器之间分割数据的模式成为——分片(Sharding)。


1. 数据分片(Sharding)

  • Redis 集群将数据分成多个分片,每个分片分布在不同的 Redis 实例上。
  • 每个分片负责一部分数据,通过哈希函数计算出哈希值再模上分片数量以映射到特定的分片上,从而实现数据的水平分布。

在这里插入图片描述

  • 但是如果我们想要进一步增加分片数量 (通常称为重新分片Resharding),该怎么办呢?

在这里插入图片描述

  • 随着片数的增加,经过哈希计算再取模的值也会改变,再去查询"foo”便会指向错误的分片。

在这里插入图片描述

Redis使用了一种巧妙的方法来解决这一问题。

在这里插入图片描述

  • 哈希槽(Hash Slots

  • Redis 集群使用 16384 个(16k)哈希槽来管理数据分片。

在这里插入图片描述

  • 每个分片负责管理一部分哈希槽,确保所有的哈希槽被分配给不同的分片,从而实现数据的均匀分布。
    在这里插入图片描述

  • 所以在Redis集群中,我们实际上用哈希值去模哈希槽,而不是分片数量。

  • Each key is assigned to a hash slot .When we do need to reshard,we simply move hash slots from one shard to another,distributing the data as required across a different Redis instances.

  • 每个键都被分配到一个哈希槽,当我们需要重新分片时,我们只需将哈希槽从一个分片移动到另一个分片,就可以根据需要在不同的Redis实例之间分发数据。

  • 数据定位:客户端在与 Redis 集群交互时,通过哈希函数计算 key 所属的哈希槽,然后根据哈希槽的分配信息找到对应的分片实例,完成数据读写操作。


2.高可用(high availability)

High availability refers to the Cluster’s ability to remain operational,even in the face of certain failures.

高可用性是指集群即使在遇到某些故障时仍能正常运行的能力。

For example,the Cluster can detect when a primary shard fails and promote a replica to a primary,without any manual intervention from the outside.

例如,集群可以检测到主分片失败并将副本提升到主分片,而无需外部的任何人工干预。

But how does it work? How does it know that a primary shard has failed,and how does it promote its replica to the new primary?

Say we have one replica for every primary shard.假设每个主分片都有一个副本。
在这里插入图片描述
在这里插入图片描述

  • All six shards are connected to each other over TCP and constantly ping each other and exchange messages.6个分片都通过TCP相互连接,并不断ping对方并交换消息。

在这里插入图片描述

  • When enough shards report that a given primary shard is not responding to them,they can agree to trigger a fail-over,and promote the shard‘s replica to become the new primary.

  • 当有足够多的分片报告某个给定的主分片对它们没有响应时,它们可以同意触发故障转移,并提升该分片的副本成为新的主分片。

在这里插入图片描述

  • How many shards need to agree that a fellow shard is offline before a fail-over is triggered?
    在触发故障转移之前,需要多少个分片同意另一个分片离线呢?

  • That’s configurable,and you can set it up when you create a Cluster.可以在创建集群时设置。

  • But there are some very imporant guidelines that you need to follow.但是需要遵循一些非常重要的方针。

  • To prevent something called a split brain situation in a Redis Cluster,always keep an odd number of primary shards and two replicas per primary shard.

  • 为了防止Redis集群中出现所谓的脑裂(split brain)情况,请始终保持奇数个主分片和每个主分片两个副本。

  • 这里我们通过一个例子解释一下缘由:假如集群中有六个分片(偶数个)。

在这里插入图片描述

  • 有一个网络分区将集群一分为二,那么将会得到两组,每组三个分片

在这里插入图片描述

  • 左侧组中的分片将无法与右侧组中的分片进行对话。

在这里插入图片描述

  • 因此集群会认为它们已离线,并将触发任何主分片的故障转移,从而导致左侧包含所有主分片

在这里插入图片描述

  • 在右侧组,也会看到左侧的分片处于离线状态,并将触发左侧所有主分片的故障转移

在这里插入图片描述

  • 从而导致,所有主分片都位于右侧。双方都认为自己为主分片。
    在这里插入图片描述

  • 将继续收到修改数据的客户端请求,例如客户端A将左侧的“foo”改成“bar”,但是客户端B设置了“foo”为“baz

在这里插入图片描述

  • 当网络分区被删除,并且分片尝试重新加入时,便会发生冲突,因为有两个分片持有不同的数据,不知道哪个数据是有效的。

在这里插入图片描述

  • 这称之为脑裂现象

在这里插入图片描述

  • 一个比较流行的解决方案就是,始终在集群中保留奇数个分片。这样当网络分裂时,左组和右组将进行计数,看看它们是否属于较大或者较小的组。如果他们占少数,他们不会触发故障转移,也不会接受任何客户端的写入请求。
    在这里插入图片描述

Redis主从复制和哨兵模式讲解在专栏哦~

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

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

相关文章

《Windows API每日一练》6.4 程序测试

前面我们讨论了鼠标的一些基础知识,本节我们将通过一些实例来讲解鼠标消息的不同处理方式。 本节必须掌握的知识点: 第36练:鼠标击中测试1 第37练:鼠标击中测试2—增加键盘接口 第38练:鼠标击中测试3—子窗口 第39练&…

Linux Static calls机制

文章目录 前言一、简介二、Background: indirect calls, Spectre, and retpolines2.1 Indirect calls2.2 Spectre (v2)2.3 RetpolinesConsequences 2.4 Static callsHow it works 三、其他参考资料 前言 Linux内核5.10内核版本引入新特性:Static calls。 Static c…

计算机毕业设计hadoop+spark+hive知识图谱医生推荐系统 医生数据分析可视化大屏 医生爬虫 医疗可视化 医生大数据 机器学习 大数据毕业设计

测试过程及结果 本次对于医生推荐系统测试通过手动测试的方式共进行了两轮测试。 (1)第一轮测试中执行了个20个测试用例,通过16个,失败4个,其中属于严重缺陷的1个,属于一般缺陷的3个。 (2&am…

Spark SQL 的总体工作流程

Spark SQL 是 Apache Spark 的一个模块,它提供了处理结构化和半结构化数据的能力。通过 Spark SQL,用户可以使用 SQL 语言或 DataFrame API 来执行数据查询和分析。这个模块允许开发者将 SQL 查询与 Spark 的数据处理能力结合起来,实现高效、优化的数据处理。下面是 Spark S…

Spring Boot中实现定时任务最常用的方法 @Scheduled 注解和 TaskScheduler 接口【包含详情代码】

Spring Boot中实现定时任务最常用的方法 Scheduled 注解和 TaskScheduler 接口【包含详情代码】 学习总结 1、掌握 JAVA入门到进阶知识(持续写作中……) 2、学会Oracle数据库入门到入土用法(创作中……) 3、手把手教你开发炫酷的vbs脚本制作(完善中………

CogMG:用大模型解决知识图谱覆盖不足的问题

CogMG:用大模型解决知识图谱覆盖不足的问题 提出背景知识图谱的作用知识覆盖不完整知识更新不对齐 显式分解知识三元组和补全检索增强生成(RAG)和知识更新 框架设计1. 查询知识图谱2. 处理结果3. 知识图谱演化 CogMG 实现3.1 模型和组件问题分…

.NET 漏洞分析 | 某ERP系统存在SQL注入

01阅读须知 此文所提供的信息只为网络安全人员对自己所负责的网站、服务器等(包括但不限于)进行检测或维护参考,未经授权请勿利用文章中的技术资料对任何计算机系统进行入侵操作。利用此文所提供的信息而造成的直接或间接后果和损失&#xf…

c++智能指针shared_ptr

文章目录 概念1.shared_ptr1.基本使用2.如何获取原始指针3. 指定删除器 2 使用shared_ptr要注意的问题2.1不要用一个原始指针初始化多个shared_ptr2.2. 避免循环引用 小结 概念 C程序设计中使用堆内存是非常频繁的操作,堆内存的申请和释放都由程序员自己管理。内存…

安装 Docker 环境(通过云平台创建一个实例实现)

目录 1. 删除原有 yum 2. 手动配置 yum 源 3. 删除防火墙规则 4. 保存防火墙配置 5. 修改系统内核。打开内核转发功能。 6. 安装 Docker 7. 设置本地镜像仓库 8.重启服务 1. 删除原有 yum rm -rfv /etc/yum.repos.d/* 2. 手动配置 yum 源 使用 centos7-1511.iso 和 Xi…

Python 语法基础二

7.常用内置函数 执行这个命令可以查看所有内置函数和内置对象(两个下划线) >>>dir(__builtins__) [__class__, __contains__, __delattr__, __delitem__, __dir__, __doc__, __eq__, __format__, __ge__, __getattribute__, __getitem__, __gt…

深入剖析 Android 网络开源库 Retrofit 的源码详解

文章目录 概述一、Retrofit 简介Android主流网络请求库 二、Retrofit 源码剖析1. Retrofit 网络请求过程2. Retrofit 实例构建2.1 Retrofit.java2.2 Retrofit.Builder()2.2.1 Platform.get()2.2.2 Android 平台 2.3 Retrofit.Builder().baseUrl()2.4 Retrofit.Builder.client()…

OpenAI穿着「皇帝的新衣」;扒了数万条帖子汇总100种AIGC玩法;北美出海的财务避坑指南;我创业「如」有CTO | ShowMeAI日报

👀日报&周刊合集 | 🎡生产力工具与行业应用大全 | 🧡 点赞关注评论拜托啦! 1. 我扒了 Reddit 论坛数万条帖子,汇总了 GenAI 的 100 种玩法 ChatGPT 已经问世一年半了。这期间诞生了很多大语言模型和生成式人工智能…

备份和还原

stai和dnta snat:源地址转换 内网---外网 内网ip转换成可以访问外网的ip 内网的多个主机可以使用一个有效的公网ip地址访问外部网络 DNAT:目的地址转发 外部用户,可以通过一个公网地址访问服务内部的私网服务。 私网的ip和公网ip做一个…

【JavaEE进阶】Spring AOP使用篇

目录 1.AOP概述 2.SpringAOP快速入门 2.1 引入AOP依赖 2.2 编写AOP程序 3. Spring AOP详解 3.1 Spring AOP 核心概念 3.1.1切点(Pointcut) 3.1.2 连接点 (Join Point) 3.1.3 通知(Advice) 3.1.4 切面(Aspect) 3.2 通知类型 3.3PointCut 3.4 切面优先级 3.5 切点表…

「51媒体」政企活动媒体宣发如何做?

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 媒体宣传加速季,100万补贴享不停,一手媒体资源,全国100城线下落地执行。详情请联系胡老师。 政企活动媒体宣发是一个系统性的过程,需要明确…

使用Scala爬取安居客房产信息并存入CSV文件

使用Scala爬取安居客房产信息并存入CSV文件 本篇博客中,我们将介绍如何使用Scala语言编写一个简单的程序,来爬取安居客(Anjuke)网站上的房产信息,并将这些信息存储到CSV文件中。这个示例将涵盖HTTP请求、HTML解析、数…

麒麟系统安装MySQL

搞了一整天,终于搞定了,记录一下。 一、背景 项目的原因,基于JeecgBoot开发的系统需要国产化支持,这就需要在电脑上安装MySQL等支撑软件。 国产化项目的操作系统多是麒麟系统,我的系统如下: arm64架构。…

详细分析Oracle修改默认的时间格式(四种方式)

目录 前言1. 会话级别2. 系统级别3. 环境配置4. 函数格式化5. 总结 前言 默认的日期和时间格式由参数NLS_DATE_FORMAT控制 如果需要修改默认的时间格式,可以通过修改会话级别或系统级别的参数来实现 1. 会话级别 在当前会话中设置日期格式,这只会影响…

CCSP自考攻略+经验总结

备考攻略 备考攻略准备阶段通读阶段精度阶段总复习阶段刷题阶段命运审判 写到最后 备考攻略 趁着对ssp知识点的理解还在,开始ccsp的考证之路,文章结构还是按照cissp备考篇的结构梳理。本次备考和cissp的离职在家备考不同,ccsp是在职利用非工…

2018年全国大学生数学建模竞赛A题高温服装设计(含word论文和源代码资源)

文章目录 一、部分题目二、部分论文三、部分Matlab源代码问题11 求解h1h22 已知h1h2求解温度分布 问题21 求解第二层最佳厚度 四、完整word版论文和源代码(两种获取方式) 一、部分题目 2018 年高教社杯全国大学生数学建模竞赛题目 A 题 高温作业专用服…