1

我正在用 erlang/elixir 开发一个应用程序。我想从 erlang 访问 Couchbase 2.0。我找到了 erlmc 项目(https://github.com/JacobVorreuter/erlmc),它是一个二进制协议 memcached 客户端。注释说“您必须拥有 1.3 或更高版本的 memcached”。

我知道 Couchbase 2.0 使用 memcached 二进制协议来访问数据,我正在寻找从 erlang 中执行此操作的最佳方法。

该手册谈到了 8092 上的“Couchbase API 端口”,并将 11210(接近 11211 memcached 普通端口)称为“内部集群端口”。 http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-network-ports.html

所以,问题是这样的:

设置 erlmc 以在端口 8092 上与 Couchbase 2.0 对话是正确的方法吗?

Erlmc 讨论了它如何散列密钥以找到正确的服务器,这让我认为它可能是 memcached 协议的版本太旧(或者我应该连接到 couchbase 2.0 上的内置 MOXI 吗?如果是这样哪个港口?)

erlang 视图的端口是哪个?并且可能视图的 REST 接口不支持直接键查找,所以我也需要编写代码来访问它,对吧?

我热衷于使用纯 erlang 解决方案,因为 NIF 不是并发的,而且我会有一些未知数量的进程想要同时访问 Couchbase 2.0。

我上一次与 Couch 合作是 CouchDB,所以我试图在 Couch 和 Membase 合并后将它们拼凑起来。

如果我走错了路,请建议以高度并发的方式从 erlang 访问 Couchbase 2.0 的最佳方式。memcached 协议应该非常可靠,因此几年前的库应该可以工作,对吧?

谢谢!

4

5 回答 5

2

简短的回答是:是的,Couchbase 与 memcached 文本协议兼容。

但这里的重点是“memcached 文本协议”。由于 memcached 使用两种不同的协议类型(文本和二进制),您应该使用那些使用文本协议的客户端。

在 Mochi,我们将 merle 用于 memcached,看起来它应该适合您。最近,我的一位同事对其进行了分叉并进行了一些小的更正:https ://github.com/twonds/merle

另外,请考虑查看https://github.com/EchoTeam/mcd。该客户端可以使用一些重构,但也经过生产验证,甚至允许简单的分片。

于 2012-11-22T13:10:40.373 回答
2

感谢 Xavier 的贡献,我重构了整个东西,添加了池,现在它构建并执行得很好。我还包括了一个 basho_bench 驱动程序,因此您可以自己对其进行基准测试。你可以在这里找到代码。我很确定这会比文本协议执行得更好。

于 2012-12-15T07:26:16.483 回答
1

我们不使用带有 Erlang 的 Couchbase,而是使用 Python,它还需要连接一个 memcache 客户端。我不能专门与 Erlang 库交谈,但希望这些课程适用于这两种情况。

Memcache 客户端限制

Memcache 客户端只能访问 memcache 功能。您将无法使用未在 memcache 协议中指定的视图或任何其他功能。如果您想访问视图,则需要在端口 8092 ( docs ) 上单独使用 REST 协议。

使用 Vanilla Memcache 客户端连接到 Couchbase

该页面上提到的端口要么在内部使用,要么由专门为 Couchbase 编写的“智能”客户端使用。默认情况下,memcache 客户端可以连接到 Couchbase 集群中任何节点上的普通 memcache 端口 11211。不要使用不是专门为 Couchbase 编写的任何 memcache 客户端的 memcache 集群功能;vanilla memcached 的常用分发方法与 Couchbase 不兼容。

解释

为了与 memcached 客户端连接,您需要直接连接到 Couchbase 存储桶的端口。当您设置一个新的存储桶时,您指定您希望该存储桶可以访问的端口。默认存储桶设置在端口 11211 上。每个存储桶就像一个独立的 memcached 实例,但在内部分布到集群中的所有节点。您可以连接到任何 Couchbase 服务器上的存储桶端口,并且您将访问相同的数据集。

这意味着您不应尝试使用 memcache 客户端的分布式 memcache 功能。这些功能专为 ad-hoc memcached 集群而设计。只需连接到 Couchbase 服务器上的适当端口,就好像它是单个 memcached 服务器一样。

这可能是因为有一个 Moxi 实例可以找到合适的 Couchbase 服务器来处理请求。这个 Moxi 实例自动为每个 Couchbase 服务器上的每个存储桶运行。即使您可能没有连接到具有您特定密钥的节点,Moxi 也会透明地将您的请求定向到适当的服务器。

通过这种方式,您可以使用普通的 Memcache 客户端与 Couchbase 通信,而无需任何额外的逻辑来跟踪集群拓扑。Moxi 会为你处理好这件事情。

二进制协议

我们确实让二进制协议在某一时刻工作,但是当我们尝试使用该flush_all命令时出现了问题。不过那是不久前的事了。我建议您自己试验一下,看看支持水平是否满足您的需求。

于 2012-12-08T03:13:37.133 回答
1

到目前为止我唯一的答案是: https ://github.com/chitika/cberl

该项目基于 C++“官方”couchbase 客户端。

它似乎有两个可能的问题:

1)它可能会被放弃(最后一次活动是 3 个月前) 2)它使用 NIF,据我所知,它不能同时访问。

于 2012-12-04T20:24:58.287 回答
1

我必须创建自己的基于 vbucket 的基于 erlmc 的 erlang couchbase 客户端。区别:
- 从 couchbase 检索 vbucket 映射的 http 连接
- 用 vbucket id 填充两个“保留”字节(例如,参见 python 客户端)
- 出于性能原因,一旦异步 tcp 连接处于活动状态

于 2012-12-04T16:40:21.520 回答