Как выполнить синхронизацию и создать пространство ключей в cassandra?

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

 CassandraConnector(conf).withSessionDo { session =>
  session.execute(s"DROP KEYSPACE if EXISTS $keyspace")
  session.execute("""CREATE KEYSPACE if NOT EXISTS %s
  WITH replication = {'class':'SimpleStrategy','replication_factor':'1'};""".format(keyspace)

) }

Но не удается создать пространство ключей. Из журналов я мог видеть только предупреждение о том, что

Received a DROPPED notification for table test.table_tracker, but this keyspace is unknown in our metadata.

Я также пытался использовать драйвер python cassandra. Но результаты такие же. Я считаю, что есть какое-то состояние гонки, и пространство ключей drop происходит асинхронно (поправьте меня, если я ошибаюсь).

Как синхронно удалить и создать пространство ключей?


person Knight71    schedule 10.08.2015    source источник


Ответы (1)


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

TRUNCATE test.table_tracker;

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

Одна проблема, с которой вы можете столкнуться, заключается в том, что, возможно, вы не ждете согласования схемы после выполнения каждой операции, что может быть проблематичным, особенно в случае манипулирования одним и тем же пространством ключей/таблицей в последующих операциях. Java-драйвер (и, следовательно, искровой коннектор) будет ждать до настраиваемого периода времени между изменениями схемы. См. это руководство в документе по метаданным java-драйвера, чтобы узнать, как дождаться соглашение, то есть:

if (cluster.getMetadata().checkSchemaAgreement()) {
    // schema is in agreement
} else {
    // schema is not in agreement
}
person Andy Tolbert    schedule 10.08.2015
comment
также обратите внимание, что truncate автоматически создаст снимок. так что следите за местом на диске и запускайте «nodetool clearsnapshot» вручную, чтобы удалить их. - person LHWizard; 06.10.2015