Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Яндекс.Директ: как мы деплоим наши Perl-web-при...
Search
Elena Bolshakova
June 13, 2014
Programming
800
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
Яндекс.Директ: как мы деплоим наши Perl-web-приложения
http://event.yapcrussia.org/yr2014/talk/273
Elena Bolshakova
June 13, 2014
More Decks by Elena Bolshakova
See All by Elena Bolshakova
Here be dragons: perltrap.com
helena
0
190
Devel::YCallTrace -- noch ein anderes Werkzeug zur Analyse von Perl Programmen
helena
0
580
Other Decks in Programming
See All in Programming
変わらないものが、変わるものを決める — 意図駆動開発 × イベントソーシング × イミュータブル | What Doesn't Change Decides What Can — IDD × Event Sourcing × Immutability
tomohisa
0
1.8k
AIに既存システムを理解させる技術 ~レガシーを見捨てないハーネスエンジニアリング入門~
ochtum
0
120
引き算の組織 ― アウトカムとAIに全振りするために辞めたこと ― / Organization by Subtraction
hirokiyamamoto14
PRO
0
270
Loosening the Reins: Go Generics Get More Flexible
kuro_kurorrr
0
190
Go 1.27 における memory allocation の高速化
andpad
0
300
メールのエイリアス機能を履き違えない
isshinfunada
0
250
How I Won Prize Money at a Hackathon Using Codex and Symphony Alpha
yasei_no_otoko
0
120
初めての模倣学習とVLA
natsutan
0
170
夏だ!祭りだ!祭りとはドメインモデリングでは?
ryugen04
0
360
Webエンジニアなのにブラウザの仕組みがわからないので、Pythonで自作してみた
tatsuki12
4
970
Japan Community Day at Kubecon + CloudNativeCon Japan 2026: Learning Container Privilege Control by Building My Own Low-Level Container Runtime
ternbusty
1
170
AIを紡ぐPMのお話
swdtkuy
0
120
Featured
See All Featured
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
37
6.6k
A Modern Web Designer's Workflow
chriscoyier
698
190k
The Curious Case for Waylosing
cassininazir
1
470
実際に使うSQLの書き方 徹底解説 / pgcon21j-tutorial
soudai
PRO
201
75k
Technical Leadership for Architectural Decision Making
baasie
3
520
Google's AI Overviews - The New Search
badams
0
1.1k
Believing is Seeing
oripsolob
1
200
Deep Space Network (abreviated)
tonyrice
0
270
It's Worth the Effort
3n
188
29k
Leveraging Curiosity to Care for An Aging Population
cassininazir
1
470
Facilitating Awesome Meetings
lara
57
7.1k
The B2B funnel & how to create a winning content strategy
katarinadahlin
PRO
1
480
Transcript
ßíäåêñ.Äèðåêò: êàê ìû äåïëîèì íàøè Perl-ïðèëîæåíèÿ Åëåíà Áîëüøàêîâà 2014-06-13
Section 1 Êòî ìû
Ýòî ßíäåêñ
Ýòî ðåêëàìà
Ýòî ðàçìåùåíèå ðåêëàìû â ßíäåêñå Äèðåêò
Section 2 Êàêèå ìû
Öèôðû íåïðåðûâíàÿ ðàçðàáîòêà ñ 2003 ãîäà; 300 KSLOC perl-êîäà; ∼1000
èìåíîâàííûõ åäèíèö ôóíêöèîíàëüíîñòè: ñòðàíèöû web-èíòåðôåéñà; ìåòîäû âíåøíåãî API; ìåòîäû âíóòðåííèõ API; êðîíîâûå ñêðèïòû; èåðàðõèÿ ïîëüçîâàòåëåé (>15 ðîëåé); 30 ìëí. âíåøíèõ çàïðîñîâ ê perl-ïðèëîæåíèÿì / ñóòêè (ìíîãî çàïèñåé è òÿæåëûõ ÷òåíèé); mysql: ∼170 ìëðä. çàïèñåé îáùåíèå ñ äåñÿòêàìè ñìåæíûõ ñåðâèñîâ; ñåé÷àñ ∼40 ðàçðàáîò÷èêîâ, â ò.÷. ∼20 perl-ðàçðàáîò÷èêîâ; 10000 êîììèòîâ / 7 ìåñÿöåâ, â ò.÷. 2500 trunk-êîììèòîâ; ïðîäàêøåí: perl-êîä íà ∼40 ñåðâåðàõ; ∼2 ðåëèçà â íåäåëþ.
Òåõíîëîãèè ubuntu perl server-side javascript python, django mysql mongodb map-reduce
(YT) memcached
Òåõíîëîãèè-2 plack apache nginx starman gearman ubic soap (SOAP::Lite) xmlrpc
(XMLRPC::Lite) jsonrpc (JSON::RPC, JSON::RPC::Simple::Client, JSON::RPC2::Client)
Ñðåäû ðàçðàáîò÷åñêèå, ÒÑ, ïðîäàêøåí: ðàçðàáîò÷åñêèå ñ óïðîùåííîé èíôðàñòðóêòóðîé; ÒÑ
ñ ïîëíîöåííîé, êàê íà ïðîäàêøåíå; ðàçðàáîò÷åñêèå è òåñòîâûå ÁÄ: îáåçëè÷åííûé áåêàï ïðîäàêøåíà ðåãóëÿðíî òåñòèðóåòñÿ áåêàï è âîññòàíîâëåíèå; ðàçíîîáðàçíûå äàííûå äëÿ òåñòèðîâàíèÿ; äîñòóïû ðàçäåëåíû (ïðîäàêøåí îáíîâëÿþò òîëüêî àäìèíû).
Section 3 Ïîðà â ïðîäàêøåí
Óïðàâëåíèå ñåðâåðàìè Ñîáñòâåííàÿ Rex-ïîäîáíàÿ óòèëèòà ïîâåðõ ssh; íà óïðàâëÿåìûõ ìàøèíàõ
íèêàêèõ àãåíòîâ.
Ðåëèçû ïåðâè÷íûé èñòî÷íèê èíôîðìàöèè î ðåëèçàõ òðåêåð: ÷òî è
êàê âûêëàäûâàåì; êàêèå ïðîáëåìû íàéäåíû; ñòàòóñû (ïîäòâåðæäåíèÿ QA, çàêàç÷èêà, RM); êàæäûé ðåëèç òåñòèðóåòñÿ íà ÒÑ; ÷òî òåñòèðîâàòü: èçìåíåíèÿ îò ïðîøëîãî ðåëèçà (svn log); ðåãðåññèîííûå òåñòû; â êàæäîì commit-message ññûëêà íà òèêåò â òðåêåðå (ïðîâåðÿåòñÿ svn hook-îì).
Êîä deb-ïàêåòû, apt Óäîáíî: ðàáîòàåò; óíèâåðñàëüíî; ìíîãî ãîòîâûõ èíñòðóìåíòîâ; çàâèñèìîñòè,
â ò.÷. íåïåðëîâûå. Íåóäîáíî: óñòàíàâëèâàòü íå âåðõíþþ âåðñèþ íåïðîñòî; ïîëíîöåííî îòêàòèòü âñå êàê áûëî íåïðîñòî.
Êîä, ìàëåíüêèå õèòðîñòè mainline releasable; ïàêåòèðóåòñÿ ëèáî òðàíê, ëèáî ðåëèçíûé
áðàí÷ (òðàíê + ÷åððè-ïèê); ïî âåðñèè âñåãäà ïîíÿòíî, êàêàÿ òî÷êà â ðåïîçèòîðèè ïàêåòèðîâàëàñü; îòäåëüíûé êîíòðîëèðóåìûé deb-ðåïîçèòîðèé; æóðíàë: ÷òî âûëîæåíî â êàæäûé ìîìåíò íà ñåðâåðàõ, ïèñüìà îá îáíîâëåíèÿõ; çàâèñèìîñòè óêàçûâàòü ñ >=; ïîòåíöèàëüíî îïàñíûå/ñëîæíîîòêàòûâàåìûå îáíîâëåíèÿ îòäåëüíî îò ïðî÷èõ ðåëèçîâ; çàðàíåå ïðîâåðÿòü ïðèãîäíîñòü çàâèñèìîñòåé ê óñòàíîâêå.
Ìèãðàöèè: èçìåíåíèå ñòðóêòóðû ÁÄ (àëüòåðû) Ôàéëû ìèãðàöèé â /deploy ïèøóòñÿ
è êîììèòÿòñÿ âìåñòå ñ êîäîì; ôîðìàò ñòðîãèé, íî ÷åëîâåêî÷èòàåìûé: 20140613_client_comments.migr { type => 'sql', db => 'main', when => 'before', time_estimate => "20 sec", sql => "alter table clients add column `comment` varchar(140) default ''", } ïðèìåíÿþòñÿ ïîëóàâòîìàòè÷åñêè íà ÒÑ, âðó÷íóþ íà ïðîäàêøåíå;
Ìèãðàöèè: êîíâåðòàöèè äàííûõ 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 ", }
Ìèãðàöèè: æäåò ðåøåíèÿ àâòîìàòè÷åñêè ïðîâåðÿòü ïðèìåíåííîñòü; ïðîñòûå ñêðèïòû çàïóñêàòü áåç
ó÷àñòèÿ ÷åëîâåêà.
Ìèãðàöèè: ìàëåíüêèå õèòðîñòè ãëîáàëüíîãî ïîðÿäêà íåò; ÷åëîâåêîïîíÿòíûå èìåíà ñ ïðèìåðíîé
äàòîé; îáÿçàòåëüíûå ðåâüþ è àïïðóâû; óíèâåðñàëüíûé ôîðìàò äëÿ âñåõ äåéñòâèé, ñîïðîâîæäàþùèõ îáíîâëåíèå êîäà; õåëïåð äëÿ ñîçäàíèÿ øàáëîíà ìèãðàöèè; ïàðñèíã: Safe::reval; ñòðîãàÿ âàëèäàöèÿ; ïðîâåðêà ñèíòàêñèñà sql: DBIx::MyParsePP; âðåìÿ ïðèìåíåíèÿ: äî/ïîñëå âûêëàäêè êîäà/êîãäà óãîäíî; òÿæåëûå ìèãðàöèè; òåêñòîâûå îïèñàíèÿ ìèãðàöèé ïèøóòñÿ âìåñòå ñ changelog-îì â ðåëèçíûé òèêåò; åñëè íàäî êîììåíòàðèè, êàê îòêàòûâàòü.
Ìîíèòîðèíã ñõåìû ÁÄ Ôàéëû â /db_schema .schema.sql, .data.sql ñõåìû
è ñëîâàðíûå äàííûå; .text îïèñàíèå òàáëèö; ñêðèïò äëÿ ñðàâíåíèÿ ÁÄ ñ ôàéëàìè; îò÷åòû î ðàñõîæäåíèè ïðîäàêøåí-áàçû è ñîõðàíåííûõ ñõåì. À åùå SchemaSpy: âèçóàëèçàöèÿ ñâÿçåé â ÁÄ. Æäåò ðåøåíèÿ: ïðîâåðÿòü àêòóàëüíîñòü ñîõðàíåííûõ ñõåì ñðàçó ïîñëå êîììèòà.
Ðåãóëÿðíûå çàïóñêè ñêðèïòîâ Ôàéëû â /etc/cron.d Ãåíåðèðóþòñÿ ïðè ñáîðêå ïàêåòîâ
èç pod + íåìíîãî ïîäãîòîâëåííûõ çàðàíåå
Section 4 Áîíóñ-òðåê
Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå ñèíòàêñèñ è ïîäòâåðæäåííîñòü ìèãðàöèé; îòñóòñòâèå
îòëàäî÷íîé ïå÷àòè â ñêðèïòàõ ìèãðàöèé; ñèíòàêñèñ êðîíòàáîâ (íàïðèìåð: ïðè îòñóòñòâèè ïåðåâîäà ñòðîêè â êîíöå ôàéëà cron èãíîðèðóåò ôàéë); ñîîòâåòñòâèå ñóùåñòâóþùèõ ñêðèïòîâ è çàïèñåé â êðîíòàáàõ; ïðàâèëüíûå ôàéëû â /debian: ãëîáàëüíûå ôàéëû + ôàéëû, îòíîñÿùèåñÿ ê ñóùåñòâóþùèì ïàêåòàì; êîìïèëÿöèÿ âñåãî perl-êîäà; êîìïèëÿöèÿ âñåõ TT-øàáëîíîâ; ñîîòâåòñòâèå èñïîëüçóåìûõ è ñóùåñòâóþùèõ øàáëîíîâ; íà âñåõ ñêðèïòàõ åñòü svn:executable + ïðàâèëüíûé shebang;
Ïðîâåðêè, êîòîðûå äåëàþò æèçíü ñïîêîéíåå îòñóòñòâèå ñëåäîâ íåäîðàçðåøåííûõ êîíôëèêòîâ; mergeinfo
òîëüêî íà êîðíå ïðîåêòà; íå÷åëîâåêî÷èòàåìûå ôàéëû èìåþò ïðàâèëüíûé mime-type; âñå èñõîäíèêè â utf8; ìåòêà NO_PRODUCTION.
Ñïàñèáî! Âîïðîñû? Åëåíà Áîëüøàêîâà,
[email protected]