Upload
elena-bolshakova
View
142
Download
1
Embed Size (px)
DESCRIPTION
http://event.yapcrussia.org/yr2014/talk/273 Доклад с YAPC::Russia 2014 Аннотация: Для рекламодателей Яндекс.Директ -- это инструмент размещения контекстных объявлений на самом Яндексе и на сайтах Рекламной сети. Внутри этот "клиентский интерфейс" -- сложный сервис с долгой историей, высокой нагрузкой, десятками серверов, терабайтами данных, несколькими (географически распределенными) группами разработчиков, тестировщиков, администраторов, менеджеров. Написан наш сервис преимущественно на Perl. Я расскажу о наших процедурах и инструментах, относящихся к выпуску новых версий; о том, что происходит до, во время и после выкладки в продакшен.
Citation preview
ßíäåêñ.Äèðåêò: êàê ìû äåïëîèì íàøèPerl-ïðèëîæåíèÿ
Åëåíà Áîëüøàêîâà
2014-06-13
Section 1
Êòî ìû
Ýòî ßíäåêñ
Ýòî ðåêëàìà
Ýòî ðàçìåùåíèå ðåêëàìû â ßíäåêñå � Äèðåêò
Section 2
Êàêèå ìû
Öèôðû
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 ðåëèçà â íåäåëþ.
Òåõíîëîãèè
I ubuntu
I perl
I server-side javascript
I python, django
I mysql
I mongodb
I map-reduce (YT)
I memcached
Òåõíîëîãèè-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)
Ñðåäû
I ðàçðàáîò÷åñêèå, ÒÑ, ïðîäàêøåí:I ðàçðàáîò÷åñêèå � ñ óïðîùåííîé èíôðàñòðóêòóðîé;I ÒÑ � ñ ïîëíîöåííîé, êàê íà ïðîäàêøåíå;
I ðàçðàáîò÷åñêèå è òåñòîâûå ÁÄ: îáåçëè÷åííûé áåêàïïðîäàêøåíà
I ðåãóëÿðíî òåñòèðóåòñÿ áåêàï è âîññòàíîâëåíèå;I ðàçíîîáðàçíûå äàííûå äëÿ òåñòèðîâàíèÿ;
I äîñòóïû ðàçäåëåíû (ïðîäàêøåí îáíîâëÿþò òîëüêîàäìèíû).
Section 3
Ïîðà â ïðîäàêøåí
Óïðàâëåíèå ñåðâåðàìè
Ñîáñòâåííàÿ Rex-ïîäîáíàÿ óòèëèòà
I ïîâåðõ ssh;
I íà óïðàâëÿåìûõ ìàøèíàõ íèêàêèõ àãåíòîâ.
Ðåëèçû
I ïåðâè÷íûé èñòî÷íèê èíôîðìàöèè î ðåëèçàõ � òðåêåð:I ÷òî è êàê âûêëàäûâàåì;I êàêèå ïðîáëåìû íàéäåíû;I ñòàòóñû (ïîäòâåðæäåíèÿ QA, çàêàç÷èêà, RM);
I êàæäûé ðåëèç òåñòèðóåòñÿ íà ÒÑ;
I ÷òî òåñòèðîâàòü:I èçìåíåíèÿ îò ïðîøëîãî ðåëèçà (svn log);I ðåãðåññèîííûå òåñòû;
I â êàæäîì commit-message ññûëêà íà òèêåò â òðåêåðå(ïðîâåðÿåòñÿ svn hook-îì).
Êîä
deb-ïàêåòû, apt
Óäîáíî:
I ðàáîòàåò;
I óíèâåðñàëüíî;
I ìíîãî ãîòîâûõ èíñòðóìåíòîâ;
I çàâèñèìîñòè, â ò.÷. íåïåðëîâûå.
Íåóäîáíî:
I óñòàíàâëèâàòü íå âåðõíþþ âåðñèþ � íåïðîñòî;
I ïîëíîöåííî îòêàòèòü �âñå êàê áûëî� � íåïðîñòî.
Êîä, ìàëåíüêèå õèòðîñòè
I mainline releasable;
I ïàêåòèðóåòñÿ ëèáî òðàíê, ëèáî ðåëèçíûé áðàí÷ (òðàíê +÷åððè-ïèê);
I ïî âåðñèè âñåãäà ïîíÿòíî, êàêàÿ òî÷êà â ðåïîçèòîðèèïàêåòèðîâàëàñü;
I îòäåëüíûé êîíòðîëèðóåìûé deb-ðåïîçèòîðèé;
I æóðíàë: ÷òî âûëîæåíî â êàæäûé ìîìåíò íà ñåðâåðàõ,ïèñüìà îá îáíîâëåíèÿõ;
I çàâèñèìîñòè óêàçûâàòü ñ >=;
I ïîòåíöèàëüíî îïàñíûå/ñëîæíîîòêàòûâàåìûå îáíîâëåíèÿ �îòäåëüíî îò ïðî÷èõ ðåëèçîâ;
I çàðàíåå ïðîâåðÿòü ïðèãîäíîñòü çàâèñèìîñòåé ê óñòàíîâêå.
Ìèãðàöèè: èçìåíåíèå ñòðóêòóðû ÁÄ (�àëüòåðû�)Ôàéëû ìèãðàöèé â /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 ïðèìåíÿþòñÿ ïîëóàâòîìàòè÷åñêè íà ÒÑ, âðó÷íóþ íàïðîäàêøåíå;
Ìèãðàöèè: êîíâåðòàöèè äàííûõ
20140614_normalize_geo.migr
{
type => 'script',
when => 'after',
time_estimate => "10 ÷àñîâ",
comment => "åñëè óïàäåò -- ìîæíî çàïóñêàòü çàíîâî",
script => "normalize_geo.pl",
}
Ìèãðàöèè: ïðî÷èå äåéñòâèÿ
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
",
}
Ìèãðàöèè: æäåò ðåøåíèÿ
I àâòîìàòè÷åñêè ïðîâåðÿòü ïðèìåíåííîñòü;
I ïðîñòûå ñêðèïòû çàïóñêàòü áåç ó÷àñòèÿ ÷åëîâåêà.
Ìèãðàöèè: ìàëåíüêèå õèòðîñòè
I ãëîáàëüíîãî ïîðÿäêà íåò;
I ÷åëîâåêîïîíÿòíûå èìåíà ñ ïðèìåðíîé äàòîé;
I îáÿçàòåëüíûå ðåâüþ è àïïðóâû;
I óíèâåðñàëüíûé ôîðìàò äëÿ âñåõ äåéñòâèé,ñîïðîâîæäàþùèõ îáíîâëåíèå êîäà;
I õåëïåð äëÿ ñîçäàíèÿ øàáëîíà ìèãðàöèè;
I ïàðñèíã: Safe::reval;
I ñòðîãàÿ âàëèäàöèÿ;
I ïðîâåðêà ñèíòàêñèñà sql: DBIx::MyParsePP;
I âðåìÿ ïðèìåíåíèÿ: äî/ïîñëå âûêëàäêè êîäà/êîãäà óãîäíî;
I �òÿæåëûå ìèãðàöèè�;
I òåêñòîâûå îïèñàíèÿ ìèãðàöèé ïèøóòñÿ âìåñòå ñchangelog-îì â ðåëèçíûé òèêåò;
I åñëè íàäî � êîììåíòàðèè, êàê îòêàòûâàòü.
Ìîíèòîðèíã ñõåìû ÁÄ
Ôàéëû â /db_schema
I .schema.sql, .data.sql � ñõåìû è ñëîâàðíûå äàííûå;
I .text � îïèñàíèå òàáëèö;
I ñêðèïò äëÿ ñðàâíåíèÿ ÁÄ ñ ôàéëàìè;
I îò÷åòû î ðàñõîæäåíèè ïðîäàêøåí-áàçû è ñîõðàíåííûõñõåì.
À åùå SchemaSpy: âèçóàëèçàöèÿ ñâÿçåé â ÁÄ.
Æäåò ðåøåíèÿ: ïðîâåðÿòü àêòóàëüíîñòü ñîõðàíåííûõ ñõåìñðàçó ïîñëå êîììèòà.
Ðåãóëÿðíûå çàïóñêè ñêðèïòîâ
Ôàéëû â /etc/cron.d
Ãåíåðèðóþòñÿ ïðè ñáîðêå ïàêåòîâ èç pod + íåìíîãîïîäãîòîâëåííûõ çàðàíåå
Section 4
Áîíóñ-òðåê
Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå
I ñèíòàêñèñ è ïîäòâåðæäåííîñòü ìèãðàöèé;
I îòñóòñòâèå îòëàäî÷íîé ïå÷àòè â ñêðèïòàõ ìèãðàöèé;
I ñèíòàêñèñ êðîíòàáîâ (íàïðèìåð: ïðè îòñóòñòâèè ïåðåâîäàñòðîêè â êîíöå ôàéëà cron èãíîðèðóåò ôàéë);
I ñîîòâåòñòâèå ñóùåñòâóþùèõ ñêðèïòîâ è çàïèñåé âêðîíòàáàõ;
I ïðàâèëüíûå ôàéëû â /debian: ãëîáàëüíûå ôàéëû +ôàéëû, îòíîñÿùèåñÿ ê ñóùåñòâóþùèì ïàêåòàì;
I êîìïèëÿöèÿ âñåãî perl-êîäà;
I êîìïèëÿöèÿ âñåõ TT-øàáëîíîâ;
I ñîîòâåòñòâèå èñïîëüçóåìûõ è ñóùåñòâóþùèõ øàáëîíîâ;
I íà âñåõ ñêðèïòàõ åñòü svn:executable + ïðàâèëüíûé shebang;
Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå
I îòñóòñòâèå ñëåäîâ íåäîðàçðåøåííûõ êîíôëèêòîâ;
I mergeinfo òîëüêî íà êîðíå ïðîåêòà;
I íå÷åëîâåêî÷èòàåìûå ôàéëû èìåþò ïðàâèëüíûé mime-type;
I âñå èñõîäíèêè â utf8;
I ìåòêà NO_PRODUCTION.