SlideShare a Scribd company logo
Cassandra. Patterns.
Для кого доклад
Для разработчиков, которые уже знают что
такое Cassandra, для чего она нужна и
попробовали ее использовать.
Cassandra. Internals.
Cassandra имеет внутри структуру хранения,
похожую на lsm tree + wal.
Верхний уровень - memtable (sorted by row
key, btree-like).
Нижний уровень - disk (sstable + bloom filter).
Cassandra. Java point of view.
SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>
Cassandra. Internals. Write path.
Cassandra. Internals. Read path.
Cassandra. Сильные стороны.
Почти линейная масштабируемость
записи и чтения
Не нужно backup, все
восстанавливается на лету
Есть поддержка нескольких ДЦ
Настраиваемая модель (в терминах CAP)
Стабильный продукт с первоклассным community
Нет ACID транзакций
Частое удаление данных это проблема
Нет хороших secondary index*
* Индексы сейчас улучшаются:
https://github.com/xedin/sasi и CASSANDRA-
10661)
Cassandra. Слабые стороны.
Лайки
CREATE TABLE LikedByObject(
user_id bigint,
object_id bigint,
created bigint,
PRIMARY KEY (object_id, user_id)
);
CREATE TABLE LikedByUser(
user_id bigint,
object_id bigint,
created bigint,
type_id int,
PRIMARY KEY ((user_id, type_id), object_id)
);
Лайки
Выбрать всех кто лайкал объект
select * from LikedByObject where object_id = 42
Выбрать все что лайкал пользователь
select * from LikedByUser where user_id = 42 and type_id in (1, 2, 3)
Лайки
Нет secondary index, используем materialized view. Почти всегда
копирование данных более предпочтительно, так как самое
затратное при чтении данных с диска это seek. Прочитать чуть
больше данных, но из одного место быстрее, чем из двух.
Уведомления
Уведомления
CREATE TABLE NotificationByUser (
user_id bigint,
shard_part text,
id timeuuid,
type_id int,
.....
PRIMARY KEY ((user_id, shard_part), id)
) WITH CLUSTERING ORDER BY (id DESC);
CREATE TABLE NotificationByUserAndType (
.....
PRIMARY KEY ((user_id, type_id, shard_part), id)
) WITH CLUSTERING ORDER BY (id DESC);
CREATE TABLE NotificationSeen (
user_id bigint,
id timeuuid,
value boolean,
PRIMARY KEY (user_id, id)
) WITH CLUSTERING ORDER BY (id DESC);
Уведомления
Уведомления всегда отсортированы по времени события, к
которому они относятся. Используем clustering order, чтобы данные
физически хранились в нужном порядке.
Уведомления могут быть непросмотренные и просмотренные.
Выделим мутабельную часть данных в отдельную cf. Это
упрощает процесс обновления данных и API.
Уведомления
CREATE TABLE NotificationByUser (
user_id bigint,
shard_part text,
id timeuuid,
type_id int,
.....
PRIMARY KEY ((user_id, shard_part), id)
) WITH CLUSTERING ORDER BY (id DESC);
У одного пользователя может быть очень много уведомлений.
Таким образом у нас могут появится wide rows. Их нужно избегать
(OOM, additional seeks, вот это вот все). Добавим в partition key
дату.
Partition keys
Как правильно выбрать partition key?
Распределение колонок внутри строки должно быть равномерным
в идеале. В одной строке не должно быть слишком много данных
(wide rows).
Варианты:
Сам ключ
Ключ + timebased часть
Ключ + partition (n of partitions fixed or any)
Partition keys
Лайки. У одного объекта очень редко бывает слишком много
лайков. Object id хороший partition key.
Уведомления. У одного пользователя может быть очень много
уведомлений, так как они накапливаются со временем. User id
плохой partition key. Нужно добавить что-то еще. User id + date.
Можно также сделать предположение, что уведомления более-
менее распределены по дням равномерно, поэтому date подходит.
Partition keys
Лента постов по тегу.
CREATE TABLE TagPosts (
tag text,
partition int,
post_id bigint,
PRIMARY KEY((tag, partition), post_id)
) WITH CLUSTERING ORDER BY (post_id DESC);
Просто tag взять нельзя, потому что распределение имеет
выбросы (тренды) и длинный хвост. Date плохая идея, так как
хвост и тренды не зависят от даты.
Partition keys
Неестественное разбиение данных на любое количество partitions
сложнее. При вставке нужно вычислять partition.
CREATE TABLE TagPostsPartitions (
tag text,
partition int,
post_count counter,
PRIMARY KEY (tag, partition)
) WITH CLUSTERING ORDER BY (partition DESC);
Partition keys
Если вы уверены, что кол-во данных по каждому ключу примерно
одинаково, то вычисление partition может быть простым:
key % n partitions
Partition keys
Вопрос: можно ли делать skinny partitions*?
*skinny partition - в одной партиции одна строка
Ответ: да, если паттерн доступа random и
нет range queries.
CREATE TABLE BlackList (
login text,
created bigint,
PRIMARY KEY (login)
);
Вставка
Используйте batches, только если вам
действительно нужна атомарность
Для производительности используйте
асинхронные операции (в драйвере) с
одиночными запросами*
*http://lostechies.com/ryansvihla/2014/08/28/cassandra-batch-loading-
without-the-batch-keyword/
Удаление
CREATE TABLE Queues (
queue_id bigint,
enqueued timeuuid,
PRIMARY KEY (queue_id, enqueued)
);
Классический anti-pattern!
Удаление
Как и в любом log-structure engine, данные физически сразу не
удаляются. Удаленные данные будут помечены, как tombstone, и
через некоторое время (настраивается) будут физически удалены
при очередном compaction.
Операция DELETE по ключу ввполняется за O(1).
Операция выборки вида:
select * from Queues where queue_id = 42 order by enqueued limit 1
может выполняться за O(n).
Удаление
Думайте про удаление заранее
Старайтесь удалять партиции целиком
Избегайте RMW
Делайте операции идемпотентными и
переписывайте данные
Используйте counter columns
Используйте транзакции осторожно, они
замедляют производительность и все
равно не ACID
Вопросы
https://facebook.com/denis.gabaydulin
(messanger)
gabaden@gmail.com

More Related Content

What's hot

Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Ontico
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
MoscowDataFest
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
Andrei Poliakov
 
Блеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшейБлеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшей
aragozin
 
Apache spark
Apache sparkApache spark
Apache spark
Anton Anokhin
 
Azure for IT pro - TechDays Armenia
Azure for IT pro - TechDays ArmeniaAzure for IT pro - TechDays Armenia
Azure for IT pro - TechDays Armenia
Alexey Bokov
 
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Yandex
 
IBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаков
IBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаковIBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаков
IBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаков
Maxim Zinal
 
презентация
презентацияпрезентация
презентация
Andrey Arbuzov
 
HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...
Alexey Zinoviev
 
BaaS - резервное копирование в облако
BaaS - резервное копирование в облакоBaaS - резервное копирование в облако
BaaS - резервное копирование в облако
Vadim Gabel
 

What's hot (11)

Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
Apache Cassandra. Ещё одно NoSQL хранилище (Владимир Климонтович)
 
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache SparkDF1 - BD - Baranov - Mining Large Datasets with Apache Spark
DF1 - BD - Baranov - Mining Large Datasets with Apache Spark
 
Cassandra db
Cassandra dbCassandra db
Cassandra db
 
Блеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшейБлеск и нищета распределённых кэшей
Блеск и нищета распределённых кэшей
 
Apache spark
Apache sparkApache spark
Apache spark
 
Azure for IT pro - TechDays Armenia
Azure for IT pro - TechDays ArmeniaAzure for IT pro - TechDays Armenia
Azure for IT pro - TechDays Armenia
 
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
Архитектура бесконечного хранилища для пользовательского контента — Артём Сок...
 
IBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаков
IBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаковIBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаков
IBM Cloudant и Apache CouchDB: NoSQL базы данных эпохи облаков
 
презентация
презентацияпрезентация
презентация
 
HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...HappyDev'15 Keynote: Когда все данные станут большими...
HappyDev'15 Keynote: Когда все данные станут большими...
 
BaaS - резервное копирование в облако
BaaS - резервное копирование в облакоBaaS - резервное копирование в облако
BaaS - резервное копирование в облако
 

Viewers also liked

Cassandra database design best practises
Cassandra database design best practisesCassandra database design best practises
Cassandra database design best practises
Sandeep Sharma IIMK Smart City,IoT,Bigdata,Cloud,BI,DW
 
Presentation of Apache Cassandra
Presentation of Apache Cassandra Presentation of Apache Cassandra
Presentation of Apache Cassandra
Nikiforos Botis
 
C* Summit 2013: How Not to Use Cassandra by Axel Liljencrantz
C* Summit 2013: How Not to Use Cassandra by Axel LiljencrantzC* Summit 2013: How Not to Use Cassandra by Axel Liljencrantz
C* Summit 2013: How Not to Use Cassandra by Axel Liljencrantz
DataStax Academy
 
Cassandra at NoSql Matters 2012
Cassandra at NoSql Matters 2012Cassandra at NoSql Matters 2012
Cassandra at NoSql Matters 2012
jbellis
 
Learning Cassandra
Learning CassandraLearning Cassandra
Learning Cassandra
Dave Gardner
 
Value Proposition Design
Value Proposition DesignValue Proposition Design
Value Proposition Design
Yves Pigneur
 

Viewers also liked (6)

Cassandra database design best practises
Cassandra database design best practisesCassandra database design best practises
Cassandra database design best practises
 
Presentation of Apache Cassandra
Presentation of Apache Cassandra Presentation of Apache Cassandra
Presentation of Apache Cassandra
 
C* Summit 2013: How Not to Use Cassandra by Axel Liljencrantz
C* Summit 2013: How Not to Use Cassandra by Axel LiljencrantzC* Summit 2013: How Not to Use Cassandra by Axel Liljencrantz
C* Summit 2013: How Not to Use Cassandra by Axel Liljencrantz
 
Cassandra at NoSql Matters 2012
Cassandra at NoSql Matters 2012Cassandra at NoSql Matters 2012
Cassandra at NoSql Matters 2012
 
Learning Cassandra
Learning CassandraLearning Cassandra
Learning Cassandra
 
Value Proposition Design
Value Proposition DesignValue Proposition Design
Value Proposition Design
 

Similar to Cassandra design patterns

django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresqlOleg Churkin
 
физическая структура хранения артемов Ready
физическая структура хранения артемов Readyфизическая структура хранения артемов Ready
физическая структура хранения артемов Readyrit2010
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовAlex.Kolonitsky
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
Nikolay Samokhvalov
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuningcollabock
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеVolha Banadyseva
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
Ontico
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Ontico
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XC
PostgreSQL-Consulting
 
Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3
Timur Shemsedinov
 
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Ontico
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Ivan Muratov
 
hl++ Rubtsov
hl++ Rubtsovhl++ Rubtsov
hl++ RubtsovOntico
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.
MageCloud
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
Rawan Qurmet
 
DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.
mikhaelsmirnov
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationNikolay Samokhvalov
 
Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"
railsclub
 
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Ontico
 

Similar to Cassandra design patterns (20)

django-and-postgresql
django-and-postgresqldjango-and-postgresql
django-and-postgresql
 
физическая структура хранения артемов Ready
физическая структура хранения артемов Readyфизическая структура хранения артемов Ready
физическая структура хранения артемов Ready
 
Оптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросовОптимизации скорости выполнения запросов
Оптимизации скорости выполнения запросов
 
#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1#PostgreSQLRussia в банке Тинькофф, доклад №1
#PostgreSQLRussia в банке Тинькофф, доклад №1
 
Query perfomance tuning
Query perfomance tuningQuery perfomance tuning
Query perfomance tuning
 
Алексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проектеАлексей Чумаков. Apache Cassandra на реальном проекте
Алексей Чумаков. Apache Cassandra на реальном проекте
 
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...ObjectManager, или как работать с большим количеством объектов на карте, Мари...
ObjectManager, или как работать с большим количеством объектов на карте, Мари...
 
Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)Что такое Postgresql (Максим Богук)
Что такое Postgresql (Максим Богук)
 
Максим Богук. Postgres-XC
Максим Богук. Postgres-XCМаксим Богук. Postgres-XC
Максим Богук. Postgres-XC
 
Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3Node.js for enterprise 2021 - JavaScript Fwdays 3
Node.js for enterprise 2021 - JavaScript Fwdays 3
 
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
Безболезненный Fallback cache на Scala / Олег Нижников (Tinkoff.ru)
 
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...Time series data in a relational database. TimescaleDB and PipelineDB extensi...
Time series data in a relational database. TimescaleDB and PipelineDB extensi...
 
Nosql and Mongodb
Nosql and MongodbNosql and Mongodb
Nosql and Mongodb
 
hl++ Rubtsov
hl++ Rubtsovhl++ Rubtsov
hl++ Rubtsov
 
MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.MySQL: Есть ли жизнь после 1 млрд. записей.
MySQL: Есть ли жизнь после 1 млрд. записей.
 
MySQL Optimization. Russian
MySQL Optimization. RussianMySQL Optimization. Russian
MySQL Optimization. Russian
 
DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.DBD lection 4. Big Data, NoSQL. In Russian.
DBD lection 4. Big Data, NoSQL. In Russian.
 
SAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentationSAMag2007 Conference: PostgreSQL 8.3 presentation
SAMag2007 Conference: PostgreSQL 8.3 presentation
 
Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"Сергей Париев - "обработка дедлоков в MySql"
Сергей Париев - "обработка дедлоков в MySql"
 
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
Проектирование высоконагруженного масштабируемого веб-сервиса в облаке на при...
 

Cassandra design patterns

  • 2. Для кого доклад Для разработчиков, которые уже знают что такое Cassandra, для чего она нужна и попробовали ее использовать.
  • 3. Cassandra. Internals. Cassandra имеет внутри структуру хранения, похожую на lsm tree + wal. Верхний уровень - memtable (sorted by row key, btree-like). Нижний уровень - disk (sstable + bloom filter).
  • 4. Cassandra. Java point of view. SortedMap<RowKey, SortedMap<ColumnKey, ColumnValue>>
  • 7. Cassandra. Сильные стороны. Почти линейная масштабируемость записи и чтения Не нужно backup, все восстанавливается на лету Есть поддержка нескольких ДЦ Настраиваемая модель (в терминах CAP) Стабильный продукт с первоклассным community
  • 8. Нет ACID транзакций Частое удаление данных это проблема Нет хороших secondary index* * Индексы сейчас улучшаются: https://github.com/xedin/sasi и CASSANDRA- 10661) Cassandra. Слабые стороны.
  • 9. Лайки CREATE TABLE LikedByObject( user_id bigint, object_id bigint, created bigint, PRIMARY KEY (object_id, user_id) ); CREATE TABLE LikedByUser( user_id bigint, object_id bigint, created bigint, type_id int, PRIMARY KEY ((user_id, type_id), object_id) );
  • 10. Лайки Выбрать всех кто лайкал объект select * from LikedByObject where object_id = 42 Выбрать все что лайкал пользователь select * from LikedByUser where user_id = 42 and type_id in (1, 2, 3)
  • 11. Лайки Нет secondary index, используем materialized view. Почти всегда копирование данных более предпочтительно, так как самое затратное при чтении данных с диска это seek. Прочитать чуть больше данных, но из одного место быстрее, чем из двух.
  • 13. Уведомления CREATE TABLE NotificationByUser ( user_id bigint, shard_part text, id timeuuid, type_id int, ..... PRIMARY KEY ((user_id, shard_part), id) ) WITH CLUSTERING ORDER BY (id DESC); CREATE TABLE NotificationByUserAndType ( ..... PRIMARY KEY ((user_id, type_id, shard_part), id) ) WITH CLUSTERING ORDER BY (id DESC); CREATE TABLE NotificationSeen ( user_id bigint, id timeuuid, value boolean, PRIMARY KEY (user_id, id) ) WITH CLUSTERING ORDER BY (id DESC);
  • 14. Уведомления Уведомления всегда отсортированы по времени события, к которому они относятся. Используем clustering order, чтобы данные физически хранились в нужном порядке. Уведомления могут быть непросмотренные и просмотренные. Выделим мутабельную часть данных в отдельную cf. Это упрощает процесс обновления данных и API.
  • 15. Уведомления CREATE TABLE NotificationByUser ( user_id bigint, shard_part text, id timeuuid, type_id int, ..... PRIMARY KEY ((user_id, shard_part), id) ) WITH CLUSTERING ORDER BY (id DESC); У одного пользователя может быть очень много уведомлений. Таким образом у нас могут появится wide rows. Их нужно избегать (OOM, additional seeks, вот это вот все). Добавим в partition key дату.
  • 16. Partition keys Как правильно выбрать partition key? Распределение колонок внутри строки должно быть равномерным в идеале. В одной строке не должно быть слишком много данных (wide rows). Варианты: Сам ключ Ключ + timebased часть Ключ + partition (n of partitions fixed or any)
  • 17. Partition keys Лайки. У одного объекта очень редко бывает слишком много лайков. Object id хороший partition key. Уведомления. У одного пользователя может быть очень много уведомлений, так как они накапливаются со временем. User id плохой partition key. Нужно добавить что-то еще. User id + date. Можно также сделать предположение, что уведомления более- менее распределены по дням равномерно, поэтому date подходит.
  • 18. Partition keys Лента постов по тегу. CREATE TABLE TagPosts ( tag text, partition int, post_id bigint, PRIMARY KEY((tag, partition), post_id) ) WITH CLUSTERING ORDER BY (post_id DESC); Просто tag взять нельзя, потому что распределение имеет выбросы (тренды) и длинный хвост. Date плохая идея, так как хвост и тренды не зависят от даты.
  • 19. Partition keys Неестественное разбиение данных на любое количество partitions сложнее. При вставке нужно вычислять partition. CREATE TABLE TagPostsPartitions ( tag text, partition int, post_count counter, PRIMARY KEY (tag, partition) ) WITH CLUSTERING ORDER BY (partition DESC);
  • 20. Partition keys Если вы уверены, что кол-во данных по каждому ключу примерно одинаково, то вычисление partition может быть простым: key % n partitions
  • 21. Partition keys Вопрос: можно ли делать skinny partitions*? *skinny partition - в одной партиции одна строка Ответ: да, если паттерн доступа random и нет range queries. CREATE TABLE BlackList ( login text, created bigint, PRIMARY KEY (login) );
  • 22. Вставка Используйте batches, только если вам действительно нужна атомарность Для производительности используйте асинхронные операции (в драйвере) с одиночными запросами* *http://lostechies.com/ryansvihla/2014/08/28/cassandra-batch-loading- without-the-batch-keyword/
  • 23. Удаление CREATE TABLE Queues ( queue_id bigint, enqueued timeuuid, PRIMARY KEY (queue_id, enqueued) ); Классический anti-pattern!
  • 24. Удаление Как и в любом log-structure engine, данные физически сразу не удаляются. Удаленные данные будут помечены, как tombstone, и через некоторое время (настраивается) будут физически удалены при очередном compaction. Операция DELETE по ключу ввполняется за O(1). Операция выборки вида: select * from Queues where queue_id = 42 order by enqueued limit 1 может выполняться за O(n).
  • 25. Удаление Думайте про удаление заранее Старайтесь удалять партиции целиком
  • 26. Избегайте RMW Делайте операции идемпотентными и переписывайте данные Используйте counter columns Используйте транзакции осторожно, они замедляют производительность и все равно не ACID