redis--05分布式系统

【Redis系列 05】Redis集群终极指南:从单机到千万级QPS的架构演进之路 当Redis遇到单机性能瓶颈时,集群架构就是突破的关键。本文从实际问题出发,通过通俗易懂的语言和丰富的案例,深入解析Redis集群的核心原理、分片策略、高可用设计和实战应用。你将学会如何构建能处理千万级QPS的Redis集群,掌握从架构设计到运维监控的完整技能体系。 阅读详情

redis分布式系统

redis分布式系统,可以很好地解决不同redis节点存放不同数据,并将用户请求方便地路由到不同redis的问题

数据分区算法

顺序分区

顺序分区规则可以将数据按照某种顺序平均分配到不同的节点。不同的顺序方式,产生了不同的分区算法。

  • 轮询分区算法
    • 字面意思,就是轮询
    • 适用于数据问题不确定的情况
    • 生产者要与所有节点保持连接
  • 时间片轮转分区算法
    • 还是字面意思,类似cpu按时间片调度
    • 每段时间产生数据可能不同,各个节点数据分配存在不均可能
    • 可以让生产者一次只连接一个节点
  • 数据块分区算法
    • 还是字面意思,类似存储管理中的段页式存储
    • 不同节点作为段,段中数据按页存
  • 业务主题分区算法
    • 按照业务驱动划分

哈希分区

哈希分区规则是充分利用数据的哈希值来完成分配,对数据哈希值的不同使用方式产生了不同的哈希分区算法。

  • 节点取模分区算法
    • 对每个节点分配唯一序号,然后对该数据按照一定算法得到其特征key,再计算hash(key)与节点数量N的模,该计算结果即为该数据的存储节点的序号
    • 优势:简单
    • 缺点:当分布式系统节点数发生变化,则所有数据要根据新的节点数重新分配节点
  • 一致性哈希算法
    • 将哈希空间抽象成一个圆环,其取值范围为[0,2^32-1]
    • 将服务器节点通过哈希映射到该圆环上
    • 将要存储的数据也通过哈希映射到该圆环上
    • 哈希环上的数据按顺时针方向寻找服务器节点映射并存储到所对应的服务器节点中
    • 我将其理解为将hash空间按照节点hash分段,所有数据经哈希映射后以统一方向去寻找最近段落边界,然后将数据存储到该边界对应的节点中。当因节点数量变化导致hash分段变化时,新增使得所在段一分为二,删除使得邻接段合二为一,由于数据的hash不会发生改变,那么无论是新增还是删除只会影响到变化节点的逆方向到前一节点之间的数据归属(新增则该部分数据归于新节点,删除则该部分数据归于后一节点)
  • 虚拟槽分区算法
    • 该算法首先虚拟处一个固定数量的整数集合,该集合中的每个整数称为一个slot槽。这个槽的数量一般远大于节点数量,然后将所有slot槽平均映射到各个节点上。而数据只与slot槽有关系。数据只通过其key的hash(key)映射到slot槽:slot=hash(key) % slotNums
    • 该算法解耦了数据与节点,客户端无法维护节点,只需维护与slot槽关系即可。
    • redis数据分区采用该算法,其计算槽点公式为:slot=CRC16(key)&16383,这里优化了计算方法,将数学运算转换为了位运算
    • 感觉和一致性哈希算法类似,都是将哈希分段然后映射到对应节点,但不同点在于一致性哈希算法是用整个哈希空间来进行划分,使得要写入数据的哈希始终在该范围,而虚拟槽算法是给定一个整数范围,然后将这个整数分段段映射到不同节点,插入数据的哈希会进行二次映射(一次映射到哈希空间,第二次映射到整数范围中的某个段)去找到所属段;该算法未使用整个哈希空间,而是将写入数据哈希进行取模映射,使得不同段的hash对应数据也会被存放到同一节点,使得数据能更好的分散

系统搭建与运行

  1. 拷贝并修改redis.conf到一个新的目录
    1. 同样的,该配置文件用于存放共用配置
    2. 将working dir修改为当前目录
    3. 将#cluster-emabled yes注释取消,以开启集群支持
  2. 创建redis6380.conf
include redis.conf
pidfile /var/run/redis_6380.pid
port 6380
dbfilename dump6380.rdb
appendfilename appendonly6380.aof
replica-priority 90
# 指定该节点的集群配置信息(该配置文件是供redis系统进行自动修改的,必须全局唯一)
cluster-config-file nodes-6380.conf
  1. 将步骤2中的配置文件复制5份,并命名为redis6381到5,并将配置文件中对应数字进行改变
  2. 将6个redis服务器按对应的配置文件启动
  3. 使用redis-cli --cluster create --cluster-replicas 1 192.168.92.129:6380 192.168.92.129:6381 192.168.92.129:6382 192.168.92.129:6383 192.168.92.129:6384 192.168.92.129:6385来创建一个有3组为1主1从的分布式集群,该命令后接的1表示每个主服务器有1个从服务器,后面的ip:端口是之前创建的redis主机

集群操作

连接集群

连接分布式系统redis-cli -c -p 6380,-c用于指定连接的是分布式系统

写入数据

对集群进行写入操作时,若要一次写入多个数据,由于redis底层的虚拟槽分区算法可能会将数据分配到不同槽中,故不能直接进行,要先对所有数据分组才能进行插入

例:mset name{emp} zs age{emp} 22 depart{emp} market

而对于一次插入一条数据则正常插入即可

集群查询

在查询数据时,只能查询当前主机的数据

故障转移

在该分布式系统中,若一个集群的master宕机,则从服务器变为master,继续正常提供服务。
若一个集群内的master和从服务器均宕机则虚拟槽无法覆盖所有空间,默认情况下该分布式系统无法提供服务,若将# cluster-require-full-coverage yes配置的注释取消掉,则剩余集群仍能对外提供服务

集群扩容

下面会动态扩容1个端口号为6386的master和端口号为6387的slave节点

  1. 复制并修改两个服务器对应的配置文件(和上节配置的类似)
  2. 启动系统和两个节点
  3. 将两个节点绑定为主从集群
  4. 使用redis-cli -c --cluster add-node 192.168.92.129:6386 192.168.92.129:6380命令将集群添加到分布式系统
    1. 该命令中第一个ip为待添加的master,第二个为分布式系统中任一主机ip
  5. 使用redis-cli -c --cluster reshard 192.168.92.129:6380命令来为分布式系统重新分配虚拟槽(会让依次键入要分配槽的大小,分配的目标服务器id,分配方式)
    1. 同样的该ip为分布式系统中任一主机(之前就存在的)
  6. 使用redis-cli -c -p 6380 cluster nodes查看集群状况
  7. 使用redis-cli --cluster add-node <slave-id> <集群中任一服务器ip,端口号> --cluster-slave --cluster-master-id <master-id>命令将slave添加到指定master下

集群缩容

下面会动态移除端口号为6387的slave和端口号为6386的master

  1. 查看集群各节点信息
    1. redis-cli -c -p <集群中任意主机的ip:端口号> cluster nodes
  2. 移除slave
    1. redis-cli --cluster del-node <slave的ip和端口号> <slave的动态id>
  3. 移除master的虚拟槽
    1. redis-cli --cluster reshard <集群中任意主机的ip:端口号>
    2. 指定要重新分配的虚拟槽数量(会出现一个列表,找到要移除master所对应的数值即可)
    3. 指定接收虚拟槽主机的动态id
    4. 指定虚拟槽提供者的动态id
  4. 移除master节点
    1. redis-cli --cluster del-node <master的ip和端口号> <master的动态id>

redis分布式系统的限制

  • 只支持0号数据库
  • 在批量key操作支持有限(需要指定组)
  • 分区仅限于key
  • 事务支持有限(当数据的key的槽点分布到不同的主机上,事务失效)
  • 不支持分级管理
【中间件篇-Redis缓存数据库05】Redis集群高可用高并发 Redis集群中,在握手成功后,每个节点之间会定期发送ping/pong消息,交换数据信息,集群中节点数量越多,消息体内容越大,比如说10个节点的状态信息约1kb,同时redis集群内节点,每秒都在发ping消息。如下图所示,三个节点真实节点:Node1、Node2和Node3,每个真实节点虚拟出三个虚拟节点:X#V1、X#V2和X#V3,这样每个真实节点所负责的hash空间不再是连续的一段,而是分散在环上的各处,这样就可以将局部的压力均衡到不同的节点,虚拟节点越多,分散性越好,理论上负载就越倾向均匀。 阅读详情

相关推荐

代码审计工具学习之Seay(安装以及初步认识)

目录 1.1名词解释 1.2代码审计的重要性 1.3代码审计的步骤 1.4代码审计的内容 1.5常见的代码审计工具 2 Seay 2.1什么是Seay 2.2Seay的安装过程 3典型漏洞分析 3.1什么是命令注入漏洞 3.2 如何理解命令注入漏洞 3.3 如何防御命令注入漏洞 4 利用工具对命令注入漏洞进行分析 4.1DVWA靶场命令注入漏洞分析 4.2 Pikachu靶场命令注入漏洞分析 1.1名词解释 软件代码审计是对编程项目中源代码的全面...

weixin_52515588的博客 2万+

华体育登录系统实战:高并发场景下的架构设计

缓存是应对高并发的利器,但要设计好过期策略微服务化能提高系统弹性,但要管理好服务发现和负载均衡异步处理非核心流程能显著提升性能压力测试要模拟真实场景,逐步增加并发量这个项目让我深刻体会到,好的架构设计能轻松应对业务高峰。最近在InsCode(快马)平台上看到类似案例,发现他们的一键部署功能特别适合快速验证架构方案,不用自己折腾环境就能看到效果,对开发者特别友好。他们的实时预览功能也很实用,能立即看到修改后的运行结果,大大提高了调试效率。

MoonbeamRaven28的博客 300

股票行情接口,最全的接入方法

股票行情接口一般有两种,一种是WebSocket,一种是http,通过WebSocket可以获取逐笔的股票tick数据,实时并且高效;通过http接口可以获取股票行情接口中的股票历史数据;WebSocket是一种高效的双向通信协议,它允许数据的实时推送,避免了不断的轮询请求。其次,WebSocket允许您订阅特定的数据源或股票数据产品,只接收您感兴趣的信息,提高了数据的效率和可用性。通过接入股票行情数据的HTTP接口,您可以将数据导入到自己的分析工具或系统中,进行更深入的数据分析、模型构建和决策支持。

apifinance的博客 3423

Redis进阶之路 | 为什么说 Redis 是分布式系统的瑞士军刀

今天是一家名为 Hooli 的科技公司的黑客马拉松日。公司里的两名软件工程师想要创建一个小巧而精致的应用程序。然而他们只熟悉少数工具——这其中包括 Redis。他们决定尽可能地利用已掌握的技能,构建出一个原型出来。注:本文涉及的代码只是为了展示Redis 使用场景的主要逻辑以帮助大家理解,因此没有考虑到必要的参数校验、异常处理、性能优化等方面。甚至,你可以将它当做伪代码~

大厂小码农的博客 960

STM32 USART高级功能全解析:IrDA、DMA、硬件流控与低功耗唤醒

USART是嵌入式系统中最基础的串行通信外设,其核心原理在于同步/异步时序控制与数据帧收发机制。现代MCU如STM32通过深度集成IrDA调制解调、DMA直传通道、RS232/RS485硬件流控及Stop模式唤醒等扩展能力,显著提升通信可靠性、吞吐效率与能效比。其中,IrDA SIR采用RZI编码实现抗干扰红外传输,DMA通过TXE/RXNE事件驱动实现零CPU干预的连续数据流,而硬件流控(RTS/CTS/DE)和低功耗唤醒(WUF+UESM)则分别保障工业现场鲁棒性与电池级超长待机。本文围绕STM32平台

weixin_28922227的博客 211

一篇文章认识《双目立体视觉》

双目立体视觉,由两个摄像头组成,像人的眼睛能看到三维的物体,具有深度的信息;单目视觉只能看到二维的物体。 1)双目摄像头 2)双目相机基线 3)打开双目摄像头 4)双目测距 视差disparity、 极线约束、 极线校正/立体校正、 a.双目标定 b.双目矫正 c.立体匹配 d.双目测距(三角测量) e.测距效果 立体视觉方法评测网站

黎国溥 7958

Redis远程字典服务器(0)——分布式系统

单机架构:应用程序 + 数据库服务器数据库和应用分离,应用程序和数据库服务器分别放到不同主机上部署了引入负载均衡,应用服务器 --> 集群,通过负载均衡器,把请求比较均匀的分发给集群中的每个应用服务器(当集群中的某个服务器挂了,其它有相同功能的数据仍然可以承担服务,提高了整个系统的可用性)引入读写分离,数据库主从结构,一个数据库作为主节点,其它N个数据库作为从节点,主节点负责写数据,从节点负责读数据,并且主节点需要把修改过的数据同步给从节点。

aaqq800520的博客 1032

如何做好软件需求分析?

软件需求分析也称为系统需求分析或需求分析工程等,是开发人员经过深入细致的调研和分析,准确理解用户和项目的功能、性能、可靠性等具体要求,将用户非形式的需求表述转化为完整的需求定义,从而确定系统必须做什么的过程。软件开发一般包括:可行性分析、需求分析、软件设计、软件开发、软件测试、软件实施、软件服务等步骤,需求分时软件开发的第一步骤。用户需求分析是指在系统设计之前和设计、开发过程中对用户需求所作的调查与分析,是系统设计、系统完善和系统维护的依据。

qq_41854911的博客 1415

【Redis】如何从单机架构演化为分布式系统

详细介绍如何从单机架构一步步演化为分布式系统

m0_74105656的博客 1557

PCL 基于超体素的点云分割【2024最新版】

点云超体素分割原理介绍、代码实现以及如何做到将每一个超体素内的点进行单独保存而不造成点云缺失的方法。博客长期更新,本文最近一次更新时间为:2024年12月29日。

点云侠的博客 36万+

Vue - 列表拖曳排序 / 鼠标拖动改变顺序排列高效简洁组件(支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无 BUG)

Vue-高效简洁列表拖曳排序/鼠标拖动改变顺序排列组件支持PC端与移动端触屏拖动,也可在滚动条内排序自动滚动,流畅丝滑无BUG列表拖曳排序插件vuedraggable拉动拽动拖动顺序改变排序js,vue.js,nuxt.js列表如何实现鼠标拖曳改变顺序排列支持滚动条内复杂数据对象带拖动效果动画排序完毕自动排列数组位置克隆Vue.Draggable官方文档教程SortableJS与vuedraggable列表拖动排序Vue拖拽组件库vuedraggable的安装与使用用户用鼠标拖动排序功能源码最好

🏆 前端领域优质创作者 4847

Redis Day05

满足分布式系统或集群模式下多进程可见并且互斥的锁,也就是所有的JVM都能看到的.因为MySQL和Redis都有主从模式,所以高可用性好,然后这里zookeeper不太懂是什么.MySQL是利用了事务,事务会自动上锁.好吧这里MySQL也不是很懂,后面得好好补补八股了.这里高可用的意思就是在遇到网络波动或者组件宕机的时候,仍能够稳定地提供服务.就比如主从模式,主机坏了就让从机变成主机。

2401_87663076的博客 639

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

分布式系统

分布式系统(DistributedSystems)是一种计算机系统架构,其中的组件在网络上分布在多个独立的计算节点(如服务器、计算机)上,但这些组件通过网络协调工作,最终向用户呈现为一个整体的系统。这种架构使得系统具备高可用性、可扩展性和容错性。为什么不能同时保证三个,举例说明要理解为什么在分布式系统中不能同时完美地保证一致性(Consistency)、可用性(Availability)和分区容错性(PartitionTolerance),可以通过具体的例子来说明。

Jak的博客 1396

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

【Redis进阶】Redis集群

数据分片(Data Sharding)是一种将数据集分割成更小的部分(称为"片"或"分片")并分布到多个存储单元(如数据库或服务器)上的技术。每个分片只存储数据集的一部分,从而使得系统能够水平扩展,处理更大规模的数据量和更高的并发请求。Redis Cluster使用数据分片实现key的存储分布Redis Cluster将集群划分为16384个槽位,数据库中所有的key进行hash计算后,都会落到16384个槽位中的其中一个槽位。

2401_83045332的博客 1771

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

尚硅谷redis7 03-05 redis能干嘛

1.硬件:mysql的存储空间在硬盘,为了提高查询效率,redis的存储空间位于内存。2.查询:mysql的查询通过检索关键字进行条件过滤,因此redis应用key-value结构存储【这样查的快】。3.关系的处理:mysql查得慢也许是因为主键和外键的约束,因此redis没有这些约束。此后的查询中,在查询mysql之前,先访问redis。若在redis中访问不到,再去访问mysql,然后再把mysql中查询的数据写入redis。

feiyinjiu的博客 756

分布式系统接口如何保证幂等性

分布式系统接口如何保证幂等性 接口幂等性 为了防止上述情况的发生,我们需要提供一个防护措施,对于同一笔支付信息如果我其中某一次处理成功了,我虽然又接收到了消息,但是这时我不处理了,即保证接口的 幂等性。 维基百科上的定义: 幂等(idempotent、idempotence)是一个数学与计算机学概念,常见于抽象代数中。 在编程中一个幂等操作的特点是其任意多次执行所产生的影响均与一次执行的影响相同。幂等函数,或幂等方法,是指可以使用相同参数重复执行,并能获得相同结果的函数。这些函数不会影响系统状态,也不用

final_me的博客 5万+

05 | 分布式系统(下):架构师不得不知的三大指标

上一讲中,我们学习了如何用服务等级协议(SLA)来评估我们设计的分布式系统,并了解了几个常见的 SLA 指标。今天我们继续来探索分布式系统的另外几个重要基础概念。

qq_37756660的博客 1135

1.初识redis

本文章为redis的开篇,主要为大家讲解了redis是什么,他与mysql的主要区别是什么,redis和分布式系统的渊源,为什么redis与分布式系统联系很紧密,以及redis中一些常见概念的介绍,相信大家在阅读完这一篇文章后,对redis会有一个新的理解。

xinhang10的博客 1561

【Redis 进阶】Redis 典型应用 —— 分布式锁

什么是分布式锁。

Elena's Blog 1268

【Redis】Linux 配置Redis

Redis是一款高性能的开源键值数据库,采用内存存储,支持多种数据结构(字符串、哈希、列表等)和持久化功能(RDB/AOF)。具备高可用特性(主从复制、哨兵、集群模式)和原子操作,适用于缓存、会话存储、消息队列等场景。安装配置方面,在Ubuntu系统下载源码编译后,通过修改bind、daemonize等参数调整配置,使用redis-server启动服务,redis-cli连接测试。Redis以其卓越性能(单机QPS 10万+)和丰富功能成为现代应用开发的重要组件。

Antonio915的博客 1361

如何使用Redis锁避免重复操作

Redis 锁作为一种强大的分布式锁,其应用场景极为广泛,适用于任何需要同步多个进程或线程访问共享资源的分布式系统。想象一下,你正在参加一个在线购物活动,这个活动有一个规则:每个用户只能领取一次优惠券。这个规则是通过后端系统来保证的,系统会检查用户是否已经领取过优惠券,如果没有,才会允许用户领取。现在,假设有大量的用户几乎同时访问这个活动页面,并且点击领取优惠券的按钮。后端系统可能由多个服务器实例组成,每个实例都在处理用户请求。

942

使用 Redis 生成分布式唯一ID

1.1唯一 ID 的需求在很多业务系统中,如电商系统中的订单、用户、支付记录等,每个实体都需要有一个唯一的标识符(ID)。全局唯一性:不同节点生成的 ID 不能重复。高效性:能够快速生成,不成为系统瓶颈。有序性(可选):某些业务场景下,需要 ID 是有序的(如消息队列中)。1.2传统方法的缺陷适合单节点系统,但在分布式环境中,容易因节点间的竞争和同步导致冲突。自增 ID 在高并发场景下容易成为性能瓶颈。

Takumilove的博客 1042

9:00面试,9:05就出来了,问的问题有点出乎意料!

从小厂跳槽出来,本以为能在新公司大展拳脚,没想到没多久就再次遭遇困境。入职初期,加班成了家常便饭,尽管如此,考虑到薪酬还算可观,我并没有过多抱怨。然而,到了六月,一纸通知打破了平静——公司宣布薪资要下调百分之四十。这样一来,连基本的生活开销都成了问题。这一连串的变故让我措手不及,原本满怀期待的心情瞬间跌入谷底。面对突如其来的挑战,我不得不重新审视自己的职业规划,并思考下一步该何去何从。原本以为自己会在这家新公司大展拳脚,谁知道还没来得及施展抱负,就遭遇了如此重大的打击。

技术分享、程序员趣事、行业趋势等内容! 2557

Redis 作为 PHP 的会话存储

通过将 PHP 会话数据存储在 Redis 中,可以实现分布式环境中的会话共享,并提升会话数据的读写效率。这种方式特别适用于需要跨多个服务器共享会话的应用程序,如负载均衡和高可用性系统。

沈明沅 682

redis 05:redis分布式锁实战、缓存穿透、击穿、雪崩等问题

缓存几大问题 一、缓存粒度控制 通俗来讲,缓存粒度问题就是我们在使用缓存时,是将所有数据缓存还是缓存部分数据? 缓存粒度问题是一个容易被忽视的问题,如果使用不当,可能会造成很多无用空间的浪费,可能会造成网络带宽的浪费,可能会造成代码通用性较差等情况,必须学会综合数据通用性、空间占用比、代码维护性 三点评估取舍因素权衡使用。 二、缓存穿透问题 缓存穿透是指查询一个一定不存在的数据,由于缓存不命中,...

严老板的技术梦想博客 1万+
上一篇: redis--04主从集群
下一篇: redis--06高并发问题
sisyphoslee
博客等级 码龄7年 942粉丝 142原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值