Cайт. Зачем он и каким должен быть, Алексей Иванов, лекция в Школе вебмастеро...
О.В. Сухорослов "Распределенные хранилища данных"
1. 11 Распределенные хранилища данных
О.В. Сухорослов
oleg.sukhoroslov@gmail.com
11.05.2012
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 1 / 49
2. План лекции
Введение
HBase
Cassandra
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 2 / 49
3. Реляционные СУБД
Фиксированная схема, построчное хранение, ACID, SQL,
абстрагирование от уровня хранения данных
Изначально не ориентированы на работу с большими объемами
данных в распределенном режиме (+ с высокими скоростями
чтения-записи)
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 3 / 49
4. Реляционные СУБД
Фиксированная схема, построчное хранение, ACID, SQL,
абстрагирование от уровня хранения данных
Изначально не ориентированы на работу с большими объемами
данных в распределенном режиме (+ с высокими скоростями
чтения-записи)
Решения по репликации и распределению существующих РСУБД
Попытки исправить ситуацию задним числом
Сложны в установке и сопровождении
Статическое разбиение данных
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 3 / 49
5. Реляционные СУБД
Фиксированная схема, построчное хранение, ACID, SQL,
абстрагирование от уровня хранения данных
Изначально не ориентированы на работу с большими объемами
данных в распределенном режиме (+ с высокими скоростями
чтения-записи)
Решения по репликации и распределению существующих РСУБД
Попытки исправить ситуацию задним числом
Сложны в установке и сопровождении
Статическое разбиение данных
Большой частью функциональности приходится жертвовать
Join, сложные запросы, триггеры, представления, внешние ключи
и контроль ссылочной целостности
Становятся очень дорогими в распределенном режиме или вообще
не работают
Не удовлетворяют высоким требованиям по скорости
чтения-записи
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 3 / 49
6. Альтернативные решения (aka NoSQL1 )
Изначально имеют распределенную архитектуру, ориентированную
на горизонтальное масштабирование путем добавления новых
узлов
Нарушают классические принципы (нормализация данных,
фиксированная схема, ACID) и отказываются от части
функциональности РСУБД (join, вторичные индексы)
Для большого класса задач позволяют делать то, чего не могут
РСУБД
Хранить и обеспечивать быстрый, масштабируемый доступ к очень
большим таблицам на кластерах из массовых серверов
1
http://en.wikipedia.org/wiki/NoSQL_(concept)
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 4 / 49
7. Пример: webtable
Таблица, хранящая загруженные поисковым роботом страницы и
их атрибуты
Количество записей в таблице - миллиарды
Ключом является URL страницы
Атрибуты - загруженное содержание, язык, MIME-тип,
обработанный текст, ссылки, изображения...
Работа с данными таблицы
Массовая оффлайн обработка и аналитика (batch, MapReduce)
Запись данных роботом (random access)
Выдача закэшированного содержимого страниц поиском (random
access)
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 5 / 49
10. HBase
Распределенная “база данных” для Hadoop
Ориентирована на случайный доступ к большим данным в режиме
реального времени
Реализована по образу Google Bigtable
Работает поверх HDFS
Проект Apache (май 2010)
http://hbase.apache.org/
Пользователи
Facebook, Twitter, Yahoo! ...
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 8 / 49
11. Точнее...
Distributed,
Versioned,
Column-Oriented,
High-Availability,
High-Performance
Store
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 9 / 49
12. Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 10 / 49
13. Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
Каждая строка таблицы имеет
Ключ (primary key)
Произвольный набор колонок
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 10 / 49
14. Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
Каждая строка таблицы имеет
Ключ (primary key)
Произвольный набор колонок
Колонки сгруппированы в “семейства” (column family)
Семейства колонок должны быть заданы при создании таблицы
Все колонки семейства имеют общий префикс
content:data, content:language, content:type
Новые колонки внутри семейства можно создавать в любой момент
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 10 / 49
15. Концептуальная модель данных
Поименованные таблицы, в строках которых хранятся данные
Каждая строка таблицы имеет
Ключ (primary key)
Произвольный набор колонок
Колонки сгруппированы в “семейства” (column family)
Семейства колонок должны быть заданы при создании таблицы
Все колонки семейства имеют общий префикс
content:data, content:language, content:type
Новые колонки внутри семейства можно создавать в любой момент
Внутри ячеек таблицы хранятся данные
Поддерживается хранение несколько версий данных
По умолчанию версия идентифицируется с помощью времени
записи (timestamp)
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 10 / 49
17. Физическая модель данных
Каждая ячейка таблицы хранится в виде
(table, row, family:column, timestamp) -> data
Пустые ячейки не хранятся
Содержимое ячейки является просто массивом байт
Нет встроенных типов данных
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 12 / 49
18. Физическая модель данных
Каждая ячейка таблицы хранится в виде
(table, row, family:column, timestamp) -> data
Пустые ячейки не хранятся
Содержимое ячейки является просто массивом байт
Нет встроенных типов данных
Строки таблицы отсортированы по ключу
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 12 / 49
19. Физическая модель данных
Каждая ячейка таблицы хранится в виде
(table, row, family:column, timestamp) -> data
Пустые ячейки не хранятся
Содержимое ячейки является просто массивом байт
Нет встроенных типов данных
Строки таблицы отсортированы по ключу
Строки таблицы разбиты вертикально на семейства колонок
Данные семейств колонок хранятся вместе (непрерывно на диске),
в отсортированном порядке по rowid, column, timestamp
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 12 / 49
20. Физическая модель данных
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 13 / 49
21. Структура данных
1 SortedMap (
2 RowKey , List (
3 SortedMap (
4 Column , List (
5 Value , Timestamp
6 )
7 )
8 )
9 )
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 14 / 49
25. Распределение данных в HBase
Разбиение данных
Таблицы разбиваются горизонтально на регионы
[startkey , endkey )
В самом начале таблица состоит из одного региона
По мере увеличения размера таблицы происходит автоматическое
разбиение данных на новые регионы
Регионы распределяются между серверами HBase-кластера
Репликация данных
Данные регионов хранятся и реплицируются в HDFS
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 18 / 49
28. Доступ к данным
Создание и удаление таблиц, колонок
Чтение данных (Get, Scan)
По ключу: все или определенные колонки для строки с данным
ключом
По времени: самое позднее значение, определенный момент
времени, N значений, все значения
По диапазону: итератор по строкам (Scanner)
Начальный и конечный ключи, набор колонок, фильтр
Запись данных (Put)
Атомарные изменения одной строки (row lock)
Multi-row locking (new)
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 21 / 49
30. HBase Shell
1 hadoop2 -00:~ $ hbase shell
2 HBase Shell ; enter ’ help < RETURN > ’ for list of supported commands .
3 Type " exit < RETURN >" to leave the HBase Shell
4 Version 0.90.1 - cdh3u0 , r , Fri Mar 25 16:10:51 PDT 2011
5
6 hbase ( main ):001:0 > create ’ test ’ , ’ data ’
7 0 row ( s ) in 12.5240 seconds
8
9 hbase ( main ):002:0 > list
10 TABLE
11 test
12 1 row ( s ) in 0.0390 seconds
13
14 hbase ( main ):003:0 > put ’ test ’ , ’ row1 ’ , ’ data :1 ’ , ’ value1 ’
15 0 row ( s ) in 0.1270 seconds
16
17 hbase ( main ):004:0 > put ’ test ’ , ’ row2 ’ , ’ data :2 ’ , ’ value2 ’
18 0 row ( s ) in 0.0360 seconds
19
20 hbase ( main ):005:0 > put ’ test ’ , ’ row3 ’ , ’ data :3 ’ , ’ value3 ’
21 0 row ( s ) in 0.0310 seconds
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 23 / 49
31. HBase Shell
1 hbase ( main ):006:0 > scan ’ test ’
2 ROW COLUMN + CELL
3 row1 column = data :1 , timestamp =1303416932470 , value = value1
4 row2 column = data :2 , timestamp =1303416939804 , value = value2
5 row3 column = data :3 , timestamp =1303416945399 , value = value3
6 3 row ( s ) in 0.2130 seconds
7
8 hbase ( main ):007:0 > disable ’ test ’
9 0 row ( s ) in 12.1800 seconds
10
11 hbase ( main ):008:0 > drop ’ test ’
12 0 row ( s ) in 1.5430 seconds
13
14 hbase ( main ):009:0 > exit
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 24 / 49
32. Java API (org.apache.hadoop.hbase.client)
1 public class ExampleClient {
2 public static void main ( String [] args ) throws IOException {
3 Configuration config = HBa se Co nfi gura tion . create ();
4
5 // Create table
6 HBaseAdmin admin = new HBaseAdmin ( config );
7 HTableDescriptor htd = new HTableDescriptor ( " test " );
8 HCol umnDescri ptor hcd = new HColumnDescriptor ( " data " );
9 htd . addFamily ( hcd );
10 admin . createTable ( htd );
11 byte [] tablename = htd . getName ();
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 25 / 49
33. Java API (org.apache.hadoop.hbase.client)
1 // Run some operations -- a put , a get , and a scan
2 HTable table = new HTable ( config , tablename );
3 byte [] row1 = Bytes . toBytes ( " row1 " );
4 Put p1 = new Put ( row1 );
5 p1 . add ( Bytes . toBytes ( " data " ) , Bytes . toBytes ( " 1 " ) ,
6 Bytes . toBytes ( " value1 " ));
7 table . put ( p1 );
8 Get g = new Get ( row1 );
9 Result result = table . get ( g );
10 System . out . println ( " Get : " + result );
11 Scan scan = new Scan ();
12 ResultScanner scanner = table . getScanner ( scan );
13 try {
14 for ( Result scannerResult : scanner ) {
15 System . out . println ( " Scan : " + scannerResult );
16 }
17 } finally {
18 scanner . close ();
19 }
20
21 // Drop the table
22 admin . disableTable ( tablename );
23 admin . deleteTable ( tablename );
24 }
25 }
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 26 / 49
34. HBase и Hadoop MapReduce
Пакет org.apache.hadoop.hbase.mapreduce
Форматы данных
TableInputFormat
один map на каждый регион таблицы
TableOutputFormat
Базовые классы Map и Reduce
TableMapper
TableReducer
Утилита TableMapReduceUtil
Примеры использования
HBASE_DIST/src/examples/mapreduce
CellCounter4
4
http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/mapreduce/CellCounter.java
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 27 / 49
35. HBase vs СУБД
СУБД HBase
Data layout Row-oriented Column-oriented
Транзакции Multi-row ACID Single row only
Язык запросов SQL get/put/scan/...
Индексы Произвольные колонки Ключи записей
Максимальный объем Терабайты 1PB
Чтение/Запись 1K запросов/сек 1M запросов/сек
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 28 / 49
36. HBase vs HDFS?
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 29 / 49
37. Область применения HBase
Да
Random read/write
Большое кол-во операций/сек + большой объем данных
Часто повторяющиеся запросы
Нет
Append + read all data
Уникальные запросы (ad-hoc analytics)
Данные могут быть размещены на одном сервере
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 30 / 49
39. 5
Apache Cassandra
Распределенное хранилище с моделью данных по образу BigTable
и децентрализованной архитектурой по образу Dynamo
Первоначальная разработка - Inbox Search @ Facebook, при
участии авторов Amazon Dynamo
2008 - open source
2010 - проект Apache Software Foundation
2010 - Facebook перешел на использование HBase
5
http://cassandra.apache.org/
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 32 / 49
40. Модель данных
Keyspace = база данных (схема)
Column family = таблица
статические / динамические
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 33 / 49
41. Типы данных
Validator
Определяет тип данных для ключей и значений колонок
Comparator
Определяет тип данных для имен колонок
Определяет порядок сортировки (и хранения) колонок
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 34 / 49
42. Индексы
Primary
По значениям ключей
Строится автоматически
Secondary
По значениям колонок
Создается по требованию
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 35 / 49
43. Распределение данных между узлами
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 36 / 49
44. Стратегия распределения данных
Определяется на уровне всего кластера
Random Patitioner
Использует стратегию consistent hashing
token = MD5(row_key), 0 − 2127
Обеспечивает равномерное распределение данных по узлам
Рекомендуется использовать по-умолчанию
Ordered Partitioner
Данные хранятся в отсортированном порядке
token = HEX(row_key_prefix)
Позволяет делать range scans
Сложнее в настройке и администрировании
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 37 / 49
45. Репликация
Стратегия репликации определяется для каждого keyspace
Кол-во реплик (replication factor)
Распределение реплик по узлам
SimpleStrategy
NetworkTopologyStrategy
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 38 / 49
46. Gossip
Децентрализованный (peer-to-peer) протокол, используемый для
обмена информацией между узлами
Состояние узла и других известных ему узлов
Позволяет достаточно быстро распространять информацию между
узлами
Seed nodes
Обнаружение отказов
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 39 / 49
48. 6
Теорема CAP
В распределенной системе невозможно одновременно обеспечить
свойства
согласованности данных (consistency)
доступности (availability)
устойчивости к разделению (partition tolerance)
Из трех свойств одновременно можно обеспечить только два
Неизбежный компромисс
Влияние на реализацию распределенного хранилища
Выбор реализуемых свойств на уровне системы (HBase=CP)
Возможность выбора свойств пользователем на уровне отдельных
операций (Cassandra)
6
http://en.wikipedia.org/wiki/CAP_theorem
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 41 / 49
49. Уровни согласованности
Могут быть указаны для каждой Read/Write-операции
ONE
Требуется ответ только от одной реплики
QUORUM (LOCAL_QUORUM, EACH_QUORUM)
Требуется ответ от большинства реплик
ALL
Требуется ответ от всех реплик
ANY (только для записи)
Требуется ответ от любого узла (не обязательно реплики)
Строгая согласованность достигается при
(nodes_written + nodes_read) > replication_factor
W=1, R=ALL | W=ALL, R=1 | W=Q, R=Q
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 42 / 49
50. Eventual Consistency
В любом случае гарантируется согласованность в конечном итоге
Некоторое время после записи клиенты могут считывать
устаревшие данные
Но, в конечном итоге, записанные данные распространятся по всей
системе
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 43 / 49
51. Базовые механизмы восстановления согласованности
См. Amazon Dynamo
Hinted Handoff
Read repair
Anti-Entropy
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 44 / 49
52. Атомарные операции и разрешение конфликтов
Атомарными являются только записи в одну строку
Несколько обновлений строки не являются атомарными
В случае неудачной записи, данные могут быть сохранены на
части реплик
Откаты не производятся
Для разрешения конфликтов используется timestamp,
передаваемый клиентом при записи данных
При записи не осуществляется проверка на уникальность row key
(UPSERT)
Есть риск случайно перезаписать данные
О.В. Сухорослов 11 Распределенные хранилища данных
() 11.05.2012 45 / 49