Инфраструктура распределенных приложений на nodejs /...

79
Инфраструктура распределенных приложений на node.js Stanislav Gumeniuk

Upload: ontico

Post on 06-Jan-2017

139 views

Category:

Engineering


3 download

TRANSCRIPT

Page 1: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Инфраструктура распределенных приложений на node.js

Stanislav Gumeniuk

Page 2: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)
Page 3: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)
Page 4: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Smart talks1. Инструментарий для запуска, мониторинга, etc;2. Архитектурные решения: от монолита к

микросервисам;3. Инкапсуляция микросервисов;4. Связывание микросервисов и сервисов;

Page 5: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

HelloWorld / node.js"use strict";var Koa = require('koa');const app = new Koa();app.use(ctx => { ctx.body = 'Hello Koa@2';});

app.listen(3000);

Page 6: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Что мы хотим?1. Разделение логов на потоки, управление потоками

логов;2. Мониторинг состояния приложения ( загрузка CPU,

память, статус, etc.. );3. Автоматический перезапуск при падении.

Page 7: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Запускаем HelloWorldБазовый инструмент$ node app.js

Page 8: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Запускаем HelloWorldБазовый инструмент$ node app.js

Умный инструмент$ nodemon app.js

Page 9: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Запускаем HelloWorldБазовый инструмент$ node app.js

Умный инструмент$ nodemon app.js

Продвинутый инструмент$ pm2 start app.js

Page 10: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)
Page 11: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

pm2 start app.js

Page 12: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

HelloWorld / Node.js / 2var Koa = require('koa');

const app = new Koa();

app.use(ctx => {

console.log('send responce');

ctx.body = 'Hello Koa@2';

});

console.error('fake error');

app.listen(5000);

Page 13: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

pm2 start app.js / pm2 logs app$ pm2 logs app

[PM2] Tailing last 20 lines for [app] process

app-14 (err): fake error

app-14 (out): send responce

app-14 (out): send responce

[PM2] Streaming realtime logs for [app] process

Page 14: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

pm2 info <app_name>pm2 info <app_name>

Page 15: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Ещё возможности pm2● Запуск несколько приложений одной командой;● Deploy одной командой;● Встроенная кластеризация(!)

Page 16: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

ecosystem.json{ "apps": [ { "name": "app", "script": "app.js", "env": { "NODE_ENV": "production" } } ]}

Page 17: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

pm2 startOrRestart ecosystem.json$ pm2 startOrRestart ecosystem.json

Page 18: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

ecosystem.json{ "apps": [ { "name": "app", "script": "app.js", "env": { "NODE_ENV": "production" }, "instances": "2" } ]}

Page 19: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

pm2 startOrRestart ecosystem.json$ pm2 startOrRestart ecosystem.json

Page 20: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

pm2 cluster

Page 21: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Инфраструктура с гипервизором

Page 22: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

pm2:1. Логи: разбиты по потокам и пишутся в файлы2. Мониторинг: memory, restarts, etc.3. Перезапуск при падении4. Кластеризация из коробки5. Deploy

Page 23: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектураот монолита к микросервисам

Page 24: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)
Page 25: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

От монолита к микросервисам1. Падение монолита - падение всей системы;2. Падение микросервиса - падение элемента системы,

при сохранении рабочей системы;3. Распределение нагрузок;4. Проще внедрять и заменять новые элементы в

систему;5. Мониторинг состояний каждого элемента системы.

Page 26: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Взаимодействие с внешним миром

Page 27: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Взаимодействие с внешним миром

Page 28: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Взаимодействие с внешним миром

Page 29: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Взаимодействие с внешним миром

Page 30: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Взаимодействие с внешним миром

Page 31: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 32: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 33: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 34: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 35: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 36: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 37: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 38: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 39: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 40: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Архитектура

Page 41: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)
Page 42: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Утверждение● Докер — это хорошо

Page 43: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Инкапсуляция микросервисов - Docker1. Все зависимости внутри;2. Единое хранилище образов приложений;3. Быстрая поставка приложения;4. Единое приложение в тестировании и “на бою”.

Page 44: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Docker lifeline : DockerfileFROM node: 4.2.3ADD . /codeWORKDIR /codeRUN npm iCMD node app.jsEXPOSE 5000

Page 45: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Docker lifeline : Dockerfiledocker build -t foo/app . docker build -t foo/app:1.0 .

Page 46: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Docker lifeline : push image

docker push foo/app

Page 47: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Docker lifeline

docker pull foo/appdocker run foo/app

Page 48: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Docker lifeline

Page 49: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

DockerfileFROM node:4.2.3ADD . /codeWORKDIR /codeRUN npm iCMD node app.jsEXPOSE 5000

Page 50: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

DockerfileFROM node:4.2.3ADD . /codeWORKDIR /codeRUN npm iCMD node app.jsEXPOSE 5000

Page 51: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

FROM node:4.2.3ADD . /codeWORKDIR /codeRUN npm iCMD node app.jsEXPOSE 5000

Dockerfile

Page 52: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

FROM node:4.2.3ADD . /codeWORKDIR /codeRUN npm iCMD node app.jsEXPOSE 5000

Dockerfile

Page 53: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

FROM node:4.2.3ADD . /codeWORKDIR /codeRUN npm iCMD node app.jsEXPOSE 5000

Dockerfile

Page 54: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

FROM node:4.2.3ADD . /codeWORKDIR /codeRUN npm i && npm i -g pm2CMD pm2 startOrRestart ecosystem.json --no-daemonEXPOSE 5000

Dockerfile

Page 55: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Что мы получаем от Docker● Удобная поставка приложения:

○ запуск приложения одной командой;○ возможность запуска множества копий приложения;○ экономия времени системных администраторов;

● Инкапсуляция зависимостей:

○ все зависимости внутри○ отсутствие конфликтов версионирования зависимостей○ не оставляет лишних следов в хостовой системе

● Docker + pm2 = стабильность при “случайных” падениях приложения

Page 56: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

ConsulСвязывание микросервисов

Page 57: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul vs etcdConsul:

● Great service discovery infrastructure● Health checking● Monitoring● Distributed key-value store● High-availability● Token-based acls● Web-UI● Gossip clustering● Golang!

etcd:

● Service discovery● Fault tolerant key value store● Bundled with coreos

Page 58: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Решение проблем с помощью Consul1. Мониторинг статуса сервисов;2. Реестр всех запущенных сервисов;3. Поиск сервисов;4. Доставка конфигов “налету”.

Page 59: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consullocalhost:8300 - server rpc localhost:8301 - serf lan localhost:8302 - serf wan localhost:8400 - cli rpc localhost:8500 - http api localhost:8600 - dns

Page 60: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul

Page 61: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Key-Value

Page 62: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Key-Value

Page 63: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Service Discovery

database: ‘localhost:3306’

Page 64: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Service Discovery

database: ‘host2:3306’

Page 65: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Service Discovery

database: ‘???:3306’

Page 66: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Service Discovery

api: ‘???:???’

Page 67: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Service Discovery

database: ‘db.service.consul:3306’

Page 68: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Consul : Service Discovery

curl http://consul/service/api

{

host: ‘api.service.consul’,

port: ‘8888’

}

Page 69: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Установка Consul1. Установить на каждый сервер

Page 70: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Установка Consul1. Установить на каждый сервер2. Использовать Docker!

Page 71: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Установка Consul1. Установить на каждый сервер2. Использовать Docker!

$ docker run --name consul -h $HOSTNAME \

-p 10.0.1.1:8300:8300 \

-p 10.0.1.1:8301:8301 \

-p 10.0.1.1:8301:8301/udp \

-p 10.0.1.1:8302:8302 \

-p 10.0.1.1:8302:8302/udp \

-p 10.0.1.1:8400:8400 \

-p 10.0.1.1:8500:8500 \

-p 172.17.42.1:53:53/udp \

-d -v /mnt:/data \

consul -server -advertise 10.0.1.1 -join 10.0.1.2

Page 72: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Добавляем поддержку Consul для pm2$ pm2 install pm2-consul

Page 73: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Добавляем поддержку Consul для pm2

Page 74: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Добавляем поддержку Consul в Docker$ docker pull gliderlabs/registrator:latest

$ docker run -d \

--name=registrator \

--net=host \

--volume=/var/run/docker.sock:/tmp/docker.sock \

gliderlabs/registrator:latest \

consul://localhost:8500

Page 75: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Добавляем поддержку Consul в Docker- Dnsmasq 53->8600

- docker run … -dns $HOSTNAME

Page 76: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Что мы получаем от Consul?● Распределенное key-value

хранилище

● Service Discovery

● Monitoring

● Полное понимание статуса сервисов

● Доступность сервисов

● Легкое управление конфигами и быстрая доставка конфигов сервисам

Page 77: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)
Page 78: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Спасибо!

Page 79: Инфраструктура распределенных приложений на nodejs / Станислав Гуменюк (Rambler&Co)

Ссылки и контактыStanislav Gumeniukhttps://gumeniuk.com/mailto: [email protected]@vigo5190

https://hub.docker.com/_/consul/https://www.npmjs.com/package/pm2-consul