AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

为了实现一致性,我们从事务方案转移到流处理方案

  • 2016-03-20
  • 本文字数:1049 字

    阅读完需:约 3 分钟

当系统变得越来越复杂,数据库会被拆分为多个更小的库,如果借助这些衍生库实现像全文搜索这样的功能,那么如何保证所有的数据保持同步就是一项很有挑战性的任务了,在最近的 QCon 伦敦会议上, Martin Kleppmann 通过演讲阐述了他的观点。

使用多个数据库时,最大的问题在于它们并不是互相独立的。相同的数据会以不同的形式进行存储,所以当数据更新的时候,具有对应数据的所有数据库都需要进行更新。保证数据同步的最常用方案就是将其视为应用程序逻辑的责任,通常会对每个数据库进行独立的写操作。这是一个脆弱的方案,如果发生像网络故障或服务器宕机这样的失败场景,那么对一些数据库的更新可能会失败,从而导致这些数据库之间出现不一致性。Kleppmann 认为这并不是能够进行自我纠正的最终一致性,至少相同的数据再次进行写操作之前,无法实现一致性:

这不是最终一致性,它更像是持续的不一致性。

传统的方案使用事务来实现原子性,但是 Kleppmann 认为这只有在一个数据库的时候才有效,如果是两个不同的数据存储的话,那么这就不太可行了。分布式事务(又称为两阶段提交)支持跨多个存储系统,但是Kleppmann 认为它也面临自身的挑战,如较差的性能和运维问题。

我们重新回过头来看一下这个问题,Kleppmann 认为有一种很简单的解决方案,那就是按照系统的顺序对所有的写操作进行排序,并且确保所有人在随后读取时遵循相同的顺序。他将其与确定性的状态机复制(deterministic state machine replication)进行了类比,对于相同的起始状态,给定的输入流在多次运行时将会始终产生相同的状态转换。

在leader(主)数据库中,同时会将所有的写入操作按照处理的顺序存储为流,然后一个或多个follower 数据库就能读取这个流并按照完全相同的顺序执行写入。这样的话,这些数据库就能更新自己的数据并成为leader 数据库的一致性备份。对于Kleppmann 来说,这是一个非常具有容错性的方案。每个follower 都遵循它在流中的顺序,在出现网络故障或宕机时,follower 数据库能够从上一次的保存点开始继续进行处理。

Kleppmann 还提到在实现上述场景时,使用 Kafka 作为工具之一。目前,他正在编写一个实现, Bottled Water ,在这个实现中,他使用了 PostgreSQL 来抽取数据变化,然后将其中继到 Kafka 中,代码可以在 GitHub 上获取到。

InfoQ 最近也发布了一个关于使用 Kafka 进行开发的演讲。

QCon 的参会者已经聆听到了 Kleppmann 的演讲, InfoQ 的读者稍后将也能看到。他还将演讲的slide 发布了出来。

查看英文原文: Moving from Transactions to Streams to Gain Consistency

2016-03-20 19:002656

评论

发布
暂无评论
发现更多内容

Java网络编程之InetAddress类详解,URL和URI的区别,URLDecoder和URLEncoder,IPv6和IPv4区别,IPv6的三种表示方法

共饮一杯无

Java 9月月更 URL和URI

P8大佬私藏的:微服务与分布式系统实践详解,YYDS!

程序知音

Java 分布式 SpringCloud 后端技术 微服务架构师

Linux系统安装配置jdk

Centos 7 jdk8 9月月更

i++需要多少QPS才能测出BUG

FunTester

云原生的学习心得

Geek_e8bfe4

Java进阶(五)Junit测试

No Silver Bullet

JUnit 测试 单元测试 9月月更

随机生成也是需要有效控制的

zxhtom

9月月更

1分钟了解什么是数据湖?标准的数据湖什么样?

雨果

数据湖

蒙特卡洛方法与蒙特卡洛搜索树(一)

Joshua

机器学习 算法 蒙特卡洛

YAML管理Kubernetes应用

CTO技术共享

查看k8s的etcd数据

程序员欣宸

Kubernetes 9月月更

真的破防了!在华为主题熄屏显示找到我的第一台Mate

最新动态

如何使用Postman调试HMS Core推送接口?

HarmonyOS SDK

移动推送

LeetCode-28. 实现strStr()(java)

bug菌

9月日更 Leet Code 9月月更

云原生(三十六) | Kubernetes篇之Harbor入门和安装

Lansonli

云原生 9月月更

LeetCode-27. 移除元素(java)

bug菌

9月日更 Leet Code 9月月更

自动化测试如何管理测试数据

老张

自动化测试

[教你做小游戏] 滑动选中!PC端+移动端适配!完美用户体验!斗地主手牌交互示范

HullQin

CSS JavaScript html 前端 9月月更

数字化转型和信息化的区别是什么?

雨果

数字化转型 企业信息化

阿里云林小平:如何实现资源高效运维及成本分析

阿里云弹性计算

运维 资源管理

库调多了,都忘了最基础的概念-《方法篇》

知识浅谈

9月月更

NFT数字藏品介绍:NFT数字藏品(交易平台)系统开发

开源直播系统源码

区块链 NFT 数字藏品 数字馆藏

【iOS逆向】某营业厅算法分析

小陈

C语言_1 背景,和Hello world

泾箐

c 9月月更

产品需求文档必须消亡

ShineScrum

Scrum 敏捷 产品开发 PRD

「趣学前端」骨架屏,分享一波前端UI组件开发的经验

叶一一

JavaScript 前端 组件 9月月更

Containerd ctr、crictl、nerdctl 实战

CTO技术共享

生产环境中使用 Linkerd

CTO技术共享

致敬经典!这款华为主题能让你的手机秒变“历代Mate”

最新动态

《小米创业思考》之一:小米历程

郭明

读书笔记

为了实现一致性,我们从事务方案转移到流处理方案_语言 & 开发_Jan Stenberg_InfoQ精选文章