Яндекс.Директ: как мы деплоим наши perl-web-приложения

26

Upload: elena-bolshakova

Post on 11-Jun-2015

147 views

Category:

Engineering


1 download

DESCRIPTION

http://event.yapcrussia.org/yr2014/talk/273 Доклад с YAPC::Russia 2014 Аннотация: Для рекламодателей Яндекс.Директ -- это инструмент размещения контекстных объявлений на самом Яндексе и на сайтах Рекламной сети. Внутри этот "клиентский интерфейс" -- сложный сервис с долгой историей, высокой нагрузкой, десятками серверов, терабайтами данных, несколькими (географически распределенными) группами разработчиков, тестировщиков, администраторов, менеджеров. Написан наш сервис преимущественно на Perl. Я расскажу о наших процедурах и инструментах, относящихся к выпуску новых версий; о том, что происходит до, во время и после выкладки в продакшен.

TRANSCRIPT

Page 1: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

ßíäåêñ.Äèðåêò: êàê ìû äåïëîèì íàøèPerl-ïðèëîæåíèÿ

Åëåíà Áîëüøàêîâà

2014-06-13

Page 2: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Section 1

Êòî ìû

Page 3: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ýòî ßíäåêñ

Page 4: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ýòî ðåêëàìà

Page 5: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ýòî ðàçìåùåíèå ðåêëàìû â ßíäåêñå � Äèðåêò

Page 6: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Section 2

Êàêèå ìû

Page 7: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Öèôðû

I íåïðåðûâíàÿ ðàçðàáîòêà ñ 2003 ãîäà;

I 300 KSLOC perl-êîäà;I ∼1000 èìåíîâàííûõ åäèíèö ôóíêöèîíàëüíîñòè:

I ñòðàíèöû web-èíòåðôåéñà;I ìåòîäû âíåøíåãî API;I ìåòîäû âíóòðåííèõ API;I êðîíîâûå ñêðèïòû;

I èåðàðõèÿ ïîëüçîâàòåëåé (>15 ðîëåé);

I 30 ìëí. âíåøíèõ çàïðîñîâ ê perl-ïðèëîæåíèÿì / ñóòêè(ìíîãî çàïèñåé è òÿæåëûõ ÷òåíèé);

I mysql: ∼170 ìëðä. çàïèñåé

I îáùåíèå ñ äåñÿòêàìè ñìåæíûõ ñåðâèñîâ;

I ñåé÷àñ ∼40 ðàçðàáîò÷èêîâ, â ò.÷. ∼20 perl-ðàçðàáîò÷èêîâ;

I 10000 êîììèòîâ / 7 ìåñÿöåâ, â ò.÷. 2500 trunk-êîììèòîâ;

I ïðîäàêøåí: perl-êîä íà ∼40 ñåðâåðàõ;

I ∼2 ðåëèçà â íåäåëþ.

Page 8: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Òåõíîëîãèè

I ubuntu

I perl

I server-side javascript

I python, django

I mysql

I mongodb

I map-reduce (YT)

I memcached

Page 9: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Òåõíîëîãèè-2

I plack

I apache

I nginx

I starman

I gearman

I ubic

I soap (SOAP::Lite)

I xmlrpc (XMLRPC::Lite)

I jsonrpc (JSON::RPC, JSON::RPC::Simple::Client,JSON::RPC2::Client)

Page 10: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ñðåäû

I ðàçðàáîò÷åñêèå, ÒÑ, ïðîäàêøåí:I ðàçðàáîò÷åñêèå � ñ óïðîùåííîé èíôðàñòðóêòóðîé;I ÒÑ � ñ ïîëíîöåííîé, êàê íà ïðîäàêøåíå;

I ðàçðàáîò÷åñêèå è òåñòîâûå ÁÄ: îáåçëè÷åííûé áåêàïïðîäàêøåíà

I ðåãóëÿðíî òåñòèðóåòñÿ áåêàï è âîññòàíîâëåíèå;I ðàçíîîáðàçíûå äàííûå äëÿ òåñòèðîâàíèÿ;

I äîñòóïû ðàçäåëåíû (ïðîäàêøåí îáíîâëÿþò òîëüêîàäìèíû).

Page 11: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Section 3

Ïîðà â ïðîäàêøåí

Page 12: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Óïðàâëåíèå ñåðâåðàìè

Ñîáñòâåííàÿ Rex-ïîäîáíàÿ óòèëèòà

I ïîâåðõ ssh;

I íà óïðàâëÿåìûõ ìàøèíàõ íèêàêèõ àãåíòîâ.

Page 13: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ðåëèçû

I ïåðâè÷íûé èñòî÷íèê èíôîðìàöèè î ðåëèçàõ � òðåêåð:I ÷òî è êàê âûêëàäûâàåì;I êàêèå ïðîáëåìû íàéäåíû;I ñòàòóñû (ïîäòâåðæäåíèÿ QA, çàêàç÷èêà, RM);

I êàæäûé ðåëèç òåñòèðóåòñÿ íà ÒÑ;

I ÷òî òåñòèðîâàòü:I èçìåíåíèÿ îò ïðîøëîãî ðåëèçà (svn log);I ðåãðåññèîííûå òåñòû;

I â êàæäîì commit-message ññûëêà íà òèêåò â òðåêåðå(ïðîâåðÿåòñÿ svn hook-îì).

Page 14: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Êîä

deb-ïàêåòû, apt

Óäîáíî:

I ðàáîòàåò;

I óíèâåðñàëüíî;

I ìíîãî ãîòîâûõ èíñòðóìåíòîâ;

I çàâèñèìîñòè, â ò.÷. íåïåðëîâûå.

Íåóäîáíî:

I óñòàíàâëèâàòü íå âåðõíþþ âåðñèþ � íåïðîñòî;

I ïîëíîöåííî îòêàòèòü �âñå êàê áûëî� � íåïðîñòî.

Page 15: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Êîä, ìàëåíüêèå õèòðîñòè

I mainline releasable;

I ïàêåòèðóåòñÿ ëèáî òðàíê, ëèáî ðåëèçíûé áðàí÷ (òðàíê +÷åððè-ïèê);

I ïî âåðñèè âñåãäà ïîíÿòíî, êàêàÿ òî÷êà â ðåïîçèòîðèèïàêåòèðîâàëàñü;

I îòäåëüíûé êîíòðîëèðóåìûé deb-ðåïîçèòîðèé;

I æóðíàë: ÷òî âûëîæåíî â êàæäûé ìîìåíò íà ñåðâåðàõ,ïèñüìà îá îáíîâëåíèÿõ;

I çàâèñèìîñòè óêàçûâàòü ñ >=;

I ïîòåíöèàëüíî îïàñíûå/ñëîæíîîòêàòûâàåìûå îáíîâëåíèÿ �îòäåëüíî îò ïðî÷èõ ðåëèçîâ;

I çàðàíåå ïðîâåðÿòü ïðèãîäíîñòü çàâèñèìîñòåé ê óñòàíîâêå.

Page 16: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ìèãðàöèè: èçìåíåíèå ñòðóêòóðû ÁÄ (�àëüòåðû�)Ôàéëû ìèãðàöèé â /deploy

I ïèøóòñÿ è êîììèòÿòñÿ âìåñòå ñ êîäîì;

I ôîðìàò � ñòðîãèé, íî ÷åëîâåêî÷èòàåìûé:

20140613_client_comments.migr

{

type => 'sql',

db => 'main',

when => 'before',

time_estimate => "20 sec",

sql => "alter table clients add column

`comment` varchar(140) default ''",

}

I ïðèìåíÿþòñÿ ïîëóàâòîìàòè÷åñêè íà ÒÑ, âðó÷íóþ íàïðîäàêøåíå;

Page 17: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ìèãðàöèè: êîíâåðòàöèè äàííûõ

20140614_normalize_geo.migr

{

type => 'script',

when => 'after',

time_estimate => "10 ÷àñîâ",

comment => "åñëè óïàäåò -- ìîæíî çàïóñêàòü çàíîâî",

script => "normalize_geo.pl",

}

Page 18: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ìèãðàöèè: ïðî÷èå äåéñòâèÿ

20131218_upgrade_nginx.migr

{

type => 'manual',

when => 'any',

time_estimate => "10 min",

text => "Âûïîëíèòü íà ñåðâåðàõ ãðóïïû PERL:

apt-get install nginx-common=1.4.4-5 nginx=1.4.4-5 \

nginx-full=1.4.4-5

è çàòåì

nginx-upgrade

",

}

Page 19: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ìèãðàöèè: æäåò ðåøåíèÿ

I àâòîìàòè÷åñêè ïðîâåðÿòü ïðèìåíåííîñòü;

I ïðîñòûå ñêðèïòû çàïóñêàòü áåç ó÷àñòèÿ ÷åëîâåêà.

Page 20: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ìèãðàöèè: ìàëåíüêèå õèòðîñòè

I ãëîáàëüíîãî ïîðÿäêà íåò;

I ÷åëîâåêîïîíÿòíûå èìåíà ñ ïðèìåðíîé äàòîé;

I îáÿçàòåëüíûå ðåâüþ è àïïðóâû;

I óíèâåðñàëüíûé ôîðìàò äëÿ âñåõ äåéñòâèé,ñîïðîâîæäàþùèõ îáíîâëåíèå êîäà;

I õåëïåð äëÿ ñîçäàíèÿ øàáëîíà ìèãðàöèè;

I ïàðñèíã: Safe::reval;

I ñòðîãàÿ âàëèäàöèÿ;

I ïðîâåðêà ñèíòàêñèñà sql: DBIx::MyParsePP;

I âðåìÿ ïðèìåíåíèÿ: äî/ïîñëå âûêëàäêè êîäà/êîãäà óãîäíî;

I �òÿæåëûå ìèãðàöèè�;

I òåêñòîâûå îïèñàíèÿ ìèãðàöèé ïèøóòñÿ âìåñòå ñchangelog-îì â ðåëèçíûé òèêåò;

I åñëè íàäî � êîììåíòàðèè, êàê îòêàòûâàòü.

Page 21: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ìîíèòîðèíã ñõåìû ÁÄ

Ôàéëû â /db_schema

I .schema.sql, .data.sql � ñõåìû è ñëîâàðíûå äàííûå;

I .text � îïèñàíèå òàáëèö;

I ñêðèïò äëÿ ñðàâíåíèÿ ÁÄ ñ ôàéëàìè;

I îò÷åòû î ðàñõîæäåíèè ïðîäàêøåí-áàçû è ñîõðàíåííûõñõåì.

À åùå SchemaSpy: âèçóàëèçàöèÿ ñâÿçåé â ÁÄ.

Æäåò ðåøåíèÿ: ïðîâåðÿòü àêòóàëüíîñòü ñîõðàíåííûõ ñõåìñðàçó ïîñëå êîììèòà.

Page 22: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ðåãóëÿðíûå çàïóñêè ñêðèïòîâ

Ôàéëû â /etc/cron.d

Ãåíåðèðóþòñÿ ïðè ñáîðêå ïàêåòîâ èç pod + íåìíîãîïîäãîòîâëåííûõ çàðàíåå

Page 23: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Section 4

Áîíóñ-òðåê

Page 24: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå

I ñèíòàêñèñ è ïîäòâåðæäåííîñòü ìèãðàöèé;

I îòñóòñòâèå îòëàäî÷íîé ïå÷àòè â ñêðèïòàõ ìèãðàöèé;

I ñèíòàêñèñ êðîíòàáîâ (íàïðèìåð: ïðè îòñóòñòâèè ïåðåâîäàñòðîêè â êîíöå ôàéëà cron èãíîðèðóåò ôàéë);

I ñîîòâåòñòâèå ñóùåñòâóþùèõ ñêðèïòîâ è çàïèñåé âêðîíòàáàõ;

I ïðàâèëüíûå ôàéëû â /debian: ãëîáàëüíûå ôàéëû +ôàéëû, îòíîñÿùèåñÿ ê ñóùåñòâóþùèì ïàêåòàì;

I êîìïèëÿöèÿ âñåãî perl-êîäà;

I êîìïèëÿöèÿ âñåõ TT-øàáëîíîâ;

I ñîîòâåòñòâèå èñïîëüçóåìûõ è ñóùåñòâóþùèõ øàáëîíîâ;

I íà âñåõ ñêðèïòàõ åñòü svn:executable + ïðàâèëüíûé shebang;

Page 25: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå

I îòñóòñòâèå ñëåäîâ íåäîðàçðåøåííûõ êîíôëèêòîâ;

I mergeinfo òîëüêî íà êîðíå ïðîåêòà;

I íå÷åëîâåêî÷èòàåìûå ôàéëû èìåþò ïðàâèëüíûé mime-type;

I âñå èñõîäíèêè â utf8;

I ìåòêà NO_PRODUCTION.

Page 26: Яндекс.Директ: как мы деплоим наши Perl-web-приложения

Ñïàñèáî!

Âîïðîñû?

Åëåíà Áîëüøàêîâà, [email protected]