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主从复制和哨兵模式讲解在专栏哦~

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

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

相关文章

Zookeeper:基于Zookeeper的分布式锁

一、Zookeeper分布式锁原理 二、Zookeeper JavaAPI操作 1、Curator介绍 Curator是Apache Zookeeper的Java客户端。常见的Zookeeper Java API: 原生Java API。ZkClient。Curator。 Curator项目目标是简化Zookeeper客户端的使用。Curator最初是Netfix研发的&#xf…

Python | Leetcode Python题解之第202题快乐数

题目: 题解: def isHappy(self, n: int) -> bool:cycle_members {4, 16, 37, 58, 89, 145, 42, 20}def get_next(number):total_sum 0while number > 0:number, digit divmod(number, 10)total_sum digit ** 2return total_sumwhile n ! 1 an…

【UE5.3】笔记5-蓝图类

什么是蓝图类:其实就是C类,只不过是UE封装好的且可以直接拖出来可视化使用。 如何创建蓝图类?蓝图类有哪些? 蓝图类分为基于关卡的,基于Actor的,基于组件Component的。 基于关卡的蓝图类 一个关卡只能有…

Python | Leetcode Python题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; class Solution:def rangeBitwiseAnd(self, m: int, n: int) -> int:while m < n:# 抹去最右边的 1n n & (n - 1)return n

【Python实战因果推断】4_因果效应异质性4

目录 Cumulative Gain Target Transformation Cumulative Gain 如果采用与累积效应曲线完全相同的逻辑&#xff0c;但将每个点乘以累积样本 Ncum/N&#xff0c;就会得到累积增益曲线。现在&#xff0c;即使曲线的起点具有最高的效果&#xff08;对于一个好的模型来说&#x…

vue 实现 word/excel/ppt/pdf 等文件格式预览操作

效果图&#xff1a; 问题描述&#xff1a;一般情况下使用iframe标签就可以实现文件预览&#xff0c;但是这个标签只针对于ppt和pdf是有效的。对于doc文件就需要借助第三方插件&#xff08;vue-office/docx&#xff09;来实现预览了。下面介绍使用方法。 安装插件&#xff1a;n…

Golang | Leetcode Golang题解之第201题数字范围按位与

题目&#xff1a; 题解&#xff1a; func rangeBitwiseAnd(m int, n int) int {for m < n {n & (n - 1)}return n }

C语言 | Leetcode C语言题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; //计算的过程函数&#xff0c;我没重点讲&#xff0c;很简单看一下代码就好了 int getSum(int n) {int sum 0;while (n) {sum (n % 10) * (n % 10);n / 10;}return sum; }bool isHappy(int n){int sum getSum(n);int hash[820] {0};whi…

数字时代的文化革命:Facebook的社会影响

随着数字技术的飞速发展和互联网的普及&#xff0c;社交网络如今已成为人们日常生活中不可或缺的一部分。在众多社交平台中&#xff0c;Facebook作为最大的社交网络之一&#xff0c;不仅连接了全球数十亿用户&#xff0c;更深刻影响了人们的社会互动方式、文化认同和信息传播模…

BFS:队列+树的宽搜

一、二叉树的层序遍历 . - 力扣&#xff08;LeetCode&#xff09; 该题的层序遍历和以往不同的是需要一层一层去遍历&#xff0c;每一次while循环都要知道在队列中节点的个数&#xff0c;然后用一个for循环将该层节点走完了再走下一层 class Solution { public:vector<vec…

JeeSite中的数据库表动态建模与管理模块(DBM)

一、引言 在现代软件开发中&#xff0c;数据库作为系统数据存储和管理的核心&#xff0c;其设计和维护的灵活性、可扩展性对于系统的长期稳定运行至关重要。JeeSite作为一款流行的企业级快速开发平台&#xff0c;其数据库表动态管理模块&#xff08;DBM&#xff09;提供了强大…

LeetCode 585, 438, 98

目录 585. 2016年的投资题目链接表要求知识点思路代码 438. 找到字符串中所有字母异位词题目链接标签思路代码 98. 验证二叉搜索树题目链接标签合法区间思路代码 中序遍历思路代码 585. 2016年的投资 题目链接 585. 2016年的投资 表 表Insurance的字段为pid、tiv_2015、tiv…

C++ | Leetcode C++题解之第202题快乐数

题目&#xff1a; 题解&#xff1a; class Solution { public:int ProductSum(int n){int sum 0;while(n){int temp n % 10;sum temp*temp;n / 10;}return sum;}bool isHappy(int n) {int slow n,fast n;// 快慢指针&#xff0c;找环的相遇位置do{slow ProductSum(slow)…

基于weixin小程序智慧物业系统的设计

管理员账户功能包括&#xff1a;系统首页&#xff0c;个人中心&#xff0c;管理员管理&#xff0c;用户管理&#xff0c;员工管理&#xff0c;房屋管理&#xff0c;缴费管理&#xff0c;车位管理&#xff0c;报修管理 工作人员账号功能包括&#xff1a;系统首页&#xff0c;维…

Unity热更方案 YooAsset+HybridCLR,纯c#开发热更,保姆级教程,从零开始

文章预览&#xff1a; 一、前言二、创建空工程三、接入HybridCLR四、接入YooAsset五、搭建本地资源服务器Nginx六、实战七、最后 一、前言 unity热更有很多方案&#xff0c;各种lua热更&#xff0c;ILRuntime等&#xff0c;这里介绍的是YooAssetHybridCLR的热更方案&#xff0…

通达信机构买卖抓牛指标公式源码

通达信机构买卖抓牛指标公式源码&#xff1a; X_1:V/CLOSE/2; X_2:SUM(IF(X_1>100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_3:SUM(IF(X_1>100 AND CLOSE<REF(CLOSE,1),X_1,0),0); X_4:SUM(IF(X_1<100 AND CLOSE>REF(CLOSE,1),X_1,0),0); X_5:SUM(IF(X_1&l…

用英文介绍巴黎:Paris, France‘s MEGACITY Europe‘s Largest City

Paris, France’s MEGACITY: Europe’s Largest City Link: https://www.youtube.com/watch?vbdObzSwVAw4&listPLmSQiOQJmbZ7TU39cyx7gizM9i8nOuZXy&index22 Paris, France is the grand megacity of Europe at the forefront of human progress. Summary Summary …

macos Automator自动操作 app, 创建自定义 应用程序 app 的方法

mac内置的这个 自动操作 automator 应用程序&#xff0c;可以帮助我们做很多的重复的工作&#xff0c;可以创建工作流&#xff0c; 可以录制并回放操作&#xff0c; 还可以帮助我们创建自定的应用程序&#xff0c;下面我们就以创建一个自定义启动参数的chrome.app为例&#xff…

vue的ESLint 4格缩进 笔记

https://chatgpt.com/share/738c8560-5271-45c4-9de0-511fad862109 一&#xff0c;代码4格缩进设置 .eslintrc.js文件 module.exports { "rules": { "indent": ["error", 4] } }; 自动修复命令 npx eslint --fix "src/**/*.{…

【秋招刷题打卡】Day03-二分系列之-二分答案

Day03-二分系列之-二分答案 给大家推荐一下咱们的 陪伴打卡小屋 知识星球啦&#xff0c;详细介绍 >笔试刷题陪伴小屋-打卡赢价值丰厚奖励 < ⏰小屋将在每日上午发放打卡题目&#xff0c;包括&#xff1a; 一道该算法的模版题 (主要以力扣&#xff0c;牛客&#xff0c;…