Объясню это простым примером. Ключевое пространство в кассандре эквивалентно имени схемы базы данных в СУБД.
Сначала нужно создать пространство ключей -
CREATE KEYSPACE MYKEYSPACE WITH REPLICATION = {
'class' : 'SimpleStrategy',
'replication_factor' : 3
};
Позволяет создать простую таблицу -
CREATE TABLE USER_BY_USERID(
userid int,
name text,
email text,
PRIMARY KEY(userid, name)
) WITH CLUSTERING ORDER BY(name DESC);
В этом примере userid
является ключом разделов и имя кластеризация ключа. Раздел также называется ключом строки, этот ключ определяет, какая строка узла будет сохранена.
Ваш первый вопрос -
Я не могу понять, как будет разделена эти данные?
Данные будут разбиты на разделы на основе ключа раздела. По умолчанию C * использует Murmur3partitioner
. Вы можете изменить разделитель в файле конфигурации cassandra.yaml. Как происходит разделение, также зависит от вашей конфигурации. Вы можете указать диапазон токенов для каждого узла, например, посмотрите ниже файл конфигурации cassandra.yaml. Я задал 6 узлов из вашего вопроса.
cassandra.yaml для узла 0:
cluster_name: 'MyCluster'
initial_token: 0
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 198.211.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
cassandra.yaml для узла 1:
cluster_name: 'MyCluster'
initial_token: 3074457345618258602
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 192.241.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
cassandra.yaml для узла 2:
cluster_name: 'MyCluster'
initial_token: 6148914691236517205
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 37.139.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
.... ... Node3 ...... Node4 ....
cassandra.yaml для узла 5:
cluster_name: 'MyCluster'
initial_token: {some large number}
seed_provider:
- seeds: "198.211.xxx.0"
listen_address: 37.139.xxx.0
rpc_address: 0.0.0.0
endpoint_snitch: RackInferringSnitch
позволяет принять эту вставку заявление -
INSERT INTO USER_BY_USERID VALUES(
1,
"Darth Veder",
"[email protected]"
);
Разметка вычислит хэш ключа секционирования (в приведенном выше примере идентификатор пользователя - 1), и решает, какой узел будет сохранен в этой строке. Предположим, что рассчитанный хеш - это что-то 12345, эта строка будет сохранена в Node 0 (найдите значение initial_token для Node0 в приведенной выше конфигурации).
Полная конфигурация cassandra.yaml configCassandra_yaml_r
Вы можете пройти через этот deployCalcTokens знать, как генерировать маркеры.
Второй вопрос -
как получает данные реплицируются?
В зависимости от стратегии репликации и коэффициента репликации данные реплицируются на каждом узле. вам нужно указать коэффициент репликации и стратегию репликации при создании пространства ключей. Например, в приведенном выше примере я использовал SimpleStrategy
в качестве стратегии репликации. Эта стратегия подходит для небольших кластеров. Для геологически распределенного приложения вы можете использовать NetworkTopologyStrategy
. replication_factor указывает, сколько копий строки будет создано, в этом примере будут созданы три копии каждой строки. С простой стратегией, cassandra будет использовать по часовой стрелке для копирования строки.
В приведенном выше примере строка сохраняется в Node0, и тот же узел копируется на узлах Node1 и Node2. Давайте возьмем другой пример -
INSERT INTO USER_BY_USERID VALUES(
448454,
"Obi wan kenobi",
"[email protected]"
);
Для идентификатора пользователя 448454, вычисленный хэш сказать 3074457345618258609, поэтому эта строка будет экономить на Node2 (обратите внимание на initial_token значение для узла 2 в указанной выше конфигурации), а также копируются по часовой стрелке до Node3 и Node4 (помните, что мы определили коэффициент репликации 3, поэтому только три копии Noe2, Node3, Node4).
Надеюсь, это поможет.
спасибо большое @Gunwant. Ваш ответ очень помог. –