Николай Сивко "Хорошо поддерживаемое в продакшне...

50

Upload: tanya-denisyuk

Post on 11-Apr-2017

50 views

Category:

Education


0 download

TRANSCRIPT

Page 1: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Page 2: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Мирглазамиразработчика1.  Естьзадачастребованиями

2.  Пишукод+тесты

3.  Показалdemoзаказчику

4.  ПередалвproducIon

ЕслибагилипроблемавproducIon:GOTO#1

Page 3: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Мирглазамиадмина•  Выкатилновуюверсиюприложения

•  В3:00утраSMS:“HTTP-50x>20rps”

•  Приложениежрет4ядра,влогепусто

•  Фронтенднедожидаетсяответаотсервисаза10sиотдаетпользователям504

•  Разработчикпроситпроверитьсеть/БД/… ивообщеперезапустить

Page 4: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

DevOps:РазрабАдмин?

Page 5: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

СчегообычноначинаетсяDevOps?•  ConInuousdeliveryидеплой10развчас!

•  СпрячемотразработчикажелезкизаDockercоркестрацией!

•  Чтобывсемасштабировалосьналетубудемходитьзаконфигамипосети,целостностьнамобеспечитPaxos/Ray!

•  Такмыбезпроблембудемрастидопланетарногомасштабаничегонеменяякоде!

Page 6: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

СчегообычноначинаетсяDevOps?•  ConInuousdeliveryидеплой10развчас!

•  СпрячемотразработчикажелезкизаDockercоркестрацией!

•  Чтобывсемасштабировалосьналетубудемходитьзаконфигамипосети,целостностьнамобеспечитPaxos/Ray!

•  Такмыбезпроблембудемрастидопланетарногомасштабаничегонеменяякоде!

Page 7: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Чегохочетбизнес?•  ProducIonдолженработать

•  Есличто-толомается,нужнобыстроопределитьпричинуипочинить

•  Сделатьтак,чтобынеповторялось

Page 8: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

DevOps:РазрабАдминРазработчикдумаетотом,какподдерживатьприложениевproducIonилисамэтоделает

ИЛИ

Когдаадминначинаетписатькод(этогоревсемье,нослучается:)

Page 9: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Будемговоритьпродиагностику•  Посмотрим,каксделаноупопулярногософта:nginx,mongo,postgresql

•  Какиевообщеестьподходы?

•  Какделатьусебя?

Page 10: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

•  Входящиезапросы

•  Бэкенды

•  Статика,кэш

•  Lua,perl,…

Page 11: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Nginx:error_log2016/10/1012:27:57[error]6219#0:*130819912upstreamImedout(110:ConnecIonImedout)whileconnecIngtoupstream,client:1.2.3.4,server:okmeter.io,request:"POST/metric/writeHTTP/1.1",upstream:"h�p://192.168.100.9:8088/metric/write",host:"okmeter.io"

•  Укакогоименноклиентаошибка•  Какойбэкенднеответил

Page 12: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Nginx:access_log1.2.3.4 - - [10/Oct/2016:14:04:38 +0300] "POST /metric/write HTTP/1.1" 200 2 "-" "Go-http-client/1.1" 0.103 - [0.039, 0.064] {192.168.100.5:8088, 192.168.100.4:8088} {504,200}

•  Какойстатусвернуликлиенту•  Чтовернулкаждыйбэкенд,сколькобылопопыток•  Сколькождаликаждогобэкенда•  Сколькождалпользователь

Page 13: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Nginx:debuglog•  Показываетвсеэтапыобработкизапроса

•  МожнотолькодляконкретныхIP/сетей(debug_connecIon)

•  Можновциклическийбуфервпамяти

Page 14: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Nginx:stub_statusAcIveconnecIons:291serveracceptshandledrequests166309481663094831070465Reading:6WriIng:179WaiIng:106

Page 15: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Nginx:тёмныепятна•  Сколькождалидиск:читалиданныесдиска,писалилог

•  ДругиеблокировкиIOloop:логикаnginx,логикапользователя(lua)

Page 16: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

•  Данные

•  Запросы+CPUboundлогика(aggregaIon)

•  Ресурсы:диск,сеть,процессор

Page 17: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Mongo•  serverStatus-server-wideметрики

•  dbStats-db-wideметрики

•  collStats–collecIon-wideметрики

Page 18: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Mongo:queryprofiler•  CappedcollecIonспрофайлингомзапросов

•  Включаетсядлявсехилитолькодля“медленных”

•  Можетнегативноповлиятьнапроизводительность

Page 19: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Mongo:практикаМетрикмного,нобольшинствоизнихдляразработчикаmongoПользовательможеттолько:-прибитьплохойзапрос-исправитьзапросы/схемуданных/индексы-поменятьконфиг-добавитьресурсов

Page 20: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Mongo:тёмныепятна•  Какойзапроспрямосейчасвсёубивает?

•  Накакиезапросыуходятресурсы?

•  Какиезапросыудерживаютлоки?

Page 21: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

•  Данные

•  Запросы

•  Ресурсы:диск,сеть,процессор

Page 22: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

PostgreSQL:данные•  pg_stat_all_(tables|indexes)

•  pg_staIo_all_(tables|indexes)

Page 23: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

PostgreSQL:запроcы•  pg_stat_acIvity– чтопроисходитпрямосейчас

•  pg_stat_statements–накопленныесчетчикипогруппамзапросов

Page 24: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

PostgreSQL:локи•  pg_stat_acIvity.wait_event– 9.6+

•  pg_locks– можноJOINнаpg_stat_acIvityпоpid

Page 25: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

PostgreSQL:тёмныепятна

Впостгресепочтиидельнаядиагностика.Постгресумный.Будькакпостгрес.

Page 26: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Зачеммывсеэтосмотрели?•  Webприложенияпохожинаnginx,толькобольшевычисленийпослеполученияданных,уnginxхорошиелоги

•  Mongo– примертого,каквсёпокрылисчетчиками,нозабылипросценариииспользованиядиагностики

•  PG– примертого,какдолжнобыть

Page 27: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Диагностика:вопросы•  Чемприложениезанятопрямосейчас?

•  Чемприложениезанималосьввчерав18:43?

•  Накакиезадачи/запросыбылипотраченыресурсы?

•  Сколькоикакихошибокбыло?

•  Сколькождалиответабазывчера/сегодня?

•  ПочемуотдалиHTTP-400?

Page 28: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Подходы•  Thread/stackdumpианалоги•  Лог

•  Счетчики/таймеры/мгновенныезначения

Page 29: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Thread/stackdumpианалоги•  Мгновенныйснимок:вкакомместекоданаходитсяуправлениекаждого“потока”

•  БольшепроrunIme,аневашкод

•  Высокоуровневыеаналоги:какиезапросысейчасобрабатываеминакакойонистадии

Page 30: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Thread/stackdumpианалоги•  Java:jstack<pid>

•  Golang:– enablepprof– curlh�p://IP:PORT/debug/pprof/gorouIne?debug=2

Page 31: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Высокоуровневыеаналоги•  PG:pg_stat_acIvity

•  Mysql:SHOWPROCESSLIST

•  Apache:mod_status

Page 32: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Лог•  Правильнописатьлогиоченьсложно•  Правильно=написатьнужноеиНЕписатьлишнее

•  Общегорецептанет– всесистемыразные

•  Предлагаюисходитьизсценариевиспользования

Page 33: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Лог:сценарийВывидитевлогеnginx:…..”GET /url HTTP/1.1" 504request_Ime=0.101 upstream_response_Ime=[0.101] upstream_addr={192.168.1.1:8000} upstream_status={504}

Чтовыбудетеделатьдальше?

Page 34: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Лог:сценарийВызахотитеузнать,чтовлогеу192.168.1.1поэтомузапросу!Чтотакое“этотзапрос”?

Page 35: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Лог:request_id•  Навходегенеримidзапроса(nginx$request_idнапример)

•  Ставимзаголовкомвовсезапросыдальше:X-Request-Id:123456

•  Вовсехсервисахпишемвлог

•  МожнодажевSQLкомментарий

Page 36: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Лог:request_idNginx…..”GET /url HTTP/1.1" 5040.101 [0.101] {192.168.1.1:8000} {504}req_id=123456192.168.1.1:<Imestamp>id:123456queryingsessionfromsession_db1<Imestamp>id:123456clientclosesconnecIon<Imestamp>id:123456GET/api/blabla4990.101sPG:<Imestamp><pid><user>@<db>from192.168.1.1[vxid:x/ytxid:0][SELECT]LOG:duraIon:147.020msexecute<unnamed>:/*123456*/select*fromsessionwheresession.id=$1AND…

Page 37: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Лог:итого•  Нужноотличатьзапросыдруготдруга(requestid)

•  Пишемнетолькозаконченныедействия(бываетнужноловитьзалипшие)

•  Есликуда-тоидем,пишемконкретныйадрес

•  Пишемвсеошибкиикакихобработали

•  Замеряемвремязначимыхопераций

Page 38: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Лог:нагрузка•  Подробноелогированиесоздаетнагрузку

•  Есливводимразныеуровнилогирования,тонужнаручкапереключениябезперезапуска

•  Клогамможноцеплятьпарсерыдляполученияметрик,ноэтотоженагрузка

Page 39: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Метрикиприложения•  Счетчикисобытий(ошибки,запросы,…)

•  Таймеры(замеряемпродолжительностькаких-тодействий)

•  Мгновенныезначения(текущееколичествосоединений,размеркэша,…)

Page 40: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Метрикиприложения•  Теряемчастьинформациипосравнениюслогом

•  Носильнодешевлелогов

•  Экспортируемвмониторингто,чтонасчитали

•  Рисуемграфики

•  Настраиваемалерты,еслинужно

Page 41: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Метрикиприложения:инструменты

•  <your_lang>-metrics

•  <your_lang>-statsd-client

Page 42: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Инструменты:<your_lang>-metrics•  Либадлявашегоприложения,естьдлявсехЯП

•  Аккумулируетзамерывпамяти

•  Экспортируетвразличныесистемы(graphite,influx,лог,…)

Page 43: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Инструменты:statsd•  UDPсерверпринимаетотстрелызамеровиз

приложения,агрегируетиэкспортируетвмониторинг

•  КлиентыдлявсехЯП

•  Семантикапримернотакаяжекакв*-metrics

•  Естьбиблиотекиспредварительнойагрегациейнаклиенте

Page 44: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

СчетчикиGolang

Page 45: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

ТаймерыGolang

Page 46: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

КейссHTTP-504

Page 47: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"
Page 48: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Ценаметрик(golang)•  GetOrRegister 122 ns/op•  CounterInc 10 ns/op•  Timer_Time 879 ns/op•  2xNow 38 ns/op10.000rps*(10таймероввкаждом)=диагностиказаймет~9%одногоядра

Page 49: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Итого•  DevOpsнужноначинатьсдиагностики

•  Диагностика–этопросто

•  Делайтедиагностикуисходяизсценариевиспользования

•  Естьмногоготовыхинструментов•  Послеэтогоможноdocker,CI/CDи100500микросервисов:)

Page 50: Николай Сивко "Хорошо поддерживаемое в продакшне приложение"

Спасибозавнимание!

Вопросы?

НиколайСивко[email protected]