52
Андрей Сибирёв Realtime хранилище данных Антон Кортунов 1

Cocaine — Стачка 2013: Realtime хранилище данных

Embed Size (px)

DESCRIPTION

Слайды к докладу на конференции «Стачка» в Ульяновске —http://nastachku.ru. Доклад был о системах хранения и обработки данных в реальном времени, в том числе о вычислениях на графе и инкрементальном MapReduce.

Citation preview

Page 1: Cocaine — Стачка 2013: Realtime хранилище данных

Андрей Сибирёв

Realtime хранилище данных

Антон Кортунов

1

Page 2: Cocaine — Стачка 2013: Realtime хранилище данных

Intro2

Page 3: Cocaine — Стачка 2013: Realtime хранилище данных

Две тысячи SSD дисков3

Page 4: Cocaine — Стачка 2013: Realtime хранилище данных

Две тысячи SSD дисков4

Page 5: Cocaine — Стачка 2013: Realtime хранилище данных

Две тысячи old school дисков5

Page 6: Cocaine — Стачка 2013: Realtime хранилище данных

High availability6

Page 7: Cocaine — Стачка 2013: Realtime хранилище данных

Master — Slave7

Page 8: Cocaine — Стачка 2013: Realtime хранилище данных

Master — Master8

Page 9: Cocaine — Стачка 2013: Realtime хранилище данных

CAP-теорема9

Page 10: Cocaine — Стачка 2013: Realtime хранилище данных

Not so eventual consistency10

Page 11: Cocaine — Стачка 2013: Realtime хранилище данных

DHT11

Page 12: Cocaine — Стачка 2013: Realtime хранилище данных

DC-aware DHT12

Page 13: Cocaine — Стачка 2013: Realtime хранилище данных

• Файловая система

• BDB

• Kyoto Cabinet

• Eblob

• LevelDB

Низкоуровневые хранилища

13

Page 14: Cocaine — Стачка 2013: Realtime хранилище данных

• Append-only

• Простой и надёжный

• Большой overhead

Eblob

14

Page 15: Cocaine — Стачка 2013: Realtime хранилище данных

И что с этими данными делать?15

Page 16: Cocaine — Стачка 2013: Realtime хранилище данных

18+

16

Page 17: Cocaine — Стачка 2013: Realtime хранилище данных

Кокаин — это облачная платформа17

Page 18: Cocaine — Стачка 2013: Realtime хранилище данных

Облака бывают разные

Infrastructure

Platform

SaaS

18

Page 19: Cocaine — Стачка 2013: Realtime хранилище данных

Облачная платформа — это баян.

19

Page 20: Cocaine — Стачка 2013: Realtime хранилище данных

Bluebox

EngineYard

Heroku

AppEngine

Joyent

Azure

Jelastic

Koder

Bluebox

EngineYard

Heroku

AppEngine

Joyent

Azure

Jelastic

Koder

Bluebox

EngineYard

Heroku

AppEngine

Joyent

Azure

Jelastic

Koder

Bluebox

EngineYard

Heroku

AppEngine

Joyent

PiCloud

Azure

Jelastic

Koder

20

Page 21: Cocaine — Стачка 2013: Realtime хранилище данных

Облака бывают необычные

Infrastructure

Cocaine Platform

& Services

21

Page 22: Cocaine — Стачка 2013: Realtime хранилище данных

+ Написать нужно только основную логику.+ Быстрая и дешёвая разработка.– Ограничения в выборе инструментов.– Нет контроля за окружением.

Неуправляемые платформы

22

Page 23: Cocaine — Стачка 2013: Realtime хранилище данных

Управляемые платформы

+ Можно запустить почти всё что угодно.+ Полный контроль над окружением.– Нужно всё написать самому.– Полный цикл разработки.

23

Page 24: Cocaine — Стачка 2013: Realtime хранилище данных

Hyengine24

Page 25: Cocaine — Стачка 2013: Realtime хранилище данных

Process

Any Code w/o API

Sandbox

Code using Runtime API

Hyengine

Cocaine

vs

25

Page 26: Cocaine — Стачка 2013: Realtime хранилище данных

Process

Any Code

Framework

I/O & Service API

Hyengine

Cocaine

+

26

Page 27: Cocaine — Стачка 2013: Realtime хранилище данных

+ Асинхронный код.+ Грязная работа уже сделана.+ Поддерживается Python, Node.js, C++.– Нужно адаптировать существующий код.

Cocaine Frameworks

27

Page 28: Cocaine — Стачка 2013: Realtime хранилище данных

import jsonfrom cocaine import Slavefrom cocaine.decorators import http

@httpdef dummy(request, response): http_req = yield request.get() # Do something useful... response.write_head(200, [(“Content-type”, “application/json”)]) response.write(json.dumps({“status”: “ok”})) response.close()

slave = Slave()slave.run({‘dummy’: dummy})

Python

28

Page 29: Cocaine — Стачка 2013: Realtime хранилище данных

var cocaine = require(‘cocaine’);

var slave = cocaine.createSlave(function (event, request, response) { request.on(‘chunk’, function (chunk) { console.log(‘Got chunk: ’ + chunk); response.close(); });

request.on(‘close’, function () { console.log(‘Bye’); });});

slave.run(argc, argv);

Node.js

29

Page 30: Cocaine — Стачка 2013: Realtime хранилище данных

struct MyApp: public application<MyApp> {    struct on_my_event: public handler<MyApp> {        on_my_event(shared_ptr<MyApp> app): handler<MyApp>(app) { }

        void on_chunk(const char *chunk, size_t size) {            response()->write(“Okay!”);            response()->close();        } }

    MyApp(shared_ptr<service_manager_t> service_manager):        application<MyApp>(service_manager) { } void initialize() {        on<on_my_event>("my_event");    }}

int main(int argc, char *argv[]) {    return worker_t::run<MyApp>(argc, argv);}

C++

30

Page 31: Cocaine — Стачка 2013: Realtime хранилище данных

Драйверы31

Page 32: Cocaine — Стачка 2013: Realtime хранилище данных

• Обычно, приложения — event driven.

• И единственное событие — HTTP-запрос.

• Это скучно и подавляет творческое начало!

Драйверы

32

Page 33: Cocaine — Стачка 2013: Realtime хранилище данных

You app

Драйверы

timeoutTimer Driver

http-requestHTTP Driver

wind-speedArduino Driver?

file-changedFilesystem Driver

Cocaine

33

Page 34: Cocaine — Стачка 2013: Realtime хранилище данных

• Какие угодно драйверы.

• В неограниченных количествах.

• Единообразная обработка всех событий.

Драйверы

34

Page 35: Cocaine — Стачка 2013: Realtime хранилище данных

Изоляция35

Page 36: Cocaine — Стачка 2013: Realtime хранилище данных

• Разработчики не думают о ресурсах.

• И уверены, что на каждом сервере будет запущено только их приложение.

• Сеть бесконечная, память неограничена, с диска можно читать мгновенно.

• А, на самом деле, серверы не резиновые, как Москва.

Изоляция

36

Page 37: Cocaine — Стачка 2013: Realtime хранилище данных

Изоляция

Isolation Group A

App #1 Worker

Isolation Group B

App #1 Worker

App #2 Worker

App #2 Worker

App #3 Worker

App #3 Worker

App #3 Worker

App #3 Worker

Cocaine

37

Page 38: Cocaine — Стачка 2013: Realtime хранилище данных

• Изолировать можно в CGroups, LXC.

• Группы настраиваются в профилях.

• Профиль — это также и настройки таймаутов, очередей и других ограничений.

Изоляция

38

Page 39: Cocaine — Стачка 2013: Realtime хранилище данных

Все параметры групп изоляции можно менять в реальном времени.

39

Page 40: Cocaine — Стачка 2013: Realtime хранилище данных

Сервисы40

Page 41: Cocaine — Стачка 2013: Realtime хранилище данных

• К общим компонентам — общий доступ.

• Геолокация, логирование, определение модели телефона, хранение данных, ...

• Для всех и без лишних задержек.

Сервисы

41

Page 42: Cocaine — Стачка 2013: Realtime хранилище данных

Сервисы

Geolocation

Logging

URL Fetching

MapReduce

RPC

Isolation Group A

App #1 Worker

App #1 Worker

App #2 Worker

App #2 Worker

Cocaine

42

Page 43: Cocaine — Стачка 2013: Realtime хранилище данных

Сервисы

from cocaine.service import Servicefrom cocaine.decorators.http import http

log = Service(“logstash”)geo = Service(“geobase-legacy”)store = Service(“super-fast-storage”)

@httpdef dummy(request, response): http_req = yield request.read() id, region = yield geo.get_region_info(http_req["remote_addr"]) log.info(“Trying to store the data”) result = yield store.write(http_req[“remote_addr”], (id, region)) if result: response.write_head(200, [(“Content-Type”, “text/plain”)]) response.write(“<html><body>Okay!</body></html>”) else: raise http.Exception(500) response.close()

43

Page 44: Cocaine — Стачка 2013: Realtime хранилище данных

Сервисы

struct MyApp: public enable_shared_from_this<MyApp> { shared_ptr<storage_service_t> m_storage;     void initialize() { create_service(m_storage, "storage");

        m_storage->read("namespace", "key")         .on_reply(bind(&on_read, shared_from_this(), _1))            .on_error(ignore); }

void on_read(const string& data) const { cout << “Got some data from the storage: “ << data << endl; }};

44

Page 45: Cocaine — Стачка 2013: Realtime хранилище данных

Модули45

Page 46: Cocaine — Стачка 2013: Realtime хранилище данных

• Всё, кроме ядра системы — подключаемые модули.

• Драйверы, изоляторы, сервисы, стораджи, системы логирования.

• И их можно менять в рантайме.

Модули

46

Page 47: Cocaine — Стачка 2013: Realtime хранилище данных

• Essentials

• Blastbeat Driver

• CGroups Isolation

• MongoDB Storage

• Elliptics Storage

• URLFetch Service

Open Source

47

Page 48: Cocaine — Стачка 2013: Realtime хранилище данных

MapReduce48

Page 49: Cocaine — Стачка 2013: Realtime хранилище данных

Incremental MapReduce49

Page 50: Cocaine — Стачка 2013: Realtime хранилище данных

Вычислительный граф50

Page 51: Cocaine — Стачка 2013: Realtime хранилище данных

Wookie51