关于分布式系统的数据一致性问题(一)
最近写了一个关于 铁道部购票系统的若干文章
铁道部新客票系统的设计(一)
铁道部新客票系统的设计(二)
铁道部新客票系统的设计(三)
正好遇到一个博友,咨询了一个问题,这个问题正好可以作为分布式系统的数据一致性的简单例子,当然,这个只是比较简单的情况
现在先抛出问题,假设有一个主数据中心在北京M,然后有成都A,上海B两个地方数据中心,现在的问题是,假设成都上海各自的数据中心有记录变更,需要先同步到主数据中心,主数据中心更新完成之后,在把最新的数据分发到上海,成都的地方数据中心A,地方数据中心更新数据,保持和主数据中心一致性(数据库结构完全一致)。数据更新的消息是通过一台中心的MQ进行转发。
先把问题简单化处理,假设A增加一条记录Message_A,发送到M,B增加一条记录 MESSAGE_B发送到M,都是通过MQ服务器进行转发,那么M系统接收到条消息,增加两条数据,那么M在把增加的消息群发给A,B,A和B找到自己缺失的数据,更新数据库。这样就完成了一个数据的同步。
从正常情况下来看,都没有问题,逻辑完全合理,但是请考虑以下三个问题
1 如何保证A->M的消息,M一定接收到了,同样,如何保证M->A的消息,M一定接收到了
2 如果数据需要一致性更新,比如A发送了三条消息给M,M要么全部保存,要么全部不保存,不能够只保存其中的几条记录。我们假设更新的数据是一条条发送的。
3 假设同时A发送了多条更新请求,如何保证顺序性要求?
这两个问题就是分布式环境下数据一致性的问题
对于第一个问题,比较好解决,我们先看看一个tcp/ip协议链接建立的过程
我们的思路可以从这个上面出发,在简化一下,就一个请求,一个应答。
简单的通信模型是这样的
A->M : 你收到我的一条消息没有,消息的ID是12345
M->A: 我收到了你的一条消息数据,消息数据是ID;12345
这样就一个请求,一个应答,就完成了一次可靠性的传输。如果A一致没有收到M的应答,就不断的重试。这个时候M就必须保证幂等性。不能重复的处理消息。那么最极端的情况是,怎么也收不到M的应答,这个时候是系统故障。自己检查一下吧。
这么设计就要求,A在发送消息的时候持久化这个消息的数据内容,然后不断的重试,一旦接收到M的应答,就删除这条消息。同样,M端也是一样的。不要相信MQ的持久化机制,不是很靠谱的。
那么M给A发送消息也采取类似的原理就可以了。
下面在看看第二个问题,如何保持数据的一致性更新,这个还是可以参考TCP/IP的协议。
首先A发送一条消息给M:我要发送一批消息数据给你,批次号是10000,数据是5条。
M发送一条消息给A:ok,我准备好了,批次号是10000,发送方你A
接着A发送5条消息给M,消息ID分别为1,2,3,4,5 ,批次号是10000,
紧接着,A发送一个信息给M:我已经完成5小消息的发送,你要提交数据更新了
接下来可能发送两种情况
1 那么M发送消息给A:ok,我收到了5条消息,开始提交数据
2 那么M也可以发送给A:我收到了5条消息,但是还缺少,请你重新发送,那么A就继续发送,直到A收到M成功的应答。
整个过程相当复杂。这个也就是数据一旦分布了,带来最大的问题就是数据一致性的问题。这个成本非常高。
对于第三个问题,这个就比较复杂了
这个最核心的问题就是消息的顺序性,我们只能在每个消息发一个消息的序列号,但是还是没有最好解决这个问题的办法。因为消息接收方不知道顺序。因为即使给他了序列号,也没有办法告诉他,这个应该何时处理。最好的办法是在第二种方式的基础作为一个批次来更新。
这个只是以最简单的例子来说明一下分布式系统的要保证数据一致性是一件代价很大的事情。当然有的博主会说,这个何必这么复杂,直接数据库同步不就可以了。这个例子当然是没有问题的,万一这个几个库的模型都不一样,我发送消息要处理的事情不一样的。怎么办?
http://www.cnblogs.com/aigongsi/archive/2012/09/21/2696773.html
分享到:
相关推荐
这一特性对于保证数据一致性、防止重复处理以及解决网络延迟等问题至关重要。尤其是在金融交易、订单处理等场景中,幂等性设计是确保业务正确性的基石。 幂等性的实现主要分为两种类型:请求幂等和操作幂等。 1. ...
### 分布式架构中的幂等性 #### 一、幂等性的定义与意义 幂等性(Idempotence)在计算机科学中是一个重要的概念,它...特别是在电商领域,通过实现幂等性可以有效防止重复操作带来的问题,同时确保系统的最终一致性。
综上所述,实现分布式系统接口的幂等性是保障系统稳定性和数据一致性的重要手段。通过上述策略的合理运用,可以有效避免因重复操作导致的数据不一致问题,从而满足如金融交易等关键业务的需求。在实际开发过程中,应...
本地消息表是一种在分布式环境中保证事务一致性的方法,其核心思想是将跨数据库或服务的操作通过消息来协调。在事务开始时,除了执行业务操作外,还会在本地创建一条消息记录。一旦业务操作成功,消息会被发送到消息...
在高并发的IT应用中,幂等性和分布式锁是两个至关重要的概念,它们对于系统的稳定性和数据一致性有着深远影响。让我们深入探讨这两个核心概念及其解决方案。 首先,幂等性(Idempotency)是指一个操作无论执行多少...
为实现这一点,分布式存储系统必须满足幂等性原则,即多次重复的写操作最终只会处理一次,以保证数据状态的一致性。 数据一致性模型是分布式存储系统中非常重要的概念,它定义了数据副本之间保持同步的策略和规则。...
分布式服务API的幂等设计是确保系统稳定性和数据一致性的重要策略。在分布式环境中,由于网络延迟、重试机制等因素,同一个请求可能会被多次执行。幂等性要求即使接口被重复调用,其结果也应该保持不变,避免出现如...
总的来说,接口幂等性设计是分布式系统中不可或缺的一部分,它有助于防止因网络问题导致的数据不一致性和系统崩溃。通过引入幂等性设计,我们可以增强系统的容错能力,提升用户体验,并确保敏感操作(如涉及财务交易...
分布式事务在现代高并发、大数据量的互联网应用中扮演着至关重要的角色,它解决了单机事务无法处理跨系统、跨数据库的数据一致性问题。本话题主要探讨分布式事务中的一个经典解决方案——最终一致性。最终一致性是一...
总结来说,理解和掌握分布式系统的互斥与幂等问题对于构建高可用、高一致性的大规模系统至关重要。设计合理的并发控制策略,如使用分布式锁和实现幂等性,可以帮助我们应对分布式环境中的挑战,保障系统的稳定运行。...
《从PAXOS到ZOOKEEPER分布式一致性原理与实践》这本书深入探讨了分布式系统中的核心议题——一致性。一致性是确保网络中多个节点对数据视图保持同步的关键,它是构建可靠分布式服务的基础。在此,我们将重点围绕...
在微服务架构中,接口幂等性是一个重要的设计原则,它确保了无论调用同一接口多少次,结果始终一致,不会对系统造成额外影响。然而,实现接口幂等性并非易事,特别是在并发环境下。本文将探讨通过Redis分布式锁来...
除此以外还介绍了一些分布式事务相关的技术,如幂等性、全局一致性ID、分布式对象等。... 6-1 分布式事务介绍 6-2 spring分布式事务实现_使用JTA 6-3 spring分布式事务实现_不使用JTA 6-4 实例1-DB-DB 6-5 实例1-DB-...
分布式系统一致性是构建大规模互联网服务的关键技术之一,它涉及到如何在多台机器或服务之间保持数据的一致性状态。在本文中,我们将深入探讨几种重要的理论和实践方法,包括ACID特性、CAP定理、BASE原则,以及几种...
总结来说,本文介绍的基于消息通信的分布式系统最终一致性平台,通过幂等性和强一致性保证了数据的正确性,通过消息监控机制实现了异常的检测与恢复,结合关注点分离和工程化实践,提高了平台的复用性和整体性能。...
分布式事务在Java编程中是一个重要且复杂的话题,它涉及到多个节点间的协调,以确保数据的一致性和完整性。在这个"Java编程代码-分布式事务-源代码+讲义+资料"的压缩包中,我们可以期待深入学习关于分布式事务的理论...
在分布式系统设计与开发中,事务管理是确保数据一致性和完整性的关键部分。当系统中的服务分布在...同时,系统设计者需要关注日志记录、服务可靠性和幂等性设计,以确保系统在面临异常情况时的稳定性和数据的一致性。
总结来说,数据一致性是分布式系统设计中的核心难题,它涉及到程序设计、硬件、并发控制等多个方面。理解并有效管理一致性,对于构建可靠、高效、大规模的分布式系统至关重要。开发者需要不断探索和优化解决方案,以...