Upload
andrey-sibiryov
View
269
Download
4
Embed Size (px)
DESCRIPTION
Слайды к докладу на конференции «Стачка» в Ульяновске —http://nastachku.ru. Доклад был о системах хранения и обработки данных в реальном времени, в том числе о вычислениях на графе и инкрементальном MapReduce.
Citation preview
Андрей Сибирёв
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
bit.ly/iwantcokebit.ly/iwantstorage
@kobolog@toshictoshic
52