Можно ли получить доступ к Couchbase 2.0 из erlang через протокол erlmc и memchache 1.3?

Я разрабатываю приложение в erlang / elixir. Я хотел бы получить доступ к Couchbase 2.0 из erlang. Я нашел проект erlmc (https://github.com/JacobVorreuter/erlmc), который является клиентом memcached для двоичного протокола. В примечаниях говорится, что «у вас должна быть версия 1.3 или выше memcached».

Я понимаю, что Couchbase 2.0 использует двоичный протокол memcached для доступа к данным, и я ищу лучший способ сделать это из erlang.

В руководстве говорится о «порту API Couchbase» на 8092, а 11210 (близкий к нормальному порту 11211 memcached) называется «внутренним портом кластера». http://www.couchbase.com/docs/couchbase-manual-2.0/couchbase-network-ports.html

Итак, вопрос такой:

Правильно ли настроить erlmc для взаимодействия с Couchbase 2.0 через порт 8092?

Erlmc рассказывает о том, как он хеширует ключи для поиска нужного сервера, что заставляет меня думать, что это может быть слишком старая версия протокола memcached (или есть ли встроенный MOXI на couchbase 2.0, к которому я должен подключиться? Если так какой порт?)

Какой порт для представлений Erlang? И, по-видимому, интерфейс REST для представлений не поддерживает прямой поиск ключей, поэтому мне также нужно написать код для доступа к нему, верно?

Я очень хочу использовать решение на чистом erlang, поскольку NIF не работают одновременно, и у меня будет какое-то неизвестное количество процессов, которые хотят получить доступ к Couchbase 2.0 одновременно.

В последний раз, когда я работал с Couch, был CouchDB, поэтому я пытаюсь собрать все воедино после слияния Couch и Membase.

Если я ошибаюсь, посоветуйте, пожалуйста, лучший способ доступа к Couchbase 2.0 из erlang с высокой степенью согласованности. Протокол memcached должен быть довольно надежным, поэтому, возможно, библиотеки, которым пару лет, должны работать, не так ли?

Спасибо!


person nirvana    schedule 20.11.2012    source источник


Ответы (5)


Короткий ответ: да, Couchbase совместим с текстовым протоколом memcached.

Но ключевым моментом здесь является «текстовый протокол memcached». Поскольку memcached использует два разных типа протокола (текстовый и двоичный), вы должны использовать тех клиентов, которые используют текстовый протокол.

В Mochi мы используем merle для memcached, и, похоже, он вам подойдет. Недавно один из моих коллег раздвоил его и внес некоторые незначительные исправления: https://github.com/twonds/merle

Также обратите внимание на https://github.com/EchoTeam/mcd. Этот клиент может потребовать некоторого рефакторинга, но он также проверен на производстве и даже допускает простое сегментирование.

person demeshchuk    schedule 22.11.2012
comment
Я понимаю, что бинарный протокол намного эффективнее. У меня вопрос о бинарном протоколе. Пакет, который я связал, do: erlmc говорит, что он говорит о двоичном протоколе и протоколе 1.3, но ваш ответ касается текстового протокола и подразумевает, что я должен использовать текстовый протокол. - person nirvana; 03.12.2012
comment
Двоичный протокол более эффективен, но не настолько: текстовый протокол memcached очень прост и чуть менее компактен, чем двоичный. - person demeshchuk; 04.12.2012
comment
И, честно говоря, я не знаю, поддерживает ли Membase бинарный протокол, но на первый взгляд - нет. Самый простой способ понять это - сначала протестировать клиент бинарного протокола на memcached, а затем попробовать его на Membase. - person demeshchuk; 04.12.2012
comment
Речь идет не о мембазе, а о couchbase 2.0, которая действительно использует бинарный протокол. Я ищу клиента бинарного протокола в erlang, вот в чем суть вопроса. - person nirvana; 05.12.2012
comment
Это тот самый проект, о котором я спрашивал в вопросе, упомянутом в самых первых двух предложениях вопроса. - person nirvana; 05.12.2012
comment
Извините, это не было выделено гиперссылкой, упало из виду - person demeshchuk; 06.12.2012
comment
Кстати, оказывается, что любой доступ к Couchbase через SASL или выделенный порт (например, назначение порта вашей корзине) будет проходить через встроенный MOXI, который использует текстовый или двоичный протокол. Так что мои волнения были напрасны. В то время, когда я задал исходный вопрос, я действовал из-за нескольких заблуждений и мало информации. - person nirvana; 20.08.2013

Благодаря вкладам Ксавьера я реорганизовал все это, добавил пул, теперь он строится и работает нормально. Я также включил драйвер basho_bench, чтобы вы могли протестировать его самостоятельно. Вы можете найти код здесь. Я почти уверен, что это будет работать лучше, чем текстовый протокол.

person cashmere    schedule 15.12.2012
comment
Мне жаль, что я не смог назначить вам награду (ваш ответ пришел после крайнего срока, когда я должен был назначить его, и я не мог дать его на ваш комментарий ниже ....) Я поддержал ваши ответы на другие вопросы по компенсации. Спасибо за вашу работу над cberl, я собираюсь вытащить его и начать пробовать использовать его сегодня. - person nirvana; 28.02.2013

Мне пришлось создать собственный клиент erlang couchbase на основе vbucket, основанный на erlmc. Различия:
- http-соединение для получения карты vbucket из couchbase
- заполните два "зарезервированных" байта идентификатором vbucket (см., Например, клиент python)
- активируйте один раз асинхронное tcp-соединение для повышения производительности

person kolchanov    schedule 04.12.2012
comment
Я предполагаю, что у этого клиента нет открытого исходного кода, раз уж вы не дали на него ссылку? Есть ли способ заставить сервер couchbase 2.0 обрабатывать распространение, чтобы клиент не был таким умным? - person nirvana; 05.12.2012

Единственный ответ, который у меня пока есть: https://github.com/chitika/cberl

Этот проект основан на "официальном" клиенте couchbase C ++.

Кажется, есть две возможные проблемы:

1) он может быть заброшен (последнее действие было 3 месяца назад) 2) он использует NIF, который, как я понимаю, не может быть доступен одновременно.

person nirvana    schedule 04.12.2012
comment
Я сопровождаю cberl. Вы можете найти более новую (и сломанную :)) версию на github.com/aliyakamercan/cberl . Файл make поврежден, и его невозможно построить. Я исправлю это на этой неделе или на следующей. Вы не можете получить к нему доступ одновременно, но вы можете создать пул соединений с poolboy или чем-то подобным. Во время моих тестов один экземпляр мог обрабатывать ~ 1,5 тыс. Операций в секунду на виртуальной машине. - person cashmere; 05.12.2012
comment
Если вы ответите на вопрос и немного конкретизируете его, вы, вероятно, получите награду. (Я не могу назначить награду за комментарий.) Poolboy создал бы пул соединений. Различные мои клиенты могли извлекать соединения из этого пула, а затем через них разговаривать с cberl, но это было бы одновременное обращение к нему. Когда вы говорите, что не можете получить доступ одновременно, это звучит так, как будто мне нужна противоположность пула - один процесс, который общается с CBERL и мультиплексирует доступ от различных клиентских процессов (что, по-моему, согласуется с тем, как работает libcouchbase). - person nirvana; 05.12.2012
comment
Я обновил cberl для компиляции с последней версией libcouchbase. github.com/xcrdev/cberl - person Xavier; 10.12.2012

Мы не используем Couchbase с Erlang, а с Python, который также должен подключаться к клиенту memcache. Я не могу говорить конкретно о библиотеках Erlang, но, надеюсь, уроки применимы в обеих ситуациях.

Ограничения клиента Memcache

Клиенты Memcache могут получить доступ только к функциям memcache. Вы не сможете использовать представления или любые другие функции, не указанные в протоколе memcache. Если вам нужен доступ к представлениям, вам нужно будет использовать протокол REST отдельно на порту 8092 (документы).

Подключение к Couchbase с помощью клиентов Vanilla Memcache

Порты, упомянутые на этой странице, используются либо внутри компании, либо «умными» клиентами, написанными специально для Couchbase. По умолчанию клиенты memcache могут подключаться к обычному порту 11211 memcache на любом из узлов в вашем кластере Couchbase. Не используйте функции кластера memcache любого клиента memcache, не написанного специально для Couchbase; обычные методы распространения для vanilla memcached несовместимы с Couchbase.

Объяснение

Чтобы подключиться к клиенту memcached, вам необходимо напрямую подключиться к порту корзины Couchbase. Когда вы настраиваете новый сегмент, вы указываете порт, на котором он должен быть доступен. Корзина по умолчанию настроена на порт 11211. Каждая корзина действует как независимый экземпляр memcached, но внутренне распределяется по всем узлам в кластере. Вы можете подключиться к порту корзины на любом из серверов Couchbase, и вы получите доступ к тому же набору данных.

Это означает, что вам не следует пытаться использовать функции распределенного кэша памяти вашего клиента кэша памяти. Эти функции разработаны для специальных кластеров memcached. Просто подключитесь к соответствующему порту на сервере Couchbase, как если бы это был один сервер memcached.

Причина, по которой это возможно, заключается в том, что существует экземпляр Moxi, который находит подходящий сервер Couchbase для обработки запроса. Этот экземпляр Moxi автоматически запускается для каждой корзины на каждом сервере Couchbase. Даже если вы не подключены к узлу, имеющему ваш конкретный ключ, Moxi прозрачно направит ваш запрос на соответствующий сервер.

Таким образом, вы можете использовать обычный клиент Memcache, чтобы общаться с Couchbase, без какой-либо дополнительной логики для отслеживания топологии кластера. Moxi позаботится об этом за вас.

Двоичный протокол

В какой-то момент у нас действительно работал двоичный протокол, но возникли проблемы, когда мы попытались использовать команду flush_all. Хотя это было недавно. Я предлагаю поэкспериментировать, чтобы увидеть, соответствует ли уровень поддержки вашим потребностям.

person kjw0188    schedule 08.12.2012
comment
Операция flush_all отключена по умолчанию, чтобы предотвратить случайные операции сброса, влияющие на данные, хранящиеся в корзине. Вы можете включить flush_all, установив параметр с помощью команды cbflushctl: shell ›/ opt / couchbase / bin / cbflushctl localhost: 11210 set flushall_enabled true setting flush param: flushall_enabled true - person kolchanov; 10.12.2012