2017-02-15 47 views
0

Я устанавливал CASSANDRA clustter с 3-мя узламиКассандры кластеризация отказоустойчивости High-Avialability

Node1(192.168.0.2) , Node2(192.168.0.3), Node3(192.168.0.4) 

https://i.stack.imgur.com/vXqsi.png

создал 'тест' с коэффициентом ключевого пространства репликации как 2.

Create KEYSPACE test WITH replication = {'class':'SimpleStrategy', 'replication_factor' : 2}

Когда я останавливаю Node2 или Node3 (по одному за раз и одновременно за один раз), я могу выполнять операции CRUD на таблице ключей.

Когда я перестану Node1 и попытаться обновить/создать строку из Node4 или node3, получить следующее сообщение об ошибке, хотя node3 и Node4 являются и running-:

All host(s) tried for query failed (tried: /192.168.0.4:9042 (com.datastax.driver.core.exceptions.DriverException: Timeout while trying to acquire available connection (you may want to increase the driver number of per-host connections))) com.datastax.driver.core.exceptions.NoHostAvailableException: All host(s) tried for query failed (tried: /192.168.0.4:9042 (com.datastax.driver.core.exceptions.DriverException: Timeout while trying to acquire available connection (you may want to increase the driver number of per-host connections)))

Я не уверен, как Cassandra выбирает лидера если лидерный узел умирает.

+1

Нет концепции лидера в cassandra ... проверьте, можете ли вы установить telnet на хост (192.168.0.4) на порт 9042 –

+0

Не могли бы вы предоставить более подробную информацию о уровне согласованности, используемом для quearies (это оказывает огромное влияние на поведение вы ожидаете)?Используете ли вы драйвер или используете cqlsh? –

+0

@undefined_variable .... да Я могу telnet с моего локального рабочего стола на все узлы на порту 9042. – UAnand

ответ

0

Итак, вы используете replication_factor 2, поэтому только 2 узла будут иметь реплику вашего пространства ключей (не все 3 узла).

  • Мой первый совет заключается в изменении РФ до 3.
  • Вы должны обратить внимание на уровень согласованности, который вы используете; Если у вас есть только 2 копии данных (RF: 2), и вы используете QUONUM уровня согласованности, он попытается записать данные на половине узлов + 1, в этом случае все 2 узла. Поэтому, если 1 узел опущен, вы не сможете писать/читать данные.
  • , чтобы проверить, где реплицируются данные, вы можете видеть, как кольцо в вас кластер. Когда вы используете SimpleStrategy, он скопирует данные по часовой стрелке. И в вашем случае его копируется в узлах по 192.168.0.2 и 192.168.0.3.
  • Взгляните на понятиях фактора репликации: http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/architecture/architectureDataDistributeReplication_c.html
  • И Консистенция Уровень: http://docs.datastax.com/en/archived/cassandra/2.0/cassandra/dml/dml_config_consistency_c.html
  • Великий Ответ РФ против CL: https://stackoverflow.com/a/24590299/6826860

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

+0

Я изменил RF: 3 и снова попытался с остановленным Node1 и Node2, Node3 вверх. Но все же это дает мне ниже ошибку (не может достичь уровня согласованности QUORUM). Как достичь уровня согласованности QUORUM? Есть ли какой-либо конкретный способ сделать это? Все хосты (ы), попробованные для запроса сбой (проверено: /192.168.0.3:9042 (com.datastax.driver.core.exceptions.ServerError: непредвиденная ошибка на стороне сервера на /192.168.0.3:9042: com.google .common.util.concurrent.UncheckedExecutionException: java.lang.RuntimeException: org.apache.cassandra.exceptions.UnavailableException: не удается достичь уровня согласованности QUORUM) – UAnand

+0

Версия Cassandra I, использующая ее 2.1.8, а также я устанавливаю уровень согласованности QUARUM. – UAnand

0

Я думаю, что я не был уверен в ответе. Коэффициент репликации - это количество копий ваших данных. Уровень согласованности - это количество копий, которое ваш клиент будет ждать, прежде чем получить ответ от сервера. Ex: все ваши узлы вверх. Клиент создает CQL с CL Quorum, сервер копирует данные в 2 узла (3/2 + 1) и отвечает клиенту, в фоновом режиме он будет копировать данные и на третьем узле.

В вашем примере, если вы отключили 2 узла кластера из 3 узлов, вы никогда не достигнете QUORUM, чтобы делать запросы (с CL QUORUM), поэтому вам нужно использовать уровень согласованности ONE, как только узлы снова встанут, cassandra скопирует данные по ним. Одна вещь, которая может произойти: до того, как cassandra скопирует данные на других 2 узлах, клиент делает запрос для node1 или node2, а данных еще нет.

+0

Спасибо .. проблема решена. Я изменил уровень согласованности как QUORUM и коэффициент репликации как 3, а также в cassandra.yaml, я прокомментировал num_token и сгенерировал initial_token для 3 узлов. Сделав эти изменения, кластер отлично работает, поэтому в кластере из 3 узлов только один узел может быть недоступен в любой момент времени. 2 узла должны всегда быть в состоянии высокой доступности. – UAnand