Redis 多机方案

Redis 多机方案

Redis主从复制

Redis服务器角色可以分为主服务器和从服务器, 从服务器复制主服务。通过在指定服务器上执行SLAVEOF可以将服务器设置为目标服务器的从服务器, 目标服务器成为主服务器。

SLAVEOF 127.0.0.1 6379

同步实现

同步包括SLAVEOF触发的复制和建立主从关系后的命令同步。

复制流程如下:

  1. 从服务器向主服务器发送SYNC命令
  2. 主服务器接收到SYNC命令后,执行BGSAVE命令, 在后台生成一个RDB文件,并使用一个缓冲区记录从现在开始执行的所有写命令。
  3. 当主服务器的BGSAVE命令执行完毕后, 主服务器将生成的RDB文件发送给从服务器,从服务器接收RDB文件后,加载数据。
  4. 主服务器将记录在缓冲区中的所有写入命令发送给从服务器, 从服务器执行同步主服务的状态。

命令传播:每当主服务器收到写入命令,数据发生变化,都将命令传播到从服务器执行。

增量复制

PSYNC 是在SYNC命令的基础上提供了全量同步和增量同步(部分重同步)的模式,用于处理从服务器断线重连主服务器的数据同步场景。

  1. 全量同步: 同SYNC的复制流程一致
  2. 增量同步: 当从服务器断线重连主服务器后, 主服务器只将从服务器断线期间的命令同步至从服务器,避免全量同步带来的性能问题。

增量同步的实现通过复制缓冲区+复制偏移量来实现:

主从服务器都维护自己同步的复制偏移量,服务器同步命令将将写入复制缓冲区, 当从服务器同主服务器建立连接进行数据同步时,检查偏移量,如果偏移量不一致,并且从服务器的偏移量还存在复制缓存区,则主服务器将从服务器偏移量之后的数据同步到从服务器即可,如果已经被清理出复制缓冲区,进行完全同步。

命令同步

主节点执行完一条写命令,立即返回客户端,异步发送写命令同步给从节点

心跳检测

       从服务器默认每秒一次的频率向主服务器发送命令。

Redis 针对主从复制的配置:

       Min-salves-to-write : 接收写命令时最少网络连接正常的从服务器数量。如不满足条件,拒绝写命令。

Min-salves-max-lag: 接收写命令时,从服务器的延迟最大值。如超过,拒绝。

Redis Setinel

Sentinel集群是Redis高可用性的解决方案: 由一个或多个Sentinel实例组成的Sentinel系统监控任意多个主服务器以及这些主服务器下属的所有从服务器, 当某个主服务器进入下线状态时,自动从该主服务器的从服务器中选择一个从服务器升级为主服务器继续处理命令。当原先下线的主服务器重新上线后将成为新主服务器的从服务器。

Sentinel通过INFO命令获取主服务器信息及其从服务器地址。建立同主服务器和从服务器的连接。

Sentinel将Sentinel信息通过发布订阅的形式推送给监控的主从节点,Sentinel之间则通过服务器状态获取其他存在的Sentinel节点信息,建立相关之间的连接。

Sentinel将同其他Sentinel示例,监控的主服务器、主服务器的从服务器都建立连接,后续通过PING命令检查响应节点的存活性。

主服务器的下线状态

主观下线状态: 当Sentinel在特定时间内无法获取监控主服务器的PING命令有效响应,则将该主服务器设置为主观下线状态。

客观下线状态:当Sentinel判断某个主服务器为主观下线状态,则向监控该主服务器的其它Sentinel进行确认,如果得到确认下线响应的Sentinel数量达到配置的quorum,则判定该主服务器客观下线。

Sentinel leader选举

当一个主服务器被判断为客观下线时, 监视该主服务器的Sentinel节点实例通过选举算法选择Sentinel的Leader 负责对主服务器进行故障转移。

选举流程如下:

  1. 每一轮选举都通过一个轮次标识来确定。
  2. 在某次配置轮次中, 当某个Sentinel确认主服务器达到客观下线状态后,将自己设置为该轮次的Leader,并向其它Sentinel进行确认。
  3. Sentinel的Leader按先到先的的规则, 当某个Sentinel在没有设置Leader节点时收到其他Sentinel的选举请求,将该选举请求中指定的Leader设置为本节点,本轮次的leader,并返回回复确认。
  4. 如果某个轮次中,一个Sentinel节点得到超过半数Sentinel节点的确认,将成为Leader。
  5. 如果在特定时间内没有选举成功Sentinel leader,则生轮次,重新选举。
  6. 不管选举是否成功,一次选举后轮次都将自增一次。

故障转移

过程包括:

  1. 从所有从服务器节点中选择主服务器:按优先级+复制偏移量进行选择。 发送SLAVEOF no one命令将该从服务器设置为主服务器。
  2. 将其他从服务器改为复制新的主服务器
  3. 将重新上线的原主服务器节点改为复制新

Redis 集群

Redis集群是Redis提供的分布式数据库方案,集群通过分片来进行数据共享,并提供复制和故障转移功能。

组成集群

通过CLUSTER MEET IP PORT将自身同目标节点纳入同一个集群中。

CLUSTER MEET 127.0.0.1 7001

可以通过CLUSTER NODES 查看集群中所有节点。其他如CLUSTER INFO查看集群信息

槽指派(分片)

集群整个数据库被划分为16384个槽位,通过指派将槽位分配到不同的集群节点负责。

CLUSTER ADDSLOTS 0 1 2 3 4 … 5000

每个集群节点的槽位分配信息将传播到其他集群节点。

集群命令执行流程

集群命令执行流程如下:

  1. 客户端向节点发送数据库键指令。
  2. 节点计算键属于哪个槽位。
  3. 检查当前节点是否负责处理该槽位, 如负责则执行命令, 否则节点向客户端返回一个MOVED错误。
  4. 客户端根据MOVED错误提供目标地址将命令重新发送到负责节点执行。

槽位确认算法: CRC16(KEY) & 16383

重新分片

Redis集群的重新分片(重新进行槽位分配)由集群管理软件redis-trib负责。

相关的质量包括:

  1. 往目标节点发送CLUSTER SETSLOT  <SLOT> IMPORTING <SOURCE_ID>: 通知目标节点准备好从源节点导入SLOT相关的键
  2. 往源节点发送CLUSTER GETKEYSINSLOT <SLOT> <COUNT>获取源节点指定SLOT,指定数量的建。
  3. 将获取到的key通过命令MIGRATE <TARGET_IP> <TARGET_PORT> <KEY_NAME> 0 <TIME_OUT>通知源节点将被选中的键迁移到目标节点,持续进行该命令。直到完成SLOT的迁移
  4. 最后向任意一个节点发送 CLUSTER SETSLOT <SLOT> NODE <TARGET_ID>通知槽指配信息的迁移,该信息会广播到集群所有节点。

迁移过程中的命令处理

       迁移过程中,按照原槽位指派信息,原节点收到键命令,如果键还没有迁移到目标节点,则原节点处理并返回。如果已经迁移走,则原节点返回一个ASK命令指示客户端跳转到目标节点进行处理。

       ASK和MOVED命令都指示客户端切换节点目标,MOVED命令是依据槽位归属的产生的跳转, ASK只用于在进行重新分片过程中产生的临时跳转。

复制和故障转移

集群中节点也按照主从概念划分为主节点和从节点, 主节点用于处理槽中键的命令, 从节点用于复制主节点,并在主节点下线后代替下线主节点继续处理命令。

CLUSTER REPLICATE <NODE_ID>将节点设置为NODE_ID的从节点。

故障检测

集群中的每一个节点会定期向集群中的其它节点发送PING消息检测目标节点的在线情况, 如果在规定时间内没有接收到PING消息的正常响应,节点会将目标节点设置为疑似下线状态。

集群中节点相互通过消息交换自身维护的集群节点状态,如果集群中超过半数的主节点都将某个主节点报告为疑似下线, 则设置为下线状态。并在集群中进行广播该主节点的下线状态。

故障转移

当从节点收到主节点下线的消息, 将触发主节点的选举。选举过程同Sentinel对主节点的选举过程类似, 只是负责选举的绝点变成集群中的所有主节点,当超过半数的主节点选举出新的从节点,当选为新主节点的从节点将负责进行故障转移:

  1. 执行SLAVEOF NO ONE 成为新的主节点
  2. 撤销原先主节点的槽位指派,并重新指派到自己身上。
  3. 广播PONG消息,通知自身成为新的主节点,其他的从节点将修改为新主节点的从节点。
  4. 后续有新的主节点负责处理槽位相关的键命令。

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

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

相关文章

设计模式简要介绍

设计模式有很多&#xff0c;较为重要的如下 静态和单例模式 单例模式的本质就是类成员中有一个对象实例 public class Animal{public static string Title "Animal" // 类成员public string Name; // 对象成员public const float Pi 3.14f; // 类成员public rea…

C语言—窄字符或宽字符

#include<iostream> #include<Windows.h> #include<tchar.h>int main() {TCHAR destination[100];lstrcpy(destination, __T("你好"));_tprintf(__T("Copied string: %s\n"), destination); }/*在C/C中&#xff0c;__T(x) 格式通常用于实…

【系统集成项目管理工程师】——3.管理

主要掌握输入&#xff0c;输出内容先看他的过程域本身&#xff0c;过程域是什么输出就是什么 上一个过程域的输出是下一个过程域的输入 十大管理1432都有计划过程组&#xff0c;通常规划为首&#xff0c;控制为尾 规划阶段的万能输出是各子计划&#xff0c;即项目管理计划的…

【第2章 Node.js基础】2.1 JavaScript基本语法

文章目录 学习目标JavaScript版本与JavaScript运行环境JavaScript版本JavaScript运行环境 JavaScript语句与注释语句语句块注释 变量变量的命名变量的声明与赋值变量提升变量泄露全局作用域和函数作用域块级作用域与let关键字使用const关键字声明只读常量注意 数据类型数值&…

引用类型;强引用;软引用;弱引用和虚引用

概述 平时在编写代码的时候内存都是由jvm管理&#xff0c;对象的回收也是jvm在管理&#xff1b; 但是有些时候jvm无法回收对象&#xff0c;最后就会抛出oom异常. 那么那些回收不了的对象肯定有区别于能回收的对象&#xff1b; 先上一波引用类型介绍 强引用 比如平常我们直…

2023-11-06 monetdb-事务-insert-delta缓存-分析

摘要: monetdb在事务处理时, 会将数据写入delta缓存中, 然后在commit时将数据写入wal文件, 随后由控制器决定何时将wal中的数据真正的写入BAT列文件中. 本文从delta缓存入手, 分析monetdb在事务处理中的细节. SQL: DML: create table t1 (a int); 事务DDL: START TRANSACTI…

数据结构-Prim算法构造无向图的最小生成树

引子&#xff1a; 无向图如果是一个网&#xff0c;那么它的所有的生成树中必有一颗生成树的边的权值之和是最小的&#xff0c;我们称 这颗权值和最小的树为&#xff1a;“最小生成树”&#xff08;MST&#xff09;。 其中&#xff0c;一棵树的代价就是树中所有权值之和。 而…

外呼系统需要关注哪些功能?okcc呼叫中心ai智能语音

场景一&#xff1a; 当点击呼叫、一键拨号、预览外呼发起时&#xff0c;座席人员当前绑定的外呼设备&#xff1a;可能是手机、固话、软电话、WebRTC软电话、SIP话机等&#xff0c;首先振铃&#xff0c;同时外呼系统自动弹出外呼弹屏&#xff0c;展示被叫号码的详细信息&#x…

封装localstorage为对象 js

export const LocalStorageManager {recordKey: "Record",// 获取本地存储中的值get(key) {try {const value localStorage.getItem(key);if (value null || value undefined || value "") {return null;}return JSON.parse(localStorage.getItem(key…

Jest和Mocha两者之间有哪些区别?

什么是单元测试&#xff1f; 所谓单元测试&#xff0c;是对软件中单个功能组件进行测试的一种软件测试方式&#xff0c;其目的是确保代码中的每一个基本单元都能正常运行。因此&#xff0c;开发人员在应用程序开发的整个过程&#xff08;即代码编写过程&#xff09;中都需要进…

云原生周刊:Gateway API 1.0.0 发布 | 2023.11.6

开源项目推荐 Kueue Kueue 是一套用于作业队列的 API 和控制器。它是作业级管理器&#xff0c;可决定何时允许作业启动&#xff08;如创建 pod&#xff09;&#xff0c;何时停止作业&#xff08;如删除活动 pod&#xff09;。 Reloader 一个 Kubernetes 控制器&#xff0c;…

阿里云服务器登录、安装MySql、配置Python、GO环境

1、刚购买的云服务如何登录 刚购买的ECS没有默认密码&#xff0c;需要先设置一下登录的密码。选中实例&#xff0c;右上角的全部操作-->重置实例密码 如果想通过SSH登录&#xff0c;则一定要勾选开启 修改之后ssh root你机器的ip&#xff0c;输入密码就可以愉快的开始你的操…

如何安装Wnmp并结合内网穿透实现外网访问内网Wnmp服务

文章目录 前言1.Wnmp下载安装2.Wnmp设置3.安装cpolar内网穿透3.1 注册账号3.2 下载cpolar客户端3.3 登录cpolar web ui管理界面3.4 创建公网地址 4.固定公网地址访问 前言 WNMP是Windows系统下的绿色NginxMysqlPHP环境集成套件包&#xff0c;安装完成后即可得到一个Nginx MyS…

冥想第九百七十天

1.充实的一天&#xff0c;今天的天气还好&#xff0c;准备下班后去跑步&#xff0c;本来是明天要跑的&#xff0c;因为明天有课&#xff0c;所以今天跑&#xff0c;不耽误事。 2.全力以赴的一天&#xff0c;感谢父母&#xff0c;感谢朋友&#xff0c;感谢家人&#xff0c;感谢不…

TSINGSEE智能分析网关V4车辆结构化数据检测算法及车辆布控

车辆结构化视频AI检测技术&#xff0c;可通过AI识别对视频图像中划定区域内的出现的车辆进行检测、抓拍和识别&#xff0c;系统通过视频采集设备获取车辆特征信息&#xff0c;经过预处理之后&#xff0c;接入AI识别算法并与车辆底库进行对比&#xff0c;快速识别车辆身份和属性…

架构漫谈 - 如何设计高性能、高可用、高扩展架构

文章目录 一、如何设计高扩展架构架构设计复杂度模型可扩展复杂度模型"拆分"复杂度分析和设计"封装"复杂度分析和设计(1)规则引擎:美团MazeGO规则引擎(2)微内核:OSGI微内核(3)抽象层:Linux VFS抽象层(4)设计模式二、设计高性能架构单机高性能集…

视频转码教程:轻松制作GIF动态图,一键高效剪辑操作

随着社交媒体的兴起&#xff0c;GIF动态图已经成为了人们表达情感、分享精彩瞬间的重要方式。而将视频转化为GIF动态图&#xff0c;不仅可以方便地在社交媒体上分享&#xff0c;还可以延长视频的播放时长&#xff0c;吸引更多的观众。本篇文章将为大家介绍如何将视频轻松转化为…

Flink ON Yarn 模式 --- per job mode 与application mode的区别

1、per job mode&#xff1a; 对于yarn-per-job模式调度的过程&#xff1a; 1、资源调度&#xff1a; 1、因为是yarn模式&#xff0c;所以客户端会向ResourceManager申请资源&#xff0c;申请容器负责来启动ApplicationManager 2、此时ResourceManager接受到客户端的请求&#…

算法与设计分析 | 全排列问题

题目 给定一个由不同的小写字母组成的字符串&#xff0c;输出这个字符串的全排列数量。 我们假设对于小写字母有a < b < ... < y < z。 输入 每组输入只有一行&#xff0c;是一个由小写字母组成的字符串&#xff08;不含相同字母&#xff09;&#xff0c;已知字符…

maven 上传本地jar包到nexus

maven上传命令 mvn deploy:deploy-file -DgroupIdcom.microsoft.sqlserver -DartifactIdsqljdbc4 -Dversion4.0 -Dpackagingjar -DfileC:\java\top-sdk-java-1.0.1-lib\lib\bcprov-jdk16-1.46.jar -Durlhttp://ip:port/repository/maven-releases/ -DrepositoryIdsnapshot…