48
Алексей Чумаков [email protected] Skype: alexey.chumakov

Алексей Чумаков. Apache Cassandra на реальном проекте

Embed Size (px)

Citation preview

Page 1: Алексей Чумаков. Apache Cassandra на реальном проекте

Алексей Чумаков[email protected]: alexey.chumakov

Page 2: Алексей Чумаков. Apache Cassandra на реальном проекте

Вкратце

• Немного о NoSQL вцелом

• Что такое Apache Cassandra и для чего она может понадобиться

• Как она устроена изнутри

• Несколько примеров

• Нюансы...

• Администрирование

Page 3: Алексей Чумаков. Apache Cassandra на реальном проекте

НЕМНОГО О NOSQL…

Page 4: Алексей Чумаков. Apache Cassandra на реальном проекте

NoSQL. Зачем?

Page 5: Алексей Чумаков. Apache Cassandra на реальном проекте

Join, group by, count начинают работать медленно на больших объемах данных

BigData – данных много (не помещаются на один сервер) и они все нужны

Необходима репликация данных между датацентрами и их постоянная доступность (availability)

Partitioning/sharding вручную не всегда удобен

А еще хотим гибкую схему данных...

NoSQL. Зачем?

Page 6: Алексей Чумаков. Apache Cassandra на реальном проекте

Pull on Demand vs Push on Change

Page 7: Алексей Чумаков. Apache Cassandra на реальном проекте

CAP-теорема

http://blog.nahurst.com/visual-guide-to-nosql-systems

Page 8: Алексей Чумаков. Apache Cassandra на реальном проекте

ЧТО ТАКОЕ APACHE CASSANDRA?

Page 9: Алексей Чумаков. Apache Cassandra на реальном проекте

История

Организация кластера

(consistent hashing), hinted handoff, read

repair

Структура данных

(SSTables), timestamps

?

Page 10: Алексей Чумаков. Apache Cassandra на реальном проекте

Распределенная и горизонтально масштабируемая

http://techblog.netflix.com/2011/11/benchmarking-cassandra-scalability-on.html

Page 11: Алексей Чумаков. Apache Cassandra на реальном проекте

Добавление новых нодов

• Скачать и распаковать дистрибутив

• Настроить IP

• Указать seed nodes

• Запустить

Page 12: Алексей Чумаков. Apache Cassandra на реальном проекте

Что-то еще?

• Децентрализованная (кольцо, нет master node, нет single point of failure)

• Репликация между нодами и дата-центрами

• Настраиваемая Consistency (Tunable Consistency)

• Низкий уровень вхождения в NoSQL благодаря CQL (Cassandra Query Language)

• Поддержка Hadoop

Page 13: Алексей Чумаков. Apache Cassandra на реальном проекте

И в чем подвох?

• Нет ACID транзакций

• Сложно гарантировать 100% consistency данных

• Нет сложных запросов (никаких like, join, group by)

• Схему данных приходится продумывать исходя из будущих запросов, а не наоборот

Page 14: Алексей Чумаков. Apache Cassandra на реальном проекте

Когда имеет смысл использовать Apache Cassandra?

• Количество операций записи больше, чем чтения

• Данные должны быть постоянно доступны для чтения и записи, несмотря на потерю N нодов

• Анализ поведения пользователя

• Агрегаторы

• Мониторинг

Page 15: Алексей Чумаков. Apache Cassandra на реальном проекте

Когда не нужна C*?

• Данные помещаются в память

• Данные помещаются на одном сервере

• Не предвидится серьезного роста объема данных

• Данные редко модифицируется и возможно реализовать шардинг

Page 16: Алексей Чумаков. Apache Cassandra на реальном проекте

КАК APACHE CASSANDRA УСТРОЕНА ИЗНУТРИ?

Page 17: Алексей Чумаков. Apache Cassandra на реальном проекте

Организация кластера

Page 18: Алексей Чумаков. Apache Cassandra на реальном проекте

Запись в любой доступный нод кластера

Page 19: Алексей Чумаков. Apache Cassandra на реальном проекте

Hinted Handoff

Page 20: Алексей Чумаков. Apache Cassandra на реальном проекте

Read repair

Page 21: Алексей Чумаков. Apache Cassandra на реальном проекте

Anti-entropy repair

• Что будет, если Coordinator Node умрет?

• Лучше запускать по расписанию

• bin/nodetool repair

Page 22: Алексей Чумаков. Apache Cassandra на реальном проекте

Физическая организация данных

• Нет B-Trees

• Используются отсортированные в памяти таблицы фиксированного размера (SSTables)

• SSTable последовательно записываются на диск, а потом объеденяются в отдельном потоке (compaction)

• При удалении физически ничего не меняется, а ставится маркер (tombstone)

Page 23: Алексей Чумаков. Apache Cassandra на реальном проекте

Физическая организация данных

Page 24: Алексей Чумаков. Apache Cassandra на реальном проекте

ЛОГИЧЕСКАЯ СТРУКТУРА ДАННЫХ

= Map<Key, Map<Column, Value>>

Page 25: Алексей Чумаков. Apache Cassandra на реальном проекте

Map<Key, Map<Column, Value>>

Page 26: Алексей Чумаков. Apache Cassandra на реальном проекте

При использовании CQL все очень похоже на RDBMS

CREATE TABLE order_events (

order_id ascii,

operation_time timestamp,

operation_type ascii,

waiter ascii,

changed_menu_items list<ascii>,

PRIMARY KEY (order_id, operation_time)

);

Page 27: Алексей Чумаков. Apache Cassandra на реальном проекте

Но в действительности все немного не так...

Page 28: Алексей Чумаков. Apache Cassandra на реальном проекте

Идемпотентность

• Повторная запись по тому же ключу c теми же значениями ничего не меняет

• Insert == Update

INSERT INTO NerdMovies (movie, director, main_actor, year)

VALUES ('Serenity', 'Joss Whedon', 'Nathan Fillion', 2005);

UPDATE NerdMovies

SET director = 'Joss Whedon',

main_actor = 'Nathan Fillion',

year = 2005

WHERE movie = 'Serenity';

Page 29: Алексей Чумаков. Apache Cassandra на реальном проекте

Распределенные счетчики

• Работают с той же скоростью, что и обычный update

• Не идемпотентны

UPDATE UserActions

SET total = total + 2

WHERE user = B70DE1D0-9908-4AE3-BE34-5573E5B09F14 AND action = 'click';

Page 30: Алексей Чумаков. Apache Cassandra на реальном проекте

НЕСКОЛЬКО ПРИМЕРОВ...

Page 31: Алексей Чумаков. Apache Cassandra на реальном проекте

Нагрузочное тестирование Black Box

Page 32: Алексей Чумаков. Apache Cassandra на реальном проекте

Данные для каждой транзакции

CREATE TABLE transactions (

transaction_id ascii,

transaction_data map<text, text>,

PRIMARY KEY (transaction_id)

);

Page 33: Алексей Чумаков. Apache Cassandra на реальном проекте

Данные для каждой транзакции

CREATE TABLE transaction_metrics (

transaction_id ascii,

tr_type ascii,

time timestamp,

PRIMARY KEY (transaction_id, tr_type)

);

Page 34: Алексей Чумаков. Apache Cassandra на реальном проекте
Page 35: Алексей Чумаков. Apache Cassandra на реальном проекте

Статистика

CREATE TABLE transaction_count (

stat_id ascii,

time_string ascii,

ops_count counter,

PRIMARY KEY (detail_key, time_string)

)

Page 36: Алексей Чумаков. Apache Cassandra на реальном проекте
Page 37: Алексей Чумаков. Apache Cassandra на реальном проекте

А теперь получаем нужный нам промежуток

SELECT time_string, ops_count FROM transaction_count

WHERE stat_id = ‘B_REQ|20140510'

AND time > '2014051003' AND time <= '2014051015'

Page 38: Алексей Чумаков. Apache Cassandra на реальном проекте

Что не стоит делать с C*?

• Пытаться создать очередь на ее основе

• Читать перед записью – в большинстве случаев можно воспользоваться счетчиками или идемпотентностью

• Писать все в один Wide Row или часто удалять данные из него

Page 39: Алексей Чумаков. Apache Cassandra на реальном проекте

НЮАНСЫ

Page 40: Алексей Чумаков. Apache Cassandra на реальном проекте

Очень высокая загрузка CPU

• Слишком большой HEAP

• concurrent_reads/concurrent_writes

• native_transport_max_threads

• rpc_max_threads

Page 41: Алексей Чумаков. Apache Cassandra на реальном проекте

Anti Entropy Repair

• nodetool repair

• Осбенно нужен в тех случаях, когда кластер оказался перегружен

Page 42: Алексей Чумаков. Apache Cassandra на реальном проекте

Amazon EBS volumes

Page 43: Алексей Чумаков. Apache Cassandra на реальном проекте

Слишком Wide Rows

• Запись в Wide Row оказалась в 5 раз медленне, чем в row с разными ключами

• Удаления из Wide Row требуют много памяти во время compaction (TombstoneOverwhelmingException)

• Все записи из Wide Row физически находятся на одном ноде (и его репликах)

Page 44: Алексей Чумаков. Apache Cassandra на реальном проекте

Синхронизация времени между нодами

• Время на нодах (даже в AWS) может быть рассинхронизированно

• Timestamps оказываются неверными

• Данные в итоге тоже

Page 45: Алексей Чумаков. Apache Cassandra на реальном проекте

Bugs

Баги есть!

...но правят их быстро

Page 46: Алексей Чумаков. Apache Cassandra на реальном проекте

Администрирование

• Nodetool – command-line утилита, в которой есть все (или почти все) для администрирования кластера

• DataStax OpsCenter – красивый веб-интерфейс для администрирования, есть Community Edition

Page 47: Алексей Чумаков. Apache Cassandra на реальном проекте

Правильный выбор технологий

VS

Page 48: Алексей Чумаков. Apache Cassandra на реальном проекте

Q & A