复制集群架构设计技巧

news2024/12/26 23:23:01

Redis Sentinel设计技巧

Redis Sentinel基本架构

在这里插入图片描述

Monitoring

Sentinel可以监控Redis节点的状态

Notification

Sentinel可以通过API进行集群状态通知

Automatic failover

Sentinel实现故障自动切换

Configuration provider

Sentinel为client提供发现master节点的发现功能,如果发生了切换,Sentinel会通知client新的master地址

实现细节

  1. Sentinel的选举是Raft算法
  2. Sentinel是独立运行的程序,但不是独立的代码:redis-server /path/to/sentinel.conf --sentinel

Sentinel架构模式

模式1-双节点

在这里插入图片描述

正常:两台服务器,每台服务器上分别部署Sentinel和Redis节点

Quorum:Sentinel对master故障达成一致意见的投票数

Majority:Sentinel之间选举leader需要的投票数

在这里插入图片描述

故障场景1:Master挂掉,Sentinel都正常

故障影响:Replica被提升为Master

在这里插入图片描述

故障场景2:服务器1挂掉,quorum=1,majority=2

故障影响:无论服务器2是否挂掉,集群都宕机

在这里插入图片描述

故障场景3:服务器1和服务器2的连接挂掉,quorum=1,majority=1

故障影响:双主(脑裂)

模式2-三节点

在这里插入图片描述

正常:三台服务器,每台服务器上分别部署Sentinel和Redis节点

在这里插入图片描述

故障场景1:Master挂掉,Sentinel都正常

故障影响:其中1个Replica被提升为Master

在这里插入图片描述

故障场景2:服务器1挂掉,quorum=2,majority=2

故障影响:其中1个Replica被提升为Master

在这里插入图片描述

故障场景3:服务器1、服务器2,它俩和服务器3军断连

故障影响:其中1个Replica被提升为Master,可能出现双主

解决方案:min-replicas-to-write 1; min-replicas-max-lag 10

模式3-分离部署

在这里插入图片描述

正常:Sentinel和Redis分开部署,可以将Sentinel和Redis客户端所在的应用部署在一起,也可以独立部署

在这里插入图片描述

故障场景1:Master挂掉,Sentinel都正常

故障影响:其中1个Replica被提升为Master

在这里插入图片描述

故障场景2:服务器1和服务器4形成分区,剩余的服务器形成另外一个分区

故障影响:双主(脑裂)

解决方案:min-replicas-to-write 1; min-replicas-max-lag 10

Redis集群架构模式对比

架构模式硬件成本架构复杂度双主故障处理能力
双节点2台服务器是,Majority=1只能支持Master节点故障,其他故障不支持
三节点3台服务器是,网络分区,可以通过 min-replicas-to-write, min-replicas-max-lag 来避免支持Master节点故障,Sentinel节点故障
分离部署多台服务器,Sentinel可以和业务服务器公用是,网络分区,可以通过 min-replicas-to-write, min-replicas-max-lag 来避免支持Master节点故障,Sentinel节点故障

MongoDB Replication设计技巧

MongoDB Replication基本架构

在这里插入图片描述

基本实现

  1. Primary处理所有Write请求,Secondary可以处理Read请求,或者只复制数据
  2. 异步复制,复制的是oplog
  3. 选举算法:3.2.0以前基于bully算法,3.2.0开始基于Raft算法
  4. 最多50个节点,但最多只有7个节点参与选举

MongoDB Replication-新节点同步流程

在这里插入图片描述

基本实现

  1. 第1步:寻找同步源,MongoDB支持级联复制,复制源不一定是Primary,而是通过算法选出来的
  2. 第2步:全量复制数据和oplog
  3. 第3步:同步全量复制后的增量数据,异步复制oplog

MongoDB Replication架构技巧

技巧1-Read preference

在这里插入图片描述

基本实现

  1. 默认读Primary,指定read preference来读取Secondary
  2. 可能读不到最新数据
  3. 事务必须读Primary
  4. 包含5种preference:primary, primaryPreferred, secondary, secondaryPreferred, nearest
  5. 通过API或者连接配置参数

技巧2-Arbiter

在这里插入图片描述

基本实现

  1. Arbiter只投票,不复制数据
  2. Arbiter永远是Arbiter,相当于“仲裁者”

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

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

相关文章

WebDAV之葫芦儿·派盘+i简记

i简记 支持webdav方式连接葫芦儿派盘。 每天都去记录生活中所消费的琐碎开支,不仅浪费时间,还有很多广告和理财推销。那有没有纯粹的手机在线记账工具?可以轻松把微信、支付宝账单导入,支持外账入内,还有汇率转换等?答案是肯定的,i简记就是非常实用的在线记账工具。 i…

SwiftUI——如何使用新的NavigationStack和NavigationSplitView(如何页面跳转2.0以及如何制作侧栏)

从 iOS 16 开始,苹果开始弃用原先的NavigationView,以后会逐渐完全淘汰掉。现在开始使用NavigationStack和NavigationSplitView。NavigationStack的效果和原本的NavigationView一样,而NavigationSplitView则和现在 iPadOS 上的NavigationView…

Elastic Search(一)

1. elasticsearch 概述 1.1 简介 官网: https://www.elastic.co/ Elasticsearch (简称ES)是一个分布式、RESTful 风格的搜索和数据分析引擎,能够解决不断涌现出的各种用例。 查询和分析 可以自定义搜索方式: 通过 Elasticsearch,您能够执行及合并多种…

TAPD项目管理:工作流自动化最佳实践

TAPD全称为腾讯敏捷产品研发平台,凝聚了腾讯内部各个产品体系多年敏捷开发的实践精髓。TAPD的【自动化助手】模块通过【触发条件】【执行条件】的规则设定,可以轻松实现自定义子需求、父需求、缺陷管理之间的流转和自动化。 产品/研发的日常工作中&…

mybatis-plus通过inSql实现子查询以及运算符

mybatis-plus通过inSql实现子查询以及运算符一、Controller二、Service1、子查询Service2、运算符Service三、结果一、Controller GetMapping("/queryProductByTypes")public List<ProductDTO> queryProductByTypes(RequestParam("types") List<S…

C数据结构-堆的实现思路和堆排序的实现

堆和堆排堆的定义为什么使用数组&#xff1f;堆接口函数的实现堆的初始化堆的销毁堆的打印堆的插入&#xff01;&#xff01;堆的删除&#xff01;&#xff01;堆的判空返回堆顶的元素堆的大小堆排序的实现&#xff01;&#xff01;实现堆排序的两种方式时间复杂度的分析Last前…

【STC8A8K64D4开发板】——STC8A8K64D4开发板介绍

版权声明&#xff1a;本文为博主原创文章&#xff0c;转载请附上原文出处链接。 文章目录前言一、STC8A8K64D4系列单片机介绍二、STC8A8K64D4开发板概述三、STC8A8K64D4开发板硬件框图四、STC8芯片命名规则五、STC8A8K64D4核心板-2款对比六、STC8A8K64D4开发板-功能描述七、STC…

肠道微生物群与过敏性鼻炎

过敏性鼻炎是个全球性健康问题&#xff0c;易反复发作&#xff0c;困扰着全世界大约着4亿人。自20世纪60年代以来&#xff0c;过敏性鼻炎的患病率持续上升。近几年&#xff0c;我国主要大中城市过敏性鼻炎的平均患病率从11.1%升高到17.6%。 过敏性鼻炎主要临床表现包括发痒、打…

相比Superset和Metabase,DataEase开源工具为什么更易用?

企业业务环境或应用环境中产生的数据大多存储在数据库中&#xff0c;但是这些数据无法直接、形象地加以展示。数据可视化的意义就在于将原始数据通过不同类型的图形进行展示&#xff0c;为数据分析提供更加具象化的手段&#xff0c;这是数据可视化分析工具诞生的使命和意义。 …

[足式机器人]Part3机构运动微分几何学分析与综合Ch02-1 平面机构离散运动鞍点综合——【读书笔记】

本文仅供学习使用 本文参考&#xff1a; 《机构运动微分几何学分析与综合》-王德伦、汪伟 《微分几何》吴大任 Ch02-1 平面机构离散运动鞍点综合2 平面运动微分几何学2.1 平面离散运动的矩阵表示2.2 鞍点规划2 平面运动微分几何学 平面连杆机构由连架杆、机架和连杆组成&#…

运筹说 第73期 | 图论创始人“数学之王”一 欧拉

前面我们介绍了有关动态规划的相关内容&#xff0c;相信大家也都有了一些收获&#xff0c;下面我们学习的列车继续驶往“图与网络分析”的站点&#xff0c;在本次文章中我们将一起走近图论的奠基人——欧拉Leonhard Euler&#xff0c;希望能给大家学习运筹学的旅程中带来不一样…

甘露糖-聚乙二醇-6-羧甲基荧光素mannose-PEG-6-FAM

甘露糖-聚乙二醇-6-羧甲基荧光素mannose-PEG-6-FAM 中文名称&#xff1a;甘露糖-6-羧甲基荧光素 英文名称&#xff1a;mannose-6-FAM 别称&#xff1a;6-羧甲基荧光素标记甘露糖&#xff0c;6-羧甲基荧光素-甘露糖 PEG分子量可选&#xff1a;350、550、750、1k、2k、34k、5…

互联网基础结构发展的三个阶段及其特点

互联网的基础结构大体上经历了三个阶段的演进。但这三个阶段在时间划分上并非截然分开而是有部分重叠的&#xff0c;这是因为网络的演进是逐渐的而不是在某个日期突然发生了变化。 第一个阶段是从单个网络ARPANET向互连网方向发展。这一阶段的主要特点是TCP/IP协议初步成型。1…

Apollo 应用与源码分析:CyberRT-protobuf

目录 概念 特点 优点 缺点 文件的创建 1.字段规则 2.数据类型 3.字段名称 4.字段编号 文件的编译 protobuf 编译命令编译 protobuf cmake 方式编译 使用bazel 编译 在protobuf 文件夹下创建build 文件 代码解释&#xff1a; 样例 protobuf 使用文件 代码解释…

Python:入门与基本语法

目录 一、Python环境 官方下载 Python开发工具 插件安装 二、基本数据类型 动态语言的体现 静态语言的体现 弱语言的体现 强语言的体现 三、基本数据类型 java八大基本数据类型 Python四大基本数据类型 案例 基本数据类型 test01 源码 引用数据类型 列表 test02 源码…

你不知道的SQL语言数据库原理

1、SQL的概述 SQL全称&#xff1a; Structured Query Language&#xff0c;是结构化查询语言&#xff0c;用于访问和处理数据库的标准的计算机语言。 SQL语言1974年由Boyce和Chamberlin提出&#xff0c;并首先在IBM公司研制的关系数据库系统SystemR上实现。 美国国家标准局(AN…

【配电网重构】负荷平衡的配电网重构【含Matlab源码 2180期】

⛄一、 负荷平衡的配电网重构 1 引言 配电网网络重构是指在正常或非正常运行条件下通过改变开关的开关状态来改变网络的拓扑结构。配电网故障恢复供电是指配电网发生故障后,在故障已被定位和隔离的基础上,研究如何恢复对无故障停电区域供电的问题,本文简称为故障恢复。故障恢复…

Spring Cloud Alibaba 整合 Nacos

写在最前 项目 GitHub 地址 mingyue-springcloud-learning 【mingyue-springcloud-user、mingyue-springcloud-member】 阅读推荐 Spring Cloud 入门必读Spring Cloud Alibaba 入门必读 版本声明 spring-boot: 2.7.5 spring-cloud: 2021.0.5 spring-cloud-alibaba: 2021.0.4…

论文阅读 Fast Reinforcement Learning Via Slow Reinforcement Learning

论文阅读 RL^2 Fast Reinforcement Learning Via Slow Reinforcement Learning1. 摘要2.introduction3. 实现4.小结1. 摘要 强化学习可以对于单个任务有较好的效果&#xff0c;但需要大量的尝试。动物往往可以通过少量的尝试就获得很好的效果。原因在于动物可以更好地使用先验…

学习笔记——Java Stream 源码学习

思路 先上一段代码 List<User> userList new ArrayList<>();for (int i 0; i < 10; i) {userList.add(new User(i, "wtq", "1234"));}userList.stream().filter(user -> user.getUserId() > 3).filter(user -> user.getUserId(…