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.mzph.cn/diannao/57846.shtml

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

相关文章

MySQL 安装及用户管理

MySQL 安装及用户管理 MySQL 是一款广泛使用的开源关系数据库管理系统,适用于各种应用程序和平台。本文将提供在不同操作系统(Windows、macOS 和 Linux)上安装 MySQL 的详细步骤,并介绍如何创建 MySQL 用户及设置密码。 1. Wind…

通过Docker Compose构建自己的Java项目

通过Docker Compose构建自己的Java项目 前置条件 安装了Docker,未安装的请移步:CentOS7 / CentOS8 安装 Docker-ce安装了Docker-Compose,未安装的请移步:在CentOS7、CentOS8系统下安装Docker Compose1. 配置阿里云镜像仓库 为了提高Docker镜像的下载速度,我们可以配置阿…

【Git 】Windows 系统下 Git 文件名大小写不敏感

背景 在 Windows 系统上,Git 对文件名大小写的不敏感性问题确实存在。由于 Windows 文件系统(如 NTFS )在默认情况下不区分文件名大小写所导致的。 原因分析 文件系统差异 Windows文件系统(如 NTFS)默认不区分文件名…

代码随想录算法训练营第46期Day42

leetcode.518.零钱兑换 class Solution { public: //求装满背包有几种方法,公式都是:dp[j] dp[j - nums[i]]; // 如果求组合数就是外层for循环遍历物品,内层for遍历背包。 // 如果求排列数就是外层for遍历背包,内层for循环遍历物…

Detecting Holes in Point Set Surfaces 论文阅读

下载链接 Detecting Holes in Point Set Surfaces 摘要 3D 数据采集过程(例如激光范围扫描)产生的重要物体模型通常包含由于遮挡、反射或透明度而产生的孔洞。本文的目标就是在点集表面上检测存在的孔洞。对于每个点,将多个标准组合成一个综…

【机器学习】股票数据爬取与展示分析

数据爬取 一、爬取原理二、代码实践2.1 股票列表获取2.1.1 确定待爬取网页2.1.2 向网页发送请求获取页面响应2.1.3 文本转换成JSON2.1.4 将数据保存到csv文件中2.2 股票数据获取 三、结果分析 一、爬取原理 本文中主要使用的就是Python的request库,这个库基于HTTP请…

GPT打数模——电商品类货量预测及品类分仓规划

背景 电商企业在各区域的商品存储主要由多个仓库组成的仓群承担。其中存储的商品主要按照属性(品类、件型等)进行划分和打标,便于进行库存管理。图 1 是一个简化的示意图,商品品类各异,件数众多,必须将这些…

Task :prepareKotlinBuildScriptModel UP-TO-DATE,编译卡在这里不动或报错

这里写自定义目录标题 原因方案其他思路 原因 一般来说,当编译到这个task之后,后续是要进行一些资源的下载的,如果你卡在这边不动的话,很有可能就是你的IDE目前没有办法进行下载。 方案 开关一下IDE内部的代理,或者…

Jetpack架构组件_LiveData组件

1.LiveData初识 LiveData:ViewModel管理要展示的数据(VM层类似于原MVP中的P层),处理业务逻辑,比如调用服务器的登陆接口业务。通过LiveData观察者模式,只要数据的值发生了改变,就会自动通知VIEW层&#xf…

C#里使用最高性的网络通讯例子

由于接收网络数据会不完整的包, 并且产生各种问题,导致大家都是使用最低效的内存保存数据,比如List<byte>这样的结构。 具体内容可以参考下面的大牛的文章: System.IO.Pipelines: High performance IO in .NET - .NET Blog (https://devblogs.microsoft.com/dot…

【Spring】详解SpringMVC,一篇文章带你快速入门

目录 一、初始MVC 二、SpringMVC 三、Spring MVC的运用 ⭕RequestMapping ⭕传递参数 1、传递单个参数 2、传递多个参数 3、参数重命名 4、传递数组与集合 5、获取路径参数 6、传递JSON数据 7、上传文件 一、初始MVC MVC&#xff08;Model-View-Controller&#…

在不能联网的电脑上安装库(PyEMD为例)

1、查看PyEMD需要什么依赖 需要numpy、pathos、scipy、tqdm依赖&#xff0c;我电脑上有了numpy, scipy&#xff0c;以另外两个为例 2、查看依赖的依赖 查看依赖是否还要依赖 可以看到pathos还要这四个依赖&#xff0c;以此类推&#xff0c;看还要哪些依赖&#xff0c;直至req…

2024.9.27华为笔试题解

第一题绩效互评人员分配 二分图判断模板,可以去看其他博客学习一下 #include <bits/stdc++.h> using namespace std;vector<int> GoodRelationships[105]; int color[105]; // 记录每个节点的颜色,0表示未染色,1和2表示不同的组 bool is_bipartite = true; …

【C】用c写贪吃蛇

1.输入正确的账号密码及其用户名&#xff0c;登录成功进入贪吃蛇游戏界面&#xff0c; 2.随机生成蛇头★、食物▲的位置(x,y)&#xff0c;并使用□打印地图 3.使用w s a d按键&#xff0c;完成蛇头的上下左右移动 4.蛇头碰撞到食物后&#xff0c;吃下食物变成蛇身的一部分●…

Mac 使用脚本批量导入 Apple 歌曲

最近呢&#xff0c;买了一个 iPad&#xff0c;虽然家里笔记本台式都有&#xff0c;显示器都是 2个&#xff0c;比较方便看代码&#xff08;边打游戏边追剧&#xff09;。 但是在床上拿笔记本始终还是不方便&#xff0c;手机在家看还是小了点&#xff0c;自从有 iPad 之后&…

【Java】java 集合框架(详解)

&#x1f4c3;个人主页&#xff1a;island1314 ⛺️ 欢迎关注&#xff1a;&#x1f44d;点赞 &#x1f442;&#x1f3fd;留言 &#x1f60d;收藏 &#x1f49e; &#x1f49e; &#x1f49e; 1. 概述 &#x1f680; &#x1f525; Java集合框架 提供了一系列用于存储和操作…

实现uniapp天地图边界范围覆盖

在uniapp中&#xff0c;难免会遇到使用地图展示的功能&#xff0c;但是百度谷歌这些收费的显然对于大部分开源节流的开发者是不愿意接受的&#xff0c;所以天地图则是最佳选择。 此篇文章&#xff0c;详细的实现地图展示功能&#xff0c;并且可以自定义容器宽高&#xff0c;还可…

java项目之电影评论网站(springboot)

风定落花生&#xff0c;歌声逐流水&#xff0c;大家好我是风歌&#xff0c;混迹在java圈的辛苦码农。今天要和大家聊的是一款基于springboot的电影评论网站。项目源码以及部署相关请联系风歌&#xff0c;文末附上联系信息 。 项目简介&#xff1a; 电影评论网站的主要使用者管…

UE5 源码学习 初始化

跟着 https://www.cnblogs.com/timlly/p/13877623.html 学习 入口函数 UnrealEngine\Engine\Source\Runtime\Launch\Private\Windows\LaunchWindows.cpp WinMain 入口 int32 WINAPI WinMain(_In_ HINSTANCE hInInstance, _In_opt_ HINSTANCE hPrevInstance, _In_ char* p…

8.three.js相机详解

8.three.js相机详解 1、 认识相机 在Threejs中相机的表示是THREE.Camera&#xff0c;它是相机的抽象基类&#xff0c;其子类有两种相机&#xff0c;分别是正投影相机THREE.OrthographicCamera和透视投影相机THREE.PerspectiveCamera&#xff1a; 正投影和透视投影的区别是&am…