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

Post on 22-Jun-2015

269 Views

Category:

Technology

4 Downloads

Preview:

Click to see full reader

DESCRIPTION

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

TRANSCRIPT

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

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

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

1

Intro2

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

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

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

High availability6

Master — Slave7

Master — Master8

CAP-теорема9

Not so eventual consistency10

DHT11

DC-aware DHT12

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

• BDB

• Kyoto Cabinet

• Eblob

• LevelDB

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

13

• Append-only

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

• Большой overhead

Eblob

14

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

18+

16

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

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

Infrastructure

Platform

SaaS

18

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

19

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

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

Infrastructure

Cocaine Platform

& Services

21

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

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

22

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

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

23

Hyengine24

Process

Any Code w/o API

Sandbox

Code using Runtime API

Hyengine

Cocaine

vs

25

Process

Any Code

Framework

I/O & Service API

Hyengine

Cocaine

+

26

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

Cocaine Frameworks

27

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

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

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

Драйверы31

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

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

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

Драйверы

32

You app

Драйверы

timeoutTimer Driver

http-requestHTTP Driver

wind-speedArduino Driver?

file-changedFilesystem Driver

Cocaine

33

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

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

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

Драйверы

34

Изоляция35

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

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

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

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

Изоляция

36

Изоляция

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

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

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

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

Изоляция

38

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

39

Сервисы40

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

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

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

Сервисы

41

Сервисы

Geolocation

Logging

URL Fetching

MapReduce

RPC

Isolation Group A

App #1 Worker

App #1 Worker

App #2 Worker

App #2 Worker

Cocaine

42

Сервисы

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

Сервисы

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

Модули45

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

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

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

Модули

46

• Essentials

• Blastbeat Driver

• CGroups Isolation

• MongoDB Storage

• Elliptics Storage

• URLFetch Service

Open Source

47

MapReduce48

Incremental MapReduce49

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

Wookie51

top related