使用合理的架构保障服务的韧性

本文涉及的产品
容器服务 Serverless 版 ACK Serverless,952元额度 多规格
应用实时监控服务ARMS - 应用监控,每月50GB免费额度
云原生网关 MSE Higress,422元/月
简介: 【6月更文挑战第14天】 该文介绍了软件韧性的概念和目标,强调了主从模式在确保业务连续性中的作用。主从模式通过全同步、半同步和异步技术保证数据一致性和系统可用性。这种模式常用于读写分离,缓解数据库负载,是保障业务韧性的常见策略。

1 简介

韧性从多个维度诠释了软件持续提供业务服务的能力,核心目标是提升软件的平均无故障时间(Mean Time Between Failure,MTBF)。

treeoflife6.png

从架构设计上,韧性包括服务异步化能力、重试/限流/降级/熔断/反压、主从模式、集群模式、AZ内的高可用、单元化、跨region容灾、异地多活容灾等。

本文介绍保障业务韧性的一个经典方法,主从模式。并且详细阐述了三种数据同步方式的特点及适用场景,并讨论了MySQL主从复制的binlog模式(SQL语句、行基础和混合模式)及其同步过程。主从复制通过主库的binlog传递到从库,经由I/O线程和SQL线程处理,实现数据更新。

当业务上线后,最不能接受的就是业务不可用,让用户无法正常使用软件,影响体验和收入。

当软件所依赖的软硬件组件出现各种异常时,软件就需要表现出抵御能力,这些异常通常包括硬件故障、硬件资源瓶颈(如CPU/网卡带宽耗尽)、业务流量超出软件设计能力、影响机房工作的故障和灾难、软件bug、黑客攻击等对业务不可用带来致命影响的因素。

这时候主从模式的读写分离就可以保障一定的业务韧性了,先介绍其三个数据同步方式,然后介绍主从同步mysql的binlog记录的三个方式,最后介绍图形解读binlog的在内部的同步过程,并做小结。

1 全同步技术

  • 定义

用户请求更新数据时,主数据库必须要同步到备用数据库才可用返回给用户,如果主数据库没有同步到备数据库,用户的更新操作一直阻塞

  • 特点

保证了数据的强一致性,吸收了系统可用性

  • 场景

适用于分布式数据库主备场景或对数据一致性有严格要求的场合,比如金融,交易场景

2 半同步技术

  • 定义

数据更新时,主数据库执行写操作,并给备数据库发送同步请求,主数据库可用等等一部分从数据库响应,即返回给用户

  • 方案

多个备用数据库其中一个返回,超过一半结点包括主数据库回复成功后,即可返回给用户。

  • 场景

多数分布式系统都采用半同步,兼顾性能和数据保护

  • 框架

      MySQL,Zookeeper,Ercd,Oracle等        
    

    3 异步技术

  • 定义

数据更新时,主数据库处理完请求后直接给用户响应,不必等备数据库完成同步,备数据库将异步执行数据同步,用户更新操作不会因为备数据库未完成而阻塞

  • 特点

保证可用性,牺牲了一些数据一致性

  • 场景

适用于用户请求响应时延要求高的场景

4 主从复制的方式

主从复制使用binlog模式进行数据备份的三种binlog模式:

① 基于SQL语句的复制,

每一条更新的语句(insert、update、delete)都会记录在binlog中,进而同步到从库的relaylog中,被从库的SQL线程取出来,回放执行。

优点是:binlog的日志量可能会比较少,比如一个涉及行数为1000行的update语句:同步这一个语句,就同步了1000行的数据。

缺点是:同步的SQL语句里如果含有绑定本地变量的函数、关键字时,可能造成主从不一致的情况。比如SQL语句中有time函数,如果主从数据库的服务器时间不是精确相等,就会造成结果不一致。

② 基于行的复制,

不记录SQL语句,只记录了哪个记录更新前和更新后的数据,可以保证主从之间数据绝对相同。缺点是:1条SQL更新1000行的数据无法再偷懒,必须原原本本同步1000行的数据量。

③ 混合复制:

以上两种模式的混合,选取两者的优点。对于有绑定本地特性、评估可能造成主从不一致的SQL语句,则自动选用基于行的复制,其他的情况则选择基于SQL语句的复制。

5 主从复制的binlog数据同步过程

主从复制过程:从库发起同步请求,数据传导过程如下:

Master->存储引擎->binlog->dump线程(读取binlog) ->从库I/O线程(将接到的日志信息存放到relaylog)->relaylog(读取relay的日志信息)->SQL线程(将数据库事件在存储引擎执行)->存储引擎

从库请求主库同步过程如下:

1  从库连接主库请求同步
2 Dump线程读取binlog
3 发送binlog中的日志
4 将binlog日志存储到relay log
5 SQL线程读取relay log
6 在存储引擎执行数据更新事件

使用图形表示如下:

image.png

上图详细描述了Mysql的主从数据同步步骤。在主从(Master-Slave)模式,主组件接收客户端的服务请求,它将工作划分给从组件,然后合并、解释、总结或整理从组件的响应。

当主组件没有对从组件分配工作时,从组件处于空闲(Idle)状态,并会在新的任务分配时被重新激活,
主从模式由主操作重配置状态图描述,其中包含两个正交的图,即主操作状态图和主从配置状态图,主操作状态图定义了主组件的操作状态,主从配置状态图描述了主组件如何安排重配置的过程。

6 小结

目前大部分的主流数据库都提供主从热备功能,通过配置两台数据库主从关系,可以将一台数据库服务器的数据更新同步到另一台服务器上。网站利用数据库的这一功能,实现数据库读写分离,从而改善数据库负载
压力。

现在对数据库的直接操作一般是因为一部分对缓存的读操作比如缓存访问未命中,缓存过期和全部写操作都需要访问数据库,应用服务器再写数据库。应用写数据时,访问主数据库,主数据库通过主从复制机制将数据更新同步到从数据库,这样当应用服务器读数据的时候,就可以通过从数据库获得数据。

为了便于应用程序访问读写分离后的数据库,通常在应用服务器端使用专门的数据访问模块,使数据库读写分离对应用透明。主从模式通常为经典的业务韧性保障机制。

相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
18天前
|
Cloud Native Java API
聊聊从单体到微服务架构服务演化过程
本文介绍了从单体应用到微服务再到云原生架构的演进过程。单体应用虽易于搭建和部署,但难以局部更新;面向服务架构(SOA)通过模块化和服务总线提升了组件复用性和分布式部署能力;微服务则进一步实现了服务的独立开发与部署,提高了灵活性;云原生架构则利用容器化、微服务和自动化工具,实现了应用在动态环境中的弹性扩展与高效管理。这一演进体现了软件架构向着更灵活、更高效的方向发展。
|
27天前
|
存储 Linux KVM
Proxmox VE (PVE) 主要架构和重要服务介绍
Proxmox VE (PVE) 是一款开源的虚拟化平台,它基于 KVM (Kernel-based Virtual Machine) 和 LXC (Linux Containers) 技术,支持虚拟机和容器的运行。PVE 还提供高可用集群管理、软件定义存储、备份和恢复以及网络管理等企业级功能。
569 7
|
2天前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性?
微服务架构中,如何确保服务之间的数据一致性?
|
13天前
|
存储 分布式计算 druid
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
大数据-155 Apache Druid 架构与原理详解 数据存储 索引服务 压缩机制
32 3
|
1月前
|
消息中间件 Kafka 数据库
微服务架构中,如何确保服务之间的数据一致性
微服务架构中,如何确保服务之间的数据一致性
|
1月前
|
存储 搜索推荐 数据库
MarkLogic在微服务架构中的应用:提供服务间通信和数据共享的机制
随着微服务架构的发展,服务间通信和数据共享成为关键挑战。本文介绍MarkLogic数据库在微服务架构中的应用,阐述其多模型支持、索引搜索、事务处理及高可用性等优势,以及如何利用MarkLogic实现数据共享、服务间通信、事件驱动架构和数据分析,提升系统的可伸缩性和可靠性。
36 5
|
1月前
|
XML Java 数据库
在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂
【9月更文挑战第8天】在微服务架构中,请求常跨越多个服务,涉及多组件交互,问题定位因此变得复杂。日志作为系统行为的第一手资料,传统记录方式因缺乏全局视角而难以满足跨服务追踪需求。本文通过一个电商系统的案例,介绍如何在Spring Boot应用中手动实现日志链路追踪,提升调试效率。我们生成并传递唯一追踪ID,确保日志记录包含该ID,即使日志分散也能串联。示例代码展示了使用过滤器设置追踪ID,并在日志记录及配置中自动包含该ID。这种方法不仅简化了问题定位,还具有良好的扩展性,适用于各种基于Spring Boot的微服务架构。
44 3
|
1月前
|
编解码 Linux 开发工具
Linux平台x86_64|aarch64架构RTMP推送|轻量级RTSP服务模块集成说明
支持x64_64架构、aarch64架构(需要glibc-2.21及以上版本的Linux系统, 需要libX11.so.6, 需要GLib–2.0, 需安装 libstdc++.so.6.0.21、GLIBCXX_3.4.21、 CXXABI_1.3.9)。
|
2月前
|
负载均衡 应用服务中间件 网络安全
Django后端架构开发:Nginx服务优化实践
Django后端架构开发:Nginx服务优化实践
49 2
|
2月前
|
消息中间件 Java API
解密微服务架构:如何在Java中实现高效的服务通信
微服务架构作为一种现代软件开发模式,通过将应用拆分成多个独立的服务,提升了系统的灵活性和扩展性。然而,实现微服务之间的高效通信仍然是许多开发者面临的挑战。本文将探讨在Java环境中实现微服务架构时,如何使用不同的通信机制来优化服务之间的交互,包括同步和异步通信的方法,以及相关的最佳实践。