Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf ·...

35
1 Рексофт, 2013 Рексофт: Инновации на заказ Распределенная NoSQL СУБД «Riak»

Transcript of Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf ·...

Page 1: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

1 Рексофт, 2013

Рексофт: Инновации на заказ

РаспределеннаяNoSQL СУБД «Riak»

Page 2: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

2 Рексофт, 2013

NoSQL – Not only SQL

Нереляционная модель данных

Менее жесткая модель целостности

Распределенность

Горизонтальная масштабируемость

Page 3: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

3 Рексофт, 2013

Примеры NoSQL СУБД

HBase — колоночная

Riak — документная

Redis — ключ-значение

Neo4j — графовая

http://hbase.apache.org

http://basho.com/riak/

http://redis.io

http://neo4j.org

Page 4: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

4 Рексофт, 2013

CAP-теорема

Consistency Availability

PartitionTolerance

ВЫБЕРИ ДВА

Page 5: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

5 Рексофт, 2013

http://basho.com/riak/

Page 6: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

6 Рексофт, 2013

Ключевые особенности

Изменяемая в run-time избыточность

Гомогенность

Отказоустойчивость наследованная от Erlang

Простота развертывания

Организация данных в bucket'ы

Наличие ссылок

Page 7: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

7 Рексофт, 2013

sha1(<<”key”>>)

0x00...00000xff...ffff

0x7f...ffff

0x3f...ffff0xbf...ffff

Хеш-кольцо

Page 8: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

8 Рексофт, 2013

Избыточность

………

sha1(<<”key”>>) + 0xff...ffff / N * i

Page 9: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

9 Рексофт, 2013

okW операций вернули ok

Запись

write(<<”key”>>, Data, W)

Page 10: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

10 Рексофт, 2013

ЧтениеDataR операций вернули Data

read(<<”key”>>, R)

Page 11: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

11 Рексофт, 2013

R + W > N

Золотое правило

Page 12: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

12 Рексофт, 2013

Node 1 Node 2

{0, 0}V1

V4 happens before V5?V4[“Node 2”] ≠ V5[“Node 2”]

Конфликт!

{0, 1}V3

{1, 1}V5

{0, 1}V2

{0, 2}V4

Векторные часы

Page 13: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

13 Рексофт, 2013

Riak

V1

V3

Клиент 1 Клиент 2

V2

read(<<“key”>>)

write(<<”key”>>, V2)

write(<<”key”>>, V3)

Разрешение конфликтов

Page 14: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

14 Рексофт, 2013

V2 read(<<“key”>>)

Клиент

V4

V3

Слияние (?)

write(<<”key”>>, V4)

Riak

Разрешение конфликтов

Page 15: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

15 Рексофт, 2013

V3

V1

V2

V1

V4

Слияние

V1 V1

V3V2

Устойчивость к разделению

Время

Page 16: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

16 Рексофт, 2013

Первичный ключ

Вторичные индексы

Riak search engine

MapReduce

Выборка

Page 17: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

17 Рексофт, 2013

Riak Search Engine

Полнотекстовый поиск

Простой язык запросов (Lucene-based)

Оценка релевантности результатов

Результаты поиска могут быть входными данными для MapReduce

Page 18: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

18 Рексофт, 2013

Слияние:

Выборка:

MapReduce

Data Data Data

Map Map

Result

Reduce

Map

Page 19: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

19 Рексофт, 2013

Клиентская часть

General HTTP RESTful API

Google protocol buffers API

Erlang (native)

Клиентские библиотеки для:Java, Perl, Python, PHP, .NET, С++ и др.

Page 20: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

20 Рексофт, 2013

Клиентская часть: Erlang

{ok, Conn} = riak:client_connect('[email protected]'),Obj = riak_object:new(<<”bucket”>>, <<”key”>>, [{int_data_field, 1}, {array_data_field, [1,2,3]}]),ok = Conn:put(Obj, 2)

{ok, Obj1} = Conn:get(<<”bucket”>>, <<”key”>>, 2),

Upd = riak_object:update_value(Obj1, [{int_data_field, 42}]),ok = Conn:put(Upd, 2).

Page 21: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

21 Рексофт, 2013

Клиентская часть: RESTful

curl -X PUT http://127.0.0.1:8098/jiak/bucket \ -H “Content-Type: application/json” \ --data “{\”schema\”:{\”allowed_fields\”:

[\”int_data_field\”, \”array_data_field\”], \”write_mask\”:[\”int_data_field\”, \”array_data_field\”]}}”

curl -X PUT http://127.0.0.1:8098/jiak/bucket/key \ -H “Content-Type: application/json” \ --data “{\”bucket\”:\”bucket\”, \”key\”:\”key\”,\”object\”:{\”int_data_field\”:1,\”array_data_field\”:[1,2,3]},\”links\”:[]}”

curl http://127.0.0.1:8098/jiak/bucket/key

Page 22: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

22 Рексофт, 2013

Эффективность

Basho Bench — утилита для замера производительности кластера Riak

http://docs.basho.com/riak/latest/ops/building/benchmarking/

Page 23: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

23 Рексофт, 2013

Эффективность: масштабируемость

Условия тестирования: Размер записи — 10KbНагрузка — максимум (около 200 операций/узел)Настройки избыточности — по-умолчанию

Read Write Update

2 узла 6 ms 25 ms 32 ms

10 узлов 8 ms 47 ms 67 ms

20 узлов 7 ms 57 ms 80 ms

Page 24: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

24 Рексофт, 2013

Эффективность: client-side

Read Write Update

HTTP 97 ms 151 ms 146 ms

Protobuf 8 ms 47 ms 67 ms

Условия тестирования: Размер записи — 10KbКоличество узлов в кластере — 10Нагрузка — максимум (около 200 операций/узел)Настройки избыточности — по-умолчанию

Page 25: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

25 Рексофт, 2013

Сложные запросы

Дано: новостные данные

Необходимо: посчитать популярность тегов, полученых на основе языкового анализа за указанный период

Page 26: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

26 Рексофт, 2013

Сложные запросы: предвыборка

{ “inputs”: { “bucket”: “news”, “query”: “time: ['2013/10/01 00:00' to '2013/10/31 23:59']” } “query”: […]}

Page 27: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

27 Рексофт, 2013

Сложные запросы: фаза map

“query”: [{“map”: {“language”: ”javascript”,

“source”:

”function(v) {

var tags = doNLProcess(v.values[0].data)

// tags format: {“tag1”: 0.97, “tag2”: 0.5}

return [tags]

}”}},

…]

Page 28: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

28 Рексофт, 2013

Сложные запросы: фаза reduce

“query”: […, {“reduce”: {“language”: ”javascript”,

“source”:

”function(v) {

var result = {}

for(var i in v)

for(var j in v[i])

result[j] += v[i][j]

return [result];

}”}}]

Page 29: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

29 Рексофт, 2013

Способы разрешения конфликтов

Необходимое условие целостности: идемпотентность операции изменения

Основная рекомендация: добавляйте данные, а не изменяйте их!

Неидемпотентное изменение должно быть проделано только одним клиентом над всеми данными

Page 30: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

30 Рексофт, 2013

Автоматическое разрешение конфликтов

Statebox — фреймворк для построения структур данных поверх БД с нежесткой моделью целостности

https://github.com/mochi/statebox

Page 31: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

31 Рексофт, 2013

Целостные данные в Riak

Константные значения

Упорядоченные списки

Множества

Упорядоченный enum

Page 32: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

32 Рексофт, 2013

Упорядоченные списки/множества

1 2 5 100

3 8

4 50

1 2 5 1003 84 50

Операция слияния: объединение множеств

+

Page 33: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

33 Рексофт, 2013

Упорядноченный enum

Операция слияния: max

Status1 < Status2 < Status3 < Status4 < Status5

Status1

Status3

Status4

Status4

+

Page 34: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

34 Рексофт, 2013

Выводы

Riak стоит использовать, если:

Много данных Модель данных определена на этапе

проектирования Модель данных проста и не изобилует связями Большинство операций — операции добавления,

удаления или чтения, но не изменения

Page 35: Распределенная NoSQL СУБД «Riak»2013.secrus.org/2013/files/053_smirnov.pdf · 2013-10-25 · 1 Рексофт, 2013 Рексофт: Инновации на заказ

35 Рексофт, 2013

Спасибо за внимание!

Санкт-Петербург, РоссияТел.: +7 812 325 2100www.reksoft.com/ru

Андрей Смирнов

[email protected]