Node.js - - PowerPoint PPT Presentation

node js
SMART_READER_LITE
LIVE PREVIEW

Node.js - - PowerPoint PPT Presentation

Node.js Stanislav Gumeniuk, SEMrush HolyJS / SPb / June 5 2016 1.


slide-1
SLIDE 1

HolyJS / SPb / June 5 2016

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

Stanislav Gumeniuk,

SEMrush

slide-2
SLIDE 2

HolyJS / SPb / June 5 2016

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

1. Инструменты для запуска, мониторинга, etc; 2. Архитектурные решения: от монолита к микросервисам; 3. Инкапсуляция микросервисов; 4. Связывание микросервисов и сервисов;

2

slide-3
SLIDE 3

HolyJS / SPb / June 5 2016

HelloWorld / Node.js

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

3

slide-4
SLIDE 4

HolyJS / SPb / June 5 2016

Что мы хотим?

  • 1. Разделение логов на потоки,

управление потоками логов;

  • 2. Мониторинг состояния приложения

( загрузка CPU, память, статус, etc.. );

  • 3. Автоматический перезапуск при падении.

4

slide-5
SLIDE 5

HolyJS / SPb / June 5 2016

Запускаем HelloWorld

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

5

slide-6
SLIDE 6

HolyJS / SPb / June 5 2016

Запускаем HelloWorld

Базовый инструмент $ node app.js Умный инструмент $ nodemon app.js

6

slide-7
SLIDE 7

HolyJS / SPb / June 5 2016

Запускаем HelloWorld

Базовый инструмент $ node app.js Умный инструмент $ nodemon app.js Продвинутый инструмент $ pm2 start app.js

7

slide-8
SLIDE 8

HolyJS / SPb / June 5 2016

8

slide-9
SLIDE 9

HolyJS / SPb / June 5 2016

pm2 start app.js

$ pm2 start app.js 9

slide-10
SLIDE 10

HolyJS / SPb / June 5 2016

HelloWorld / Node.js / 2

var 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);

10

slide-11
SLIDE 11

HolyJS / SPb / June 5 2016

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

11

slide-12
SLIDE 12

HolyJS / SPb / June 5 2016

pm2 info <app_name>

12

slide-13
SLIDE 13

HolyJS / SPb / June 5 2016

Ещё возможности pm2

  • Запуск несколько приложений одной командой;
  • Deploy одной командой;
  • Встроенная кластеризация(!)

13

slide-14
SLIDE 14

HolyJS / SPb / June 5 2016

ecosystem.json

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

14

slide-15
SLIDE 15

HolyJS / SPb / June 5 2016

pm2 startOrRestart ecosystem.json

$ pm2 startOrRestart ecosystem.json

15

slide-16
SLIDE 16

HolyJS / SPb / June 5 2016

ecosystem.json

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

16

slide-17
SLIDE 17

HolyJS / SPb / June 5 2016

pm2 startOrRestart ecosystem.json

$ pm2 startOrRestart ecosystem.json

17

slide-18
SLIDE 18

HolyJS / SPb / June 5 2016

pm2 cluster

pm2 app app

api

18

slide-19
SLIDE 19

HolyJS / SPb / June 5 2016

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

app.js

pm2

app2.js

logs

19

slide-20
SLIDE 20

HolyJS / SPb / June 5 2016

pm2:

  • 1. Логи: разбиты по потокам и пишутся в

файлы

  • 2. Мониторинг: memory, restarts, etc..
  • 3. Перезапуск при падении
  • 4. Кластеризация из коробки
  • 5. Deploy

20

slide-21
SLIDE 21

HolyJS / SPb / June 5 2016

Архитектура

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

slide-22
SLIDE 22

HolyJS / SPb / June 5 2016

От монолита к микросервисам

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

22

slide-23
SLIDE 23

HolyJS / SPb / June 5 2016

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

app

23

slide-24
SLIDE 24

HolyJS / SPb / June 5 2016

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

nginx app

24

slide-25
SLIDE 25

HolyJS / SPb / June 5 2016

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

app app nginx front / SPA

front

app / api

25

slide-26
SLIDE 26

HolyJS / SPb / June 5 2016

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

app app nginx front / SPA

front

app / api app / api

26

slide-27
SLIDE 27

HolyJS / SPb / June 5 2016

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

nginx front / SPA

front

app / api app / api nginx

27

slide-28
SLIDE 28

HolyJS / SPb / June 5 2016

Архитектура

app

28

slide-29
SLIDE 29

HolyJS / SPb / June 5 2016

Архитектура

api

29

slide-30
SLIDE 30

HolyJS / SPb / June 5 2016

Архитектура

api

DB

30

slide-31
SLIDE 31

HolyJS / SPb / June 5 2016

Архитектура

api

DB

worker

31

slide-32
SLIDE 32

HolyJS / SPb / June 5 2016

Архитектура

api

DB

worker

? ?

32

slide-33
SLIDE 33

HolyJS / SPb / June 5 2016

Архитектура

api

DB

worker

33

slide-34
SLIDE 34

HolyJS / SPb / June 5 2016

Архитектура

api

DB

worker 2 worker

34

slide-35
SLIDE 35

HolyJS / SPb / June 5 2016

Архитектура

api

DB

worker 2 worker front

35

slide-36
SLIDE 36

HolyJS / SPb / June 5 2016

Архитектура API

nginx app app

api

36

slide-37
SLIDE 37

HolyJS / SPb / June 5 2016

Архитектура API

nginx app app

api

nginx

37

slide-38
SLIDE 38

HolyJS / SPb / June 5 2016

slide-39
SLIDE 39

HolyJS / SPb / June 5 2016

Инкапсуляция микросервисов - Docker

1. Все зависимости внутри; 2. Единое хранилище образов приложений; 3. Быстрая поставка приложения.

39

slide-40
SLIDE 40

HolyJS / SPb / June 5 2016

Docker lifeline : Dockerfile

App: Dockerfile

FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000

40

slide-41
SLIDE 41

HolyJS / SPb / June 5 2016

Docker lifeline : docker build img

App: Dockerfile App: Docker image

docker build -t foo/app . docker build -t foo/app:1.0 .

41

slide-42
SLIDE 42

HolyJS / SPb / June 5 2016

Docker lifeline : push image

App: Dockerfile App: Docker image Docker registry app:img

docker push foo/app

42

slide-43
SLIDE 43

HolyJS / SPb / June 5 2016

Docker lifeline

App: Dockerfile App: Docker image Docker registry app:img app

docker pull foo/app docker run foo/app

43

slide-44
SLIDE 44

HolyJS / SPb / June 5 2016

Docker lifeline

App: Dockerfile App: Docker image Docker registry app:img db:img app app app db

44

slide-45
SLIDE 45

HolyJS / SPb / June 5 2016

Dockerfile

FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000

45

slide-46
SLIDE 46

HolyJS / SPb / June 5 2016

Dockerfile

FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000

46

slide-47
SLIDE 47

HolyJS / SPb / June 5 2016

Dockerfile

FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000

47

slide-48
SLIDE 48

HolyJS / SPb / June 5 2016

Dockerfile

FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000

48

slide-49
SLIDE 49

HolyJS / SPb / June 5 2016

Dockerfile

FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i CMD node app.js EXPOSE 5000

49

slide-50
SLIDE 50

HolyJS / SPb / June 5 2016

Dockerfile + pm2

FROM node:4.2.3 ADD . /code WORKDIR /code RUN npm i && npm i -g pm2 CMD pm2 startOrRestart ecosystem.json --env docker --no-daemon EXPOSE 5000

50

slide-51
SLIDE 51

HolyJS / SPb / June 5 2016

Что мы получаем от Docker

  • Удобная поставка приложения:
  • запуск приложения одной командой;
  • возможность запуска множества копий приложения;
  • экономия времени системных администраторов;
  • Инкапсуляция зависимостей:
  • все зависимости внутри
  • отсутствие конфликтов версионирования зависимостей
  • не оставляет лишних следов в хостовой системе
  • Docker + pm2 = стабильность при “случайных” падениях приложения

51

slide-52
SLIDE 52

HolyJS / SPb / June 5 2016

Consul

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

slide-53
SLIDE 53

HolyJS / SPb / June 5 2016

Решение проблем с помощью Consul

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

53

slide-54
SLIDE 54

HolyJS / SPb / June 5 2016

Consul

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

54

slide-55
SLIDE 55

HolyJS / SPb / June 5 2016

Consul

Consul Consul Consul

55

slide-56
SLIDE 56

HolyJS / SPb / June 5 2016

Consul : Key-Value

Consul Consul Consul n1:v1

56

slide-57
SLIDE 57

HolyJS / SPb / June 5 2016

Consul : Key-Value

Consul Consul Consul n1:v1 n1:v1 n1:v1

57

slide-58
SLIDE 58

HolyJS / SPb / June 5 2016

Consul : Service Discovery

app DB

database: ‘localhost:3306’

host

58

slide-59
SLIDE 59

HolyJS / SPb / June 5 2016

Consul : Service Discovery

app DB

database: ‘host2:3306’

host1 host2

59

slide-60
SLIDE 60

HolyJS / SPb / June 5 2016

Consul : Service Discovery

app DB

database: ‘???:3306’

host1 virtual host

60

slide-61
SLIDE 61

HolyJS / SPb / June 5 2016

Consul : Service Discovery

api

api: ‘???:???’

hostX/Docker hostY/Docker worker

61

slide-62
SLIDE 62

HolyJS / SPb / June 5 2016

Consul : Service Discovery

app DB

database: ‘db.service.sd:3306’

host1 virtual host

62

slide-63
SLIDE 63

HolyJS / SPb / June 5 2016

Consul : Service Discovery

api

curl http://sd/service/api { host: ‘api.service.sd’, port: ‘8888’ }

hostX/Docker hostY/Docker worker

63

slide-64
SLIDE 64

HolyJS / SPb / June 5 2016

Установка Consul

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

64

slide-65
SLIDE 65

HolyJS / SPb / June 5 2016

Установка Consul

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

65

slide-66
SLIDE 66

HolyJS / SPb / June 5 2016

Установка Consul

1. Установить на каждый сервер 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 \

progrium/consul -server -advertise 10.0.1.1 -join 10.0.1.2 66

slide-67
SLIDE 67

HolyJS / SPb / June 5 2016

$ pm2 install pm2-consul

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

67

slide-68
SLIDE 68

HolyJS / SPb / June 5 2016

$ pm2 install pm2-consul

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

68

slide-69
SLIDE 69

HolyJS / SPb / June 5 2016

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

69

slide-70
SLIDE 70

HolyJS / SPb / June 5 2016

$ 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

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

70

slide-71
SLIDE 71

HolyJS / SPb / June 5 2016

  • Dnsmasq 53->8600
  • docker run … -dns $HOSTNAME

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

71

slide-72
SLIDE 72

HolyJS / SPb / June 5 2016

Что мы получаем от Consul?

  • Распределенное key-value хранилище
  • Service Discovery
  • Monitoring
  • Полное понимание статуса сервисов
  • Доступность сервисов
  • Легкое управление конфигами и

быстрая доставка конфигов сервисам

72

slide-73
SLIDE 73

HolyJS / SPb / June 5 2016

app

api

DB

worker 2

worker front

external app Consul

73

slide-74
SLIDE 74

HolyJS / SPb / June 5 2016

Спасибо!

74

slide-75
SLIDE 75

HolyJS / SPb / June 5 2016

Ссылки и контакты

Stanislav Gumeniuk https://gumeniuk.com/ mailto: i@vigo.su @vigo5190 https://hub.docker.com/r/progrium/consul/ https://www.npmjs.com/package/pm2-consul

75