本文首先发表在星云格拉夫社区公共帐户中
在Nlive Live广播的最后一个星云存储中,Nebula Storage团队的Wang Yuzhang(四个国王)分享了星云存储的设计思想,还回答了社区合作伙伴的一些问题。并根据问题所涉及的分类调整顺序。它不是按照直播时间完全分类的。
整个存储主要分为三层。底部是商店引擎,即RockSDB。中间是筏一致性协议层。单击查找一个接口,例如其邻居。当我们通过语句创建空间时,该空间被分为多个逻辑单元,根据填充参数为分区。每个分区都将落在不同的机器上。同一分区的多个副本将形成逻辑单元,并通过筏共识算法保证一致。
在这里,我们将重点介绍v2.x为何具有这些数据格式:在v1.x版本中,星云vid主要是int类型,因此您可以看到上面的v1.x中的点还是边缘,它的vid是vid是vid是vid是vid是vid是vid。thex版本的开始,为了支持字符串类型vid,顶点成为不规则的n -byte。因此,当您创建一个空间时,需要指定VID的长度。这是主要变化。其他则有一些小的更改以删除时间戳。事后,当前的存储格式更接近使用方案 - 从某个点开始启动以找到其邻居并通过v2.x Pertexid + Edgetype存储格式将其保存下来。
同时,v2.x还改变了密钥的编码格式(星云底层是KV存储)。简而言之,这是要与边缘分开的。在这种情况下,当使用所有标签时,您可以直接通过前缀扫描它,从而避免在扫描点(如v1.x)的过程中避免使用多层的问题。
为了响应用户提出的“如何存储数据在星云的底层”的问题,四个国王回复:星云的存储层使用kv用于存储点边缘数据。对于一个点,键存储在vid和vid中。它的标签类型。根据该标签的模式,该点的值将编码和以值进行编码和存在。使用存储时,根据某些编码,年龄字段的值保存在值中。Besides,边缘上的存储密钥将是更多字段,主要是起点ID,边缘类型,排名和终点类型,并通过这四个元组确定唯一的边缘。侧面的值类似于点的值。根据模式字段的定义,每个字段均已编码和存储。在这里,我们必须说,星云中的存储边缘是存储的两个部分:星云中的边缘有方向和边缘,存储层将存储向前和反向边缘。
一般而言,图表存储分为两种方式:切割边缘和切割点。像上面提到的星云一样,使用了边缘方法:一个边缘存储两个KV。
用户问题:为什么切割点和切割边缘有任何优点和缺点?
如果剪切边缘,每个边缘有两个部分,并且数据总量将远大于切点,因为图的数据边数远大于该点,导致大量冗余。相对好处是起点和IT映射时,它将被映射到同一分区,因此从单个点触发的一些查询将很快得到结果。如果剪辑点,则可以将点分为多个机器。更新数据时,必须考虑数据的一致性。通常,图计算中的切点的使用将被更广泛地使用。
以下内容在以前的活动的AMA会议上收集,以及在直播期间在弹幕中提出的问题。
如底部存储中所述,当创建边缘模式时,将指定边缘类型上的属性。这些属性将存储为基础岩石键的值。
由于技术或产品原因?因为考虑到字符串类型更长,每行的长度均未固定,并且感觉与架构没有什么不同。如果您不固定,您如何知道在查询期间在哪里查询?有迹象吗?
实际上,基本原因是强架的优势是快速的。首先,让我们谈谈常见的简单数据类型,例如:int和double。此数据类型长度是固定的,我们将直接在值的相应位置进行编码。Besides字符串类型,星云中有两个字符串:一个是固定的字符串,长度是固定的,并且相同的简单数据类型是编码的在价值的固定位置。另一个是更长的字符串。一般而言,每个人都会更倾向于变长弦。
例如,长字符串类型中的架构中有一个属性。我们不会直接编码并保存与简单数据类型相同。相反100要节省这个长字符串。因此,当阅读读取字符串时,我们需要两次读取价值并首次偏移,第二次我们可以真正读取字符串。通过此表单,所有类型的属性都将转换为“”固定增长”。该设计的优点是,根据要读取的属性和前面所有字段的职业字节大小,您可以直接计算要读取的字段以读取要读取要读取的字段。存储在价值上并读取它。在阅读过程中,无需读取无关的字段,避免弱模式需要解码整个值的问题。
诸如Neo4J之类的图数据库通常不是架构,在编写时会更灵活,但是在序列化和依赖化时会消耗某些CPU,并且在阅读时需要重新编码。
问题:如果有更长的字符串,它将导致每条数据的长度不同
可能长度会有所不同,因为它更长。
问题:如果每一行的长度不同,为什么我要坚固?以块形式组织的星云底部存储中使用的岩石DB,每个块可能为4K。阅读时,根据块的大小读取,每个块中每个值的长度可能不同。
保存侧面设计
星云的储户存储在两部分中。我只能存储一侧吗?侧面的反向查询有问题吗?
实际上,这是一个更好的问题。实际上,在星云的最早设计中,只有一个边缘属性,适合某些业务场景。例如,您不需要任何反向遍历。在这种情况下,根本不需要节省反向边缘。在目前,反向的最大意义是促进我们进行反向查询。侧面的后面。边缘类型的属性值未存储,并且属性值仅在边缘存在。它可能带来一些问题。当遍历或反向查询时,整个代码逻辑包括处理过程更为复杂。如果只有一侧,则反向查询确实存在问题。
当您使用星云时,您将首先建立一个地图空间。在构建地图空间时,系统将分配一个称为SpaceID的唯一图形ID,该ID可以获取SpaceID。然后,当存储发现机器要保存某些数据时,它将首先构建一个附加目录,然后构建单独的RockSDB在岩石的本质(实例)中,以保存数据。这样,就可以执行物理隔离。这样,存在一个缺点:尽管RockSDB的实例或整个空间目录彼此隔离,但可能存在相同的磁盘,并且当前的资源隔离不好足够的。
例如,我们以它为例。当我们构建标签时,我们首先将请求发送给Meta以使其写入此信息。写作形式非常简单。首先获取tagid并保存标签名称。基础岩石底B的键存储是tagid或标签名称。值是每个字段的每个字段的定义。例如,第一个字段是年龄,类型是整数int;第二个字段是名称,类型是字符串。所有字段的所有类型和名称都存在,并以某种序列化形式在RockSDB中写入。
在这里,使用KV存储的Meta和存储的底层都是RockSDB,但它提供了不同的接口。例如,META提供的接口可能是保存特定标签以及标签上的属性。orit是元信息,例如机器或空间,包括元数据中的用户权限和配置信息。存储也是kV存储,但是存储的数据是点-Edge数据,并且提供的接口是一个图片操作,例如提取点,边缘和各个方面。在整个,元存储层中,元件和存储在KV存储层代码中完全相同,但是向上暴露的外部接口是不同的。
最后,存储和元数据分别存储,并且两者在启动时未通过过程和存储目录指定。
问题:我该怎么办?
就是这样。一般来说,星云建议通过三个副本部署的元。由于存储和图不依赖元数据,因此仅在启动时才从元数据中获得信息,然后定期从元数据获得元存储的信息。如果修改模式,则不会对图形和存储产生影响。
是否有任何计划在星云背后的存储层?性能,可用性,稳定性方面的稳定性
在这一表演中,星云的底部使用了岩石,其性能主要取决于使用方法和人参的熟练程度。坦率地说,即使是Facebook的内部员工也是一个谜。Furthermore,我刚刚介绍了星云的基本钥匙存储,例如VID或Edgetype在某种程度上对基础存储的相对位置,在某种程度上,某些查询会产生性能效应。在RocksDB本身中,实际上有很多表演要做:首先,在写作或写作时,需要处理一些索引,这将带来额外的性能开销。加上,压实和实际的业务工作量也将对性能产生重大影响。
在稳定性方面,星云的底部采用了筏协议,这是确保星云图不会丢失数据的非常关键的点。因为仅此层是稳定的,并且以下数据写入以下岩石公司可以可以数据没有发生或发生数据丢失。此外,星云本身是根据通用数据库设计的。它将遇到一些通用数据库所面临的一些问题,例如DDL更改;星云本身是一个分布式图数据库,它还将面临分布式系统中遇到的分布式系统。问题就像网络隔离,网络中断,各种加班或某些原因。上述问题需要具有响应机制。例如,星云目前支持动态扩展能力。整个过程非常复杂。它需要在元中以及悬挂的节点以及数据搬迁工作的其余“活着”节点上。在此过程中,必须处理中间的任何步骤。
在可用性方面,我们将来会介绍主要体系结构。某些情况中涉及的数据量相对较小。没有必要保存三个副本,也可以存储单个机器。所有数据都在单个计算机上。它可以最大程度地减少不必要的RPC调用并直接调用成本,并且可以大大提高性能。由于星云总共部署了3个服务:元,图和存储。如果是单个机器部署,则可以将Graph +存储放置在同一台计算机上。最初,需要通过RPC调用存储界面以获取数据以获取数据,然后返回图表进行操作。将导致损失增加,例如网络开销,序列化和deepertine。当两个过程在一起(storeged and Graphd)时,没有RPC调用,因此性能将得到很大改善。此外,CPU利用率将是在这样的一台机器下,这也是Nebula Storage团队目前正在做的事情,并将在下一个大版本中与您会面。
您可以根据vid遍历和边缘吗?
从上图,您可以看到存储了类型。在v1.x版本中,类型类型在v1.x版本中是相同的,因此上述扫描点将与多个侧面混合。在v2.x上启动,将点与类型侧区分开,前缀类型值不同。给定VID,无论是检查所有标签还是所有边缘,您只需要查询一次,并且您不会扫描其他数据。
星云是强大的模式。如何判断该字段在插入数据时是否定义?
如果符合定义,则可能是。创建模式时,您将需要指定一个字段是无效的或默认值,或者既不为默认值,也不是默认值。当我们插入数据时,插入语句将询问您每个字段的值什么需要字段。此插入查询发送到存储层后,存储层将检查是否设置了所有字段值,或者书面值的字段是否具有默认值或nullable。可以填充价值。如果不是,系统将报告错误,并通知用户,如果问题存在问题,则无法写入。如果没有错误,则存储将编码该值,然后最后写入它在RocksDB中通过筏,可能是整个过程。
星云统计在太空上吗?因为我还记得像机器一样。
这是一个非常好的问题,当前的答案不是。我们正在计划这篇文章。造成此问题的主要原因是指标较少。目前,我们支持的指标仅为三个类别:潜在,QPS和QPS。每个指示器具有相应的平均值,最大值,最小值,总价值,和计数以及P99参数。当前是机器级别的度量标准。以下内容将进行两个优化:一个增加指标;第二个是根据空间级别进行统计。对于每个空间,我们将提供QPS语句,例如fetch,go和查找。以上是图表上的指标,并且由于存储没有强大的资源隔离能力,因此它仍然提供群集或单个计算机 -指标而不是空间级别。
如何实现星云2.6.0?
让我们谈谈以下事务的背景。背景是上面提到的星云具有两个侧面和两个KV。这两个KV可能具有不同的节点,如果有机器悬挂,这可能不会成功编写。SO所谓的边境交易或折腾,主要问题是,当我们遇到其中一台机器时,存储层可以确保两个边(边缘和边缘)的最终一致性。该一致性级别最终是一致的。别无选择。一致性是因为研发过程中存在一些问题以及数据处理过程中的问题。最后,选择了最终的一致性。
此外,抛弃处理的整体过程,首先转到第一台写作机器的正面信息,在计算机上写下标记,查看标记是否成功,如果成功输入下一步,如果失败,则它失败了,如果它直接失败了错误。起点和终点被替换,因此可以从反向边缘拼写为正边的机器。接收相反的机器后,它将直接写入边缘,如果将第一台机器告知,如果写作的结果是成功的。第一台计算机收到此写作结果后,假设它成功,它将删除以前的第一步写的标记并将其替换为正常边缘。目前,将完成整个侧面的正常写作过程。这是链同步机制。
简而言之,故障过程,第一台机器无法直接报告错误。第一台机器成功后,第二台机器失败了。在这种情况下,第二台计算机的边缘以确保与第一台计算机相同。更复杂的是,第一台计算机是根据第二台计算机返回的错误代码处理的。直接切换到正常的正边缘,并写出更多额外的标记以指示现在需要恢复的故障边缘,以最终将保持一致。
问题:有没有?
就是这样,因为只有一个副本,所以它不需要交易。从总体上讲,问这个问题的人要强调侧面和边缘之间的事务,例如在插入或删除时是否存在观点删除点时相应的边缘。星云悬架点的设计基于绩效注意事项。如果要解决上述问题,您将引入完整的交易,但是此绩效将按顺序降低。刚刚提到的是抛弃是一个链式的正式同步信息,上面也提到的是,原因是因为第一个节点可以完成第二个节点的数据。但是链式词 - 型单词对于完整的交易将更加严重,因此未来交易的设计不会采用这种方法。
如何首次存储数据,因为我发现第一个导入数据磁盘占据了更多?
每个人都发现,如果磁盘很高,则有更多的WAL文件。由于我们导入的数据量通常很大,因此这将产生大量的WAL。星云中的默认WAL TTL为4小时。在这4个小时中,磁盘空间将非常大。此外,RockSDB还将编写一块数据,该数据正常运行的时间比以下一段时间的群集。目前,磁盘职业将很高。相应的解决方案也相对简单。导入数据时,调整WAL TTL时间的时间。例如,只有半小时或一个小时,以便将磁盘占用率降低。当然,磁盘空间足够大。您不会进行4个小时的处理。因为几个小时后,背景线程将继续检查可以删除哪个WAL。例如,经过4个小时的违约,将删除在发现时到期的WAL系统。
除了初步介绍中的峰值外,在线业务上的数据量不会实时很大,并且WAL文件相对较小。不建议手动删除WAL文件,因为可能会有问题并将其从TTL中删除。
您如何改善查询并减少数据存储职业?您可以看到RockSDB的简介和文章,并且简单地谈论压实主要是多通道合并和分类。RockSDB是LSM -Tree树结构。仅需书面的是,只有apend-lyly才会写成,这将导致一定的冗余数据。在此输入和输出过程中,压实将检查相同的密钥是否在LSM中的不同层中出现。如果同一键出现多次,它将仅保留最新的密钥。在同一时间,SST数量和LSM-Tree的数量可能会减少,因此在查询期间需要读取的SST数量将减少,并且查询效率将得到提高。
不同尺寸的磁盘是否考虑百分比的百分比,因为我使用了两个不同尺寸的磁盘,以及一个完整后的指导指南
目前,这并不容易。主要原因是存储分区分配搜索以旋转形式执行。另一个原因是星云有一个哈希片,每个数据磁盘的数据存储大小正在接近。这将导致两个数据磁盘不一致,一盘在数据已满之前已满。可以从该解决方案处理解决方案。系统层,两个板直接将其绑在同一板上,并安装相同的路径。
在Nebula的RockSDB存储中,它是否通过列列家族区分顶点属性?
目前,实际上,我们根本没有使用Columb家族,并且我们仅使用默认列族。它可以在以下内容中使用,但不会用于区分顶点属性。相反,不同的分区数据分为不同的列族。这个优势是直接的物理隔离。
内布尔的魔术改革WAL似乎是全球多生WAL,但目录中反映的空间似乎是独立的WAL。什么是原则?首先,星云确实是多斗篷,但没有全球沃尔布拉的WAL的概念是针对分区级别的。每个分区都有自己的WAL,并且没有空间WAL。由于设计其设计原因,现在相对容易实施。尽管会有性能损失,但如果将磁盘写成多个WAL,则是随机写作。但是对于筏子来说,写瓶颈不是在此中,而是系统的网络开销。用户的复制操作复制开销是最大的。
Nebul社区中的第一个论文活动!?奖品慷慨大方,整个场景涵盖:撸代码机械键盘??,手机无线充电?等待您领导,以及星云围绕交付的精美,周围的不间断交付?
欢迎写自己和星云对星云感兴趣的星云的有趣故事?
Exchange图数据库技术?加入星云通信组,请先填写您的星云名片,Nebula Assistant会将您吸引到该小组~~
遵循公共帐户