Apache Cassandra3.X 系列,第 4 部分 如何实现节点间数据同步

本文是 Apache Cassandra3.X 系列第四篇文章,主要内容是介绍 Cassandra 如何实现数据节点之间的数据同步。实现数据同步是通过数据写入流程和所使用的算法来实现的,完整地介绍了从数据写入到多个节点的完成数据同步的过程和技术介绍,让读者可以明白 Cassandra 是如何让数据被传播到各个备份节点,如何快速完成并确保数据一致性。

数据快速同步的重要性

通过 Apache Cassandra 系列文章的前几篇文章介绍,我们已经知道 Cassandra 是一个无中心化设计的数据库,也就是说不存在中心节点控制整个集群的数据分布,而是通过内部的某种设计机制确保用户写入的数据能够快速被同步,并且确保数据不丢失,而读取时又能快速获取到数据。数据如果能够做到快速同步,系统的可用性就会大大增强,本文介绍具体如何实现数据快速同步,而数据同步又是在写入过程中就需要完成的,所以我们重点介绍数据写入过程。

Cassandra 写入数据设计思路

避免读取磁盘

为什么很多数据库在读写数据时速度比较慢?大多是因为需要写入/读取磁盘。对于读取数据操作,如果数据都是存放在内存里面的,那么速度肯定会比较快,但是如果内存里存放不了所有的数据呢?那么可能有人会提出可以采用冷热数据分开存储的方式,内存中只保留经常被查询的数据,查找不到再去读取磁盘。而对于写入数据操作,Cassandra 的写入数据速度是非常快的,因为从设计角度上避免了磁盘的读取和寻址。Memtables 和 SSTables 从根本上解决了 Cassandra 写入数据库时对于磁盘速度的依赖,Cassandra 内部所有的写入操作都是采用单向递增方式,也就是类似于写入日志方式。

递增模型

由于设计过程中实现了数据库的交易日志和 hinted handoff 设计,所以数据库即便是对于同一个列族内的写入,依然可以保持原子化操作。

由于 Cassandra 使用了递增模型,如果你想要新增的那条数据的主键已经存在,这时的操作就变成了替换,如果你想要更新的那个主键不存在,那么就变成了全新创建一条数据,所以说插入和更新对于 Cassandra 来说,并不是程序调用接口不同就是不同的结果,而是需要依赖于你的数据本身是否已经存在。就这一点而言,主流的 NoSQL 数据库基本也是这种实现逻辑。

写入一致性

Cassandra 的写入一致性是可以调节的,一致性级别越高,意味着整个写入过程中,需要更多的节点响应副本存储请求,也就是说会降低了系统的可用性。

对于读和写,一致性级别包括 ANY、ONE、TWO 和 THREE 被认为是弱的,然而 QUORAM 和 ALL 被认为是强一致性。QUORAM 一致性级别需要副本节点的大多数响应(副本系统/2+1)。ALL 一致性级别所有副本的响应。R+W>N=强一致性,R 表示读副本数量,W 表示写副本数量,N 是副本因子。所有的客户端 读取都会读到最近的写入数据。

写入数据过程

Cassandra 的写入过程首先是由客户端发起的,然后通过环形设计中的一个节点开始写入过程,这个节点就是协调者节点(coordinator node)。协调者节点根据分区键确定集群中的哪些节点需要存储备份数据,当然这也需要根据 keyspace 的副本策略辅助决定。协调者节点可能自身也需要存储数据的副本,尤其是针对令牌感知驱动方式。如果协调者知道当前状态没有足够的节点可以响应写入一致性要求(例如 ALL 级别,需要满足副本策略要求的 N 个节点保存数据,而实际当前存活的节点数量小于 N-1 个),这种情况协调者节点会立即返回错误信息给客户端,表示无法接收数据。如果节点数量足够满足副本策略要求和一致性级别要求,接下来,协调者节点会立即同时发送写入请求给所有的备份数据节点,这个设计策略决定了所有的副本节点都会第一时间接收到写入数据。如果节点当时宕机了,它们也会被保证一旦启动成功,可以通过 hinted handoff、read repair,或者 anti-entropy repair 等机制获取数据。

  • 发表于:
  • 原文链接:http://kuaibao.qq.com/s/20180107B0MW4O00?refer=cp_1026

同媒体快讯

相关快讯

扫码关注云+社区