Apache Cassandra

Системы хранения данных NoSQL составляют гибкую и масштабируемую альтернативу реляционным базам данных, и один из наиболее популярных вариантов среди множества таких систем - это Apache Cassandra, которая является распределенной и децентрализованной системой хранения данных с открытым исходным кодом. Она обеспечивает высокую скорость доступа к данным без единой точки отказа. К характерным особенностям Cassandra стоит отнести: 

  • Высокая степенью масштабируемости, что позволяет работать с большими данными 
  • Отсутствие единой точки отказа, что важно для бизнеса 
  • Высокая производительность  
  • Гибкая схема хранения данных, позволяет хранить  структурированные, частично структурированные и неструктурированные данные.  
  • Легкое распределение данных  за счет репликации данных между несколькими центрами обработки данных. 
  • Поддержка транзакций (ACID). 
  • Очень быстрая запись данных
  • Может хранить сотни терабайт данных, без ущерба для эффективности чтения
  • Наличие драйверов для всех популярных языков программирования (C++, Java, PHP, Go, Scala, Rust, Python, Perl и др)

Архитектура кластера Cassandra показана на рисунке ниже. Она состоит из нескольких узлов и распределяет данные между этими узлами). 

Для распределения элементов данных по узлам Cassandra использует последовательное хэширование. Проще говоря, Cassandra использует хэш-алгоритм для вычисления хэш-значений ключей каждого элемента данных, хранящегося в Cassandra (имя столбца, ID строки и т.п.). Диапазон хэш-значений или все возможные хэш-значения (т.н. пространство ключей) распределяется между узлами кластера Cassandra. Затем Cassandra назначает каждому элементу данных свой узел, и этот узел отвечает за хранение и управление этим элементом данных. Такая архитектура предоставляет следующие возможности: 

  • Cassandra распределяет данные между узлами прозрачно для пользователей. Любой узел может принимать любой запрос (чтение, запись или удаление), и если данные хранятся не в этом узле, перенаправляет его в нужный узел; 
  • пользователи могут определить необходимое количество реплик, и Cassandra прозрачно обеспечит создание реплик и управление ими; 
  • настраиваемая согласованность: при хранении и считывании данных пользователи могут выбирать уровень согласованности по каждой операции. Например, если при записи или чтении используется уровень согласованности «кворум», то данные записываются и считываются более чем из половины узлов кластера. Поддержка настраиваемой согласованности позволяет выбрать уровень согласованности, наиболее подходящий для данного случая; 
  • Cassandra обеспечивает очень быструю запись, более быструю, чем чтение, со скоростью передачи данных порядка 80-360 МБ/с на узел. Это достигается с помощью двух подходов: 
  • Cassandra хранит большую часть данных в оперативной памяти ответственного узла, и любые обновления выполняются в памяти, а затем записываются в файловую систему ленивым методом. Однако во избежание потери данных Cassandra регистрирует все транзакции в журнале фиксации транзакций на диске. В отличие от обновления элементов данных на диске, записи в журналы фиксации могут только добавляться, что исключает задержку вращения диска. 
  • если не требуется полная согласованность записей, Cassandra записывает данные в достаточное число узлов без разрешения конфликтов несоответствия, которые разрешаются только при первом считывании. Этот процесс называется «ремонтом при чтении». 

Результирующая архитектура хорошо масштабируется. Можно построить кластер Cassandra с десятками или сотнями узлов, способный обрабатывать терабайты или петабайты данных. Но распределенные системы имеют свои недостатки, и масштабирование почти никогда не дается даром. Переходя от реляционных баз данных к Cassandra, пользователь может столкнуться со многими сюрпризами.  

Основы работы с cqlsh и языком CQL 

Cassandra поддерживает несколько интерфейсов. С ней можно работать по протоколу Thrift, который считается устаревшим, а также по новому протоколу CQL, название которого совпадает с названием языка запросов. Для работы с Cassandra воспользуемся утилитой cqlsh. 
Создадим новую базу данных (в терминологии Cassandra - пространство ключей (keyspace)) и выберем созданную: 

KEYSPACE create test WITH replication =
{'class':'SimpleStrategy', 'replication_factor':2};
use test;


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

create table todo_list (
    id int,
    description text,
    primary key(id)
);

Заполним ее какими-нибудь данными:

insert into todo_list (id, description) values (1,'Item 1');
insert into todo_list (id, description) values (2,'Item 2');
insert into todo_list (id, description) values (3,'Item 3');

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

SELECT * FROM todo_list;

id  | description
----+-------------
1   |      Item 1
2   |      Item 2
3   |      Item 3


Для получения записи с ключем id=2 достаточно написать запрос:

 SELECT * FROM todo_list WHERE id = 2;

На первый взгляд все очень похоже на классический SQL, но это не так. Если вы попробуете выбрать запись по какому-нибудь desciption, например так:

SELECT * FROM todo_list WHERE description = 'Item 1';

То вы получите ошибку, это связано с тем, что выбирать можно только проиндексированные данные. Чтобы это исправить создаем индекс

CREATE INDEX ON todo_list (description);

После чего запрос будет работать. Еще одной ключевой особенностью CQL является отсутствие JOIN-ов. Для получения информации про таблицу или пространству ключей можно воспользоваться следующими командами:

DESC TABLE todo_list;
DESC KEYSPACE est; 

Если нужно удалить строку, то пишем инструкцию DELETE:

DELETE FROM todo_list WHERE id = 1; 

Для удаления таблицы есть инструкция:

DROP TABLE todo_list; 

Для более детальной информации можно воспользоваться официальным руководством.

 

Тэги: cassandra nosql базы данных


 


 
архив

подписка