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

news2024/11/23 1:49:41

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.coloradmin.cn/o/1871538.html

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

相关文章

《征服数据结构》字典树(Trie树)

摘要: 1,字典树的介绍 2,字典树的插入 3,字典树的查询 4,字典树排序 5,字典树的删除 6,字典树的用途 1,字典树的介绍 字典树又称 Trie 树 ,单词查找树,前缀树…

花卉寄售系统

摘 要 随着互联网的快速发展和普及,电子商务已经成为人们日常生活中不可或缺的一部分。在电子商务领域,花卉行业也逐渐崭露头角,成为一个具有巨大潜力的市场。传统的花卉销售模式通常是通过实体店面进行销售,这种模式存在着许多问…

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…

RISC-V知识总结 —— 向量(扩展)指令集

资源1:晏明 - RISC-V向量扩展指令架构及LLVM自动向量化支持 - 202112118 - 第13届开源开发工具大会(OSDTConf2021)_哔哩哔哩_bilibili资源2:张先轶 - 基于RISC-V向量指令集优化基础计算软件生态【第12届开源开发工具大会(OSDT2020&#xff09…

AI加持,商业智能与分析软件市场释放更大潜能

根据IDC最新发布的《中国商业智能和分析软件市场跟踪报告,2023H2》显示,2023下半年,中国商业智能与分析软件市场规模为5.2亿美元,同比增长为3.7%。其中,本地部署收入占比为89.3%,同比增长1.7%;公…

密码学及其应用 —— 对称加密技术

1. 对称加密、流加密和块加密 1.1 对称加密 对称加密(也称为密钥加密)是一种加密方式,其中加密和解密使用相同的密钥。这种加密方法基于二进制层面的操作,如XOR(异或)、SHIFT(位移)…

Linux 搭建 kafka 流程

优质博文:IT-BLOG-CN 一、安装环境 【1】CenOS7虚拟机三台 【2】已经搭建好的zookeeper集群。 【3】软件版本:kafka_2.11-1.0.0 二、创建目录并下载安装软件 【1】创建目录 cd /opt mkdir kafka #创建项目目录 cd kafka mkdir kafkalogs #创建kafk…

Transformers 安装及 google-t5/t5-small 机器翻译示例

文章目录 Github文档推荐文章简介安装官方示例google-t5/t5-small使用脚本进行训练Pytorch 机器翻译数据集下载数据集格式转换 Github https://github.com/huggingface/transformers 文档 https://huggingface.co/docs/transformers/indexhttps://github.com/huggingface/tr…

《昇思25天学习打卡营第1天|基本介绍》

文章目录 前言:今日所学: 前言: 今天非常荣幸的收到了昇思25天学习打卡营的邀请。昇思MindSpore作为华为昇腾AI全栈的重要一员,他支持端、边、云独立的和协同的统一训练和推理框架,有着易于开发、执行效率高、全场景框…

以Bert训练为例,测试torch不同的运行方式,并用torch.profile+HolisticTraceAnalysis分析性能瓶颈

以Bert训练为例,测试torch不同的运行方式,并用torch.profileHolisticTraceAnalysis分析性能瓶颈 1.参考链接:2.性能对比3.相关依赖或命令4.测试代码5.HolisticTraceAnalysis代码6.可视化A.优化前B.优化后 以Bert训练为例,测试torch不同的运行方式,并用torch.profileHolisticTra…

深入剖析 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()…

Windows的内核对象

内核对象句柄特定于进程。 也就是说,进程必须创建 对象或打开现有对象以获取内核对象句柄。 内核句柄上的每个进程限制为 2^24。 但是,句柄存储在分页池中,因此可以创建的实际句柄数取决于可用内存。 可以在 32 位 Windows 上创建的句柄数明显低于 2^24。 任何进程都可以为…

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

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

Linux技能篇-恢复lvm物理卷

项目场景&#xff1a; 今天遇到一个很有意思的故障&#xff0c;我用虚拟机来还原了当前的故障场景。 首先来看&#xff0c;系统中只有一个lvn卷组 我们给系统中添加一块磁盘&#xff0c;使用pvcreate创建物理卷 pvcreate /dev/sdb并将容量添加到当前的卷组中 创建一个lvm逻辑…

基于Spring Boot医护人员排班系统

设计技术&#xff1a; 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringbootMybatisvue 工具&#xff1a;IDEA、Maven、Navicat 主要功能&#xff1a; 医护类型管理 医护人员排班系统的系统管理员可以对医护类型添加修改删除以及查询操作。具体界面…

Opencv学习项目7——face_recognition

前面两篇博客解决了安装dlib库的问题和numpy和dlib不兼容的问题&#xff0c;今天开始做人脸识别第一个项目 我们可以从网上下载一张带有人脸的图片或者自己电脑有的也可以&#xff0c;我这里使用lyf的图片进行演示 加载图像文件 img1 face_recognition.load_image_file(lyf1.…

mac菜单栏应用管理软件:Bartender 4 for Mac 中文激活版

Bartender 4 是一款由Bearded Men Games开发的适用于Mac操作系统的应用程序&#xff0c;它被设计用来优化和美化Mac菜单栏的功能。自从macOS Big Sur开始&#xff0c;Mac的菜单栏可以自定义&#xff0c;用户可以添加和移除各种图标。Bartender 4就是在这个背景下应运而生&#…

论文阅读Vlogger: Make Your Dream A Vlog

摘要 论文介绍了一个名为“Vlogger”的通用人工智能系统&#xff0c;它能够根据用户的描述生成分钟级的视频博客&#xff08;vlog&#xff09;。与通常只有几秒钟的短视频不同&#xff0c;vlog通常包含复杂的故事情节和多样化的场景&#xff0c;这对现有的视频生成方法来说是一…

CPPTest设计分析

目录 1 概述2 设计3 扩展Output3.1 扩展实例 1 概述 CppTest是一个可移植、功能强大但简单的单元测试框架&#xff0c;用于处理C中的自动化测试。重点在于可用性和可扩展性。支持多种输出格式&#xff0c;并且可以轻松添加新的输出格式。 CppTest下载地址Sourceforge Github地…