gpt4 book ai didi

riak - 如何在分布式环境下将数据附加到 Riak key ?

转载 作者:行者123 更新时间:2023-12-04 17:10:47 29 4
gpt4 key购买 nike

使用 Riak 我想以一种可以获得我不时附加的所有数据的方式顺序附加数据。想想日志,如果我选择递增的日志行并将它们传输到 riak,在某些时候我想重新构建我附加的所有内容。

我想通过为此目的创建一个新存储桶来完成此操作,然后添加由序列号或日期时间戳定义的键,并将内容添加到其中,然后使用 list keys API并重组我需要的数据。问题在于列表键 API 效率不高,建议生产。我喜欢这种方法的一点是数据没有并发写入问题(没有锁/等),因为所有的键都是独立的。

另一种方法是使用单个 key ,打开它并附加到它,但是 我很关心通过并发/锁定问题。这个 Action 会在分布式环境下执行,肯定是个糟糕的选择

问题 :在 Riak 中还有其他方法可以做到这一点吗?任何附加模式到一个键?

最佳答案

虽然在写入时将大量小记录写入存储桶既简单又高效,但您付出的代价是,当您尝试读取值时,它会变得昂贵,因为您很可能不知道键。如果您需要通过二级索引、键过滤器或更糟糕的方式查找这些键,通过遍历存储桶中的所有键(这是一项非常繁重的操作,从不推荐用于生产环境),这将大大降低效率而不是通过键检索数据,而不是缩放。

Riak 中也没有追加功能,这意味着您需要先读取然后写入记录以更新它并追加新的日志条目。根据您组织和协调写作的方式,这可能会导致同一记录的并发更新,在设计解决方案时需要考虑这一点。

假设您正在收集记录,例如日志条目,可以被视为一个集合,我推荐的一种技术是时间盒。进行时间装箱时,您可以根据时间段聚合数据。如果我们例如假设我们正在收集一组服务器(在本例中称为服务器)的日志,我们可以创建具有基于服务器 ID 和日期时间标识符的键的记录,例如测量周期的开始。我们不需要完整的时间戳,只要足以让我们识别记录即可。包含 2013/03/07 14:15 到 14:20 期间的 server3 日志条目的记录可以命名为“server3_20130307_1415”。随后的 5 分钟时间将相应地命名为“server3_20130307_1420”。如果某个时间段没有数据,则不会创建任何记录。

这使您可以自动知道涵盖特定时间段的记录的 key ,并允许您严格根据 key 访问来检索记录,这可以很好地扩展和执行。您自然需要根据您生成的数据量调整单个记录覆盖的时间段,因为您通常希望将 Riak 中的对象大小保持在 1-2MB 以下。如果每个时期都会有大量数据,那么考虑在应用程序级别压缩数据也是值得的,以便低于此建议大小。

如果您希望能够访问更大的数据块而不必检索潜在的大量记录,您可以定期聚合记录。你可以例如读取一个小时内的所有记录,并将聚合数据写入一个名为“server3_20130307_14”的新记录,该记录涵盖整个时间段 14:00-15:00。如您所知,这很简单,也很容易作为批处理作业来实现。

在采用这种方法时,如前所述,您将需要考虑并发写入的可能性。在我看来,最好的方法是允许 sibling (使用存储桶属性 [1] 将存储桶的 'allow_mult' 设置为 true 并将 'last_write_wins' 设置为 false)。这将导致 Riak 在并发更新的情况下保留记录的所有版本,而您将需要在读取具有 sibling 的记录时解析在应用程序层中创建的任何 sibling 。尽管这确实增加了一些复杂性,但它可以确保您不会丢失任何数据。

由于我们假设这种情况下的日志条目可以被视为一个集合,因此您可以通过集合联合合并所有 sibling 的集合,然后更新对象(使用正确的向量时钟)以解析 sibling 。

[1] http://docs.basho.com/riak/latest/references/apis/http/HTTP-Set-Bucket-Properties/

关于riak - 如何在分布式环境下将数据附加到 Riak key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15274070/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com