从传统银行到互联网,异地多活难不难?(3)

本文涉及的产品
RDS Agent(兼容OpenClaw),2核4GB
RDS AI 助手,专业版
RDS MySQL DuckDB 分析主实例,集群系列 4核8GB
简介: 从传统银行到互联网,异地多活难不难?(3)

因为我们的数据是异地多份存储的,考虑到数据库的性能,我们在写入数据的时候是不能去给所有机房的这条数据上锁,也就是我们的ACID是在本地机房级别的。为了避免不同机房出现数据最终不一致的问题,我们需要限制数据的写入点,一条数据只能在一个机房写入,避免两个机房同时写一条数据导致的数据最终不一致问题。为了实现这个目的,我们需要一层数据路由。所谓数据路由,就是在程序链接数据库之前,在DAL层,或者驱动层,或者框架,ORM层,等等上面的一层路由。确保落地的数据是能落到正确的机房,以保证数据的最终一致性。



image.png


数据同步


   根据我们的需求,做了基础调研以后,发现有以下几种方法可以实现我们需要的数据同步功能。


1、基于mysql的原生复制,做主主架构,两边都开启写入。


2、基于PXC类似的数据库集群方案


3、基于otter的数据同步方案


4、自己开发一套数据库同步系统


在有现有软件满足我们需求的前提下,我们是不优先考虑自己开发的。毕竟重复自造轮子的开销不小,而且需要比较长的一个时间来验证轮子的稳定性。


所以优先在前面三个方案里面做了深度调研。


OTTER:


优点:


1、两个机房的mysql独立,本地机房做维护切换架构清晰,简单.


2、如果数据同步异常的时候,推移位点可以保证数据的一致性.


3、与mysql版本无关,可实现低版本往高版本复制,方便升级.


4、在公司的汇总库中使用,已经有比较深的使用经验


缺点:


1、引进了新的技术,存在风险,需要评估风险是否可控.


MySQL原生复制:


优点:


1、原生的复制协议,大家都熟悉,可控度比较好.



缺点(未使用GTID):


1、会增加架构的复杂度,级联复制.


2、如果数据同步异常的时候,寻找同步位点比较麻烦.


3、如果其中一个master的机器坏掉,会导致同步的位点丢失.


4、三机房以后架构不支持


PXC:


优点:


1、通过Galera实现的无共享的分布式数据库。


2、使用同步复制,可以完全保证数据的一致性


3、节点自动配置


缺点:


1、PXC我们团队还没有使用案例,在核心的双活架构中使用,存在很大的不可控风险.


2、Galera对网络延时比较敏感,在跨机房应用中,这是一个很大的性能瓶颈。


综合上面的分析,我们最终选择了使用otter来作为双活机房的数据同步组件,当然基于我们的业务场景和功能,也对OTTER做了一些小的调整。


分区情况下的数据合并


在单元化与数据同步方案都确定的前提下,我们来讨论一下数据合并。比如我们有A<—>B两个机房,做了双活架构,中间使用OTTER做数据同步,每张表同时只有一个机房允许写入。当一个机房的网络断掉以后,那么就出现了分区问题。这个时候,我们有两个选择。


1、将属于这个机房的用户切换到其他机房。


2、什么也不做,不能给这部分用户提供服务。


在可能的情况下,大家肯定会选择1,将用户切换到其他机房,这个本来也是我们架构的目的。但是如果切了会出现什么问题呢?最大的问题就是,挂掉机房写入的数据还没有来得及同步到其他机房。网络就断掉了,如果把用户切换到其他机房,那么他看见的数据就存在一致性问题,这个问题是我们架构选择了最终一致性和异步同步数据导致的。


如果站在业务角度来看,就是User A在订单支付以后,他所在的机房刚好处理完,还没有把处理结果,也就是订单的支付状态及信息同步到其他机房就断网了。这个时候用户切换到其他机房,那么就会看见订单未付款,如果他联系客服还好。如果他又再支付了一次,那么问题就严重了。等故障的机房好了以后,那么数据一同步,不同机房这个用户的支付信息就不一样。出现了数据的不一致性,对于用户来说,同一个商品,他却付款了两次。这种情况就只有走人工的异常处理流程了。


对于一个大型电商网站,每秒的交易量成千上万。显然全部走人工的异常处理流程是下下之策。


这个时候大家又说,那就什么都不做吧。但是这样是不是和我们的初衷有点违背呢?其实还有解决方案,怎么解决?


现在又到了01之间的选择,0是不给那部分机房提供服务,1是要给那部分机房提供服务。 可是大家想过没有,我可以给那个机房提供有损服务,也就是01之间。如何做?


对于已有的数据,并且是已经故障的机房产生的数据是不能更新,但是对于新写入的数据是可以更新的。这个地方可以通过全局的ID生成器来判断数据的来源,根据业务时间作为时间线的参考,从而保证只对一部分数据产生影响。


如果在没有这个机制的前提下,我建议还是什么也不做把,至少我们有N-1/N的用户是可以正常服务的,N为机房数量。 这已经达到了01之间,而不是0


##异地多活的case方案,虽说实现各异,但万变不离其宗。


银行之前出现过db2复制导致数据库崩溃事件,xxx银行数十小时不可用事件其根本还是保障了数据一致性,未敢提供业务连续性部分,甚至是部分可用。因为出现风险的应对审批和管控流程很复杂;而大部分情况下在同城节点等待一定时间后实行了业务恢复。而对于互联网架构,可以采取部分有损的方案,比如90%的用户可用,是不是也是可以接受的呢?某些数据不能修改,只能做大部分业务是不是也可以接受呢?互联网提供了更多开放的可能性。

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
存储 缓存 负载均衡
Tair分布式缓存
Redis很好用,相比memcached多了很多数据结构,支持持久化。但是在很长一段时间里,原生是不支持分布式的。后来就出现了很多redis集群类产品,Tair是其中胜出的优秀作品之一。 所以Tair的特性都是一些集群的特性,比如:容错、解决单点故障、跨机房管理、多集群管理、支持副本等。总而言之,是redis的高可用版本。
2268 1
Tair分布式缓存
|
存储 NoSQL Linux
VLDB顶会论文Async-fork解读与Redis在得物的实践(1)
VLDB顶会论文Async-fork解读与Redis在得物的实践
412 0
|
NoSQL 测试技术 Linux
VLDB顶会论文Async-fork解读与Redis在得物的实践(2)
VLDB顶会论文Async-fork解读与Redis在得物的实践
410 0
VLDB顶会论文Async-fork解读与Redis在得物的实践(2)
|
8月前
|
NoSQL 数据可视化 Redis
redis上db复制的方法
首先排除使用命令行实现,因为没有现成的命令可以完成db复制,跨redis实例的复制迁移就更加没有这种命令了。假如非要使用命令来实现,要写大量的脚本,但是这样可靠性和速度无法保证,因为你无法保证你写的程序是否会有bug。db的复制,可以使用yunedit-redis来实现,yunedit-redis有可视化界面,复制起来非常简单。
|
10月前
|
NoSQL Redis
功能最全面最快的redis备份工具
现在使用云的人越来越多,redis数据跨云备份,跨云迁移的需求也越来越多,备份这么重要的东西,肯定要选最好的客户端。现在做数据备份和恢复的产品,也就yunedit-redis这款redis客户端能考虑所有这些场景,而且导出导入速度也是做到客户端导出比在服务端导出还快的效果。实测导出20万数据只用时十多秒。在备份这个领域,yunedit-redis应该是最好的。
|
人工智能 缓存 NoSQL
Redis 与 AI:从缓存到智能搜索的融合之路
Redis 已从传统缓存系统发展为强大的 AI 支持平台,其向量数据库功能和 RedisAI 模块为核心,支持高维向量存储、相似性搜索及模型服务。文章探讨了 Redis 在实时数据缓存、语义搜索与会话持久化中的应用场景,并通过代码案例展示了与 Spring Boot 的集成方式。总结来看,Redis 结合 AI 技术,为现代应用提供高效、灵活的解决方案。
|
存储 网络协议 Linux
2.10 高性能异步IO机制:io_uring
2.10 高性能异步IO机制:io_uring
1706 0
|
存储 缓存 NoSQL
Redis中大Key与热Key的解决方案
在工作中,Redis作为一款高性能缓存数据库被广泛应用,但常遇到“大key”和“热key”问题。“大key”指单个键包含大量数据,导致内存消耗高、性能下降及持久化效率降低;“热key”则是频繁访问的键,会引起CPU占用率高、请求阻塞等问题。本文详细分析了这些问题的定义、影响、原因,并提供了相应的解决方案,如合理设置缓存时间和数据结构、拆分大key、采用热点数据分片等方法。
1394 5
Redis中大Key与热Key的解决方案
|
NoSQL Cloud Native Redis
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
阿里云瑶池数据库团队后续将持续参与Valkey社区,如过往在Redis社区一样耕耘,为开源社区作出持续贡献。
Redis核心开发者的新征程:阿里云与Valkey社区的技术融合与创新
|
存储 JSON NoSQL
深入解析RedisJSON:在Redis中直接处理JSON数据
深入解析RedisJSON:在Redis中直接处理JSON数据

热门文章

最新文章