Статьи

Начало работы с Cassandra: использование CQL API и CQLSH

Apache Cassandra — одна из самых популярных систем распределенных баз данных с открытым исходным кодом. Он был разработан с целью обработки больших объемов данных, хранящихся на многих серверах, распределенных по географическим регионам, обеспечивая высокую масштабируемость и доступность без единой точки отказа. Системы Cassandra могут охватывать несколько центров обработки данных, обеспечивая низкую задержку для всех подключенных клиентов.

Это серия из трех частей, в которой я начну с основ Cassandra, использующих CQLSH для создания таблиц и записей. Затем я объясню различные типы данных, поддерживаемые Cassandra, а затем мы будем использовать клиентскую библиотеку Go для программной обработки операций Cassandra.

В этой первой части я кратко расскажу о том, как модель данных Cassandra представлена ​​вкратце, и выполню основные операции с использованием CQLSH.

В этой серии уроков я предполагаю, что читатели смогут установить Cassandra самостоятельно на свои машины в зависимости от операционной системы.

Модель данных Cassandra следует подходу семейства столбцов , которое легко понять как аналог структуры реляционных таблиц, но в смысле NoSQL. Приведенное ниже описание должно прояснить ситуацию:

Пространство ключей можно рассматривать как самый внешний контейнер для данных в Cassandra. Все данные в Cassandra должны жить в пространстве ключей. Это можно рассматривать как базу данных в RDBMS, которая представляет собой набор таблиц. В случае Cassandra пространство ключей представляет собой набор семейств столбцов.

Семейство столбцов можно рассматривать как набор строк, а каждая строка — это набор столбцов. Это аналог таблицы в RDBMS, но имеет некоторые отличия. Семейства столбцов определены, но для каждой строки необязательно иметь все столбцы, и столбцы можно добавлять или удалять из строки по мере необходимости.

Столбец является основной единицей данных в Кассандре. У него есть три значения: имя ключа или столбца, значение столбца и отметка времени.

Супер столбец — это специальный тип столбца, в котором хранится карта других вложенных столбцов. Это облегчает хранение сложных данных, а также ускоряет выборку данных, поскольку каждое семейство столбцов в 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’, ‘[email protected]’);
cassandra@cqlsh:k1> SELECT * FROM person;
 
 id |
——+——————————+———+———-
 001 |

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

Допустим, мы хотим обновить значение в столбце email до чего-то другого.

1
2
3
4
5
6
cassandra@cqlsh:k1> UPDATE person SET email=’[email protected]’ 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’, ‘[email protected]’);
cassandra@cqlsh:k1> INSERT INTO person (id, name, surname, email) VALUES (‘003’, ‘Harry’, ‘Potter’, ‘[email protected]’);
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 значительно упрощает тестирование и отладку. В следующей части этой серии я расскажу о различных типах данных, предоставленных Кассандрой, и о том, как с ними обращаться.