写点什么

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

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

评论

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

地理位置数据存储方案——Redis GEO

程序员架构进阶

redis 源码剖析 geo 6月日更 6月月更

DDD概念复杂难懂,实际落地如何设计代码实现模型?

Java全栈架构师

程序员 后端 领域驱动设计 DDD 架构师

SDN系统方法 | 10. SDN的未来

俞凡

架构 网络 sdn SDN系统方法

什么是算子?

华为云开发者联盟

人工智能 算子

新一代构建工具(1):对比rollup/parcel/esbuild—esbuild脱颖而出

zhoulujun

Rollup webpack esbuild

社招两年半10个公司28轮面试面经(含字节、拼多多、美团、滴滴......)

CoderW

Java 面试 简历模板 大厂

HotSpot JVM 「01」类加载、链接和初始化

Samson

学习笔记 hotspot 6月月更

MyBatis 执行流程及源码解析

码农参上

mybatis java实战

TML转义字符:xss攻击与HTML字符的转义和反转义

zhoulujun

XSS xss攻击 转义字符 反转义

web内容如何保护:如何有效地保护 HTML5 格式的视频内容?

zhoulujun

DRM 视频版权保护 数字版权保护 h5视频版权

微博评论的计算架构

极客土豆

IET出席2022世界科技社团发展与治理论坛 为构建国际科技共同体献言献策

E科讯

华为发布两大昇腾计划 推动AI人才发展和科研创新

郝俸🦁好棒

昇腾

Flutter 网络请求封装之Dio(Cookie管理、添加拦截器、下载文件、异常处理、取消请求等)

yechaoa

flutter android 6月月更 dio

源码其实很简单!阿里巴巴最新出品Spring学习脑图+视频+文档真香

Java全栈架构师

Java spring 源码 程序员 面试

揭秘GES超大规模图计算引擎HyG:图切分

华为云开发者联盟

人工智能 图计算 图切分

面对AI人才培养的“产学研”鸿沟,昇腾AI如何做厚产业人才黑土地?

脑极体

先到先得!“阿里爸爸”全新出品SpringBoot高级笔记(全彩版)

Java全栈架构师

Java 源码 程序员 面试 springboot

Maven 基础

zarmnosaj

6月月更

解析数仓lazyagg查询重写优化

华为云开发者联盟

数据库 后端

Tiger DAO VC产品正式上线,Seektiger生态的有力补充

鳄鱼视界

Wireshark网卡无法找到或没有显示的问题

岚哲

网络 Wireshark 域名 vpn 网卡

TLog 助力盘古框架实现微服务链路日志追踪

码农大熊

盘古开发框架

Pipenv中安装Django

宇宙之一粟

django 6月月更

居家办公让我绩效拿了C | 社区征文

大菠萝

初夏征文

六大专题全方位优化,阿里巴巴性能优化小册终开源,带你直抵性能极致

Java全栈架构师

Java 程序员 面试 性能优化

中断操作:AbortController学习笔记

zhoulujun

喜报|海泰方圆通过CMMI-3资质认证,研发能力获国际认可

电子信息发烧客

Java代码优化请求合并与分而治之

码农参上

Java 大数据 高并发 java实战

数据治理,说起来容易,做起来难

奔向架构师

数据治理 数据资产 6月月更

《网络是怎么样连接的》读书笔记 - 集线器、路由器和路由器(三)

懒时小窝

网络编程 网络

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