实用 | Apache Kudu读写路径

Kudu的体系架构已经具备了提供良好分析性能的能力,同时还能够接收插入和更新操作的连续流。为了使用户能够专注于其最关心的内容,Kudu提供了简单的API,而封装了后台的复杂性。但是一些高级用户希望了解内部部件,以理解Kudu如何能够快速分析快速数据,以及如何更好地利用其功能。本篇博文旨在向用户介绍向Kudu内写入数据以及从Kudu中读取数据时在其后台会发生什么。本篇博文假设读者对本文中所介绍的Kudu架构已经有一个基本的了解。

多版本并发控制(MVCC)

数据库使用并发控制方法确保用户始终看到一致性的结果,不管是否进行并发写入操作。Kudu使用了一种称为多版本并发控制(MVCC)的方法,该方法可以跟踪正在进行的操作,并通过确保读取操作只能读到已提交的操作来保证一致性。Kudu使用多版本并发控制(MVCC)的主要优点是允许读取者(通常是大型扫描程序)不必获取锁定,分析作业不会阻止同一数据上的并发写入者,这样就可以显著提高其扫描性能。每个写入都使用系统生成的时间戳进行标记,该时间戳保证在tablet中是唯一的。当用户创建扫描程序从tablet读取数据时,他们可以选择两种读取模式:

● READ_LATEST(默认)在tablet中获取多版本并发控制(MVCC)当前状态的快照,无法保证最新版本。也就是说,该功能可读取在副本上提交的任何写入,但是由于写入可以无序执行,所以不保证其一致性。而且由于副本可能落后于同一tablet中的其他副本,因此不能保证读取的是最新版本。

● READ_AT_SNAPSHOT可以获取多版本并发控制(MVCC)的快照,其中包括基于特定时间戳的行版本,无论是用户选择还是系统选择(“当前”时间)。tablet等到这个时间戳是“安全的”(即已经完成所有具有较低时间戳的飞行中写入操作),并且由于具有较晚的时间戳,tablet中的进一步写入将被扫描程序忽略。在这种模式下,扫描是一致且可重复的。

通过提供您自己的扫描时间戳,第二种快照类型具备发布 “时间行程读取”的能力,这反映了在该时间点数据库的状态。这意味着用户只能看到单个版本的行,但在内部Kudu可以存储行的多个版本以提供多版本并发控制(MVCC)快照功能。

Raft

Kudu中的表被分割成称为tablet的连续片段,并且为了实现容错功能,每个tablet都在多个tablet服务器上进行复制。 Kudu使用Raft一致性算法以保证对tablet进行的更改获得其所有副本的同意。在任何时候,其中一个副本会被选为领导者,而其他则是追随者。任何副本都可以为读取提供服务,但只有领导者可以接受写入。Raft保留了复制的操作日志,只有在大多数副本被持久存储在日志中时才会对其进行确认。复制日志是一个抽象概念,实际上由tablet的写入日志(WAL)表示。具有N个副本(通常为3或5个)的tablet可以继续接受最多(N-1)/ 2个副本的失败。

Tablet发现

当创建Kudu客户端时,其会从主服务器上获取tablet位置信息,然后直接与服务于该tablet的服务器进行交谈。为了优化读取和写入路径,客户端将保留该信息的本地缓存,以防止他们在每个请求时需要查询主机的tablet位置信息。随着时间的推移,客户端的缓存可能会变得过时,并且当写入被发送到不再是tablet领导者的tablet服务器时,则将被拒绝。然后,客户端将通过查询主服务器发现新领导者的位置来更新其缓存。

大数据

写入路径

写入操作是指需进行插入、更新或删除操作的一组行。需要注意的事项是Kudu强制执行主关键字的唯一性,主关键字是可以更改行的唯一标识符。为了强制执行此约束条件,Kudu必须以不同的方式处理插入和更新操作,并且这会影响tablet服务器如何处理写入。

大数据

Kudu中的每个tablet包含预写式日志(WAL)和多个行集合(RowSet),它们是保存在存储器和磁盘上(被刷新时)的不相交的行集合。写入操作先被提交到tablet的预写式日志(WAL),并根据Raft 一致性算法取得追随节点的同意,然后才会被添加到其中一个tablet的内存中:插入会被添加到tablet的MemRowSet中。为了在MemRowSet中支持多版本并发控制(MVCC),对最近插入的行(即尚未刷新到磁盘的新的行)的更新和删除操作将被追加到MemRowSet中的原始行之后以生成重做(REDO)记录的列表。读取者需要应用相关的重做(REDO)记录,根据扫描程序给定的时间戳构建行的正确快照。

用户喜欢...