写点什么

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

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

评论

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

渣渣2本学历CRUD一年半,决定改变现状,努力学习两个月成功拿到美团30k offer

Java架构之路

Java 程序员 架构 面试 编程语言

阿里五位MySQL封神大佬耗17个月总结出53章性能优化法则

996小迁

Java MySQL 大数据 架构 面试

RabbitMQ之路由和通配符模式,附源码注释讲解

小Q

Java 学习 架构 面试 RabbitMQ

第二周总结

Griffenliu

【Java】变量声明在循环体内还是循环体外你选哪一个咧?

root

Java 变量声明

架构师训练营第六周课后练习

薛凯

架构师训练营 W02 总结

Geek_f06ede

架构师训练

架构师训练营第二周学习总结

邢永春

一个90后码农的真实经历,希望大家可以不留遗憾;

Java架构师迁哥

云小课|云数据库RDS实例连接失败了?送你7大妙招轻松应对

华为云开发者联盟

数据库 网络 ssl RDS实例 端口

架构师训练营 W02 作业

Geek_f06ede

架构师训练

架构训练营-week6-学习总结-技术选型(二)

于成龙

架构训练营

Java程序员必会的三个技能:Spring+MySQL+并发编程

Java架构师迁哥

架构师训练营第 1 期第 6 周作业

好吃不贵

极客大学架构师训练营

数据库JDBC:Statement查询

正向成长

JDBC sql查询 SQL光标

十八般武艺玩转GaussDB(DWS)性能调优(二):坏味道SQL识别

华为云开发者联盟

数据库 sql 性能调优 GaussDB 算子

全网首发,做第一人纯源码讲解RabbitMQ实践,收藏吧

小Q

Java 学习 架构 面试 RabbitMQ

第二周作业

Griffenliu

第六周

等燕归

第1周 架构方法-作业

SuGeek

架构师训练营第二周作业

邢永春

Double Kill!! 数据联邦修炼之路

脑极体

第五周作业

icydolphin

极客大学架构师训练营

Week2 - 框架设计

evildracula

学习 架构

架构训练营-week6-作业

于成龙

CAP 架构训练营

架构师训练营 1 期第 6 周:技术选型(二) - 作业

piercebn

极客大学架构师训练营

第六周作业

alpha

极客大学架构师训练营

LeetCode题解:78. 子集,迭代,JavaScript,详细注释

Lee Chen

算法 大前端 LeetCode

玩转华为云开发|老板万万没想到:刚入职的我一人就搞定人脸识别开发

华为云开发者联盟

软件开发 模块化流程 人脸识别 API 华为云

架构师训练营第 1 期第 6 周学习总结

好吃不贵

极客大学架构师训练营

架构师训练营第二期 - 第二周作业

john_zhang

极客大学架构师训练营

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