xiaoxiangyu 2019-01-18
Scylla是一个开源的NoSQL数据库,提供Apache Cassandra的水平横向扩展和容错能力,但吞吐量提高了10倍,并且一致,低的单位延迟。Scylla采用C ++技术从零开始实现,可以显着减少你需要的数据库节点数量,并自动优化动态工作负载和各种硬件组合。
Scylla开源3.0发布,推出了一系列丰富的新功能,可以提高查询效率,减少存储需求,缩短维护时间,提高整体数据库性能。Scylla号称是业界性能最高的NoSQL数据库,现在包含超出Apache Cassandra功能的生产就绪功能。
当应用程序维护具有不同组织的相同数据的多个表时,“物化视图”会自动执行繁琐且低效的繁琐工作。数据分为可通过分区键找到的分区。有时,应用程序需要按另一列的值查找分区。在不扫描所有分区的情况下有效执行此操作需要建立索引。
多年来,人们一直在使用物化视图,也称为非规范化,作为客户端实现。以前,应用程序维护了两个或多个视图以及两个或多个具有相同数据但在不同分区键下的单独表。每次应用程序想要写入数据时,都需要写入两个表,并且从所需的表中直接(并且有效地)完成读取。但是,确保两个或多个视图中的数据之间的任何级别的一致性都需要复杂和缓慢的应用程序逻辑。
Scylla的物化视图功能将这种复杂性从应用程序移到服务器中。实施更快(减少到应用程序的往返次数)并且更可靠。这种方法使应用程序更容易开始在其数据中使用多个视图。应用程序只声明了其他视图,Scylla创建了新的视图表,并且在对基表的每次更新时,视图表也会自动更新。写入仅在基表上直接执行,并自动传播到视图表。读取直接进入视图表。
像往常一样,Scylla版本与功能和CQL语法兼容——与Apache Cassandra版本(它仍然处于实验模式)。
Scylla开源3.0引入了可以扩展到任何规模的分布式集群的生产就绪全局二级索引——与Apache Cassandra采用的本地索引方法不同。辅助索引使用底层的物化视图索引,以使索引独立于集群中的节点数量。二级索引(大部分)对应用程序是透明的。查询可以访问表中的所有列,可以在不更改应用程序的情况下添加和删除索引。辅助索引也可以比物化视图具有更少的存储开销,因为辅助索引只需要复制索引的列和主键,而不是像物化视图那样复制查询的列。出于同样的原因,使用辅助索引可以更高效地进行更新,因为只有对主键和索引列的更改才会导致索引视图中的更新。对于物化视图,对视图中显示的任何列的更新都需要更新后备视图。
与往常一样,是否使用二级索引或物化视图的决定实际上取决于你的应用程序的要求。如果需要最高性能并且可能查询特定的列集,则应使用物化视图。但是,如果应用程序需要查询不同的列集,则二级索引是更好的选择,因为可以根据应用程序需要以较少的存储开销添加和删除它们。
全局二级索引可最大限度地减少从数据库中检索的数据量,从而提供许多好处:
允许过滤是一种进行更复杂查询的方法,只返回匹配结果的子集。由于过滤是在服务器上完成的,因此此功能还可以减少群集与应用程序之间通过网络传输的数据量。这种过滤可能会对Scylla集群产生处理影响。例如,查询可能要求数据库在返回响应之前过滤非常大的数据集。默认情况下,阻止执行此类查询,返回以下消息:
Bad Request: Cannot execute this query as it might involve data filtering and thus may have unpredictable performance.
未经许可的查询包括哪些限制:
但是,在某些情况下(通常由于数据建模决策),应用程序需要进行违反这些基本规则的查询。从Scylla开源3.0开始,查询可以附加ALLOW FILTERING关键字以绕过此限制并利用服务器端过滤。
过滤的好处包括:
Scylla开源3.0引入了对更高性能存储格式(SSTable)的支持,该格式不仅与Apache Cassandra 3.x兼容,而且还将存储容量减少了3倍。较旧的2.x格式用于复制磁盘上每个单元格旁边的列名称。新格式消除了重复,列名称在架构中存储一次。
新引入的格式与Apache Cassandra 3.x使用的格式相同,同时与先前的Scylla SSTable格式保持向后兼容。Scylla开源3.0的新部署将自动使用新格式,而现有文件保持不变。
这种新的存储格式带来了重要的好处,包括:
Hinted Handoff旨在帮助任何单个节点由于大量写入负载,网络情况,硬件故障或任何其他因素而暂时无响应。在发生短期网络问题或节点重启时,Hinted Handoff也有所帮助,减少了计划修复的时间,从而提高了分布式部署的整体性能。最初作为Scylla开源2.1中的实验性特性引入,Hinted Handoff是Scylla开源3.0中的另一个生产就绪功能。
从技术上讲,'Hint'是协调器持有的写请求的记录,直到无响应的副本节点重新联机。当一个写入被认为成功但一个或多个副本节点无法确认它时,Scylla会写一个提示,当它们恢复时会重放这些节点。一旦节点再次可用,则提示中的写请求数据被写入副本节点。
Hinted Handoff带来以下好处:
Scylla开源3.0建立在早期改进的基础上,通过扩展有状态分页来支持范围扫描。与读取单个分区或不同分区列表的其他分区查询相反,范围扫描读取属于客户端指定范围的所有分区。由于无法预先确定给定范围内的分区的精确数量和标识,因此查询必须从包含该范围的数据的所有节点读取数据。
为了改进范围扫描分页,Scylla开源3.0引入了一种新的控制算法,用于读取属于所有分片范围内的所有数据,这些分片在每个分片上缓存中间流,并将分页查询引导到先前使用的匹配缓存结果。新算法本质上是一个多路复用器,它将受影响的分片上打开的阅读器输出组合成一个流。当分区扫描尝试从分片中读取时,将按需创建读取器。为确保读取不会停止,算法使用缓冲和预读。
好处包括:
在节点恢复期间使用流处理来使用从运行节点复制的数据填充已还原的节点。Scylla流模型在一个节点上读取数据,将其传输到另一个节点,然后写入磁盘。发件人创建SSTable读取器以从磁盘上的SSTable读取行并通过网络发送它们。接收器从网络接收行并将它们写入memtable。memtable中的行会定期刷新到SSTable中,或者当memtable满时。
在Scylla开源3.0中,节点之间的流同步绕过了memtables,大大减少了修复,添加和删除节点的时间。当集群拓扑发生变化时,这些改进可带来更高的性能,将流带宽提高多达240%,并将执行“重建”操作所需的时间缩短70%。
Scylla的流改进提供了以下好处: