当前位置:网站首页>基于MySQL数据库,Redis缓存,MQ消息中间件,ES搜索引擎的高可用方案解析
基于MySQL数据库,Redis缓存,MQ消息中间件,ES搜索引擎的高可用方案解析
2022-07-30 11:09:00 【InfoQ】
- 缓存:Redis
- 数据库:MySql
- 消息队列:RabbitMQ
- 搜索: ElasticSearch
1 redis高可用策略
- 数据持久化
- 主从同步
- 哨兵模式
- 集群
1.1 数据持久化
- AOF: 将更新的操作命令记录在对应的日志文件中,在重启的时候采用“回放”策略,将所有的命令重新执行一遍来实现场景恢复
- RDB: 定时存储redis中的数据快照到数据文件中,在重启的时候,加载rdb文件,恢复所有的数据
1.2 主从方式
- 主机:提供读写能力
- 从机:只提供读


- 多实例提供服务,实现负载均衡
- 每个实例冗余一份全量数据
1.3 哨兵模式
- 哨兵:监听redis实例,判断是否存活(不太对外提供服务能力)
- 通过 PING 命令,检查与主从服务器之间的连接情况,若正常相应,则认为存活;否则认为
主观下线
- 当
n/2 + 1半数以上哨兵认为主节点下线,则认为主节点客观下线,尝试选新的主节点
- 从所有从节点中,选择与之前主库相似度最高的从节点作为新的主库

1.4 集群模式

1.5 小结
- 持久化:RDB数据落盘加载方式 + AOF记录操作命令用于回放策略
- 主从,主从从:全量数据冗余、读写请求分离,负载均衡的思想;核心问题在于主节点挂掉之后需要人工参与手动指定主库
- 哨兵机制:PING/PONG的探活机制,监听主节点,宕机之后自动选主,确保高可用;核心问题在于所有的实例冗余相同的一份数据,数据量大时不友好
- 集群:数据分片,每个实例提供部分服务能力
2 MySql高可用策略
2.1 数据持久化

- 数据更新策略:总是更新缓存的内容(缓存未命中,则从磁盘加载到缓存)
- 先写undolog日志文件:记录之前的数据,支持mvcc、支持回滚就靠它
- redolog记录的两阶段提交:(先是prepare,待binlog写完之后,再次更新状态为commit)
- 最后异步刷新缓存数据到磁盘
- 为什么先更新缓存,最后异步刷磁盘?
- 核心在于操作内存的速度 >> 操作磁盘
- undolog作用是什么,怎么支持mvcc,实现事务回滚的?
- 保障事务原子性的关键所在,数据行非主键变更时,记录修改前的数据到undolog,并指向它,其他sql读这个undolog中的副本数据从而支持mvcc,回滚时则是根据undo log进行逻辑恢复
- redolog作用是什么,为什么两阶段方案?
- 主要保障事务的持久性,当数据库异常宕机之后,可以通过重新执行redo log来恢复未及时落盘的数据;两阶段的主要目的是为了解决redolog与binlog的一致性问题,避免出现redolog第一阶段成功,但是binlog失败导致不一致问题
- redolog属于innodb引擎,固定大小,环形结构覆盖写策略;内部同样是先写缓存,再刷磁盘的策略
2.2 主备架构

2.3 主从架构

2.4 一主多从

2.5 多主多从

2.6 主库切换策略、主从同步策略
主库切换策略
- vip: 即virtual ip虚拟ip
- KeepAlived: 保活脚本
- 级联复制(主->从->从这种复制模式叫做级联复制)或者一主多从在切换之后,其他从实例需要重新配置连接新主
主从同步策略

- 主库生成binlog日志文件
- statement:记录具体引起改动的操作语句,比如insert xxxxx,缺点是某些函数会导致数据不一致(如now())
- row:基于数据行的,原来数据行是xx值改为了yy 值,缺点是数据量大
- mixed: 上面两个混用
- 从库的io线程拉主库的binlog日志,写入自己的relaylog(中继日志),然后由sql线程读取relaylog日志进行回放,实现数据同步
2.7 小结
- 通过冗余来实现高可用:如主备
- 读写分离,实现负载均衡:主从、主从从模式
- 数据持久化策略:操作内存(buffer),异步刷盘,两阶段提交保障一致性
3. RabbitMq高可用方案
3.1 数据持久化

- exchange持久化: 即exchange本身不会因为rabbitmq宕机而被删除,需要手动指定durable=true
- topic持久化:消费者通过topic从exchange中读取消息,需要指定durable=true,避免出现宕机后队列中的消息丢失
- msg消息持久化:即生产者投递到echange的消息,需要持久化到磁盘
3.2 主备模式
3.3 Shovel远程模式
- Shovel 就是我们可以把消息进行数据中心的复制工作,我们可以跨地域的让两个 MQ 集群互联。

3.4 镜像模式

- consumer,任意连接一个节点,若连上的不是master,请求会转发给master,为了保证消息的可靠性,consumer回复ack给master后,master删除消息并广播所有的slaver去删除。
- publisher ,任意连接一个节点,若连上的不是master,则转发给master,由master存储并转发给其他的slaver存储。如果master挂掉,则从slaver中选择消息队列最长的为master,
3.5 普通集群模式
- 数据拆分存储,若纯消息的节点挂了,则只能等待它恢复之后才能正常工作
3.6 多活模式

3.7 小结
- 主备模式
- 镜像模式:全量冗余一份数据,主对外提供服务,可以实现自动切主
- 普通集群模式:数据拆分到集群的实例中,consumer/publisher连接到实例之后,会从具体持有exchange/topic的实例上拉数据
- 远程模式:适用于多中心的场景,将消息转发给其他中心的实例
4. ElasticSearch高可用方案
4.1 集群

- 每个节点包含集群名 + 节点名两个属性,相同集群名的节点挂在一个集群内
- 节点启动之后,开始PING其他节点(连接上后会得到对应节点所在集群的所有信息)
- 节点发现主要靠Zen Discover来实现,选举也是靠它来实现

- 选举同样也是依赖Zen Discover来实现
- 每个节点上报自己任务的主节点,然后票数最多的就是主节点;票数相同的情况下,根据ID排序,选第一个
discovery.zen.minimum_master_nodes4.2 脑裂问题
- 数据节点:负责数据的存储和相关的操作(CURD,聚合)等,因此对机器性能要求较高
- 候选主节点:拥有选举权和被选举权,主节点在候选主节点中评选出来,负责创建索引、删除索引、跟踪哪些节点是群集的一部分,并决定哪些分片分配给哪些的节点、追踪集群中节点的状态等

- 网络问题,导致分区:即部分节点连接不到主节点,认为它挂了,然后选举出现的主节点
- 主节点负载、响应延迟:主节点由于负载过高、或者响应超时,导致重新选举新的主节点
- 适当调大ping timeout响应时间,避免因为网络、主节点性能问题导致的选举
- 设置最少选举节点数大于候选主节点的半数,这样只要有半数以上的候选节点存活,则可以选举出一个主节点;而当可用节点数小于半数时,不参与选举,集群无法使用,也不会出现状态异常的情况
- 角色分离:数据节点 + 候选主节点不放在一台机器上;
- 半数节点以上的投票才算有效
- es额外提供了节点的角色定位,数据节点和候选主节点,其中只有候选主节点才有选举权和被选举权,提供一种角色分离的可选方案,来避免主节点被其他数据服务影响
4.3 数据分片

- 对应副本的概念,上面的分片也叫做主分片
- 当一个数据写入/更新到分片时,只有所有的副本都更新完毕之后,才算完成(可以MySql的全同步)
4.4 数据持久化

- 首先请求随机连一个es节点(这个节点叫做协调节点),然后通过路由算法,确定数据对应的主分片
- 写数据到主分片,然后同步到副本(多个副本时采用并发同步,乐观锁控制)
- 所有副本同步完成之后,主分片节点告诉协调节点最终结果,然后协调节点告诉调用者响应
- 分段存储,可以有效避免读写时加锁的问题
- 不变性,数据只读可以高效缓存,无需考虑更新
- 一个段一旦拥有了提交点,就说明这个段只有读的权限,失去了写的权限。相反,当段在内存中时,就只有写的权限,而不具备读数据的权限,意味着不能被检索
- 新增:当前文档新增一个段
- 删除:新增一个.del文件,记录被删除的文档信息;被标记删除的文档仍然可以被检索到,只是最终返回时被移除
- 更新:删除文件中标记旧的文档删除,插入新的段

- 写入文件缓存系统,之后异步落盘,可能导致丢数据,es采用事务日志的方式来处理恢复策略(即mysql的先写日志,崩溃之后做回放恢复)
- es对外服务时,检索文件缓存系统 + 段中的文档,而内存中的数据不会被检索到(所以所es是近实时搜索引擎,因为最新写入的数据还在内存中,没有提交,立马查就查不到)
- 为了避免段过多,es会定时做合并,将很多小的段合并成大的段(合并过程中会自动移除被标记删除的文档)
- 索引分段存储,段生成 checkpoint 之后,则只读,因此可以全量缓存,不用考虑更新修改
- 延迟写策略:先更新内存数据,异步提交文件缓存系统,最后再由操作系统刷盘
- 内存中的数据不能被检索;文件缓存 + 段中的数据提供查询聚合,最终的结果会过滤已标记删除的文档
4.5 小结
- 角色划分:候选主节点 + 数据节点
- 数据节点:负责数据的存储和相关的操作(CURD,聚合)等,因此对机器性能要求较高
- 候选主节点:拥有选举权和被选举权,主节点在候选主节点中评选出来,负责创建索引、删除索引、跟踪哪些节点是群集的一部分,并决定哪些分片分配给哪些的节点、追踪集群中节点的状态等
- 索引分段存储,段生成checkpoint之后,则只读,因此可以全量缓存,不用考虑更新修改;当出现修改时,标记原来段中文档删除,在新的段写入数据
- 延迟写策略:先更新内存数据,异步提交文件缓存系统,最后再由操作系统刷盘
- 内存中的数据不能被检索;文件缓存 + 段中的数据提供查询聚合,最终的结果会过滤已标记删除的文档
5.一灰灰的总结
5.1 综述
- 冗余 (如数据副本、主备服务等)
- 拆分 (数据拆分、服务能力拆分等)
- 持久化
- 持久化:RDB数据落盘加载方式 + AOF记录操作命令用于回放策略
- 主从,主从从:全量数据冗余、读写请求分离,负载均衡的思想;核心问题在于主节点挂掉之后需要人工参与手动指定主库
- 哨兵机制:PING/PONG的探活机制,监听主节点,宕机之后自动选主,确保高可用;核心问题在于所有的实例冗余相同的一份数据,数据量大时不友好
- 集群:数据分片,每个实例提供部分服务能力
- 通过冗余来实现高可用:如主备
- 读写分离,实现负载均衡:主从、主从从模式
- 数据持久化策略:操作内存(buffer),异步刷盘,两阶段提交保障一致性
- 主备模式
- 镜像模式:全量冗余一份数据,主对外提供服务,可以实现自动切主
- 普通集群模式:数据拆分到集群的实例中,consumer/publisher连接到实例之后,会从具体持有exchange/topic的实例上拉数据
- 远程模式:适用于多中心的场景,将消息转发给其他中心的实例
- ES集群:数据节点 + 候选主节点
- ES持久化:
- 延迟写策略,先更新内存,然后提交操作系统缓存,最后异步刷新到磁盘;
- 索引分段存储:段生成checkpoint之后,则只读,因此可以全量缓存,不用考虑更新修改;当出现修改时,标记原来段中文档删除,在新的段写入数据
- 如果感觉本文对你有帮助,点赞关注支持一下,想要了解更多Java后端,大数据,算法领域最新资讯可以关注我公众号【架构师老毕】私信666还可获取更多Java后端,大数据,算法PDF+大厂最新面试题整理+视频精讲
边栏推荐
猜你喜欢

Telerik2022 R2,有效的自动化测试

ABP学习资源整理

Typroa 替代工具marktext

RandLA-Net复现记录

我又造了个轮子:GrpcGateway

高能产出!腾讯内部的MyCat中间件手册,理论实操齐下

The configuration process and related syntax of writing markdown format notes in vscode

Performance testing of API Gateway APISIX on Google Cloud T2A and T2D

VSCode更改插件的安装位置

The package of idea is not hollow
随机推荐
WebAPI 复习
Typroa alternative tool marktext
获取1688app上原数据 API
加密和安全
高能产出!腾讯内部的MyCat中间件手册,理论实操齐下
MySQL——数据库基础
Unity 锁定相机第二弹
PL5920 SOT-23-6 21V、2A、600KHz同步降压DC/DC转换器
电流继电器JL-8GB/11/AC220V
wsl操作
VLAN相关知识点
淘宝/天猫淘宝评论问答列表接口 API
物联网技术概论:第6章
360 released a future-oriented EDR to protect the security of government and enterprise user terminals in an all-round way
Vim plugin GrepIt
ODrive应用 #4 配置参数&指令「建议收藏」
Neural Network Study Notes 4 - Autoencoder (including sparse, stacked) (updated)
Performance testing of API Gateway APISIX on Google Cloud T2A and T2D
Log4j有哪几种日志级别呢?
ORA-00600 [13013], [5001], [268] 问题分析及恢复