В Cassandra, почему удаление столбца из таблиц, определенных с компактным хранилищем, не разрешено?

Согласно документации datastx здесь, мы не можем удалить столбец из таблиц, определенных с опцией COMPACT STORAGE. Что является причиной этого?


person Manish Khandelwal    schedule 04.09.2020    source источник


Ответы (1)


Это восходит к исходной реализации CQL3 и изменениям, которые были внесены, чтобы позволить ему абстрагировать подобную SQL структуру с широкими строками поверх исходного механизма хранения на основе Thrift. В конечном счете, управление схемой сводится к тому, является ли базовая структура таблицей или column_family.

В качестве примера я создам две таблицы, используя старую установку Apache Cassandra (2.1.19):

CREATE TABLE student (
  studentid TEXT PRIMARY KEY,
  fname TEXT,
  name TEXT);

CREATE TABLE studentcomp (
  studentid TEXT PRIMARY KEY,
  fname TEXT,
  name TEXT)
WITH COMPACT STORAGE;

Я вставлю по одной строке в каждую таблицу:

INSERT INTO student (studentid, fname, lname) VALUES ('janderson','Jordy','Anderson');
INSERT INTO studentcomp (studentid, fname, lname) VALUES ('janderson','Jordy','Anderson');

А потом посмотрю на таблицы старым инструментом cassandra-cli:

[default@stackoverflow] list student;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: janderson
=> (name=, value=, timestamp=1599248215128672)
=> (name=fname, value=4a6f726479, timestamp=1599248215128672)
=> (name=lname, value=416e646572736f6e, timestamp=1599248215128672)

[default@stackoverflow] list studentcomp;
Using default limit of 100
Using default cell limit of 100
-------------------
RowKey: janderson
=> (name=fname, value=Jordy, timestamp=1599248302715066)
=> (name=lname, value=Anderson, timestamp=1599248302715066)

Вы видите пустое/призрачное значение столбца в первом результате? Это пустое значение столбца было связующим звеном CQL3 между значениями столбца и метаданными таблицы. Если его нет, то CQL нельзя использовать для управления столбцами таблицы.

Компаратор, используемый для преобразования типов, был единственным, что действительно было доступно через Thrift. Это отсутствие контроля/отсутствия доступа к метаданным позволило Cassandra считаться бессхемной в дни, предшествовавшие CQL. Если я запускаю describe studentcomp из cassandra-cli, я вижу используемые компараторы (класс проверки):

Column Metadata:
  Column Name: lname
    Validation Class: org.apache.cassandra.db.marshal.UTF8Type
  Column Name: fname
    Validation Class: org.apache.cassandra.db.marshal.UTF8Type

Но если я попробую describe student, я увижу это:

WARNING: CQL3 tables are intentionally omitted from 'describe' output.
See https://issues.apache.org/jira/browse/CASSANDRA-4377 for details.

Sorry, no Keyspace nor (non-CQL3) ColumnFamily was found with name: student (if this is a CQL3 table, you should use cqlsh instead)

По сути, таблицы и семейства столбцов были разными объектами, помещенными в одно и то же ведро. Добавление WITH COMPACT STORAGE фактически сделало таблицу семейством столбцов. С этим связано отсутствие какого-либо управления схемой (добавление или удаление столбцов), кроме доступа к компараторам.

Изменить 20200905

Можем ли мы как-то/как-нибудь (взломать) удалить столбцы из таблицы?

У вас возможно это получится. Сильвен Лебрейн написал Руководство по переходу на CQL3 Thrift to CQL3, которое будет иметь некоторые необходимые детали для вас. Я также советую прочитать упомянутый выше тикет Jira (CASSANDRA-4377), поскольку это охватывает многие глубокие технические проблемы, которые усложняют это.

person Aaron    schedule 04.09.2020
comment
Можем ли мы как-то/как-нибудь (взломать) удалить столбцы из таблицы. У меня есть старая резервная копия моих системных таблиц перед добавлением столбца. Я подумывал отключить все узлы и восстановить старые sstables из резервной копии в каталоге schema_columns. Но не получилось? - person Manish Khandelwal; 05.09.2020
comment
@ManishKhandelwal Редактирование сделано. Удачи! - person Aaron; 05.09.2020
comment
Попробовал (откат системных таблиц) и преуспел, но я опасаюсь применять в производстве. Я думаю удалить таблицу и воссоздать ее с тем же именем и вставить данные. - person Manish Khandelwal; 06.09.2020