Apache Cassandra: описание директорий, язык CQL, утилита cqlsh

Автор: | 03/04/2015

Cassandra-LogoПрежде, чем продолжать знакомство с Apache Cassandra – давайте посмотрим – какие каталоги и файлы идут “в комплекте”.

Так как при установке deb-пакетом они разбросаны по системе – установим скомпилированную версию.

Со страницы загрузок выбираем зеркало и загружаем файл:

$ wget http://apache.cp.if.ua/cassandra/2.0.14/apache-cassandra-2.0.14-bin.tar.gz

Распаковываем:

$ tar xfp apache-cassandra-2.0.14-bin.tar.gz

Структура каталогов Apache Cassadnra выглядит так:

$ tree -d -L 1 apache-cassandra-2.0.14
apache-cassandra-2.0.14
├── bin
├── conf
├── interface
├── javadoc
├── lib
├── pylib
└── tools
  • bin – содержит исполняемые файлы для управления сервером Cassandra, клиент интерфейса командной строки (CLI), различные утилиты (такие как nodetool для управления нодами кластера); при установке из репозитория – большая часть этих утилит (cqlshnodetool) находятся в /usr/bin/, а cassandra – в /usr/sbin/;
  • conf – файлы конфигурации Cassandracassandra.yaml – основной файл конфигурации сервера, storage-conf.xml отвечает за создание и настройку хранилища данных, файлы настройки авторизации, файл настроек log4j для управления логами; при установке из репозитория – они обычно расположены в /etc/cassandra/;
  • interface – содержит один файл cassandra.thrift, который предоставляет API для клиентов, описанный с помощью Thrift;
  • javadoc – документация, созданная с помощью JavaDoc; включает в себя только содержимое комментариев из Java-кода, и не является полноценной документацией по Cassandra;
  • lib – содержит внешние библиотеки, необходимые для работы Cassandra;
  • pylib – Python-драйвер для Cassandra; может быть установлен отсюда, либо из PIP (pip install cassandra-driver);
  • tools – некоторые утилиты, например – cassandra-stress для нагрузочного тестирования; при установке из репозитория – находятся в каталоге /usr/bin/.

При установке скомпилированной версии – перед запуском создайте и установите владельца для каталогов:

# mkdir /var/log/cassandra/
# mkdir /var/lib/cassandra/
# chown -R setevoy:setevoy /var/log/cassandra/
# chown -R setevoy:setevoy /var/lib/cassandra/

Замените setevoy на пользователя, от имени которого будет запускаться Cassandra.

Теперь можно запускать сервер:

$ cd apache-cassandra-2.0.14/
$ ./bin/cassandra -f

Cassandra CLI и cqlsh

Для управления сервером и нодами можно использовать имеющуюся утилиту командной строки cassandra-cli (которая использует упомянутый выше Thrift-сервер):

$ ./bin/cassandra-cli
Connected to: "Test Cluster" on 127.0.0.1/9160
Welcome to Cassandra CLI version 2.0.14

Но она уже считается устаревшей:

The CLI is deprecated and will be removed in Cassandra 3.0

И поэтому используем утилиту cqlsh:

$ ./bin/cqlsh
Connected to Test Cluster at localhost:9160.
[cqlsh 4.1.1 | Cassandra 2.0.14 | CQL spec 3.1.1 | Thrift protocol 19.39.0]
Use HELP for help.
cqlsh>

Cassandra используется язык запросов CQL (Cassandra Query Language).

Подсказка по командам

cqlsh> ?

Documented shell commands:
===========================
CAPTURE      COPY  DESCRIBE  EXPAND  SHOW    TRACING
CONSISTENCY  DESC  EXIT      HELP    SOURCE

CQL help topics:
================
ALTER                        CREATE_TABLE_OPTIONS  SELECT
...
CREATE_KEYSPACE              PERMISSIONS
CREATE_TABLE                 REVOKE

Для получения подсказки по конкретной команде:

cqlsh> HELP SHOW

        SHOW [cqlsh only]

          Displays information about the current cqlsh session. Can be called in
          the following ways:
...

        SHOW SESSION <sessionid>

          Pretty-prints the requested tracing session.

После установки Cassandra имеет только два пространства ключей (keyspace), которые можно посмотреть так:

cqlsh> describe keyspaces;

system  system_traces

Они являются аналогами баз mysql и performance_shema в MySQL и не предназначены для работы пользователя.

Получить информацию по самому кластеру, к которому вы подключены, можно так:

cqlsh> describe cluster;

Cluster: Test Cluster
Partitioner: Murmur3Partitioner
Snitch: SimpleSnitch

Больше про команду DESCRIBE можно почитать тут>>>,

Пространство ключей (keyspace) – что-то схожее с базой данных в реляционных базах данных, которая содержит описание одной или нескольких семейств колонок (column family), которые, грубо говоря, являются аналогами таблиц в базах типа MySQL.

Для создания нового keyspace – используется команда CREATE KEYSPACE:

cqlsh> CREATE KEYSPACE TestKeyspace WITH REPLICATION = { 'class' : 'SimpleStrategy', 'replication_factor' : 1 };

Классы репликации мы рассмотрим позже.

Переключаемся на работу с новым keyspace:

cqlsh> USE TestKeyspace;
cqlsh:testkeyspace>

Если выполнить DESCRIBE KEYSPACES (можно сократить до DESC KEYSPACES) – среди системных баз появится и наша:

cqlsh:testkeyspace> DESCRIBE KEYSPACES;

system  testkeyspace  system_traces

Для получения более полной информации – укажите имя keyspace:

cqlsh:testkeyspace> describe keyspace testkeyspace;

CREATE KEYSPACE testkeyspace WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': '1'
};

Для создания таблицы (column family) в новой базе – используется команда CREATE TABLE:

cqlsh:testkeyspace> CREATE TABLE users (
                ... firstname text,
                ... lastname text,
                ... age int,
                ... email text,
                ... city text,
                ... PRIMARY KEY (lastname));

Если вызвать desc keyspace testkeyspace ещё раз – мы увидим новую таблицу:

cqlsh:testkeyspace> desc keyspace testkeyspace;

CREATE KEYSPACE testkeyspace WITH replication = {
  'class': 'SimpleStrategy',
  'replication_factor': '1'
};

USE testkeyspace;

CREATE TABLE users (
  lastname text,
  age int,
  city text,
  email text,
  firstname text,
  PRIMARY KEY ((lastname))
) WITH
  bloom_filter_fp_chance=0.010000 AND
  caching='KEYS_ONLY' AND
  comment='' AND
  dclocal_read_repair_chance=0.100000 AND
  gc_grace_seconds=864000 AND
  index_interval=128 AND
  read_repair_chance=0.000000 AND
  replicate_on_write='true' AND
  populate_io_cache_on_flush='false' AND
  default_time_to_live=0 AND
  speculative_retry='99.0PERCENTILE' AND
  memtable_flush_period_in_ms=0 AND
  compaction={'class': 'SizeTieredCompactionStrategy'} AND
  compression={'sstable_compression': 'LZ4Compressor'};

Для изменения таблиц – используется ALTER TABLE. Например – что бы удалить колонку firstname:

cqlsh:testkeyspace> ALTER TABLE users DROP firstname;
cqlsh:testkeyspace> describe keyspace testkeyspace;
...
CREATE TABLE users (
  lastname text,
  age int,
  city text,
  email text,
  PRIMARY KEY ((lastname))
) ...

А что бы удалить всю таблицу – DROP TABLE:

cqlsh:testkeyspace> DROP TABLE users;

Создадим новую таблицу:

cqlsh:testkeyspace> CREATE TABLE users (id int, name text, login text, group text, PRIMARY KEY ((id)));

Добавление данных выполняется помощью INSERT:

cqlsh:testkeyspace> INSERT INTO users (id, name, login, group) VALUES (1, 'User', 'setevoy', 'wheel');

Проверяем:

cqlsh:testkeyspace> SELECT * FROM users;

 id | group | login   | name
----+-------+---------+------
  1 | wheel | setevoy | User

(1 rows)

Или с помощью WHERE:

cqlsh:testkeyspace> SELECT * FROM users WHERE id=1;

 id | group | login   | name
----+-------+---------+------
  1 | wheel | setevoy | User

(1 rows)

Изменить запись можно с помощью UPDATE, указав PRIMARY KEY записи:

cqlsh:testkeyspace> UPDATE users SET group='nobody' where id=1;

Результат:

cqlsh:testkeyspace> SELECT * FROM users WHERE id=1;

 id | group  | login   | name
----+--------+---------+------
  1 | nobody | setevoy | User

(1 rows)

Использование поля, не являющего первичным ключом, вызовет ошибку:

cqlsh:testkeyspace> UPDATE users SET group='nobody' where login='setevoy';
Bad Request: Non PRIMARY KEY login found in where clause

Удалить запись можно с помощью DELETE, так же указав PRIMARY KEY:

cqlsh:testkeyspace> DELETE FROM users where id=1;
cqlsh:testkeyspace> SELECT * FROM users WHERE id=1;

(0 rows)