Upload
it-people
View
709
Download
4
Embed Size (px)
Citation preview
Краткая историческая справка
• Изначально проект был разработан в недрах Facebook,
• в 2009 году передан фонду Apache Software Foundation.
Факты:
• СУБД Cassandra написана на языке Java,
• использует модель хранения данных на базе семейства столбцов.
Характеристики
• Децентрализованность,
• реплицируемость данных (в т. ч. между датацентрами),
• масштабируемость,
• отказоустойчивость,
• язык запросов,
• настраиваемая консистентность.
Теорема CAP
В любой реализации распределённых вычислений возможно обеспечить не более двух из трёх следующих свойств:
• согласованность данных (consistency) во всех вычислительных узлах в один момент времени данные не противоречат друг другу;
• доступность (availability)любой запрос к распределённой системе завершается корректным откликом;
• устойчивость к разделению (partition tolerance)расщепление распределённой системы на несколько изолированных секций не приводит к некорректности отклика от каждой из секций.
Модель данных SQL
Name Capital ISO Code Currency
USA Washington US USD
Russia Moscow RU RUB
Canada Ottawa CA CAD
China Beijing CN CNY
Table ColumnsPrimary key column
Rows
Модель данных Cassandra
Name Capital ISO Code Currency
USA Washington US USD
Russia Moscow RU RUB
Canada Ottawa CA CAD
China Beijing CN CNY
Column family ColumnsRow Keys
Rows
Модель данных Cassandra
USACapital ISO Code Currency
Washington US USD
RussiaCapital ISO Code Currency
Moscow RU RUB
CanadaCapital ISO Code Currency
Ottawa CA CAD
ChinaCapital ISO Code Currency
Beijing CN CNY
Row Keys
Модель данных Cassandra. Schema-less
USACapital Currency
Washington USD
RussiaCapital ISO Code Currency
Moscow RU RUB
CanadaCapital ISO Code Currency
Ottawa CA CAD
ChinaCapital Currency Time zone
Beijing CNY UTC+8
Строка в Cassandra
RussiaColumnName: Capital ColumnName: ISO Code ColumnName: Currency
Value: Moscow Value: RU Value: RUB
Отсортированы по ColumnName
Строка в Cassandra. Column timestamps
Russia
ColumnName: Capital ColumnName: ISO Code ColumnName: Currency
Value: Moscow Value: RU Value: RUB
Timestamp: 1001 Timestamp: 1004 Timestamp: 1002
Строка в Cassandra. Tomb stones
Russia
ColumnName: Capital ColumnName: ISO Code ColumnName: Currency
Value: Moscow Value: RU TOMBSTONE
Timestamp: 1001 Timestamp: 1004 Timestamp: 1002
Основные запросы
• Чтение колонки в строке по RowKey и ColumnName
• Чтение колонок в строке по RowKey и диапазону имен колонок
• Запись одной или нескольких колонок в строке по RowKey
• Удаление одной или нескольких колонок в строке по RowKey
• …
Token: 10
Token: 0
Token: 15
Token: 25
Token: 30
Работа с кластером
Клиентсовершает запрос к
произвольному узлу кластера
Распределение данных
Token: 10
Token: 0
Russia Column1, Column2, Column3, …
Token('Russia') = 7
Token: 7
#1
#2
#3
#4
#5
Распределение данных. Репликация
Token: 10
Token: 0
Token: 15
Token: 25
Token: 30
Replication factor = 3#1
#2
#3
#4
#5
Распределение данных. Репликация
Token: 10
Token: 0
Token: 15
Token: 25
Token: 30
Replication factor = 3
#1
#2
#3
#4
#5
Распределение данных. Репликация
Token: 10
Token: 0
Russia Column1, Column2, Column3, …
Token('Russia') = 7
Token: 7
Replication factor = 3
#1
#2
#3
#4
#5
Координатор запросов
Клиент
Совершает запрос к произвольному узлу
Опрашивает соответствующие узлы-реплики для получения ответа
Координатор
Запись одной колонки в строку
RowKey = USAColumnName = President Value = ObamaTimestamp = 2009
Replication factor = 1
Token('USA') = 23Token: 25
Token: 15
#1
#2
#3
#4
#5
Координатор запросов
RowKey = USAColumnName = President Value = ObamaTimestamp = 2009
Replication factor = 1#1
#2
#3
#4
#5
Координатор запросов
RowKey = USAColumnName = President Value = ObamaTimestamp = 2009
Replication factor = 1#1
#2
#3
#4
#5
Запись одной колонки в строку
RowKey = USAColumnName = President Value = ObamaTimestamp = 2009
Replication factor = 2
Token('USA') = 23Token: 25
Token: 15
#1
#2
#3
#4
#5
Consistency level
• ONE — координатор отправляет запросы всем узлам-реплик, ожидает ответа от первого же узла и возвращает управление пользователю,
• TWO — то же самое, но координатор дожидается подтверждения от двух первых узлов,
• QUORUM — собирается кворум: координатор дожидается подтверждения записи от более чем половины узлов-реплик, а именно Round(RF / 2) + 1,
• ALL — координатор дожидается подтверждения от всех узлов-реплик.
Запись одной колонки в строку
RowKey = USAColumnName = President Value = ObamaTimestamp = 2009
Replication factor = 3Consistency level = QUORUM
Token('USA') = 23Token: 25
Token: 15
#1
#2
#3
#4
#5
Чтение одной колонки из строки
RowKey = USAColumnName = President
Replication factor = 1Consistency level = ALL
Token('USA') = 23Token: 25
Token: 15
#1
#2
#3
#4
#5
Чтение одной колонки из строки
RowKey = USAColumnName = President
Replication factor = 2Consistency level = ALL
Token('USA') = 23Token: 25
Token: 15
#1
#2
#3
#4
#5
Чтение одной колонки из строки
RowKey = USAColumnName = President
Replication factor = 3Consistency level = QUORUM
Token('USA') = 23Token: 25
Token: 15
#1
#2
#3
#4
#5
Чтение
USA : {President: { Value: Obama, Timestamp: 2009
}}
USA : {President: { Value: Lincoln, Timestamp: 1865
}}
Вычисляется наиболее актуальное значение на основе Timestamp
Чтение целой строки
USA : {President: { Value: Lincoln, Timestamp: 1865
},Currency: {Value: USD,Timestamp: 1794
}}
USA : {President: { Value: Obama, Timestamp: 2013
}}
USA: { President: { … }, Currency: { … } }
Чтение целой строки
USA : {President: { Value: Lincoln, Timestamp: 1865
},Currency: {TOMBSTONETimestamp: 2008
}}
USA : {President: { Value: Obama, Timestamp: 2013
} ,Currency: {Value: USD,Timestamp: 1794
}}
USA: { President: { … } }
Процедуры восстановления данных
• Read repairПри чтении данных более актуальные данные отправляются на узлы-реплики с устаревшими метками.
• Hinted handoffПозволяет сохранить данные на координаторе и отправить соответствующему узлу позже, когда это будет возможно.
• Anti-entropy node repairПроцедура распространения актуальных данных на узлы-реплики, запускаемая вручную.
Основные компоненты узла
• MemTable — таблица данных в памяти, которая позволяет мгновенно отдавать данные. Основана на ConcurrentSkipList.
• SSTable — таблица сохраненная на диск, которая после записи никогда не модифицируется.
Запись значений в узел
SSTables
MemTable
Запрос от координатора
Запись при наступлении порогового условия
Чтение значений из узла
SSTables
MemTable
Запрос от координатора
Ответ координатору
Объединений колонок строки
Уменьшение IO-операций
• Блум-фильтрация
При небольших затратах памяти позволяет отвечать на вопрос вхождения ключа в множество ключей сохранённых на диске. Допускает ложноположительные ответы.
• Row Cache
Кэширует всю строку в памяти.
• Key Cache
Позволяет по значению ключа строку найти его позицию на диске.
Краткая историческая справка
История версий:0.6, Апрель 2010, integrated caching
0.7, Январь 2011, secondary indexes
1.0, Октябрь 2011, integrated compression
1.1, Апрель 2012, self-tuning caches, row-level isolation, CQL
1.2, Январь 2013, atomic batches
2.0, Сентябрь 2013, lightweight transactions, triggers