对于允许 [通过流式传输或快照] 将单个 riak 存储桶备份到文件的解决方案,您有什么建议?
3 回答
在 Riak 中,仅备份一个存储桶将是一项困难的操作。
所有的解决方案都归结为以下两个步骤:
列出存储桶中的所有对象。这是棘手的部分,因为在 Riak 集群的任何地方都没有“清单”或任何存储桶的内容列表。
向上面列表中的每个对象发出 GET,并将其写入备份文件。这部分通常很简单,但为了获得最佳性能,您需要确保以多线程方式并行发出这些 GET,并使用某种连接池。
至于列出所有对象,您有以下三种选择之一。
一种是通过 HTTP(例如/buckets/bucket/keys?keys=stream
)或协议缓冲区对存储桶执行 Streaming List Keys 操作——参见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,这是一个实验性 Java 应用程序,它使用流式列表键方法与高效的并行 GET 相结合。
Basho 函数 contrib 有一个用于备份单个存储桶的 erlang 解决方案。这是一个自定义功能,但它应该可以解决问题。
据我所知,在 Riak 中没有自动备份单个存储桶的解决方案。您必须使用riak-admin
命令行工具来备份单个物理节点。如果您希望它快速但不安全(r = 1),您可以编写一些东西来检索单个存储桶中的所有密钥并使用低 r 值。
Buckets 是一个逻辑命名空间,所有的键都存储在同一个 bitcask 结构中。这就是为什么获得单个节点的唯一方法是编写一个工具来自己流式传输它们。