写点什么

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

  • 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:002919

评论

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

让我们开始使用 Amazon Lambda

亚马逊云科技 (Amazon Web Services)

Serverless 云原生 亚马逊云科技 云技能

在线CSV转SQL工具

入门小站

工具

3月券商App行情刷新及交易体验评测报告,国泰君安再夺领导者冠军

博睿数据

博睿数据入选首批欧拉技术测评方案,为欧拉生态开发者应用体验保驾护航

博睿数据

14年软件开发经历IT:低代码已成为企业管理的核心引擎

一只大光圈

钉钉 低代码 IT 数字化 钉钉宜搭

这款神器大大提升了协作效率!

Liam

后端 Jmeter Postman swagger Mock

在线字节转换工具

入门小站

工具

程序员=沉闷无趣?都是刻板印象…

LigaAI

程序员人生 程序猿

16 张图 | Nacos 架构原理①:一条注册请求会经历什么?

悟空聊架构

nacos 注册中心 4月日更 悟空聊架构 4月月更

自研消息队列之消息队列数据库表设计

晨亮

「架构实战营」

社区动态|Apache Doris 迎来第 300 位 Contributor !

ApacheDoris

大数据 开源 OLAP MPP apache doris

智慧零售产业应用实战,30分钟上手的高精度商品识别

百度大脑

揭露sealer背后实现整个集群一键交付的奥秘 | 龙蜥技术

OpenAnolis小助手

开源 sealer 龙蜥技术 镜像集群

飞桨EasyDL助力资讯网站实现信息自动分类

百度大脑

内网渗透(蚁剑+MSF)

喀拉峻

网络安全 WEB安全 内网渗透

读《Software Engineering at Google》(06)

术子米德

架构师成长笔记

JVM虚拟机,基础原理总结

Java JVM 虚拟机

Docker 实战教程之从入门到提高 (五)

汪子熙

Docker 容器 虚拟化 容器镜像 4月月更

Tiger DAO VC:将你的风险投资变成DAO组织协同

BlockChain先知

2022年全新FFmpeg/WebRTC/RTMP/RTSP/HLS/RTP播放器-音视频流媒体高级开发学习大纲

赖猫

音视频开发 音视频技术

实例解析山路十八弯的Flutter 2.0路由

岛上码农

flutter ios 安卓开发 4月月更 跨平台开发

【深度分享】阿里云架构师解读四大主流游戏架构

阿里云弹性计算

游戏

高精度PP-YOLOE、轻量化PP-PicoDet SOTA模型重磅开源

百度大脑

mac浏览器密码获取难?教你两种方法,轻松搞定

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 漏洞挖掘

虎符研究院|币圈后浪MetaAds——现实与元宇宙的展示平台

区块链前沿News

虎符交易所

百度文心大模型「技术天团」首次亮相!首场技术开放日、AI创意派决赛来啦~

百度大脑

JS/TS项目里的Module都是什么?

华为云开发者联盟

js Module loaders bundlers

linux之iconv命令

入门小站

Linux

同事删库跑路后,我连表名都不能修改了?

码农参上

数据库 数据恢复 权限 删库 4月月更

审核和审批的区别

秋去冬来春未远

coreldraw2022订阅版本最新版本简介

茶色酒

cdr2022

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