Download - Cassandra:Курс молодого бойца
За кадром• DevOps–Мониторинг– Настройка кластера– Утилиты обслуживания
• CQL– Уровень абстракции над внутренней
моделью– SQL-like
Историческая справка• Facebook Inbox Message Search• Написана на Java• 2008 – open source• 2017 – version 3.9
Характеристики• Нет единой точки отказа (мульти-
мастер)• Настраиваемая репликация (в т.ч.
между дата-центрами)• Линейная масштабируемость• Настраиваемая консистентность• Интеграция с Hadoop
Cassandra в Контур.Биллинге
• 2 кластера – 6 узлов и 3 узла• 64 GB памяти, используется ~17
GB• 2000 RPS на чтение, 1000 RPS на
запись• ~6 TB данных• Лучше железо, виртуалки – отстой• Всё под Linux
Модель данных SQL
Song Artist Album YearBank Holiday
Blur Parklife 1994
Tell Me Why
The Beatles
A Hard Day’s Night
1964
Go Robot Red Hot Chili Peppers
The Getaway 2016
Hells Bells AC/DC Back In Black 1980
Primary key
ColumnsTable
Rows
Модель данных Cassandra
Row key ColumnsColumn Family
Rows
Song Artist Album YearBank Holiday
Blur Parklife 1994
Tell Me Why
The Beatles
A Hard Day’s Night
1964
Go Robot Red Hot Chili Peppers
The Getaway 2016
Hells Bells AC/DC Back In Black 1980
Модель данных CassandraBank
HolidayArtist Album YearBlur Parklife 1994
The Beatles A Hard Day’s Night
1964
Red Hot Chili Peppers
The Getaway 2016
AC/DC Back In Black 1980
Tell Me Why
Go Robot
Hells Bells
Schema-lessBank
HolidayArtist Album YearBlur Parklife 1994
The Beatles A Hard Day’s Night
1964
Red Hot Chili Peppers
The Getaway 2016
AC/DC Back In Black 1980
Tell Me Why
Go Robot
Hells Bells
• Метка времени (64-битное число)
• Можно управлять в приложении
• Нужен для разрешения конфликтов записи
Про Timestamp
Внутреннее хранилище
SSTables
CassandraNode MemTable
Read
Оптимизация чтения:
• Bloom Filter• Row Caches• Key Caches
Внутреннее хранилище• Быстрая запись
• Медленное чтение
• Свежие записи читаются из памяти (кэш)
• LSM-tree
Read (Quorum)
Побеждает больший Timestamp
Value = 42Timestamp = 10
Value = 1Timestamp = 3
Value = 42Timestamp = 10
Какая настройка круче?• Зависит от сценария
• Строгая согласованность – R + W > RF
• Часто R = W = Quorum
Какая настройка круче?• Зависит от сценария
• Строгая согласованность – R + W > RF
• Часто R = W = Quorum
• Instagram: W = 2, R = 1
Сколько влезет в строчку?• 2 миллиарда колонок
• Или 2 GB данных
• Но на практике – порядки нескольких MB и миллионов строк
@BurlakovNick_2015
@BurlakovNick_2016
ColumnName Valuetimestamp1:id1
action1
timestamp2:id2
action2
timestamp3:id3
action3
ColumnName Valuetimestamp1:id1 event1timestamp2:id2 event2timestamp3:id3 event3
2016_09
timestamp4:id4 event4timestamp5:id5 event5timestamp6:id6 event6
2016_10
Last Write Wins
Node 1 Node 2
Balance=5
Время на реплике отстало
Value=5Timestamp
=42
Value=666Timestamp
=10
Событийная модель
Снимки состояний (Snapshots) для быстрого восстановления состояния
ColumnName Valuetimestamp1:id1
20$
timestamp2:id2
-50$
timestamp3:id3
15$
userId
ТвитыColumnName Valuetimestamp1:id1
tweet_1
timestamp2:id2
tweet_2
timestamp3:id3
tweet_3
userId_date
SELECT *FROM Followers fJOIN Tweets t ON f.FollowId = t.UserIdWHERE f.UserId =
@BurlakovNickORDER BY t.Date
Храним ленту для каждого
пользователяColumnName Valuetimestamp1:id1
tweet_1
timestamp2:id2
tweet_2
timestamp3:id3
tweet_3
userId_date
Выводы• Хороший инструмент
…но не для всех задач
• Подумай о распределении данныхи нагрузки
• Используй неизменяемые события
• Денормализуй данные под запрос
Read (Quorum) – after delete
Timestamp=3
Timestamp=5Tombstone!
Timestamp=5Tombstone!
Timestamp=5Tombstone!