æ°çŸã®ããŒã¿ããŒã¹ãšæ°åã®ã¹ãã¢ãããã·ãŒãžã£ã 24x7ã®é«è² è·ã®ç¶æ
ã§è¿
éã«ããŒã«ããã¯ããæ»ãªãªãæ©èœãåãããå€ãã®ãµãŒããŒã§ãã¹ãŠãäœæããã¹ããå±éããæ¹æ³ã¯ïŒ é¢çœãïŒ ç«ãžããããïŒ

ãã§ã«ãåç¥ã®ããã«ã
Avitoã®ãã¹ãŠã®
åºåã¯PostgreSQL
ã«ååšããŸãã ãã®ããŒã¿ããŒã¹ã®æ©èœã¯ãããŒã¿ã¬ãã«ã ãã§ãªããã¹ãã¢ãããã·ãŒãžã£ãããªã¬ãŒãé¢æ°ãéããŠãã®ããŒã¿ãžã®ã¢ã¯ã»ã¹ãæäŸããç¬èªã®APIã®äœæã«ãåºã¥ããŠãéåžžã«åªããæ©èœãæäŸããŸãã ãã®æ§é å
šäœã§äœæ¥ããå Žåãããã€ãã®å€æŽãå¿
èŠã«ãªãããšããããããŸãã ãããŠæãåçŽãªã±ãŒã¹ã§ã¯ãéçºè
ã1ã€ã®ã¯ã©ã€ã¢ã³ããš1ã€ã®ããŒã¿ããŒã¹ãæ±ãå ŽåãæŽæ°ããã»ã¹ã¯éåžžã«åçŽã«èŠããŸããå€æŽã移è¡ã¹ã¯ãªããããããŠããã ãã§ãã ãããããã®ãããªç¶æ³ã¯ãŸãã§ãããå€ãã®å Žåã補åã®é¡§å®¢ãšããŒã¿ããŒã¹ã¯æ°çŸã«ãªããŸãã ãããã£ãŠãéåžžã®ããŒã¿ããŒã¹ã©ã€ããµã€ã¯ã«ã§ã¯ãã³ãŒããããŒãžã§ã³ç®¡çããã¡ã«ããºã ãäžå¯æ¬ ã§ãã
ãã®èšäºã§ã¯ãAvitoã§å®è£
ããããŒã¿ããŒã¹å
ã®ã³ãŒããããŒãžã§ã³ç®¡çãã2ã€ã®æ¹æ³ã«ã€ããŠèª¬æããŸãã ãã®æ
å ±ã圹ç«ã€å ŽåããããŸãã ãŸããå°ãã®ã³ã³ããã¹ãã
Avitoã¯ïŒ
- èšå€§ãªæ°ã®ãµãŒããŒãšããã«å€ãã®ããŒã¿ããŒã¹ã
- ãã¹ãŠã®ããŒã¹ã®åèšãµã€ãºã¯15 Tbã§ãã
- éåžžã«é«ãTPSãå¹³å10Kã
- å€ãã®éçºè
ãšgitãã©ã³ãã
æåã®ã¿ã¹ã¯ïŒ
- ç°ãªãgitãã©ã³ãã®äžã§åãããŒã¹ã«è€æ°ã®ããŒãžã§ã³ã®ããã·ãŒãžã£ãå±éããŸãã
- ã¹ãã¢ãããã·ãŒãžã£ã³ãŒãã®äŸ¿å©ãªããŒãžã§ã³ç®¡çã
æåã®ããŒãžã§ã³ç®¡çãªãã·ã§ã³
ç§ãã¡ãæãã€ããæåã®ãªãã·ã§ã³ã¯
ãèŸæžã«ããããŒãžã§ã³ç®¡çã§ãã
詳现
- PHPã³ãŒãããåŒã³åºãããã¹ãã¢ãããã·ãŒãžã£ã®ã¿ããããžã§ã¯ãã«æ ŒçŽããããããã€ã®å¯Ÿè±¡ãšãªããŸãã
- ãããžã§ã¯ãå
ã«ãã¡ã€ã«è¡šçŸãæããªãã¹ãã¢ãããã·ãŒãžã£ã¯ã移è¡ããŒã«ãDBAã³ãã³ãã䜿çšããŠãããã€ãããŸãã
- ãããã€ãããåããŒã¿ããŒã¹ã«ã¯ãstored_proceduresããŒãã«ããããŸãã
åå
| 説æ
| äŸ
|
æ
| åœ¹è· æ ãã®äžã§ å®æœããã ä¿åã®éçº æé
| ãã±ãŒã·ã§ã³IDä¿®æ£
|
fn_name
| åœ¹è· ä¿åããã ãå«ãæé ã¹ããŒã
| core.location_save
|
fn_md5
| ããã·ã¥é ïŒmd5ïŒã³ãŒã ä¿åããã æé
| 0539f31fee4efd845a24c9878cd721b2
|
ver_id
| ããŒãžã§ã³çªå· å¢å ããŠããŸã 1 at å€ãã ããã·ã¥ ããã©ã«ãïŒ0
| 2
|
create_txtime
| æé äœæäž
| 2016-12-11 10:16:10
|
update_txtime
| æé æåŸã® æŽæ° ããŒãžã§ã³ ïŒå¢å ver_idïŒ
| 2016-12-11 11:23:14
|
- ãã®ãããžã§ã¯ãã«ã¯ããã©ã³ãããšã«ããŒãã«ãããã£ã«ã¿ãªã³ã°ãããããŒã¿ãå«ãphpèŸæžããããŸãïŒãã©ã³ã= '<çŸåšã®ãã©ã³ãã®åå>'ïŒã ãã®çµæãèŸæžã«ã¯ãã®ãã©ã³ãã®ãã¹ãŠã®ã¹ãã¢ãããã·ãŒãžã£ã®ååïŒããŒã¿ããŒã¹ã®ååãå«ãïŒãšver_idãå«ãŸããŸãã
1 => array ( 'verId' => 2, 'hash' => '0539f31fee4efd845a24c9878cd721b2', 'fnFullName' => 'core.location_save@master' )
- ã¹ãã¢ãããã·ãŒãžã£ã®ããŒãžã§ã³ã¯ãååã®ãã¹ããã£ãã¯ã¹ãã決å®ãããŸãããã®ãã¹ããã£ãã¯ã¹ã®åœ¢åŒã¯ã <ã¹ãã¢ãããã·ãŒãžã£å> _verïŒã§ ã ïŒã¯ããŒãžã§ã³çªå·ã§ãã
- stored_proceduresã®ãã©ã³ãåã®ãããã§ãç°ãªããã©ã³ãã¯åãååã®ã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºãããšãã§ããŸãããããã®ã¹ãã¢ãããã·ãŒãžã£ã¯ç°ãªãã³ãŒããæã¡ããããã£ãŠããŒãžã§ã³ãç°ãªããŸãã
- ãã©ã³ãã§ã®éçºãå®äºãããšãã¹ãã¢ãããã·ãŒãžã£ã®ã³ãŒãïŒphpã³ãŒããªã©ïŒããã¹ã¿ãŒã«åºå®ãããŸãã
- ã¹ãã¢ãããã·ãŒãžã£ã®ãã¡ã€ã«åã«ããŒãžã§ã³ïŒcore.location_save_ver2.sqlã§ã¯ãªãcore.location_save.sqlïŒãå«ãŸããŠããªãããããã©ã³ãã®åã¹ãã¢ãããã·ãŒãžã£ã§è¡ãããå€æŽã¯ãããã»ã¹äžã«1è¡ãã€è¡šç€ºãããŸãã
- PHPã³ãŒãã§ã¯ãã¹ãã¢ãããã·ãŒãžã£ã¯ãã¬ãŒã¹ãã«ããŒããŒãžã§ã³ãéããŠåŒã³åºãããŸãã
$this->db->exec( "select core.location_save%ver%(...)" );
- åŒã³åºããããšããã¬ãŒã¹ãã«ããŒã¯_verãã¬ãã£ãã¯ã¹ä»ãã®ããŒãžã§ã³çªå·ã«çœ®ãæããããŸããããšãã°ãããŒãžã§ã³2ã®å ŽåãïŒ
verïŒ
ã®ä»£ããã«_ver2ã䜿çšãããŸãã
ã¹ãã¢ãããã·ãŒãžã£ã®å±éã¯ãèŸæžã®ã¢ã»ã³ããªã®åã«ããããžã§ã¯ãã¢ã»ã³ããªã®æåã®ã¹ãããã§å®è¡ãããŸãã
ãããžã§ã¯ãã®åã¹ãã¢ãããã·ãŒãžã£ãã¡ã€ã«ã«ã€ããŠïŒ
- ãã¡ã€ã«ã®å
容ããããã·ã¥åèšãèšç®ãããã¹ãã¢ãããã·ãŒãžã£ã®æå°ããŒãžã§ã³ãstored_proceduresããŒãã«ã®æ°ããããã·ã¥åèšã§æ€çŽ¢ãããŸãã
- äœãèŠã€ãããªãã£ãå ŽåïŒä»¥åã¯ãã®ãããªããã·ãŒãžã£ã¯ã©ã®ãã©ã³ãã«ããããã€ãããŠããŸããã§ããïŒãæ°ããããã·ãŒãžã£ã®ããŒãžã§ã³ãã€ã³ã¯ãªã¡ã³ããããããŒã¿ããŒã¹ãžã®ãã®ããã·ãŒãžã£ã®ãããã€ãèš±å¯ãããŸãã
- ãã®æ°ããããã·ã¥ã䜿çšããã¹ãã¢ãããã·ãŒãžã£ãä»ã®ãã©ã³ãã§æ¢ã«äœ¿çšãããŠããå ŽåãçŸåšã®ãã©ã³ãã¯ãããŒã¿ããŒã¹ãžã®æ°ãããããã€ã¡ã³ããªãã§ããã®ããã·ãŒãžã£ãæå°ããŒãžã§ã³ã§ã䜿çšããŸãã
- ãã®ãã©ã³ãã§ãã®ã¹ãã¢ãããã·ãŒãžã£ã以åã«äœ¿çšãããæ°ããããã·ã¥ãçŸåšã®ã¬ã³ãŒãã®stored_proceduresããŒãã«ã®ããã·ã¥ãšç°ãªããæ°ããããã·ã¥ãå«ããã®ã¹ãã¢ãããã·ãŒãžã£ã...
-ä»ã®ãã©ã³ãã§äœ¿çšãããŠããããæå°ããŒãžã§ã³ãäžæãªå Žåãæ°ããæé ã§ã¯ããŒãžã§ã³ãå¢å ããããŒã¿ããŒã¹ãžã®å±éãèš±å¯ãããŸãã
-ä»ã®ãã©ã³ãã§äœ¿çšãããŠããŠãæå°ããŒãžã§ã³ãããã£ãŠããå ŽåãçŸåšã®ãã©ã³ãã¯ãããŒã¿ããŒã¹ãžã®æ°ããã³ãŒãå±éãªãã§ãæå°ããŒãžã§ã³ã®æ¢åã®ã¹ãã¢ãããã·ãŒãžã£ã䜿çšããŸãã - stored_proceduresããŒãã«ãžã®åæç»é²ãŸãã¯ver_idæŽæ°ã®å Žåãã¹ãã¢ãããã·ãŒãžã£ãäœæããããã®ã³ãŒãã¯ãã¹ãã¢ãããã·ãŒãžã£ãäœæããããã®SQLããããŒã«äºåã«æºåãããããŒãžã§ã³ã䜿çšããŠã¿ãŒã²ããããŒã¹ã§å®è¡ãããŸãã
CREATE OR REPLACE FUNCTION core.location_save(...)
PHPã§ã¯ã«ãªããŸã
CREATE OR REPLACE FUNCTION core.location_save_ver2(...)
ããŒã¹ã§å®è¡ããŸãã
core.location_save.sqlãã¡ã€ã«ã¯å€æŽãããŸããã
- 次ã«ããã£ã¯ã·ã§ããªãã¢ã»ã³ãã«ãããŸãããã®ã¹ããŒãžã«ã¯ããã®ãã©ã³ãã®ã¹ãã¢ãããã·ãŒãžã£ã®çŸåšã®ããŒãžã§ã³ãå«ãŸããŠããŸãã
ãã®ããŒãžã§ã³ç®¡çã³ãŒãã®å©ç¹ïŒ
- å€æŽãããã¹ãã¢ãããã·ãŒãžã£ã®ã¿ãå±éãããŸãã
- ã¹ãã¢ãããã·ãŒãžã£ã®è€æ°ã®ããŒãžã§ã³ã1ã€ã®ããŒã¿ããŒã¹ã«ä¿åããããšãã§ããŸãã
- ç°¡åãªãããŒã«ããã¯ãã
çæïŒ
- å
éšã¹ãã¢ãããã·ãŒãžã£ã®å±éãšäœ¿çšã«é¢ããåé¡ïŒ1ã€ã®ã¹ãã¢ãããã·ãŒãžã£ãå¥ã®ã¹ãã¢ãããã·ãŒãžã£ããåŒã³åºãïŒã
- ã¹ãã¢ãããã·ãŒãžã£ã®å€ãããŒãžã§ã³ãã¯ãªãŒã³ã¢ããããã«ã¯ããŒã«ãå¿
èŠã§ãã
- ããŒã¿ããŒã¹ãäœæãããããŒãžã§ã³ã«é¢ããæ
å ±ã¯äžå
åãããŠããŸããïŒããŒã¿ããŒã¹ã®2çªç®ã®ã³ããŒïŒæžã蟌ã¿å¯èœïŒããããã€ã¡ã³ãã«æ¥ç¶ããå Žåãäžè¬çãªãããã€ã¡ã³ãããã¯ã®äžã§stored_proceduresããŒãã«ãåæããå¿
èŠããããŸãïŒã
2çªç®ã®ããŒãžã§ã³ç®¡çãªãã·ã§ã³
ããªããæšæž¬ãã次ã®ãªãã·ã§ã³ã¯ãåã®ãªãã·ã§ã³ã®ãã€ãã¹ããæ¥ãŸããã æ°ãããããžã§ã¯ãã¢ã»ã³ããªããšã«äžæã®ã¹ããŒã ãšãŠãŒã¶ãŒãäœæããããšã«ãã ã ããŒãžã§ã³ç®¡çãšããŠæå®ããŸãã
詳现
ãã¹ãŠã®ã¢ã»ã³ããªã«é¢ããæ
å ±ã¯ãã¡ã€ã³ãµãŒããŒäžã®ããŒã¿ããŒã¹ã®build_historyããŒãã«ã«æ ŒçŽãããŸãã
åå
| 説æ
| äŸ
|
build_branch
| åéãããã©ã³ãã®åå
| deploy_search_path
|
build_tag
| ãããžã§ã¯ãã®å°æ¥ã®ã¢ãŒã«ã€ãã®åå
| ãããã€_1501247988
|
build_time
| ãããžã§ã¯ãã®ãã«ãæé
| 17/28/17 1:19:48ååŸ
|
schema_name
| ãããžã§ã¯ãã®æå®ã¹ããŒã
| z_build_1
|
schema_user
| ãããžã§ã¯ãã®æå®ããŒã¿ããŒã¹ãŠãŒã¶ãŒ
| user_1
|
deploy_time
| æ°ãããããžã§ã¯ãã³ãŒãã«åãæ¿ããæé
| 07/28/17 14:05:22
|
- æ°ãããããžã§ã¯ãã¢ã»ã³ããªããšã«ããã©ã³ãã®ã³ã³ããã¹ãã§ãããŒã¿ããŒã¹ã«äžæã®ã¹ããŒã ãäœæãããŸãã
- ãã¹ãã¢ã»ã³ããªã®å Žåãåè·¯ã®åœ¢åŒã¯z_build_test_Nã§ã Nã¯åŸªç°ã·ãŒã±ã³ã¹ïŒ 1ãn1 ïŒã§ãã
- ãã¹ããã«ãã®å ŽåããŠãŒã¶ãŒã®åœ¢åŒã¯user_test_Nã§ã ãããã§ã Nã¯åŸªç°ã·ãŒã±ã³ã¹ïŒ 1ãn1 ïŒã§ãã
- æŠéã¢ã»ã³ããªã®å Žåãåè·¯ã®åœ¢åŒã¯z_build_Nã§ã ãããã§ã Nã¯åŸªç°ã·ãŒã±ã³ã¹ïŒ 1ãn2 ïŒã§ãã
- ã³ã³ããããã«ãã®å ŽåããŠãŒã¶ãŒã®åœ¢åŒã¯user_Nã§ã Nã¯åŸªç°ã·ãŒã±ã³ã¹ïŒ1ããn2ïŒã§ãã
- åã¹ããŒã ã«ã¯ãããŒã¿ããŒã¹ãµãŒããŒã«æ¥ç¶ããããã®ç¬èªã®äžæã®ãŠãŒã¶ãŒãããŸãã
- ãã¹ãŠã®ã¹ãã¢ãããã·ãŒãžã£ãå±éãããŸãã
- ã¹ããŒã ã¯åšæçã«åäœæãããŸãã
- PHPã³ãŒãã§ã¯ãã¹ããŒã ãšãã¬ãŒã¹ãã«ããŒããŒãžã§ã³ïŒ
verïŒ
ãæå®ããã«ã¹ãã¢ãããã·ãŒãžã£ãåŒã³åºãããŸãã
ãããžã§ã¯ãã®çµã¿ç«ãŠäžã®æŠéå±éã®ããã»ã¹ïŒ
- ã¢ã»ã³ããªãèµ·åããããšãæ°ããã¢ã»ã³ããªã«é¢ããæ
å ±ãbuild_historyããŒãã«ã«èšé²ãããããŒã¿ããŒã¹ãµãŒããŒã«æ¥ç¶ããããã®äžæã®ã¹ããŒã ãšãŠãŒã¶ãŒãå²ãåœãŠãããŸãã
- ãŠãŒã¶ãŒã¯ããããžã§ã¯ãã³ãŒããšå
±ã«å±éãããæ§æã«æžã蟌ã¿ãŸãã
- ãããã€ã¡ã³ãçšã®ç¹å¥ãªãŠãŒã¶ãŒã®äžã«ããŒã¿ããŒã¹ãµãŒããŒãžã®æ¥ç¶ããããŸãã
- ããŒã¿ããŒã¹ã§ã¯ãã¹ãã¢ãããã·ãŒãžã£ãå²ãåœãŠãããã¹ããŒããäœæãããŸãïŒååšããå Žåã¯åäœæãããŸãïŒã
- ãããžã§ã¯ãã³ãŒãããã¹ãŠã®ã¢ããªã±ãŒã·ã§ã³ãµãŒããŒã«é
眮ãããåŸãã·ã³ããªãã¯ãªã³ã¯ãæ°ãããããžã§ã¯ãã³ãŒãã«çœ®ãæãããããšããããã®ãµãŒããŒã®ãããããã¡ã€ã³ãµãŒããŒã«ã¢ã¯ã»ã¹ããŸãã
-build_historyããŒãã«ã§æ°ãããããžã§ã¯ãã³ãŒãã«åãæ¿ããæéãèšå®ããŸãã
- ãããã¯ã·ã§ã³ã°ã«ãŒãã¯éžæãããŠãŒã¶ãŒã«å²ãåœãŠããã誰ãæŠéã«åå ããŠããããç¥ãããã«ãããã«ã·ã³ããªãã¯ãªã³ã¯ãåãæ¿ããã«ãããžã§ã¯ããç¹°ãè¿ãåæ§ç¯ããå Žåã«ãã¹ãã¢ãããã·ãŒãžã£ã§ã¹ããŒã ã誀ã£ãŠããéããªãããã«ããŸãã
-ã¹ããŒã ãäœæããããã¹ãŠã®ãµãŒããŒã§ããã©ãŒã ã®æ°ããsearch_pathãèšå®ãããŸãã
search_path = publicã<assigned schema>ã®å ŽåïŒ
-å°çšãŠãŒã¶ãŒuser_N;
-DBAéçºè
ããã³ããŒã ã
-ããŸããŸãªã¯ã©ãŠã³ãªã©ã®ãŠãŒã¶ãŒ
pgbouncerã§ããŒã«ãèšå®ããããã®éèŠãªè¿œå
pgbouncerã䜿çšããå ŽåãããŒã«ã®ãµã€ãºãå¶éããã«ã¯ã pool_sizeãšçããmax_db_connectionsãªãã·ã§ã³ã䜿çšããå¿
èŠããããŸãã ããããªãå ŽåãåããŒã«ãŠãŒã¶ãŒã¯ç¬èªã®pool_sizeãæã¡ãŸãã ãã®åäœã¯ææžåãããŠããŸããããmax_db_connectionsã¯æ¬¡ã®ããã«æ©èœããŸããããŒã«å
ã®ãã¹ãŠã®ãŠãŒã¶ãŒã®ã¢ã¯ãã£ããªãã©ã³ã¶ã¯ã·ã§ã³ã®æ°ãå¶éããŸãã
pgbouncerããŒã«ã®äŸïŒ
my_database = host=localhost pool_size=5 max_db_connections=5
çµè«ãšããŠãæ瀺ãããã³ãŒãããŒãžã§ã³ç®¡çã®ããŒãžã§ã³ã¯ã24æé365æ¥ã®é«è² è·ã¢ãŒãã§åªããçµæã瀺ãããã€ããªããã¢ãŒãã§äœ¿çšãããŠããããšã«æ³šæããŠãã ããã ãããæè¿ãsearch_pathã®2çªç®ã®ã¡ãœãããããåªå
ããŸãã
ãæž
èŽããããšãããããŸããïŒ