yugabytedb关键特性和架构初探

2022-04-11 00:00:00 数据 多个 操作 分布式 压缩

人学始知道,不学非自然,万事须己运,他得非我贤

YugabyteDB

YugabyteDb是一个高性能、云原生的分布式SQL数据库,目标是支持所有的PostgreSQL特性。它非常适合云原生OLTP应用,需要保证数据的正确性,需要如下特性的一个或多个:扩展性,容错性或者全球部署。

YugabyteDB的核心特性包括:

1、强大的关系型数据库兼容性。Yugabyte SQL,简称YSQL,重用了PostgreSQL的查询层,支持PostgreSQL的大部分特性。

2、分布式事务。分布式事务的设计基于Google Spanner架构。主副本之间写入操作的强一致性通过Raft协议实现,集群级的分布式ACID事务使用混合逻辑时钟(hybrid logical clocks)实现,支持SSI(Snapshot serializable isolation)隔离级别。读操作默认保证强一致性,但可以动态选择从Follower读和副本读。

3、持续的可用性。通过原生的故障切换和修复,Yugabytedb对常见的故障有极强的修复能力。可以配置自动容忍disk、node、zone、region 和cloud故障。对于公有云上一个region内跨多个zone的典型部署场景,RPO是0,RTO小于3秒。

4、水平扩展性。往集群中添加节点即可实现更高的IOPS和存储更多的数据。

5、跨地理分布的多云部署。Yugabytedb可以部署在公有云,也可以部署在Kubernetes中。Yugabytedb支持跨三个或更多容错域的部署,比如跨zone、跨region、跨云部署。它还支持xCluster异步复制,具有单向主从和双向多主配置,可用于两个区域部署。为了以低延迟服务(过时)数据,也支持读取副本数据。

6、支持多种API,目前支持两种:Yugabyte SQL(YSQL),复用了PostgreSQL的查询层和Yugabyte Cloud QL(YCQL),类似于Cassandra的API。

7、开源,基于Apache2.0协议。开源版本具有强大的企业功能,如分布式备份、静态数据加密、动态TLS加密、更改数据捕获、读取副本等。

Yugabytedb架构

从上图可看出Yugabyte分为两层

1、Yugabyte Query layer(YQL)

2、DocDB Document Store

在正式看两层的详细设计之前,先来明确YugabyteDB中用到的一些关键概念

Universe

YugabyteDB Universe是一组节点(VM、物理机器或容器),它们共同作为一个具有弹性和可伸缩性的分布式数据库运行。

考虑到不同的业务需求和延迟,可以配置和部署不同的universe,比如:

(1)单个可用zone(AZ/rack/故障域)

(2)一个region中多个可用zones(AZs)

(3)多个regions

组织用户数据

一个YugabDB universe可以由一个或多个命名空间组成,每个命名空间可以包含一个或多个用户表。

组件服务

一个universe由两类服务组成:YB-Tserver和YB-Master。这些YB-Tserver和YB-Master服务基于Raft协议构建,形成各自的分布式服务。

YB-Tserver

YB-Tserver是YugabyteDB Tablet Server的简称,负责存储用户数据,并处理用户所有的查询请求。

如下是一个4节点的YugabyteDB universe示例,其中一个表有16个tablet,复制系数是3。

 每个tablet对应的tablet-peers存储在不同的YB-Tserver上共同组成一个Raft组,在彼此之间复制数据。在每个YB-Tserver上都有一些策略来协调tablet的放置位置,以便大化提高资源利用率,下面是一些协调策略:

(1)服务器全局块缓存

块缓存在一个YB-Tserver上的所有的tablets之间共享,当一个tablet的读取频率明显高于其他tablet时,可以明显提供缓存的利用率。

(2)空间放大

YugabyteDB的压缩是大小分层的。与分级压缩相比,按大小分层压缩的写放大率更低。可能有人担心大小分层压缩的写入放大率更大,因为需要50%的头部空间。但这在YugabyteDB中是不正确的,因为每个表被分成多个tablet,并且每个tablet之间的并发压缩被限制在某个大值,YugabyteDB中的典型写放大在10%~20%的范围内。

(3)节流压缩

在给定的YB-Tserver中,通过tablet对压缩进行节流,以防止压缩风暴,这可以防止压缩风暴期间的高延迟。默认策略会保证压缩是值得的,确保被压缩的文件大小不会相差太大,比如把1GB文件和100GB文件压缩在一起是没有意义的,会产生大量不必要的IO。

(4)小型和大型压缩队列

压缩被划分为大压缩和小压缩,并具有一定的优先级,比如小压缩的优先级高于大压缩,以便在极端IO模式下也能保证系统的性能。

(5)手动压缩

用户执行compact_table命令触发压缩,用于数据不再更新时,回收磁盘空间。

(6)服务器全局内存存储限制

比如一个YB-Tserver中有多个tablet,但是其中一个tablet的写入量比其他tablet多的多,如果每个tablet的内存使用都有限制,则可增大写入量多的tablet允许使用的内存,以便实现更好的写性能。

(7)自动调整块缓存和内存大小

基于系统当前可用内存,YB-Tserver会自动将总可用内存的一定比例分配给块缓存,并将另外一定比例分配给memstore。

(8)tablet跨数据磁盘均匀加载

在多SSD机器上,让每个表的SSTable和WAL在SSD上均匀分布,确保每个SSD处理每个表的负载量相等。

YB-Master

YB-Master是YugabyteDB Master Server的简称,负责存储系统元数据,协调系统范围内的操作,比如create/alter/drop表,以及启动维护操作,比如负载均衡。

 (1)协调universe范围内的管理操作

比如用户发起的create table、alter table和drop table请求,YB-Master保证将这些操作传播到所有的tablet,而不管这些tablet所在YB-Tserver服务器的状态如何,这一点非常重要,因为这些全universe范围内的操作之一正在进行时,YB-Tserver出现故障不会因为在某个tablet上无法应用而影响请求的结果。

(2)存储系统元数据

每个YB-Master存储的系统元数据包括,命名空间、表、角色、权限、tablet属于哪个YB-Tserver。这些系统信息使用Raft协议在YB-Master之间复制,系统元数据存储在DocDB的一个表中。

(3)给YB-Tserver分配tablet

YB-Master存储了所有tablet和所属YB-Tserver的对应的关系,client向YB-Master查询对应关系,并缓存,这样client可以直接连接对应的YB-Tserver,用于各种查询,而不会产生额外的网络开销。

(4)后台操作

数据放置和负载均衡。

Leader均衡,除了确保每个YB-Tserver服务的tablet数量均衡外,YB-Master还确保每个符合条件的节点上有对称数量的tablet的Leader。

在扩展的YB-Tserver故障时,重新复制数据,YB-Master接收来自所有YB-TServers服务器的心跳,并确认他们是否正常,如果在设定的阈值范围内,YB-Master没有收到某个YB-Tserver的心跳,则认为该YB-Tserver故障,并开始查找替换的YB-Tserver服务器,将故障YB-Tserver服务器上的数据复制到新选择的YB-Tserver服务器上,为了不影响前台操作的性能,YB-Master以节流的方式进行数据复制。

Universe vs Cluster

一个YugabyteDB Universe只包含一个主集群和零个或多个读取副本集群。

(1)主集群可以执行写操作和读操作。主群集中节点之间的复制是同步执行的。

(2)读取副本群集只能执行读操作。发送到读取副本群集的写入将自动重新路由到universe的主群集。这些集群有助于在远离主集群且具有时间轴一致性数据的区域中为读操作提供数据。这确保了地理分布应用程序的低延迟读取。通过从主集群进行异步复制,将数据引入读取副本集群。换句话说,读取副本群集中的节点充当Raft观察者,不参与主群集中存在的Raft Leader和Raft Follower的写入路径。

Yugabyte Query layer(YQL)

Yugabyte查询层(YQL)是Yugabyte数据库的上层。应用程序使用客户端驱动程序直接与YQL交互。该层处理特定于API的方面,如查询/命令编译和运行时(数据类型表示、内置操作等)。YQL的构建考虑了可扩展性,并允许添加新的API。目前,YQL支持两种风格的分布式SQL API,即YSQL和YCQL。

 每个YB TServer都配置为在不同的端口上支持这些协议。端口5433是YSQL的默认端口,9042是YQL的默认端口。

从应用程序的角度来看,这是一个无状态层,客户端可以连接到相应端口上的任何(一个或多个)YB Tserver,以对YugabyteDB集群执行操作。

每个YB TServer内部的YQL实现了每个API所需支持的协议,但终使用DocDB复制、存储和检索数据,DocDB是YugabyteDB通用的底层强一致性分布式存储。YQL中每个API的一些子组件包括:

(1)一种“语句缓存”,用于缓存已编译语句或已准备语句的执行计划,以避免与语句重复解析相关的开销。

(2)命令解析器和执行层。

(3)支持特定语言的内置操作、数据类型编码等。

DocDB Document Store

DocDB是一个分布式文档存储。它具有以下属性:

(1)强写入一致性

(2)容忍故障的弹性

(3)自动分片和负载均衡

(4)Zone/region/cloud数据放置策略

(5)可调读一致性

DocDB中的数据存储在表中。每个表由行组成,每行包含一个键和一个文档。以下是一些要点:

Sharding

数据存储在DocDB的表中。DocDB表通常分为多个tablets。这种表切分对用户是透明的。

 Replication

每个包含用户数据的tablet都使用Raft共识算法根据某些复制因子进行复制。复制是在tablet级别执行的,即使出现故障,也能确保单行线性化。

 Persistence

为了持久化数据,使用了日志结构的面向行/文档的存储。它包括几个优化,用于高效地处理不断增长的数据集。

Transactions

DocDB支持单行和多行事务。

相关文章