背景: 我们使用 Couchbase 6.6.6-10576-enterprise 作为键值存储(我们仅存储二进制数据),并且我们正在努力迁移到 Redis(我不会详细说明我们进行此迁移的原因)。 我们的应用程序是用 C# 编写的,我们使用 CouchbaseNetClient NuGet 版本 2.7.27 与 Couchbase 交互。
目标: 在迁移的背景下,我们想要编写一个简单的工具,迭代 Couchbase 实例的所有键,然后将它们写入 Redis(当然只要它们关联的值)。
问题: 根据我的理解,获取所有密钥可以通过这样的查询来完成:
SELECT META().id FROM `my-bucket` WHERE META().id > $key LIMIT 1000
但是当我运行这样的查询时,我收到以下错误消息:
No index available on keyspace my-bucket that matches your query. Use CREATE INDEX or CREATE PRIMARY INDEX to create an index, or check that your expected index is online.
除非我错了,否则可以使用此命令创建索引:
CREATE PRIMARY INDEX `my-bucket-index` IF NOT EXISTS
ON META().id
问题:在生产中创建此类索引会产生什么后果?这是解决我们问题的适当方法吗?
听说您要离开 Couchbase,我感到很遗憾 :( 如果您最终愿意的话,我想了解更多原因。
话虽这么说:
我通常不会推荐在 Couchbase 上的生产中使用
PRIMARY INDEX
,因为它可以充当后备索引,使 any 查询能够运行,相当于全表扫描(这对大型池的性能不利)数据)。
但是,对于您的情况,您想要检索每个密钥,我认为只要满足以下条件就可以了:
每当弄乱生产中的索引时,我仍然会担心性能。这可能是一种更安全的方法:
A) 在集群中临时添加一个 Analytics 节点,并在其中运行迁移查询。
B) 启动第二个集群,设置 XDCR,并查询第二个集群上的数据。
C) 设置 Kafka 连接器,并处理文档。
这些可能是许可事件,因为您使用的是 Enterprise 🤷u200d♂️。 IANAL,YMMV。