44
Введение в Cassandra

Евгений Тихонов "Введение в Cassandra". Выступление на Cassandrd conf 2013

Embed Size (px)

Citation preview

Введение в Cassandra

Краткая историческая справка

• Изначально проект был разработан в недрах 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

Token: 15

Token: 25

Token: 30

#1

#2

#3

#4

#5

Распределение данных

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

Запрос от координатора

Ответ координатору

Объединений колонок строки

Запись значений в узел

Запись в CommitLog

MemTable

Запрос от координатора

SSTables

Уменьшение 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