Многоузловой кластер Cassandra и несогласованные клиентские запросы на чтение

У меня запущен и работает кластер Cassandra с двумя узлами, и я выполняю построенные запросы CQL через API драйвера python. Я провожу модульное тестирование серии моделей, которые я создал, чтобы абстрагироваться от большей части API Cassandra для простоты использования другими разработчиками. Все мои тесты проходят успешно при тестировании на кластере с одним узлом, но после добавления еще одного узла тесты совершенно несовместимы, либо не работают, выдают ошибки, либо проходят с минимальной рифмой или причиной.

Я сравниваю объект, вставленный в Cassandra, и объект, полученный в результате запроса Cassandra с помощью self.__dict__ == other.__dict__, поскольку я заполняю поля класса на основе значений столбцов, полученных от Cassandra.

Я считаю, что изолировал проблему. На моем начальном узле:

cqlsh:mykeyspace> select id,created_at from users;

id | created_at
----+--------------
10 | 139621386780
11 | 139621386780
 8 | 139621386780
 7 | 139621386780
 6 | 139621386780
 9 | 139621386780
12 | 139621386780

(7 rows)

На моем втором узле:

cqlsh:mykeyspace> select id,created_at from users;

 id | created_at
----+--------------
  8 | 139621370181
  7 | 139621370181
  9 | 139621370181

(3 rows)

, где первый столбец — целочисленный идентификатор, а второй столбец — объект Python datetime. Я считаю, что происходит то, что когда я вставляю строку в users, строка вставляется либо в первый, либо во второй узел, но когда я пытаюсь получить этот объект обратно из Cassandra, я читаю с узла, отличного от того, который я только что вставил, так как Cassandra это позволяет. Однако, если у меня есть consistency_level=ALL (что для моих вызовов CQL Python), не должен ли я получать самые последние данные строки, а не строку из вставки, предшествующей самой последней?


Обновлять

Обратите внимание, что уникальные идентификаторы намеренно удалены.

На начальном узле:

$ nodetool status
Datacenter: 243
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address         Load       Tokens  Owns   Host ID                               Rack
UN  IP Address 0  136.47 KB  256     100.0%  ownsuuid  58

$ nodetool gossipinfo
/IP Address 0
  HOST_ID:ownsuuid
  SCHEMA:schema
  RPC_ADDRESS:0.0.0.0
  RELEASE_VERSION:2.0.4
  STATUS:NORMAL,-1102599059356328037
  SEVERITY:0.0
  RACK:58
  LOAD:150498.0
  DC:243
  NET_VERSION:7
/IP Address 1
  SCHEMA:schema
  HOST_ID:ownsuuid
  RPC_ADDRESS:0.0.0.0
  RELEASE_VERSION:2.0.4
  STATUS:NORMAL,-1102599059356328037
  SEVERITY:0.0
  RACK:181
  LOAD:148937.0
  DC:241
  NET_VERSION:7

На другом не начальном узле:

~$ nodetool status
Datacenter: 241
===============
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address          Load       Tokens  Owns   Host ID                               Rack
UN  IP Address 1  145.45 KB  256     100.0%  ownsuuid  181

$ nodetool gossipinfo
/IP Address 0
  STATUS:NORMAL,-1102599059356328037
  LOAD:139743.0
  RELEASE_VERSION:2.0.4
  RACK:58
  SCHEMA:schema
  SEVERITY:0.0
  NET_VERSION:7
  HOST_ID:ownsuuid
  RPC_ADDRESS:0.0.0.0
  DC:243
/IP Address 1
  STATUS:NORMAL,-1102599059356328037
  LOAD:164405.0
  RELEASE_VERSION:2.0.4
  RACK:181
  NET_VERSION:7
  SCHEMA:schema
  SEVERITY:0.0
  HOST_ID:ownsuuid
  RPC_ADDRESS:0.0.0.0
  DC:241

person Matt Morse    schedule 30.03.2014    source источник


Ответы (1)


Мне кажется, что у вас больше проблем со сплетнями об узлах, чем с чем-либо еще. Знакомы ли вы с диагностическим инструментом «nodetool», который доступен в вашем каталоге bin для Cassandra?

Я запускаю Cassandra в кластере из 2 узлов на серверах Amazon EC2 и могу запускать следующие команды из каталога bin:

статус ноды bash

bash nodetool сплетниинформация

Вы должны увидеть все свои узлы при выполнении этих команд. Это должно как минимум подтвердить, что ваши узлы правильно обмениваются данными и распределяют ваши данные. Для моего кластера, как только я убедился, что все узлы обмениваются данными, я могу запустить запрос на выборку в cqlsh с любого из узлов и получить 100% согласованные результаты.

Кроме того, вы настроили значение семян узлов в файле cassandra.yaml в папке «conf»? Как только вы запустите свой первый узел, второй узел должен использовать IP-адрес или имя первого узла в качестве начального значения.

person Todd Nakamura    schedule 31.03.2014
comment
Похоже, что статус nodetool показывает, что два узла не видят друг друга; запуск его на каждом узле показывает только один IP-адрес. Тем не менее, информация nodetool gossipinfo показывает, что оба узла видят друг друга и подключаются нормально, см. обновленный пост. Кажется правильным? И да, один узел установлен как начальный узел в cassandra.yaml для обоих узлов. - person Matt Morse; 07.04.2014
comment
Вау, это интересно. Определенно не то, с чем я столкнулся в своей конфигурации, поэтому я могу только догадываться о решении. Какие порты у вас открыты между двумя узлами? У меня есть 7000, 7199 и 9160. У меня также есть порт 9042, открытый на узлах Cassandra, чтобы разрешить трафик с моего веб-сервера, использующего драйвер C#. Может быть, у вас закрыто движение на одном из них? Я точно знаю, что сплетни происходят на порту 7000 (по крайней мере конфиг по умолчанию). - person Todd Nakamura; 07.04.2014
comment
Привет, извините за задержку с ответом! Все перечисленные вами порты открыты на обоих узлах, но порт 7001 закрыт. Хотя, насколько я знаю, это должно быть нормально. - person Matt Morse; 14.04.2014
comment
Да, я не думаю, что порт 7001 нужен для чего-либо. Это может звучать глупо, но, может быть, просто убедитесь, что вы используете одну и ту же версию Cassandra на разных узлах и что все остальное на каждом сервере полностью согласовано? Кроме того, похоже, вам следует попробовать связаться с кем-то непосредственно в Datastax. Кажется, они здесь довольно активны. - person Todd Nakamura; 16.04.2014
comment
На самом деле коллега решил эту проблему полчаса назад; Я попытался использовать оценочную копию Datastax в качестве многоузлового кластера, который явно не предназначен для такого использования. Я ценю вашу помощь и терпение с этой глупой ошибкой! - person Matt Morse; 17.04.2014