Redis 集群 问题

前言


 相关系列

  • 《Redis & 目录》
  • 《Redis & 集群 & 源码》
  • 《Redis & 集群 & 总结》
  • 《Redis & 集群 & 问题》
     
     

什么是Redis集群?为什么要集群?Redis集群的优/缺点是什么?


    Redis集群是指将多台Redis实例进行协同组合以统一对外提供服务的一种部署/工作方式,也是官方提供的具体数据分区实现。通过将数据/请求以各类算法分片/分流到不同节点中保存/访问,可以达到大幅降低单台Redis实例负载的效果以实现对现实大数据/高并发场景的支持…Redis集群的优/缺点具体如下:

  • 去中心化:Redis并未设计专用组件来处理请求的引导/分流问题,而是直接将该功能内嵌到到了所有节点中以实现引导组件的同步集群,从避免单机成为高并发引导的性能瓶颈。此外Redis还允许客户端也具备一定程度的引导/分流能力,从而使得客户端可以直接访问目标节点,并以此避免代理转发的开销;
  • 动态拓展能力强:Redis集群采用了哈希槽来替换倡议的一致性哈希方案来实现数据分区,从而增强了集群的动态扩展能力,即数据重分片更加高效;
  • 内嵌主从同步/哨兵:Redis集群内嵌了主从同步/哨兵功能,从而可以在完全无人为干预的情况下建立建立合理的主从关系并进行自动的故障转移。
     
  • 不支持跨节点操作:无论是多键指令还是事务,所有涉及跨节点的操作在集群中都是不支持的;
  • 无法动态选择数据库:在开启集群的情况下只能选择0数据库;
  • 维护相对复杂:集群的扩/缩容相对复杂,因为数据重分片需要人为的指定范围/数量。
     
     

什么是哈希槽?


    哈希槽是Redis设计用于集群中实现数据分区的逻辑区间。为了增加集群的动态扩/缩容能力,Redis没有简单采用常规的一致性哈希(取模)方案实现数据分区,而是设计了16384个哈希槽用于挂靠数据。这些哈希槽会与集群中的节点建立尽可能均匀的映射关系,而当Redis/客户端通过公式CRC16(key) / 16384计算得到数据所挂靠的哈希槽时,数据便会被置于其映射的节点中保存。

    哈希槽并无法在集群扩/缩容是避免数据重分片/迁移,除非新增的节点并没有实际发挥作用。哈希槽的核心作用是将数据重分片从一致性哈希的被动性转为了主动性,因为在一致性哈希方案中节点数量的变化就意味着模的变化,同理也意味着数据所在仓库的变化,从而被动导致全量数据被强制性的重分片。但哈希槽总数的不变性注定了其与数据的挂靠关系不会改变,因此只要哈希槽与节点的映射关系不变,数据重分片就永远不会发生。而由于这两者的映射关系是受开发者主观控制的,因此迁移那(几)个节点的数据,迁移多少数据都可以自由决定,从而为最佳迁移方案的指定/执行提供了实现基础。
 
 

哈希槽为什么被固定为16384个?


    哈希槽总数16384是经验值。所谓经验值是指没有/缺少实际的理论依据,但在程序实际运行的各个方面都能取得良好效果的阈值。因此想要说出哈希槽总数被设计为16384的具体原因是难以做到的,我们只能从以下几个实际的好处来拥戴这一点:

  • 计算效率高:计算机对于2的幂次方数字处理更快,并且该数字对于CRC16算法也有优化加成;
  • 负载均衡强/迁移更灵活:对于实际开发场景中的主节点数量而言,16384个哈希槽不但可以做到对各主节点的大致均匀分配以实现负载均衡,还能保证单个主节点具备较高的哈希槽/数据颗粒度以实现迁移的灵活性,即能够选择的迁移范围更加多样化;
  • 内存开销小/通讯影响少/增加集群体量:Redis集群的节点数量是很难超过1000个的,其“主要”原因是集群中的节点两两之间都会进行通讯,因此节点数量的增加就意味着“单个节点需要通讯的其它节点数量/通讯心跳包中包含的各节点数据(主要指各节点的运行状态,用于综合反应集群状态)”也同步增加,从而在节点数量接近1000时因为出现网络拥堵现象而难以继续扩容。而在这心跳包中除了各节点数据外还有一项非常重要的哈希槽数据,还数据的本质是当前节点被分配的哈希槽。由于以位图形式(具体如下图)保存且哈希槽总数为16384的原因,该哈希槽数据会固定占有较小的2(16384/8/1024)KB大小。但如果将哈希槽总数设计的更大,那么心跳包的大小自然也会水涨船高,从而就会导致网络拥堵现象出现的更早,并进一步导致可支持的节点数量也更少。

 
 

Redis除了集群外还有别的数据分片方案?


    Redis可用的数据分片方案如下:

  • 客户端分片:由客户端根据自身算法去决定数据具体落在哪台Redis实例上;
  • 代理/中心化分片:客户端将读/写请求发送至专门用于引导/分流的代理服务器,并由代理服务器根据内部将读/写访问请求分发至相应Redis实例上。该数据分片方案的实现组件有Twemproxy;
  • 去中心化分片(最推荐):Redis集群所采用的数据分片方案,所有节点/客户端都具备引导/分流读/写请求至正确客户端的能力。
     
     

Redis集群是前期做还是后期规模上来了再做?为什么?


    对于生产/线上环境来说,在一开始就搭建Redis集群应该是更合理的做法,具体原因如下:

  • Redis非常轻量:在没有数据的情况下,一个Redis实例只占用1MB的内存,因此在一开始就启动多个Redis实例不会浪费多少内存;
  • 方便动态拓展:Redis集群支持快速扩容,这意味着你就算在早期构建了集群,但也不代表你就需要启动很多的Redis实例…一主一从即可,后续可以再加;
  • 提升稳定性:Redis集群自动支持主从同步/故障转移,这可以确保程序在生产/线上环境上稳定/安全运行,也避免了手动建立主从/启动哨兵的操作。

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

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

相关文章

基于LORA的一主多从监测系统_4G模块上巴法云

临时添加一个更新,更换云平台为巴法云,事情的起因是因为阿里云这个老六,早上睡了一觉起来发短信告诉我云平台给我停了,得交钱,好嘛,不过也没办法现在这基本都收费,当然还有onenet可以用&#xf…

.NET Core WebApi第4讲:控制器、路由

一、控制器是什么? 1、创建一个空的API控制器:TestController.cs 2、里面有一个类叫TestController,把它叫做控制器 因为它继承了ControllerBase类,ControllerBase类里提供了一系列的方法,使得TestController这个类具…

Java面试经典 150 题.P55. 跳跃游戏(009)

本题来自:力扣-面试经典 150 题 面试经典 150 题 - 学习计划 - 力扣(LeetCode)全球极客挚爱的技术成长平台https://leetcode.cn/studyplan/top-interview-150/ 题解: class Solution {public boolean canJump(int[] nums) {int…

计算机网络网络层笔记

互联网提供的两种服务 1.虚电路服务 2.数据报服务 需要记住的是现在只用第二种也就是数据报服务 网际协议IP 物理层的中断系统:转发器(hub) 链路层的中断系统:交换机 网络层的中断系统:路由器 网络层以上:网关 如上图所示,网关是用来访问其他的网段的一个接口,网关的地…

【热门主题】000015 大数据治理:开启数据价值新纪元

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 【热…

CentOS8.5.2111(4.1)数据中心主DNS部署

【背景】 某公司的数据中心DC,要架设DNS服务器负责解析“学生姓名缩写.cqie”的域名解析工作。DNS服务器的FQDN(完全正式域名标识)为dns.姓名.cqie,IP地址为192.168.学号.66。要求为以下域名实现正反向域名解析服务。&#xff08…

【C/C++】模拟实现strlen

学习目标: 使用代码模拟实现strlen。 逻辑: strlen 需要输入一个字符串数组类型的变量,并且返回一个整型类型的数据。strlen 需要计算字符串数组有多少个元素。 代码1:使用计数器 #define _CRT_SECURE_NO_WARNINGS 1 #include&…

渗透测试-百日筑基—SQL注入篇时间注入绕过HTTP数据编码绕过—下

day8-渗透测试sql注入篇&时间注入&绕过&HTTP数据编码绕过 一、时间注入 SQL注入时间注入(也称为延时注入)是SQL注入攻击的一种特殊形式,它属于盲注(Blind SQL Injection)的一种。在盲注中,攻击…

Linux 文件内容显示

文件内容显示 浏览普通文件 文件内容查看 cat 命令 作用:查看文件内容,适合数据量较少 格式: cat -参数 文件名 参数: -n :显示行号,加上 -b :文件中所有非空行增加行号&#xff0…

ALIGN: Tuning Multi-mode Token-level Prompt Alignment across Modalities

文章汇总 当前的问题 目前的工作集中于单模提示发现,即一种模态只有一个提示,这可能不足以代表一个类[17]。这个问题在多模态提示学习中更为严重,因为视觉和文本概念及其对齐都需要推断。此外,仅用全局特征来表示图像和标记是不…

linux学习笔记 Ubuntu下的守护进程supervisor安装与多项目部署

我这里首先是在本地WSL上进行安装,WSL2的是ubuntu 24.04,之后又再正式环境的ubuntu 20.04上安装,再次记录一下。 1、首先安装supervisor apt install -y supervisor 2、创建配置文件 echo_supervisord_conf > /etc/supervisor/supervisor…

Linux特种文件系统--tmpfs文件系统前传:虚拟内存子系统

虚拟内存子系统是操作系统中的一个重要组成部分,它负责管理和优化计算机的内存使用。虚拟内存的概念允许操作系统为每一个进程创建一个虚拟地址空间,这个空间比实际物理内存要大得多。虚拟内存子系统通过将部分虚拟地址映射到物理内存,部分映…

【测试工具】通过Jmeter压测存储过程

目录 一、存储过程准备1.1、 建立空表1.2、 建立存储过程1.3、调试 二、测试工具准备三、工具配置及执行3.1、配置JDBC Connection Configuration:3.2、配置吞吐量控制器3.3、配置JDBC Request 一、存储过程准备 1.1、 建立空表 CREATE TABLE test_data ( id NUMB…

安宝特分享 | AR技术引领:跨国工业远程协作创新模式

在当今高度互联的工业环境中,跨国合作与沟通变得日益重要。然而,语言障碍常常成为高效协作的绊脚石。安宝特AR眼镜凭借其强大的多语言自动翻译和播报功能,正在改变这一局面,让远程协作变得更加顺畅。 01 多语言翻译优势 安宝特A…

vivado-vitis-2024.1 ps_hello_world 实验

实验环境 vivado:2024.1 vitis:2024.1 核心板:ZYNQ-7020 实验内容 实验PS端串口打印 "Hello world " 硬件配置 打开vivado2024,新建一个工程 点击 Create Block Design 开始IP配置 首先连接线 然后点击自动连接…

[GXYCTF 2019]Ping Ping Ping 题解(多种解题方式)

知识点: 命令执行 linux空格绕过 反引号绕过 变量绕过 base64编码绕过 打开页面提示 "听说php可以执行系统函数?我来康康" 然后输入框内提示输入 bjut.edu.cn 输入之后回显信息,是ping 这个网址的信息 输入127.0.0.1 因为提示是命令…

《神经网络助力战场车辆及部件损毁识别与评估》

《神经网络助力战场车辆及部件损毁识别与评估》 一、战场车辆损毁评估的重要意义二、传统战场车辆损毁评估方法(一)视觉评估法(二)仪器检测技术 三、神经网络在战场车辆损毁评估中的应用案例(一)射击毁伤评…

K8S配置storage-class

简介 Kubernetes支持NFS存储,需要安装nfs-subdir-external-provisioner,它是一个存储资源自动调配器,它可将现有的NFS服务器通过持久卷声明来支持Kubernetes持久卷的动态分配。该组件是对Kubernetes NFS-Client Provisioner的扩展&#xff0…

Redis 主从同步 总结

前言 相关系列 《Redis & 目录》《Redis & 主从同步 & 源码》《Redis & 主从同步 & 总结》《Redis & 主从同步 & 问题》 参考文献 《Redis的主从复制和哨兵机制详解》 概述 简介 主从同步的本质是数据复制机制。主从同步机制用于将master…

Android 圆形进度条CircleProgressView 基础版

一个最基础的自定义View 圆形进度条,可设置背景色、进度条颜色(渐变色)下载进度控制;可二次定制度高; 核心代码: Overrideprotected void onDraw(NonNull Canvas canvas) {super.onDraw(canvas);int mW g…