Почему первая вставка выигрывает у второй в Кассандре? - PullRequest
0 голосов
/ 23 мая 2018

Есть два центра обработки данных с 3 узлами в каждом.Я делаю две простые вставки (очень быстро вплотную) в одну и ту же таблицу с уровнем согласованности локального кворума.Таблица имеет один ключ разделения и не содержит столбцов кластеризации.

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

Код C #

var statement = "Insert Into customer (id,name) Values (1, "foo")";
statement.SetConsistencyLevel(ConsistencyLevel.LocalQuorum);
session.Execute(statement);

1 Ответ

0 голосов
/ 23 мая 2018

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

Что-то вроде: var statement = "INSERT INTO customer (id,name) VALUES (1, 'foo') USING TIMESTAMP {microsecond timestamp}";

Лучший подход - использовать одноатомную метку времени, чтобы каждый вызов всегда был выше, чем последний (т. Е.использовать текущие миллисекунды и добавить счетчик).Я не знаю C #, чтобы сказать вам, как лучше всего к этому подойти.Посмотрите на https://docs.datastax.com/en/developer/csharp-driver/3.3/features/query-timestamps/#using-a-timestamp-generator

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...