2012-11-20 31 views
1

我正在開發erlang/elixir中的應用程序。我想從erlang訪問Couchbase 2.0。我找到了erlmc項目(https://github.com/JacobVorreuter/erlmc),它是一個二進制協議的memcached客戶端。筆記說:「你必須有一個版本1.3或更高版本的memcached。」可以通過erlmc&memchache 1.3協議從erlang訪問Couchbase 2.0嗎?

據我所知,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協議應該非常穩定,因此可能有幾年的圖書館應該可以工作,對吧?

謝謝!

回答

1

的只有回答我目前爲止是: https://github.com/chitika/cberl

該項目是基於C++「官方」couchbase客戶端。

它似乎有兩個可能的問題:

1)它可能會被放棄(最後一項活動是3個月前) 2)它採用了NIF,這是我的理解,不能同時訪問。

+2

我是cberl的維護者。您可以在https://github.com/aliyakamercan/cberl/上找到更新的(並破壞:))版本。 make文件已損壞,無法構建。我會在本週或下一週修復它。您無法同時訪問它,但您可以使用Poolboy或類似的東西創建一個連接池。在我的測試中,一個實例能夠在虛擬機上每秒處理〜1.5k次操作。 – cashmere

+0

如果你想回答這個問題,並將它充實一點,你可能會獲得賞金。 (我不能評論賞金。) Poolboy會創建一個連接池。我的各種客戶可以從該池中取出連接,然後通過它們與cberl通信 - 但這將同時訪問它。當你說你「無法併發訪問」時,聽起來像我需要一個池的對立面 - 一個與CBERL進行對話的進程,它將來自各種客戶進程的訪問進行多路複用(這與我認爲libcouchbase的工作方式一致。) – nirvana

+1

我更新了cberl以使用最新版本的libcouchbase進行編譯。 https://github.com/xcrdev/cberl – Xavier

2

簡短的回答是:是的,Couchbase與memcached文本協議兼容。

但這裏的關鍵是「memcached文本協議」。由於memcached使用兩種不同的協議類型(文本和二進制),因此應使用那些使用文本協議的客戶端。

在Mochi中,我們使用merle作爲memcached,看起來它應該適合你。最近,我的一位同事分析了它並做了一些小修正:https://github.com/twonds/merle

另外,考慮看看https://github.com/EchoTeam/mcd。這個客戶可以使用一些重構,但也是生產驗證,甚至允許簡單的分片。

+0

我明白二進制協議更有效率。我的問題是關於二進制協議。我鏈接的軟件包是這樣的:erlmc說它會說「二進制協議」和「協議1.3」,但你的迴應是關於文本協議,並暗示我應該使用文本協議。 – nirvana

+0

二進制協議更高效,但並不那麼多:memcached的文本協議非常簡單,並且比二進制文件稍微緊湊。 – demeshchuk

+0

坦率地說,我不知道Membase是否支持二進制協議,但乍一看 - 它不。解決這個問題的最簡單方法是首先在memcached上測試一些二進制協議客戶端,然後在Membase上嘗試它。 – demeshchuk

1

我不得不創建自己的基於vbucket的erlmc基於erlang的couchbase客戶端。 的差異:
- HTTP連接來檢索couchbase
vbucket地圖 - 填充兩個「保留」與vbucket ID(參見例如Python客戶端)字節
- 活性一次性能原因異步TCP連接

+1

我假設這個客戶端不是開源的,因爲你沒有給它一個鏈接?有沒有辦法讓couchbase 2.0服務器處理分發,所以客戶端不一定非常聰明? – nirvana

1

我們不使用Couchbase與Erlang,而是使用Python,它也需要與一個memcache客戶端連接。我無法專門與Erlang圖書館進行溝通,但希望這兩個課程適用於這兩種情況。

Memcache的客戶端限制

Memcache的客戶端只能訪問內存緩存功能。您將無法使用未在memcache協議中指定的視圖或任何其他功能。如果要訪問視圖,則需要在端口8092(docs)上分別使用REST協議。

連接與香草的Memcache客戶

該網頁上提到的端口用於內部或通過專門爲Couchbase寫有「智能」客戶Couchbase。默認情況下,memcache客戶端可以連接到Couchbase集羣中任何節點上的普通memcache端口11211。不要使用專門爲Couchbase編寫的任何memcache客戶端的memcache羣集功能; vanilla memcached的常用分發方法與Couchbase不兼容。

說明

爲了與memcached的客戶端連接,您需要直接連接到端口的Couchbase桶。當您設置新存儲區時,您可以指定您想要存取存儲區的端口。默認存儲區是在端口11211上設置的。每個存儲區都像獨立的memcached實例,但在內部分佈到羣集中的所有節點。您可以連接到任何Couchbase服務器上的存儲桶端口,並且您將訪問相同的數據集。

這意味着您不應該嘗試使用您的memcache客戶端的分佈式memcache功能。這些功能是爲特設的memcached羣集設計的。只需連接到Couchbase服務器上的相應端口,就好像它是單個memcached服務器一樣。

這是可能的原因是因爲有一個Moxi實例發現合適的Couchbase服務器來處理請求。此Moxi實例會自動爲每個Couchbase服務器上的每個存儲桶運行。即使您沒有連接到具有特定密鑰的節點,Moxi也會透明地將您的請求指向適當的服務器。

通過這種方式,您可以使用vanilla Memcache客戶端與Couchbase進行通話,而無需任何額外的邏輯來跟蹤羣集拓撲。磨西爲你照顧這件作品。

二進制協議

我們確實有二進制協議在一個點上工作,但是當我們試圖用flush_all命令有問題。不過,這是前一陣子。我建議您嘗試一下,看看支持水平是否符合您的需求。

+0

flush_all操作默認已禁用,以防止意外的刷新操作影響存儲在存儲桶中的數據。您可以通過使用cbflushctl命令設置參數來啓用flush_all: shell>/opt/couchbase/bin/cbflushctl localhost:11210 set flushall_enabled true 設置flush參數:flushall_enabled true – kolchanov

2

感謝Xavier的貢獻,我重構了整個事物添加池,現在它構建並執行正常。我還包括一個basho_bench驅動程序,以便您可以自己進行基準測試。您可以在here上找到代碼。我很確定這會比文本協議執行得更好。

+0

對不起,我不能給你賞金(你的回答是在我必須分配它的最後期限之後發出的,而我無法在下面給出你的評論......)我已經提出了其他有關補償問題的答案。感謝您在cberl上的工作,我會拉它並開始嘗試今天使用它。 – nirvana

+0

@BillWarren哈哈:)謝謝你不必那樣做。 – cashmere

相關問題