Невозможно выполнить запрос: один или несколько узлов были недоступны при выполнении оператора вставки с использованием cqlsh

Я пытаюсь выполнить вставку в новой установке Cassandra 2, и, хотя мне удалось настроить новое пространство ключей и таблицу, я получаю упомянутую выше ошибку при попытке выполнить вставку.

У меня нет какой-либо причудливой настройки нескольких серверов, я просто запускаю один компьютер с тестовой базой данных, поэтому моя путаница с конфигурацией узла

Команды, используемые для создания указанных предметов:

CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 3 };
USE demodb;
CREATE TABLE users (user_name varchar, state varchar, birth_year bigint, PRIMARY KEY (user_name));
INSERT INTO users (user_name, state, birth_year) VALUES ('canadiancreed', 'PA', 1976);

person canadiancreed    schedule 08.03.2014    source источник


Ответы (2)


CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'DC1' : 3 };

Скорее всего ваш виновник. В нем говорится, что данные в пространстве ключей demodb принадлежат DC1 и должны быть реплицированы 3 раза. Если ваш единственный тестовый узел не указан как член DC1, любой запрос на вставку в это пространство ключей завершится ошибкой. Кроме того, если он является членом DC1 и уровень согласованности больше 1, все запросы будут завершаться сбоем, поскольку для записи будет невозможно получить более одного подтверждения.

Проверьте, как называется ваш центр обработки данных (состояние nodetool), и настройте параметры репликации пространства ключей, чтобы они соответствовали. Это, скорее всего, решит ваши проблемы.

---- Отредактировано для получения более подробной информации и лучшего форматирования ----

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

Пространства ключей — это логическая структура для организации групп информации, она аналогична базе данных в реляционном мире. Каждое ключевое пространство указывает, на каких и скольких машинах оно должно реплицироваться. Если мы используем NetworkTopologyStrategy, репликация указывается для каждого центра обработки данных. Мы указываем эти детали во время создания (хотя они могут быть изменены позже), используя «CREATE KEYSPACE…. WITH REPLICATION».

В приведенном выше заявлении вы указали, что вся информация в демо-базе Keyspace должна быть помещена в центр обработки данных «DC1», и в этом центре обработки данных должно быть 3 копии данных. В основном это означает, что у вас есть как минимум 3 узла в DC1, и вам нужна копия данных на каждом из этих узлов. Это само по себе не приведет к сбою вставки, если только весь центр обработки данных не будет известен кластеру Cassandra. Это было бы в том случае, если вы не выполнили первоначальную настройку своего кластера C * и просто запускаете стандартный yaml.

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

Datacenter: Cassandra
=====================
Status=Up/Down
|/ State=Normal/Leaving/Joining/Moving
--  Address    Load       Owns (effective)  Host ID                               Token                                    Rack
UN  127.0.0.1  93.37 KB   100.0%            50be3bec-7e30-4385-bd4a-918055a29292  4731866028208108826                      rack1

Этот вывод показывает, что у меня есть один узел, работающий в кластере с именем «Кассандра». Это означает, что любые вставки в области ключей, для которых требуются реплики в других центрах обработки данных, завершатся ошибкой, поскольку кластер не знает, как обрабатывать такие запросы. (Если узлы были просто отключены, но мы видели их до того, как мы могли сохранить подсказки, но если другой контроллер домена никогда не был замечен, мы отклоняем запрос, потому что кластер, скорее всего, был неправильно сконфигурирован.)

Чтобы исправить эту ситуацию, я бы изменил свое пространство ключей, используя

cqlsh:demodb> ALTER KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'Cassandra' : 1 };

Теперь demoDB требует копию данных на 1 машине в дата-центре Cassandra. Это здорово, потому что, как указано в выходных данных моего nodetool, у меня есть один узел в центре обработки данных с именем Cassandra. Если я попробую вставить сейчас, это пройдет.

cqlsh:demodb> INSERT INTO users (user_name, state, birth_year) VALUES ('canadiancreed', 'PA', 1976);
cqlsh:demodb> select * from users where user_name = 'canadiancreed' ;

 user_name     | birth_year | state
---------------+------------+-------
 canadiancreed |       1976 |    PA

(1 rows)

и я бы изменил свой сценарий схемы установки, чтобы он также имел правильное имя центра обработки данных

CREATE KEYSPACE demodb WITH REPLICATION = { 'class' : 'NetworkTopologyStrategy', 'Cassandra' : 1 };
person RussS    schedule 08.03.2014
comment
Ну, это то, что у меня есть, когда я делаю статус nodetool. Не вижу ничего, что говорит о деталях представления пространства ключей. Идентификатор хоста может быть? Это то, что у меня есть. -- Адрес Токены загрузки Владелец Идентификатор хоста Rack UN 127.0.0.1 132,76 КБ 256 100,0% 22d3305d-b09f-4ccf-b61b-8c3ddc12605drack1 - person canadiancreed; 09.03.2014
comment
Вы пропустили важную первую строку Datacenter: Cassandra ===================== Status=Up/Down |/ State=Normal/Leaving/Joining/Moving -- Address Load Owns (effective) Host ID Token Rack UN 127.0.0.1 93.37 KB 100.0% 50be3bec-7e30-4385-bd4a-918055a29292 4731866028208108826 rack1 - person RussS; 09.03.2014
comment
не волнуйтесь. Я все еще в замешательстве относительно того, на что я должен смотреть. - person canadiancreed; 10.03.2014
comment
Я внес дополнительные изменения в исходный ответ. Но в основном в cqlsh вы создали пространство ключей, которое ищет центр обработки данных, которого не существует. Вам нужно либо переименовать центр обработки данных, в котором находится машина, либо изменить параметры репликации для этого пространства ключей. - person RussS; 10.03.2014
comment
Это сработало для меня cqlsh:demodb› alter keyspace demodb with replication = {'class':'NetworkTopologyStrategy', 'datacenter1': 1} ; - person Dipak Yadav; 15.05.2014
comment
Это зависит от вашей реализации снитча. Имея endpoint_snitch: GossipingPropertyFileSnitch в моем cassandra.yaml и определяя dc=dc1 в cassandra-rackdc.properties, мне пришлось установить 'dc1': 1. Хотя смотреть на nodetool status бессмысленно, AFAIU. - person SYN; 06.08.2017
comment
Он напрямую выводит имя центра обработки данных в качестве первой строки каждой группы узлов... Как это бесполезно? Даже если вы думаете, что ваша конфигурация отличается, это буквально скажет вам, как называется контроллер домена. - person RussS; 06.08.2017

На случай, если вы окажетесь здесь после поиска в Google, я обнаружил, что вы можете получить эту ошибку, если используете уровень согласованности ALL (также может иметь место для QUORUM с определенными числами коэффициента репликации), а используемое вами пространство ключей настроено как реплицированы в несуществующем или мертвом центре обработки данных.

Обновление репликации пространства ключей для удаления ссылки на несуществующий центр обработки данных решает проблему.

(и в этом случае сообщение совершенно логично: вы хотите получить результаты от узлов, которых больше не существует).

person Vincent de Lagabbe    schedule 04.08.2015