大学英文网站建设举措,百度搜索引擎的网址,在线制图生成器,网站建设小程序开发seo推广说在前面
在40岁老架构师尼恩的数千读者群中#xff0c;一直在指导大家简历和职业升级#xff0c;前几天#xff0c;指导了一个华为老伙伴的简历#xff0c;小伙伴的优势在异地多活#xff0c;但是在简历指导的过程中#xff0c;尼恩发现#xff1a; 异地多活的概念、异…说在前面
在40岁老架构师尼恩的数千读者群中一直在指导大家简历和职业升级前几天指导了一个华为老伙伴的简历小伙伴的优势在异地多活但是在简历指导的过程中尼恩发现 异地多活的概念、异地多活的架构、非常重要但是小伙伴却对整个异地多活的体系不是太清晰。
异地多活的概念有很杂乱像什么同城双活、两地三中心、三地五中心等等
这里 尼恩 站在 得物 异地多活架构得物架构师 YINJIHUAN的基础上 给大家对异地多活做一个起底式的 、系统化、穿透式的介绍。
并且把此文的异地多活架构和尼恩其他的架构文章一起组成一个架构知识系统帮助大家实现你的 架构自由
《吃透8图1模板人人可以做架构》
《10Wqps评论中台如何架构B站是这么做的》
《阿里二面千万级、亿级数据如何性能优化 教科书级 答案来了》
《峰值21WQps、亿级DAU小游戏《羊了个羊》是怎么架构的》
《100亿级订单怎么调度来一个大厂的极品方案》
《2个大厂 100亿级 超大流量 红包 架构方案》
以上的架构系列文章非常重要建议大家多多看看。
以上文章的PDF版本都可以在《技术自由圈》公众号找尼恩来获取。
言归正传。
本文目录 文章目录说在前面本文目录1. 什么是异地多活架构设计的3高原则常见的多活方案常见方案1同城双活常见方案2两地三中心常见方案2三地五中心异地多活3大挑战1、数据同步延迟挑战2、单元化解耦挑战3、流量的路由挑战2. 得物APP的异地多活改造2.1得物APP异地多活基础改造改造之前的单机房架构得物APP机房改造得物APP单元化改造得物APP流量调度2.2 RPC框架的异地多活改造2.2.1 定义RPC路由类型2.2.2 业务RPC改造2.2.4 遇到的问题2.3 数据库的异地多活2.3.1 DB-Proxy代理中间件2.3.2 分布式ID2.3.3 使用OTTER进行数据同步2.3.4 业务改造2.3.5 遇到的问题2.4 Redis 的异地多活2.4.1 业务改造2.4.2 遇到的问题2.5 RocketMQ异地多活2.5.1 定义消费类型2.5.2 业务改造2.5.3 遇到的问题3. 得物异地多活的半单元化3.1 整体方向3.2 服务类型3.2.1 中心服务3.2.2 单元服务3.2.3 中心单元服务4. 异地多活切流方案5. 得物异地多活的总结技术自由的实现路径实现你的 架构自由实现你的 响应式 自由实现你的 spring cloud 自由实现你的 linux 自由实现你的 网络 自由实现你的 分布式锁 自由实现你的 王者组件 自由实现你的 面试题 自由1. 什么是异地多活
异地多活的概念很多像什么同城双活、两地三中心、三地五中心等等概念。
要想理解异地多活需要从架构设计的3高原则说起。
架构设计的3高原则
现如今开发一个软件系统对其要求越来越高如果你了解一些「架构设计」的要求就知道一个好的软件架构应该遵循以下 3 个原则
高性能高并发高可用
高性能意味着系统拥有更大流量的处理能力更低的响应延迟。
例如 1 秒可处理 10W 并发请求接口响应时间 5 ms 等等。
高并发表示系统在迭代新功能时能以最小的代价去扩展系统遇到流量压力时可以在不改动代码的前提下去扩容系统。
高可用通常用 2 个指标来衡量
平均故障间隔 MTBFMean Time Between Failure表示两次故障的间隔时间也就是系统「正常运行」的平均时间这个时间越长说明系统稳定性越高故障恢复时间 MTTRMean Time To Repair表示系统发生故障后「恢复的时间」这个值越小故障对用户的影响越小
可用性与这两者的关系 可用性Availability MTBF / (MTBF MTTR) * 100% 这个公式得出的结果是一个「比例」通常我们会用「N 个 9」来描述一个系统的可用性。 从这张图你可以看到要想达到 4 个 9 以上的可用性一年的不可以时间为 52分钟平均每天故障时间必须控制在 10 秒以内。
系统发生故障其实是不可避免的尤其是规模越大的系统发生问题的概率也越大。
这些故障一般体现在 3 个方面
硬件故障CPU、内存、磁盘、网卡、交换机、路由器软件问题代码 Bug、版本迭代不可抗力地震、水灾、火灾、战争
这些风险随时都有可能发生。所以在面对故障时我们的系统能否以「最快」的速度恢复就成为了可用性的关键。
常见的多活方案
4 个 9 高可用的核心方案就是异地多活
异地多活指分布在异地的多个站点同时对外提供服务的业务场景。
异地多活是高可用架构设计的一种与传统的灾备设计的最主要区别在于“多活”即所有站点都是同时在对外提供服务的。
常见的多活方案有同城双活、两地三中心、三地五中心等多种技术方案
常见方案1同城双活
同城双活是在同城或相近区域内建立两个机房。同城双机房距离比较近通信线路质量较好比较容易实现数据的同步复制 保证高度的数据完整性和数据零丢失。
同城两个机房各承担一部分流量一般入口流量完全随机内部RPC调用尽量通过就近路由闭环在同机房相当于两个机房镜像部署了两个独立集群数据仍然是单点写到主机房数据库然后实时同步到另外一个机房。
下图展示了同城双活简单部署架构当然一般真实部署和考虑问题要远远比下图复杂。 服务调用基本在同机房内完成闭环数据仍然是单点写到主机房数据储存然后实时同步复制到同城备份机房。
当机房A出现问题时候运维人员只需要通过GSLB或者其他方案手动更改路由方式将流量路由到B机房。
同城双活可有效用于防范火灾、建筑物破坏、供电故障、计算机系统及人为破坏引起的机房灾难。
同城双活中的核心组件GSLB的原理可以参见 尼恩的高并三部曲 之三《Java高并发核心编程 卷3 加强版》PDF。
常见方案2两地三中心
所谓两地三中心是指 同城双中心 异地灾备中心。
异地灾备中心是指在异地的城市建立一个备份的灾备中心用于双中心的数据备份数据和服务平时都是冷的
当双中心所在城市或者地区出现异常而都无法对外提供服务的时候异地灾备中心可以用备份数据进行业务的恢复。 两地三中心方案特点
优势 服务同城双活数据同城灾备同城不丢失数据情况下跨机房级别容灾。架构方案较为简单核心是解决底层数据双活由于双机房距离近通信质量好底层储存例如mysql可以采用同步复制有效保证双机房数据一致性。灾备中心能防范同城双中心同时出现故障时候利用备份数据进行业务的恢复。 劣势 数据库写数据存在跨机房调用在复杂业务以及链路下频繁跨机房调用增加响应时间影响系统性能和用户体验。服务规模足够大(例如单体应用超过万台机器)所有机器链接一个主数据库实例会引起连接不足问题。出问题不敢轻易将流量切往异地数据备份中心异地的备份数据中心是冷的平时没有流量进入因此出问题需要较长时间对异地灾备机房进行验证。 同城双活和两地三中心建设方案建设复杂度都不高两地三中心相比同城双活有效解决了异地数据灾备问题但是依然不能解决同城双活存在的多处缺点想要解决这两种架构存在的弊端就要引入更复杂的解决方案去解决这些问题。
常见方案2三地五中心
三地五中心和两地三中心 的架构差不太多这里不做展开
有兴趣的小伙伴可以来尼恩的疯狂创客圈 高并发社群交流。
异地多活3大挑战 1、数据同步延迟挑战
1应用要走向异地首先要面对的便是物理距离带来的延时。
如果某个应用请求需要在异地多个单元对同一行记录进行修改为满足异地单元间数据库数据的一致性和完整性需要付出高昂的时间成本。
2解决异地高延时即要做到单元内数据读写封闭不能出现不同单元对同一行数据进行修改所以我们需要找到一个维度去划分单元。
3某个单元内访问其他单元数据需要能正确路由到对应的单元例如A用户给B用户转账A用户和B用户数据不在一个单元内对B用户的操作能路由到相应的单元。
4面临的数据同步挑战对于单元封闭的数据需全部同步到对应单元对于读写分离类型的我们要把中心的数据同步到单元。
2、单元化解耦挑战
所谓单元(下面我们用RZone代替)是指一个能完成所有业务操作的自包含集合在这个集合中包含了所有业务所需的所有服务以及分配给这个单元的数据。
单元化架构就是把单元作为系统部署的基本单位在全站所有机房中部署数个单元每个机房里的单元数目不定任意一个单元都部署了系统所需的所有的应用。
单元化架构下服务仍然是分层的不同的是每一层中的任意一个节点都属于且仅属于某一个单元上层调用下层时仅会选择本单元内的节点。
选择什么维度来进行流量切分要从业务本身入手去分析。
例如电商业务和金融的业务最重要的流程即下单、支付、交易流程通过对用户id进行数据切分拆分是最好的选择买家的相关操作都会在买家所在的本单元内完成。
对于商家相关操作则无法进行单元化需要按照下面介绍的非单元化模式去部署。
当然用户操作业务并非完全能避免跨单元甚至是跨机房调用例如两个买家A和B转账业务A和B所属数据单元不一致的时候对B进行操作就需要跨单元去完成后面我们会介绍跨单元调用服务路由问题。
3、流量的路由挑战
流量调度系统部署过去后流量怎么跟着怎么过去。流量自闭环。由于距离的原因跨地域的物理延时是没法避免的流量过去之后怎么保证所有的操作都在本地完成如果做不到那怎么将这种延时影响降到最低。容灾切流。当某个机房出现故障时如何快速把流量无损地切至其他机房。这里并不是说简单把流量切过去就完事由于数据在多区域同步流量切过去之后能否保证数据的一致性
2. 得物APP的异地多活改造
2.1得物APP异地多活基础改造
改造之前的单机房架构
了解改造点之前我们先来看下目前单机房的现状是什么样子才能更好的帮助大家去理解为什么要做这些改造。 如上图所示客户端的请求进来会先到SLB(负载均衡)然后到我们内部的网关通过网关再分发到具体的业务服务。
业务服务会依赖Redis, Mysql, MQ, Nacos等中间件。
改造之后的目标
既然做异地多活那么必然是在不同地区有不同的机房比如中心机房单元机房。
所以我们要实现的效果如下图所示 得物APP机房改造
得物多活改造一期目前有两个机房分别是机房A和机房B。
A机房我们定义为中心机房也就是多活上线之前正在使用的机房。
另一个B机房在描述的时候可能会说成单元机房那指的就是B机房。
得物APP单元化改造
得物多活进行了业务的单元改造他们的业务比较单一就是电商业务所以一个机房就是一个单元或者说一个单元就是一个机房在这个单元内能够完成业务的闭环。
比如说用户进入APP浏览商品选择商品确认订单下单支付查看订单信息这整个流程都在一个单元中能够完成并且数据也是存储在这个单元里面。
这块对他们的难度不大。
得物APP流量调度
用户的请求从客户端发出这个用户的请求该到哪个机房这是得物APP要改造的第一个点。
没做多活之前域名会解析到一个机房内做了多活后域名会随机解析到不同的机房中。
如果按照这种随机的方式是肯定有问题的对于服务的调用是无所谓的因为没有状态。
但是服务内部依赖的存储是有状态的呀。
得物APP是电商业务用户在中心机房下了一个单然后跳转到订单详情这个时候请求到了单元机房底层数据同步有延迟一访问报个错订单不存在。 用户当场就懵了钱都付了订单没了。
所以针对同一个用户尽可能在一个机房内完成业务闭环。
为了解决流量调度的问题得物APP基于OpenResty二次开发出了DLB流量网关DLB会对接多活控制中心
DLB流量网关能够知道当前访问的用户是属于哪个机房如果用户不属于当前机房DLB会直接将请求路由到该用户所属机房内的DLB。 如果每次都随机到固定的机房再通过DLB去校正必然会存在跨机房请求耗时加长。
所以在这块得物APP也是结合客户端做了一些优化在DLB校正请求后得物APP会将用户对应的机房IP直接通过Header响应给客户端。
这样下次请求的时候客户端就可以直接通过这个IP访问。
如果用户当前访问的机房挂了客户端需要降级成之前的域名访问方式通过DNS解析到存活的机房。
2.2 RPC框架的异地多活改造
当用户的请求达到了单元机房内理论上后续所有的操作都是在单元机房完成。
这就要求RPC请求落在就近的机房那么怎么知道单元机房的服务信息
所以得物APP的注册中心Nacos要做双向同步这样才能拿到所有机房的服务信息。
不同的机房的Nacos服务的注册信息采用双向复制进行同步。 前面也提到了用户的请求尽量在一个机房内完成闭环当然只是尽量没有说全部。
这是因为有的业务场景不适合划分单元比如库存扣减。
所以在得物APP的划分里面有一个机房是中心机房那些不做多活的业务只会部署在中心机房里面那么库存扣减的时候就需要跨机房调用。
对于单元服务会存在多个机房的服务信息如果不进行控制则会出现调用其他机房的情况所以RPC框架要进行改造。
2.2.1 定义RPC路由类型
默认路由
请求到中心机房会优先调用中心机房内的服务如果中心机房无此服务则调用单元机房的服务如果单元机房没有此服务则直接报错。
单元路由
请求到单元机房那么说明此用户的流量规则是在单元机房接下来所有的RPC调用都只会调用单元机房内的服务没有服务则报错。
中心路由
请求到单元机房那么直接调用中心机房的服务中心机房没有服务则报错。请求到中心机房那么就本机房调用。
2.2.2 业务RPC改造
业务方需要对自己的接口Java interface进行标记是什么类型是单元路由还是中心路由通过HARoute加在接口上面。
标记完成后在Dubbo接口进行注册的时候会把路由类型放入到这个接口的元数据里面。
在Nacos后台可以查看Dubbo接口的路由类型这些数据也是RPC路由异地多活改造的核心参数。
后面通过RPC调用接口内部所有的方法都会按照标记类型进行路由。
比如单元路由的RPCRPC在路由的时候会根据这个值判断用户所在的机房。
路由逻辑如下 RPC 接口复制一份命名为UnitApi带上路由参数。在新接口的实现里面调用老接口新旧接口共存。
2.2.4 遇到的问题
1 其他场景切单元接口
除了RPC直接调用的接口还有一大部分是通过Dubbo泛化过来的这块在上线后也需要将流量切到UnitApi等老接口没有请求量之后才能下线。
2 接口分类整改
接口进行分类之前没有多活的约束一个Java interface中的方法可能各种各样所以需要进行rpc
接口的分类整改
3 业务层面调整
业务层面调整比如之前查询订单只需要一个订单号但是现在需要路由参数所以接入这个接口的上游都需要调整。
2.3 数据库的异地多活
请求顺利的到达了服务层接下来要跟数据库打交道了。
数据库得物APP定义了不同的类型定义如下
1 单元化
此库为单元库会同时在两个机房部署每个机房都有完整的数据数据采用双向同步。
2 中心化
此库为中心库只会在中心机房部署。
3 中心单元化
此库为中心单元库会同时在两个机房部署中心可以读写其他机房只能读。
中心写数据后单向复制到另一个机房。
2.3.1 DB-Proxy代理中间件
异地多活之前得物内部的各大服务 都是客户端形式的Sharding中间件客户端模式访问分库分表
要命的是每个业务方的版本还不一致。 在多活切流的过程中需要对数据库禁写来保证业务数据的准确性如果没有统一的中间件这将是一件很麻烦的事情。
所以得物APP调整为 proxy模式去掉 client模式的分库分表访问。
得物APP 通过对ShardingSphere进行深度定制二次开发数据库代理proxy中间件 彩虹桥。
有了proxy组件之后各业务方替换之前的Sharding Client方式。 2.3.2 分布式ID
单元化的库数据层面会做双向同步复制操作。如果直接用表的自增ID则会出现下面的冲突问题 得物APP采用了一种一劳永逸的方式接入全局唯一的分布式ID来避免主键的冲突。
所以分布式ID绝对是 分库分表的核心 技术要点如果做到 高并发、高性能、防止倾斜绝对是一大核心的技术难题
这里强烈建议大家去看看尼恩 分析了百度ID、推特snowflake IDshardingjdbc ID三大ID源码之后定义的异步高并发、防止倾斜、防止时间回拨的高并发ID一定带给大家N多的启发。
2.3.3 使用OTTER进行数据同步
OTTER是阿里巴巴公司为了解决杭州/美国机房数据间同步研发的一个开源软件。
OTTER基于数据库增量日志解析准实时同步到本机房或异地机房的mysql/oracle数据库是一个分布式数据库同步系统。
工作原理图 原理描述
基于Canal开源产品获取数据库增量日志数据。典型管理系统架构manager(web管理)node(工作节点) a. manager运行时推送同步配置到node节点 b. node节点将同步状态反馈到manager上基于zookeeper解决分布式状态调度的允许多node节点之间协同工作
2.3.4 业务改造
在Dao层对表进行操作的时候会通过ThreadLocal设置当前方法的ShardingKey然后通过Mybatis拦截器机制将ShardingKey通过Hint的方式放入SQL中带给彩虹桥。
彩虹桥会判断当前的ShardingKey是否属于当前机房如果不是直接禁写报错。
这里跟大家简单的说明下为什么切流过程中要禁写这个其实跟JVM的垃圾回收有点相似。如果不对操作禁写那么就会不断的产生数据而得物APP切流一定要保证当前机房的数据全部同步过去了之后才开始生效流量规则否则用户切到另一个机房数据没同步完就会产生业务问题。除了彩虹桥会禁写RPC框架内部也会根据流量规则进行阻断。
2.3.5 遇到的问题
1 单元接口中不能访问中心数据库
如果接口标记成了单元接口那么只能操作单元库。
在以前没有做多活改造的时候基本上没有什么中心和单元的概念所有的表也都是放在一起的。
多活改造后得物APP会根据业务场景对数据库进行划分。
划分后中心库只会被中心机房的程序使用在单元机房是不允许连接中心库。
所以单元接口里面如果涉及到对中心库的操作必定会报错。
这块需要调整成走中心的RPC接口。
2 中心接口不能访问单元数据库
跟上面同样的问题如果接口是中心的也不能在接口里面操作单元库。中心接口的请求都会强制走到中心机房如果里面有涉及到另一个机房的操作也必须走RPC接口进行正确的路由
因为你中心机房不能操作另一个机房的数据库。
3 批量查询调整
比如批量根据订单号进行查询但是这些订单号不是同一个买家。
如果随便用一个订单的买家作为路由参数那么其他一些订单其实是属于另一个单元的这样就有可能存在查询到旧数据的问题。
这样批量查询的场景只能针对同一个买家可用如果是不同的买家需要分批调用。
2.4 Redis 的异地多活
Redis在业务中用的比较多在多活的改造中也有很多地方需要调整。
对于Redis首先得物APP明确几个定义
不做双向同步
Redis不会和数据库一样做双向同步也就是中心机房一个Redis集群单元机房一个Redis集群。
每个机房的集群中只存在一部分用户的缓存数据不是全量的。
Redis类型
Redis分为中心和单元中心只会在中心机房部署单元会在中心和单元两个机房部署。
2.4.1 业务改造
1 Redis多数据源支持
多活改造前每个应用都有一个单独的Redis集群
多活改造后由于应用没有进行单元化和中心的拆分所以一个应用中会存在需要连接两个Redis的情况。
一个中心Redis一个单元Redis。
基础架构组提供的专用Redis Client包需要支持多数据源的创建
基础包中并且定义通用的配置格式业务方只需要在自己 的配置里面指定集群和连接模式即可完成接入。
spring.redis.sources.carts.modeunit
spring.redis.sources.carts.cluster-namecartsCuster 具体的Redis实例信息会在配置中心统一维护不需要业务方关心
在做机房扩容的时候业务方是不需要调整的
2 数据一致性
缓存和缓存之间不进行同步没有数据一致性问题
缓存和DB之间使用binlog 进行同步
这里得物APP的方案是采用订阅数据库的binlog来进行缓存的失效操作可以订阅本机房的binlog也可以订阅其他机房的binlog来实现所有机房的缓存失效。 使用 binlog 进行同步的实操非常重要 具体请参见尼恩的 100wQps 三级缓存组件实操建议大家一定认真看看。
2.4.2 遇到的问题
1 序列化协议兼容
在接入新的Redis Client包后测试环境出现了老数据的兼容问题。
有个别应用自己定制了序列化方式导致Redis按新的方式装配后没有用到自定义的协议这块也是进行了改造支持多数据源的协议自定义。
2 分布式锁的使用
目前项目中的分布式锁是基于Redis实现当Redis有多个数据源之后分布式锁也需要进行适配。
在使用的地方要区分场景默认都是用的中心Redis来加锁。
但是单元接口里面的操作都是买家场景所以这部分需要调整为单元Redis锁对象进行加锁这样能够提高性能。其他的一些场景有涉及到全局资源的锁定那就用中心Redis锁对象进行加锁。
2.5 RocketMQ异地多活
所以MQ跟数据库一样也要做同步将消息同步到另一个机房的MQ中至于另一个机房的消费者要不要消费这就要让业务场景去决定。 2.5.1 定义消费类型
1 中心订阅
中心订阅指的是消息无论是在中心机房发出的还是单元机房发出的都只会在中心机房进行消费。
如果是单元机房发出的会将单元的消息复制一份到中心进行消费。
2 普通订阅
普通订阅就是默认的行为指的是就近消费。在中心机房发送的消息就由中心机房的消费者进行消费在单元机房发送的消息就由单元机房的消费进行消费。
3 单元订阅
单元订阅指的是消息会根据ShardingKey进行消息的过滤无论你在哪个机房发送消息消息都会复制到另一个机房此时两个机房都有该消息。通过ShardingKey判断当前消息应该被哪个机房消费符合的才会进行消费不符合的框架层面会自动ACK。
4 全单元订阅
全单元订阅指的是消息无论在哪个机房发出都会在所有的机房进行消费。
2.5.2 业务改造
1 消息发送方调整
消息发送方需要结合业务场景进行区分。如果是买家场景的业务消息在发消息的时候需要将多活路由Key放入消息中具体怎么消费由消费方决定。
如果消费方是单元消费的话那么必须依赖发送方的多活路由Key否则无法知道当前消息应该在哪个机房消费。
2 消息消费方指定消费模式
前面提到了中心订阅单元订阅普通订阅全单元订阅多种模式到底要怎么选就是要结合业务场景来定的定好后在配置MQ信息的时候指定即可。
比如中心订阅就适合你整个服务都是中心的其他机房都没部署这个时候肯定适合中心订阅。
比如你要对缓存进行清除就比较适合全单元订阅一旦数据有变更所有机房的缓存都清除掉。
2.5.3 遇到的问题
1 消息幂等消费
就算不做多活消息消费场景肯定是要做幂等处理的因为消息本身就有重试机制。
单独拎出来说是在切流的过程中属于切流这部分用户的消息会被复制到另一个机房重新进行消费
解释下为什么切流过程中会有消息消费失败以及需要复制到另一个机房去处理如下图所示 用户在当前机房进行业务操作后会产生消息。由于是单元订阅所以会在当前机房进行消费。
消费过程中发生了切流操作消费逻辑里面对数据库进行读写但是单元表的操作都携带了ShardingKey彩虹桥会判断ShardingKey是否符合当前的规则发现不符合直接禁写报错。
这批切流用户的消息就全部消费失败。
等到流量切到另一个机房后如果不进行消息的重新投递那么这部分消息就丢失了这就是为什么要复制到另一个机房进行消息的重新投递。
2 切流场景的消息顺序问题
上面讲到了在切流过程中会将消息复制到另一个机房进行重新消费然后是基于时间点去回放的如果你的业务消息本身就是普通的Topic
在消息回放的时候如果同一个场景的消息有多条这个顺序并不一定是按照之前的顺序来消费所以这里涉及到一个消费顺序的问题。
如果你之前的业务场景本身就是用的顺序消息那么是没问题的如果之前不是顺序消息这里就有可能有问题我举个例子说明下
解决方案有下面几种
Topic换成顺序消息以用户进行分区这样就能保证每个用户的消息严格按照发送顺序进行消费对消息做幂等已消费过就不再消费。但是这里跟普通的消息不同会有N条消息如果对msgId进行存储这样就可以判断是否消费过但是这样存储压力太大当然也可以只存储最近N条来减小存储压力。消息幂等的优化方式让消息发送方每发送一次都带一个versionversion必须是递增。消费方消费消息后把当前version存储起来消费之前判断消息的version是否大于存储的version满足条件才进行消费这样既避免了存储的压力也能满足业务的需求。
3. 得物异地多活的半单元化
得物异地多活的没有做全单元化而是半单元化 3.1 整体方向
首先要根据整个多活的一个整体目标和方向去梳理
比如得物APP的整体方向就是买家交易的核心链路必须实现单元化改造。那么这整个链路所有依赖的上下游都需要改造。
用户浏览商品进入确认订单下单支付查询订单信息。这个核心链路其实涉及到了很多的业务域比如商品出价订单支付商家等等。
在这些已经明确了的业务域下面可能还有一些其他的业务域在支撑着所以要把整体的链路都梳理出来一起改造。
当然也不是所有的都必须做单元化还是得看业务场景比如库存肯定是在交易核心链路上但是不需要改造必须走中心。
3.2 服务类型
3.2.1 中心服务
中心服务只会在中心机房部署并且数据库也一定是中心库。
可以对整个应用进行打标成中心这样外部访问这个服务的接口时都会被路由到中心机房。
3.2.2 单元服务
单元服务会在中心机房和单元机房同时部署并且数据库也一定是单元库。
单元服务是买家维度的业务比如确认订单下单。
买家维度的业务在接口定义上第一个参数必须是多活路由Key因为要进行路由。
用户的请求已经根据规则进行分流到不同的机房只会操作对应机房里面的数据库。 3.2.3 中心单元服务
中心单元服务也就是说这个服务里面既有中心的接口也有单元的接口并且数据库也是有两套。
所以这种服务其实也是要在两个机房同时部署的只不过是单元机房只会有单元接口过来的流量中心接口是没有流量的。
一些底层的支撑业务比如商品商家这些就属于中心单元服务。
支撑维度的业务是没有多活路由Key的商品是通用的并不属于某一个买家。
而支撑类型的业务底层的数据库是中心单元库也就是中心写单元读写请求是在中心进行比如商品的创建修改等。
操作后会同步到另一个机房的数据库里面。这样的好处就是可以减少得物APP在核心链路中的耗时如果商品不做单元化部署那么浏览商品或者下单的时候查询商品信息都必须走中心机房进行读取。
而现在则会就近路由进行接口的调用请求到中心机房就调中心机房的服务请求到单元机房就调单元机房的服务单元机房也是有数据库的不需要跨机房。 从长远考虑还是需要进行拆分把中心的业务和单元的业务拆开这样会比较清晰。
4. 异地多活切流方案
所谓切流就是在⼀个数据中心发生故障或灾难的情况下将流量切换到其他数据中心其他数据中心可以正常运行并对关键业务或全部业务进行接管实现用户的故障无感知。
前面得物APP也提到了再切流过程中会禁写会复制MQ的消息到另一个机房重新消费。
接下来给大家介绍下得物APP的切流方案能够帮助大家更深刻的理解整个多活的异常场景下处理流程。 下发禁写规则
当需要切流的时候操作人员会通过双活控制中心的后台进行操作。
切流之前需要先进行已有流量的清理需要下发禁写规则。
禁写规则会下发到中心和单元两个机房对应的配置中心里面通过配置中心去通知需要监听的程序。
彩虹桥执行禁写逻辑
彩虹桥会用到禁写规则当禁写规则在配置中心修改后彩虹桥能立马感知到然后会根据SQL中携带的shardingkey进行规则的判断看当前shardingkey是否属于这个机房如果不属于则进行拦截。
反馈禁写生效结果
当配置变更后会推送到彩虹桥配置中心会感知到配置推送的结果然后将生效的结果反馈给双活控制中心。
推送禁写生效时间给Otter
双活控制中心收到所有的反馈后会将全部生效的时间点通过MQ消息告诉Otter。
Otter进行数据同步
Otter收到消息会根据时间点进行数据同步。
Otter同步完成反馈同步结果
生效时间点之前的数据全部同步完成后会通过MQ消息反馈给双活控制中心。
下发最新流量规则
双活中心收到Otter的同步完成的反馈消息后会下发流量规则流量规则会下发到DLB,RPC,彩虹桥。
后续用户的请求就会直接被路由到正确的机房。
5. 得物异地多活的总结
多活是一个高可用的容灾手段但实现的成本和对技术团队的要求非常高。但是异地多活改造的范围实在是太大了。
本篇主要讲的是中间件层面和业务层面的一些改造点和过程同时还有其他的一些点都没有提到。
比如机房网络的建设发布系统支持多机房监控系统支持多机房的整个链路监控数据巡检的监控等等。
没有100%的可用性异地多活只是在极端场景下对业务的一些取舍罢了优先保证核心功能。
在实现多活的时候得物APP应该结合业务场景去进行设计所以也不是所有系统所有功能都要满足多活的条件。
得物异地多活的方案很多很多 大家有什么具体的问题也可以来尼恩的高并发社群50里边交流。
后续尼恩会给大家结合各大互联网的行业案例分析出更多更加劲爆的异地多活大家可以找尼恩来一次性获取这些方案的PDF。
当然如果大家遇到这类高可用的面试难题也可以找尼恩求助。
技术自由的实现路径
实现你的 架构自由
《吃透8图1模板人人可以做架构》
《10Wqps评论中台如何架构B站是这么做的》
《阿里二面千万级、亿级数据如何性能优化 教科书级 答案来了》
《峰值21WQps、亿级DAU小游戏《羊了个羊》是怎么架构的》
《100亿级订单怎么调度来一个大厂的极品方案》
《2个大厂 100亿级 超大流量 红包 架构方案》
… 更多架构文章正在添加中
实现你的 响应式 自由
《响应式圣经10W字实现Spring响应式编程自由》
这是老版本 《Flux、Mono、Reactor 实战史上最全》
实现你的 spring cloud 自由
《Spring cloud Alibaba 学习圣经》 PDF
《分库分表 Sharding-JDBC 底层原理、核心实战史上最全》
《一文搞定SpringBoot、SLF4j、Log4j、Logback、Netty之间混乱关系史上最全》
实现你的 linux 自由
《Linux命令大全2W多字一次实现Linux自由》
实现你的 网络 自由
《TCP协议详解 (史上最全)》
《网络三张表ARP表, MAC表, 路由表实现你的网络自由》
实现你的 分布式锁 自由
《Redis分布式锁图解 - 秒懂 - 史上最全》
《Zookeeper 分布式锁 - 图解 - 秒懂》
实现你的 王者组件 自由
《队列之王 Disruptor 原理、架构、源码 一文穿透》
《缓存之王Caffeine 源码、架构、原理史上最全10W字 超级长文》
《缓存之王Caffeine 的使用史上最全》
《Java Agent 探针、字节码增强 ByteBuddy史上最全》
实现你的 面试题 自由
4000页《尼恩Java面试宝典 》 40个专题 文章转载自: http://www.morning.tgfsr.cn.gov.cn.tgfsr.cn http://www.morning.zpqbh.cn.gov.cn.zpqbh.cn http://www.morning.rscrj.cn.gov.cn.rscrj.cn http://www.morning.nlhcb.cn.gov.cn.nlhcb.cn http://www.morning.rbnj.cn.gov.cn.rbnj.cn http://www.morning.zfhwm.cn.gov.cn.zfhwm.cn http://www.morning.brsgw.cn.gov.cn.brsgw.cn http://www.morning.ykkrg.cn.gov.cn.ykkrg.cn http://www.morning.fllx.cn.gov.cn.fllx.cn http://www.morning.tlyms.cn.gov.cn.tlyms.cn http://www.morning.cnbdn.cn.gov.cn.cnbdn.cn http://www.morning.fwkq.cn.gov.cn.fwkq.cn http://www.morning.ryywf.cn.gov.cn.ryywf.cn http://www.morning.fxzw.cn.gov.cn.fxzw.cn http://www.morning.jcxqc.cn.gov.cn.jcxqc.cn http://www.morning.tcsdlbt.cn.gov.cn.tcsdlbt.cn http://www.morning.dlurfdo.cn.gov.cn.dlurfdo.cn http://www.morning.jwgnn.cn.gov.cn.jwgnn.cn http://www.morning.nypsz.cn.gov.cn.nypsz.cn http://www.morning.pjftk.cn.gov.cn.pjftk.cn http://www.morning.xqffq.cn.gov.cn.xqffq.cn http://www.morning.sjwiki.com.gov.cn.sjwiki.com http://www.morning.txhls.cn.gov.cn.txhls.cn http://www.morning.bpds.cn.gov.cn.bpds.cn http://www.morning.yfphk.cn.gov.cn.yfphk.cn http://www.morning.brwp.cn.gov.cn.brwp.cn http://www.morning.redhoma.com.gov.cn.redhoma.com http://www.morning.xqkcs.cn.gov.cn.xqkcs.cn http://www.morning.nxcgp.cn.gov.cn.nxcgp.cn http://www.morning.gbhsz.cn.gov.cn.gbhsz.cn http://www.morning.ntwfr.cn.gov.cn.ntwfr.cn http://www.morning.tbjb.cn.gov.cn.tbjb.cn http://www.morning.hrzhg.cn.gov.cn.hrzhg.cn http://www.morning.xqgh.cn.gov.cn.xqgh.cn http://www.morning.rbylq.cn.gov.cn.rbylq.cn http://www.morning.uqrphxm.cn.gov.cn.uqrphxm.cn http://www.morning.zmbzl.cn.gov.cn.zmbzl.cn http://www.morning.zbnkt.cn.gov.cn.zbnkt.cn http://www.morning.gthc.cn.gov.cn.gthc.cn http://www.morning.lyldhg.cn.gov.cn.lyldhg.cn http://www.morning.jpkk.cn.gov.cn.jpkk.cn http://www.morning.fwjfh.cn.gov.cn.fwjfh.cn http://www.morning.wflsk.cn.gov.cn.wflsk.cn http://www.morning.dphmj.cn.gov.cn.dphmj.cn http://www.morning.yswxq.cn.gov.cn.yswxq.cn http://www.morning.mkrjf.cn.gov.cn.mkrjf.cn http://www.morning.gtmgl.cn.gov.cn.gtmgl.cn http://www.morning.rdzlh.cn.gov.cn.rdzlh.cn http://www.morning.rzcmn.cn.gov.cn.rzcmn.cn http://www.morning.xflzm.cn.gov.cn.xflzm.cn http://www.morning.nqmkr.cn.gov.cn.nqmkr.cn http://www.morning.rblqk.cn.gov.cn.rblqk.cn http://www.morning.tmbfz.cn.gov.cn.tmbfz.cn http://www.morning.mfnjk.cn.gov.cn.mfnjk.cn http://www.morning.rxfbf.cn.gov.cn.rxfbf.cn http://www.morning.lqlhw.cn.gov.cn.lqlhw.cn http://www.morning.gwsll.cn.gov.cn.gwsll.cn http://www.morning.nlwrg.cn.gov.cn.nlwrg.cn http://www.morning.mzqhb.cn.gov.cn.mzqhb.cn http://www.morning.gywfp.cn.gov.cn.gywfp.cn http://www.morning.jsljr.cn.gov.cn.jsljr.cn http://www.morning.gfznl.cn.gov.cn.gfznl.cn http://www.morning.rhkq.cn.gov.cn.rhkq.cn http://www.morning.gtqx.cn.gov.cn.gtqx.cn http://www.morning.srjbs.cn.gov.cn.srjbs.cn http://www.morning.qrlsy.cn.gov.cn.qrlsy.cn http://www.morning.skqfx.cn.gov.cn.skqfx.cn http://www.morning.lmmyl.cn.gov.cn.lmmyl.cn http://www.morning.sqqpb.cn.gov.cn.sqqpb.cn http://www.morning.zxybw.cn.gov.cn.zxybw.cn http://www.morning.xqnzn.cn.gov.cn.xqnzn.cn http://www.morning.psgbk.cn.gov.cn.psgbk.cn http://www.morning.hwycs.cn.gov.cn.hwycs.cn http://www.morning.qnzk.cn.gov.cn.qnzk.cn http://www.morning.cykqb.cn.gov.cn.cykqb.cn http://www.morning.glpxx.cn.gov.cn.glpxx.cn http://www.morning.dhqg.cn.gov.cn.dhqg.cn http://www.morning.ctswj.cn.gov.cn.ctswj.cn http://www.morning.mumgou.com.gov.cn.mumgou.com http://www.morning.jbztm.cn.gov.cn.jbztm.cn