专栏首页linjinhe的专栏设计数据密集型应用(8-9):从单机到分布式

设计数据密集型应用(8-9):从单机到分布式

这两章的内容介绍从单机转向分布式系会遇到的问题,简单提炼一下几个重要概念。

分布式系统中的问题

从单机到分布式会遇到很多新的问题。

1、网络。

网络是不可靠的,随时可能丢包。

网络是有延迟的,而且延迟可能很高。

所以,当你通过网络发送一个数据包的时候,程序必须考虑到这个数据包可能丢失、也可能延迟。

同样的,如果对端没回复,也不一定是因为对方挂了,有可能是网络问题。

2、时钟。

在分布式系统中,不同机器的时钟是无法完全同步的,并且机器的时钟有可能向前或向后跳跃,不保证单调递增。就算是 Google Spanner 中采用的 GPS + 原子钟,也只能保证不同机器的时钟误差是在一个几毫秒的范围内。

3、部分故障(partial failures)。

可能出现部分节点故障,这是分布式与单机的最大不同。分布式系统不能因为少部分节点的故障而影响整个系统的可用性。

分布式环境下,只能通过网络通信来检测节点是否故障,但是网络又是不可靠的,所以只能通过“节点超时未应答”来判定节点故障——实际上有可能是网络问题,这种情况如果没有处理好,可能会影响数据一致性。

4、超时。

在单机环境下,一个请求只有成功 or 失败两种状态。

在分布式环境下,还存在第三种状态——超时。

超时的请求,就是一只薛定谔的猫——有可能是成功,也有可能是失败。只能再发个请求去确定一下。

对于一些非常重要的请求,一般将其设计成幂等的来解决,遇到超时可以继续重试。

线性一致性(Linearizability)

Linearizability 是一种强一致性的模型,这个概念一开始应该是出自并发编程领域,感兴趣的话可以参考论文:Linearizability: A Correctness Condition for Concurrent Objects

对于提供线性一致性的的分布式系统,在这个系统中:

  1. 多副本的多份数据在外部看起来就像是一份数据。
  2. 所有操作在外部看起来都是原子的。

实现线性一致性的分布式共识算法主要有:

  1. Paxos
  2. Raft

分布式事务

前面讲到了分片和事务,分布式事务其实就是跨分片的事务。

有不少开源数据库实现了分布式事务,比如:

  • TiKV
  • CockroachDB
  • FoundationDB
  • Calvin

想要深入了解分布式事务,这里推荐一些论文:

  1. Omid 四部曲:
    1. Omid: Lock-free Transactional Support for Distributed Data Stores
    2. Omid, Reloaded: Scalable and Highly-Available Transaction Processing
    3. A Critique of Snapshot Isolation
    4. Taking Omid to the Clouds: Fast, Scalable Transactions for Real-Time Cloud Analytics
  2. Google 家的实现
    1. Large-scale Incremental Processing Using Distributed Transactions and Notifications
    2. Spanner: Google’s Globally Distributed Database
  3. Deterministic Database
    1. Calvin: Fast Distributed Transactions for Partitioned Database Systems

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • MySQL数据类型

    linjinhe
  • leveldb iterator 的 Prev 究竟比 Next 差在哪?

    leveldb 通过 iterator 提供了范围查找、有序遍历的功能,支持正向迭代(Next)和反向迭代(Prev)。

    linjinhe
  • LevelDB:整体架构

    上图简单展示了 LevelDB 的整体架构。LevelDB 的静态结构主要由六个部分组成:

    linjinhe
  • Scrapy:常见错误整理

    一般是在全局配置settings.py中设置了 DOWNLOAD_TIMEOUT,或用了代理IP等,就会出现这类报错。

    新码农
  • 通过对象组合水平扩展 PHP 类功能

    通过前面的学习,我们已经知道,通过类继承可以扩展类的功能,但是随着系统越来越复杂,如果仅仅通过类继承的方式扩展类的功能,而 PHP 又是单继承机制,会导致类的层...

    学院君
  • 3d效果的图片轮播

    CSS3的3d变换 CSS3给我们提供了一个新的功能,那就是3d变换。3d变换和2d变换的基本API函数类似,只不过多了些在Z轴上的操作,不难使用。     ...

    欲休
  • MongoDB-基础-条件操作符

    1.一些解释 less than         :  比..少  lt greater than      :  比..多  gt equals       ...

    Ryan-Miao
  • 前段:可能是最全的 “文本溢出截断省略” 方案合集

    在我们的日常开发工作中,文本溢出截断省略是很常见的一种需考虑的业务场景细节。看上去 “稀松平常” ,但在实现上却有不同的区分,是单行截断还是多行截断?多行的截断...

    用户4962466
  • 前段:可能是最全的 “文本溢出截断省略” 方案合集

    在我们的日常开发工作中,文本溢出截断省略是很常见的一种需考虑的业务场景细节。看上去 “稀松平常” ,但在实现上却有不同的区分,是单行截断还是多行截断?多行的截断...

    用户4962466
  • 腾讯助力第五届CCF优秀博士学位论文获奖者论坛

    7月12-13日,第五届中国计算机学会(CCF)优秀博士学位论文获奖者论坛在西北工业大学友谊校区举行。来自国内外20余所高校和企业的历届CCF优秀博士学位论文奖...

    腾讯高校合作

扫码关注云+社区

领取腾讯云代金券