Возможно ли иметь «локальное» пространство ключей в кластере cassandra с несколькими центрами обработки данных

#cassandra #kubernetes

#cassandra #kubernetes

Вопрос:

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

В моем собственном тесте я настроил два кластера Kubernetes в GCP, каждый из которых служит центром обработки данных Cassandra. В каждом кластере k8s есть 3 узла.

Сначала я настраиваю центр обработки данных DC-WEST и создаю демонстрацию пространства ключей, используя это: CREATE KEYSPACE demo WITH replication = {‘class’: ‘NetworkTopologyStrategy’, ‘DC-WEST’ : 3};

Затем я настроил центр обработки данных DC-EAST, не добавляя никаких используемых пространств ключей.

Чтобы объединить два центра обработки данных, я изменяю переменную CASSANDRA_SEEDS среды в Cassandra StatefulSet YAML, чтобы включить начальные узлы из обоих центров обработки данных (я использую сеть хостов).

Но после этого я замечаю, что пространство ключей demo синхронизируется с DC-EAST, хотя в репликации в пространстве ключей есть только DC-WEST.

 cqlsh> select data_center from system.local
... ;

data_center
-------------
DC-EAST     <-- Note: this is from the DC-EAST datacenter

(1 rows)
cqlsh> desc keyspace demo

CREATE KEYSPACE demo WITH replication = {'class': 'NetworkTopologyStrategy', 'DC-WEST': '3'}  AND durable_writes = true;
  

Итак, мы видим в DC-EAST demo пространство ключей, которое должно быть реплицировано только на DC-WEST! Что я делаю не так?

Ответ №1:

Стратегии репликации Cassandra определяют, где размещаются данные, но фактическая схема (существование таблицы / центров обработки данных / etc) является глобальной.

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

Комментарии:

1. Спасибо за ваш ответ. Я думаю, что это было мое недоразумение. У меня сложилось ошибочное впечатление, что если пространство ключей реплицируется только в пределах определенного DC, другие DC не будут его видеть. Теперь у меня есть правильное понимание, и я могу закрыть вопрос сейчас. Спасибо.

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

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

Ответ №2:

Вы не указали, как вы развернули свой кластер Cassandra в Kubernetes, но похоже, что ваши узлы DC-WEST могут быть настроены так, чтобы говорить, что они есть DC-EAST .

Я бы проверил ConfigMap на наличие заданного состояния DC-WEST . Может быть, оно имеет DC-EAST значение для cassandra-rackdc.properties (?). Дополнительная информация о cassandra-rackdc.properties файле здесь.

Комментарии:

1. Я устанавливаю имя центра обработки данных через переменную среды CASSANDRA_DC в statefulset yaml и подтверждаю, что имя постоянного тока задано правильно для каждого постоянного тока. Реальная проблема заключается в моем непонимании того, как работает Cassandra, как объясняется в ответе Джеффа. Спасибо.