对于允许将单个riak存储桶备份(通过流式传输或快照)到文件的解决方案,您有什么建议?
答案 0 :(得分:3)
在Riak中备份一个桶只是一个困难的操作。
所有解决方案将归结为以下两个步骤:
列出存储桶中的所有对象。这是棘手的部分,因为在Riak集群中的任何地方都没有“清单”或任何存储桶的内容列表。
从上面的列表中的每个对象发出一个GET,并将其写入备份文件。这部分通常很简单,但为了获得最佳性能,您需要确保以并行方式,以多线程方式发布这些GET,并使用某种连接池。
就列出所有对象而言,您有三种选择之一。
一种是通过HTTP(例如/buckets/bucket/keys?keys=stream
)或协议缓冲区对存储桶执行流式列表键操作 - 有关详细信息,请参阅http://docs.basho.com/riak/latest/dev/references/http/list-keys/和http://docs.basho.com/riak/latest/dev/references/protocol-buffers/list-keys/。在任何情况下都不应该执行非流式常规List Keys操作。 (它将挂起整个群集,并且一旦密钥数量变得足够大,最终会超时或崩溃。)
二是发出二级索引(2i)查询以获取该对象列表。有关讨论和警告,请参阅http://docs.basho.com/riak/latest/dev/using/2i/。
如果您正在使用Riak Search并且可以通过单个分页搜索查询检索所有对象,则会有三个。 (但是,Riak Search的查询结果限制为10,000个结果,因此,这种方法远非理想化。)
有关可以备份单个存储桶的独立应用程序的示例,请查看Riak Data Migrator,这是一个使用流式列表键方法并结合高效并行GET的实验性Java应用程序。
答案 1 :(得分:2)
Basho功能contrib有一个用于备份单个存储桶的erlang解决方案。这是一个自定义函数,但应该可以解决这个问题。
答案 2 :(得分:0)
据我所知,没有自动解决方案来备份Riak中的单个存储桶。您必须使用riak-admin
命令行工具来处理备份单个物理节点。您可以编写一些内容来检索单个存储桶中的所有密钥,并使用低r值,如果您希望它快速但不安全(r = 1)。
Buckets是一个逻辑命名空间,所有键都存储在同一个bitcask结构中。这就是为什么只获得一个节点的唯一方法就是编写一个工具来自己流式传输它们。