Apache Cassandra — одна из самых популярных систем распределенных баз данных с открытым исходным кодом. Он был разработан с целью обработки больших объемов данных, хранящихся на многих серверах, распределенных по географическим регионам, обеспечивая высокую масштабируемость и доступность без единой точки отказа. Системы Cassandra могут охватывать несколько центров обработки данных, обеспечивая низкую задержку для всех подключенных клиентов.
Это серия из трех частей, в которой я начну с основ Cassandra, использующих CQLSH для создания таблиц и записей. Затем я объясню различные типы данных, поддерживаемые Cassandra, а затем мы будем использовать клиентскую библиотеку Go для программной обработки операций Cassandra.
В этой первой части я кратко расскажу о том, как модель данных Cassandra представлена вкратце, и выполню основные операции с использованием CQLSH.
В этой серии уроков я предполагаю, что читатели смогут установить Cassandra самостоятельно на свои машины в зависимости от операционной системы.
Модель данных Кассандры
Модель данных Cassandra следует подходу семейства столбцов , которое легко понять как аналог структуры реляционных таблиц, но в смысле NoSQL. Приведенное ниже описание должно прояснить ситуацию:
пространство ключей
Пространство ключей можно рассматривать как самый внешний контейнер для данных в Cassandra. Все данные в Cassandra должны жить в пространстве ключей. Это можно рассматривать как базу данных в RDBMS, которая представляет собой набор таблиц. В случае Cassandra пространство ключей представляет собой набор семейств столбцов.
Семейство колонн
Семейство столбцов можно рассматривать как набор строк, а каждая строка — это набор столбцов. Это аналог таблицы в RDBMS, но имеет некоторые отличия. Семейства столбцов определены, но для каждой строки необязательно иметь все столбцы, и столбцы можно добавлять или удалять из строки по мере необходимости.
колонка
Столбец является основной единицей данных в Кассандре. У него есть три значения: имя ключа или столбца, значение столбца и отметка времени.
Супер колонка
Супер столбец — это специальный тип столбца, в котором хранится карта других вложенных столбцов. Это облегчает хранение сложных данных, а также ускоряет выборку данных, поскольку каждое семейство столбцов в Cassandra хранится в одном файле в файловой системе.
Использование консоли Cassandra
CQLSH — это стандартная оболочка для взаимодействия с Cassandra через CQL (Cassandra Query Language). CQL очень похож на SQL (который в основном используется для RDBMS) и, следовательно, позволяет начинающим разработчикам Cassandra очень быстро приступить к работе с ним. CQLSH поставляется с каждым пакетом Cassandra и должен быть уже установлен на вашем компьютере, когда вы установили Cassandra.
Создать пространство ключей
Как мы видели в модели данных, описанной выше, keyspace является внешним контейнером и должно быть создано прежде всего. Чтобы создать его, запустите:
|
1
|
$ cqlsh localhost -e «CREATE KEYSPACE IF NOT EXISTS k1 WITH replication = {‘class’: ‘SimpleStrategy’, ‘replication_factor’: ‘1’} AND durable_writes = true;»
|
В приведенной выше команде я предположил, что ваша Cassandra существует на localhost без какой-либо аутентификации пользователя. Я создал keyspace durable_writes с именем k1 с durable_writes политикой replication и политики durable_writes .
Если вы определили аутентификацию пользователя, вы можете запустить:
|
1
|
$ cqlsh -u <username> -p <password> localhost -e «CREATE KEYSPACE IF NOT EXISTS k1 WITH replication = {‘class’: ‘SimpleStrategy’, ‘replication_factor’: ‘1’} AND durable_writes = true;»
|
В приведенной выше команде замените <username> и <password> своими учетными данными для аутентификации.
Выполнение такой команды может быть немного громоздким. Другой способ — запустить приглашение CQLSH, а затем выполнить запросы непосредственно внутри него.
|
1
2
3
4
5
|
$ cqlsh -u <username> -p <password> localhost
Connected to Test Cluster at 127.0.0.1:9042.
[cqlsh 5.0.1 |
Use HELP for help.
cassandra@cqlsh> CREATE KEYSPACE IF NOT EXISTS k1 WITH replication = {‘class’: ‘SimpleStrategy’, ‘replication_factor’: ‘1’} AND durable_writes = true;
|
В дальнейшем я буду использовать вышеуказанный метод выполнения запросов. Перед выполнением любого другого запроса нам нужно сообщить CQLSH, какое пространство ключей следует использовать.
|
1
2
|
cassandra@cqlsh> USE k1;
cassandra@cqlsh:k1>
|
Коэффициент replication_factor для пространства ключей может быть изменен, чтобы соответствовать количеству репликации, необходимому для class репликации.
|
1
2
|
cassandra@cqlsh:k1> ALTER KEYSPACE «k1» WITH REPLICATION =
{ ‘class’ : ‘SimpleStrategy’, ‘replication_factor’ : 3 };
|
Создать и изменить таблицу
Таблица эквивалентна семейству столбцов в Кассандре. Cassandra поддерживает множество различных типов данных для хранения данных, о которых я подробно расскажу в следующей части этого урока. Чтобы создать таблицу, просто запустите команду CREATE TABLE .
|
1
2
3
4
5
|
cassandra@cqlsh:k1> CREATE TABLE person (
id text,
name text,
surname text,
PRIMARY KEY (id));
|
Чтобы проверить, как выглядит структура таблицы после ее создания:
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
|
cassandra@cqlsh:k1> DESCRIBE person;
CREATE TABLE k1.person (
id text PRIMARY KEY,
name text,
surname text
) WITH bloom_filter_fp_chance = 0.01
AND caching = {‘keys’: ‘ALL’, ‘rows_per_partition’: ‘NONE’}
AND comment = »
AND compaction = {‘class’: ‘org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy’, ‘max_threshold’: ’32’, ‘min_threshold’: ‘4’}
AND compression = {‘chunk_length_in_kb’: ’64’, ‘class’: ‘org.apache.cassandra.io.compress.LZ4Compressor’}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = ’99PERCENTILE’;
|
Теперь предположим, что мы хотим изменить таблицу для хранения электронной почты этого человека.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
|
cassandra@cqlsh:k1> ALTER TABLE person ADD email text;
cassandra@cqlsh:k1> DESCRIBE person;
CREATE TABLE k1.person (
id text PRIMARY KEY,
email text,
name text,
surname text
) WITH bloom_filter_fp_chance = 0.01
AND caching = {‘keys’: ‘ALL’, ‘rows_per_partition’: ‘NONE’}
AND comment = »
AND compaction = {‘class’: ‘org.apache.cassandra.db.compaction.SizeTieredCompactionStrategy’, ‘max_threshold’: ’32’, ‘min_threshold’: ‘4’}
AND compression = {‘chunk_length_in_kb’: ’64’, ‘class’: ‘org.apache.cassandra.io.compress.LZ4Compressor’}
AND crc_check_chance = 1.0
AND dclocal_read_repair_chance = 0.1
AND default_time_to_live = 0
AND gc_grace_seconds = 864000
AND max_index_interval = 2048
AND memtable_flush_period_in_ms = 0
AND min_index_interval = 128
AND read_repair_chance = 0.0
AND speculative_retry = ’99PERCENTILE’;
|
Вставить и обновить данные
Вставка данных в таблицу Cassandra с использованием CQL довольно проста.
|
01
02
03
04
05
06
07
08
09
10
11
12
|
cassandra@cqlsh:k1> SELECT * FROM person;
id |
—-+——-+——+———
(0 rows)
cassandra@cqlsh:k1> INSERT INTO person (id, name, surname, email) VALUES (‘001’, ‘Shalabh’, ‘Aggarwal’, ‘contact@shalabhaggarwal.com’);
cassandra@cqlsh:k1> SELECT * FROM person;
id |
——+——————————+———+———-
001 |
|
В этой таблице у нас есть все поля только для одного типа данных. Все становится немного сложнее, когда мы используем разные типы данных или составные типы данных. Это будет обсуждение в следующей части этой серии.
Допустим, мы хотим обновить значение в столбце email до чего-то другого.
|
1
2
3
4
5
6
|
cassandra@cqlsh:k1> UPDATE person SET email=’shalabh.agrwal@gmail.com’ WHERE id=’001′;
cassandra@cqlsh:k1> SELECT * FROM person;
id |
——+—————————+———+———-
001 |
|
Запрос данных
Данные в таблице могут быть запрошены просто с помощью SELECT .
Давайте вставим еще несколько записей и запросим их.
|
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
cassandra@cqlsh:k1> INSERT INTO person (id, name, surname, email) VALUES (‘002’, ‘John’, ‘Doe’, ‘john@example.com’);
cassandra@cqlsh:k1> INSERT INTO person (id, name, surname, email) VALUES (‘003’, ‘Harry’, ‘Potter’, ‘harry@example.com’);
cassandra@cqlsh:k1> SELECT * from person;
id |
——+—————————+———+———-
002 |
001 |
003 |
(3 rows)
cassandra@cqlsh:k1> SELECT name FROM person WHERE id=’001′;
name
———
Shalabh
(1 rows)
cassandra@cqlsh:k1> SELECT name FROM person WHERE id IN (‘001’, ‘002’);
name
———
Shalabh
John
(2 rows)
|
Также могут использоваться более сложные операторы запросов, такие как операторы неравенства, или несколько условий WHERE могут быть объединены с использованием AND / OR и т. Д.
Вывод
Cassandra является одной из самых популярных систем баз данных NoSQL и является лучшей сборкой для использования в распределенных средах. Работа с Cassandra довольно проста для новичков, обладающих некоторыми знаниями в области РСУБД и SQL.
CQL в некоторой степени очень похож на SQL, а CQLSH значительно упрощает тестирование и отладку. В следующей части этой серии я расскажу о различных типах данных, предоставленных Кассандрой, и о том, как с ними обращаться.