2014-07-09 3 views
1

В Cassandra мы можем «исправить» узел, в котором находится конкретный раздел, чтобы оптимизировать выборки?Размещение данных в определенных узлах в Cassandra

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

Другими словами, это схема, где схема является общей для всех центров обработки данных, но данные никогда не доступны через центры обработки данных. Один из способов сделать это - сделать идентификатор центра обработки данных в качестве ключа раздела. Однако данные конкретного центра обработки данных необходимо/не следует размещать в других центрах обработки данных. Можем ли мы оптимизировать, указав cassandra ключ раздела для сопоставления центров обработки данных?

Является ли пользовательским Partitioner решением для такого использования?

ответ

1

Данные слишком воинственны для тиражирования по всем центрам обработки данных. Поэтому я прибегаю к созданию ключа для каждого центра обработки данных.

CREATE KEYSPACE "MyLocalData_dc1" 
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 3, 'dc2' : 1, dc3:0, dc4: 0}; 

CREATE KEYSPACE "MyLocalData_dc2" 
WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 0, 'dc2' : 3, dc3:1, dc4: 0}; 

Таким образом, MyLocalData порождена датацентре 1 имеет одну резервную копию в датацентре 2. И данные, порожденную datacenter2 поддерживается в центре обработки данных 3. Данные «фиксированной» в центре обработки данных написано в и доступ из. Сетевые задержки устраняются.

2

Чтобы решить эту проблему, вы должны использовать Cassandra для «центра обработки данных». Вы не сможете заставить его обеспечить соблюдение этой осведомленности на уровне строк, но вы можете сделать это на уровне клавишного пространства. Поэтому, если у вас есть определенные пространства ключей, которые, как вам известно, будут доступны только в определенных местах (и обслуживаются конкретными центрами обработки данных), вы можете настроить ваше пространство ключей для репликации соответственно.

В cassandra-topology.properties file вы можете определить, какой из ваших узлов находится в стойке и центре обработки данных. Затем убедитесь, что вы используете snitch (в вашем cassandra.yaml), который будет уважать записи топологии (например: propertyFileSnitch).

Затем, когда вы создаете пространство ключей, можно определить коэффициент репликации на основе каждого центра обработки данных:

CREATE KEYSPACE "Excalibur" 
    WITH REPLICATION = {'class' : 'NetworkTopologyStrategy', 'dc1' : 3, 'dc2' : 2}; 

Чтобы получить клиентские приложения доступ только к определенным датацентров, вы можете указать LOCALread consistency (напр : LOCAL_ONE или LOCAL_QUORUM). Таким образом, ваши клиентские приложения в одной области будут считываться только из определенного центра обработки данных.

данные конкретного дата-центра необходимо/не следует размещать в других данных центров.

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

2

Cassandra определяет, на каком узле, с которого следует хранить строку, используя partioner. Обычно вы используете разделитель, такой как разделитель Murmur3, который распределяет строки эффективно случайным образом и, следовательно, равномерно. Вы можете писать и использовать свой собственный разделитель, на Java. Тем не менее, вы должны быть осторожны в этом. У вас действительно хотите назначить строку определенному узлу.

Смежные вопросы