

ååã®èšäº
ãBitrix24ã®11 MySQL Cooking Recipesãã§ã¯ ãäž»ã«ã¢ãŒããã¯ãã£ãœãªã¥ãŒã·ã§ã³ã«ã€ããŠæ€èšããŸãããã¯ã©ãŠããµãŒãã¹ïŒAmazon RDSãªã©ïŒã䜿çšãã䟡å€ãããããMySQLãéžæããããªã©ã§ãã
ã¬ãã¥ãŒãã倿ãããšãå€§èŠæš¡ãªãé«è² è·ããããžã§ã¯ãã§ã®MySQLã®æèœãªéçšã®ãããã¯ã¯éåžžã«å€§ããéèŠã§ãã ãã®ããã
Bitrix24ã®éçºäžã«ééããæ¥åžžçã«äœ¿çšããŠããããŒã¿ããŒã¹ã®ãã¥ãŒãã³ã°ãšç®¡çã®åŸ®åŠãª
éãã«ã€ããŠãããã«è©±ãåãããšã«ããŸããã
ãã®èšäºïŒããã³ä»¥åã®èšäºïŒã¯ãããããå Žé¢ã§å®ç§ãªMySQLãã¥ãŒãã³ã°ãè¡ãããã®æ®éçãªãã¬ã·ããã§ã¯ãªãããšãæ¹ããŠæãåºããŸãã :)ããã¯èµ·ãããŸããã :)ããããç§ã¯ããªããåã
ã®ç¹å®ã®åé¡ã解決ããããšã圹ç«ã€ãšå¿ããä¿¡ããŠããŸãã
ãããŠãèšäºã®çµããã«-ã»ãšãã©ã®æ£è
ã®èªè
ã®ããã®é©ãã :)
1. QUERY CACHEã®ã»ããã¢ããMySQLã§ã¯ãšãªãã£ãã·ã¥ãã©ã®ããã«æ©èœããããããã³ãããèšå®ããŠäœ¿çšããæ¹æ³ã説æããèšäºãæ°å€ãæžãããŠããŸãã
ããã§ããããŒã¿ããŒã¹ãã»ããã¢ããããã·ã¹ãã 管çè
ã®æãäžè¬çãªèª€è§£ã¯ãã
ãã£ãã·ã¥çšã®ã¡ã¢ãªãå€ãæäŸããã»ã©è¯ã ã
ã§ã ã
ããã§ã¯ãããŸããã
MySQLã¯å€§ããªã¯ãšãªãã£ãã·ã¥ãåŠçããŸããã å®éã«ã¯ã
query_cache_sizeã512Mãè¶
ãããšã
ãã¯ãšãªãã£ãã·ã¥ããã¯ã®åŸ
æ©ãç¶æ
ïŒSHOW PROCESSLISTã§è¡šç€ºïŒã§çæéãã³ã°ããããã»ã¹ãé »ç¹ã«è¡šç€ºããããšããäºå®ã«ééããŸããã
ããã«ããã¹ãŠã®ãªã¯ãšã¹ãããã£ãã·ã¥ã«èœã¡ãå Žåããããå¢ããããšã¯è³¢æã§ã¯ãããŸããã ã·ã¹ãã å
ã®RAMã¯è²Žéã§ãïŒ
ãããã£ãŠããããžã§ã¯ãã§äœãèµ·ãã£ãŠããã®ããçŸåšã®èšå®ã§ã¯ãšãªãã£ãã·ã¥ãã©ã®çšåºŠå¹æçã«äœ¿çšãããŠããã®ããçè§£ããããšãåžžã«éèŠã§ãã
äž»ãªæ
å ±ã¯æ¬¡ã®ãšããã§ãã
mysql> SHOW STATUS LIKE 'Qcache%'; +
æãéèŠãªã®ã¯ãQcache_hitsãšQcache_insertsãQcache_insertsãšQcache_not_cachedãããã³Qcache_lowmem_prunesïŒãã£ãã·ã¥ãããã£ãã·ã¥ãããèŠæ±ã®æ°ïŒãšQcache_free_memoryã®æ¯çã§ãã
ãããã®çµ±èšããšãã©ãèŠãã®ã§ã¯ãªããåæãæå
ã«çšæããããšããå§ãããŸãã ããŸããŸãªç£èŠããŒã«ã䜿çšããŠåéã§ããŸãã ããšãã°ãMuninïŒ


ãã€ããã¯ã¹ã®ã°ã©ããèŠããšãããšãã°1æ¥ã«1åãæçµçã«1ã€ã®ãµãŒããŒã®ãããã®èšå®ã§ååã§ãããšããçµè«ã«éããŸããã
query_cache_size = 128M query_cache_limit = 2M
ãã¡ãããããããããªãã®ãããžã§ã¯ãã«ãšã£ãŠã¯ç¶æ³ã¯ç°ãªãã§ãããã
2. innodb_buffer_pool_sizeãããã¡ãŒããŒã«ã®ãµã€ãºã¯ãInnoDBã®æãéèŠãªèšå®ã®1ã€ã§ãã ããã¯ãããŒã¿ãã£ãã·ã¥ãšããŒãã«ã€ã³ããã¯ã¹ã®äœæ¥äžã«MySQLã䜿çšããã¡ã¢ãªãããã¡ãŒã®ãµã€ãºã§ãïŒMySQLãšãªãã¬ãŒãã£ã³ã°ã·ã¹ãã ã«ããããã«ãã£ãã·ã¥ãåé¿ããããã«ãèšå®ã§
innodb_flush_method = O_DIRECTãæå®ãã䟡å€ãããããšã
ããã«æãåºããŸãïŒã
MySQLéçºè
ã®åŽããèŠãæå€§ã®ç¯çœªã®1ã€ã¯ãããã©ã«ãå€ã8Mã«èšå®ããããšã§ãã :)
å®éãçæ³çã«ã¯ã
innodb_buffer_pool_sizeã®å€ã¯ãããŒã¿ããŒã¹å
šäœãã¡ã¢ãªã«åãŸãããã«ããå¿
èŠããããŸãã åæã«ãã·ã¹ãã ã¯ã¡ã¢ãªãšãã©ã³ã¹ãåããŠããããšãèŠããŠããããšãéèŠã§ãïŒããã«ã€ããŠã¯
ååã®èšäºã§èª¬æããŸãã ïŒ
-innodb_buffer_pool_sizeã®å€ããåŒãè£ããŠããã·ã¹ãã å
šäœãã¹ã¯ããããããã«ãªããšãäœãããŸããããŸããã
é©åãªã»ããã¢ããã®è¯ãææšã¯ããããã¡ããŒã«ã®ãããçã§ãã
mysql> SHOW ENGINE InnoDB STATUS\G ...
å€ãã1000/1000ãã«è¿ãå Žå-ãã¹ãŠã¯é 調ã§ãã ãã以å€ã®å Žåã¯ã
innodb_buffer_pool_sizeãå¢ããå¿
èŠããããŸãã ååãªã¡ã¢ãªããªãå Žåã¯ãã¡ã¢ãªã远å ããŸãã
3. innodb_buffer_pool_instancesããã©ã«ãã§ã¯ãInnoDBã¯ãããã¡ãŒããŒã«ã«1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã䜿çšããŸãã
åæã«ãè€æ°ã®ãããã¯ãéžæããããšãã§ããŸããMySQLã¯ãInnoDBã§ãããã®ãããã¯ãããå¹ççã«äœ¿çšããå ŽåããããŸãã
ãããã¡ãŒããŒã«ã¯ã2 GBãè¶
ããå Žåãããã€ãã®ã€ã³ã¹ã¿ã³ã¹ã«åå²ããå¿
èŠããããŸãã åã€ã³ã¹ã¿ã³ã¹ã®ãµã€ãºã¯1 GB以äžã®äŸ¡å€ããããŸãã
ããã«ãå€ãã®äººãæ··åããŠããéèŠãªè³ªåããããŸãïŒ
innodb_buffer_pool_sizeã¯ããŒã«ã®åèšãµã€ãºã§ããããããšã1ã€ã®ã€ã³ã¹ã¿ã³ã¹ã®ãµã€ãºã§ããïŒ
çãã¯ããã¥ã¡ã³ãã«ãããŸã-ããã¯åèšãµã€ãºã§ãã ãããã£ãŠãããšãã°ã次ã®ãããªæ§æããããŸãã
innodb_buffer_pool_size = 4096M innodb_buffer_pool_instances = 4
...åã€ã³ã¹ã¿ã³ã¹ã1 GBãå æãããšèšããŸãã
ã€ã³ã·ãã³ãããªãããšã«æ³šæããŠãã ããïŒMySQL DBAã«ãµãã¹ã¯ã©ã€ãããŠããå人ã®1人ããèšå®innodb_buffer_pool_size = 1024Mãinnodb_buffer_pool_instances = 64-64 GBã®å²ãåœãŠãèšç»ããŠMySQLãæäœããçµéšã説æããŸããã
4. innodb_io_capacityè峿·±ããã©ã¡ãŒã¿ïŒå
¬åŒããã¥ã¡ã³ããä¿¡ããŠããå Žå:)ïŒãããã©ãŒãã³ã¹ã«ã¯ããŸã圱é¿ããŸããããå®éã«ã¯æ£ããèšå®ãããŠããã°ããçšåºŠã®å©çãåŸãããŸãã
innodb_io_capacityã¯ãããã¯ã°ã©ãŠã³ãã§å®è¡ãããInnoDBæäœïŒããšãã°ããããã¡ãŒããŒã«ãããã£ã¹ã¯ãžã®ããŒãžã®ãã³ãïŒã®å
¥åºåæäœïŒIOPSïŒã®å¶éãèšå®ããŸãã
ããã©ã«ãå€ã¯200ã§ãã
å€ãå°ãããããšããããã®æäœããé
ãããŸãã 倧ãããããšããããã¡ããŒã«ããã®ããŒã¿ãããã«ãã©ãã·ã¥ãããŸãã
çæ³çã«ã¯ããã£ã¹ã¯ã·ã¹ãã ã®å®éã®ããã©ãŒãã³ã¹ã«å¯Ÿå¿ããå€ãèšå®ããå¿
èŠããããŸãïŒåã³ãIOPSã§ïŒã
5. innodb_file_per_tableããã©ã«ãã§ã¯ãInnoDBã®MySQLã¯ãã¹ãŠã®ããŒãã«ã®ããŒã¿ãšã€ã³ããã¯ã¹ã1ã€ã®ããŒãã«ã¹ããŒã¹ïŒibdata1ãã¡ã€ã«ïŒã«ä¿åããŸãã
èšå®ã§
innodb_file_per_tableãªãã·ã§ã³ã
䜿çšãããŠããå Žåããã®å ŽåãããŒã¿ãšã€ã³ããã¯ã¹ãä¿åãããŠããããŒãã«ããšã«åå¥ã®ãã¡ã€ã«
table_name.ibdãäœæãããŸãã
ããã¯çã«ããªã£ãŠããŸããïŒ
ç§åäººã®æèŠã§ã¯ãæšæºã®MySQLã䜿çšããå Žåã䜿çšããå¿
èŠã¯ãããŸããã ããŒãã«ãå¥ã
ã®ãã¡ã€ã«ã«ä¿åãããšãããã©ãŒãã³ã¹ãäœäžããå¯èœæ§ããããŸããããã¯ãã·ã¹ãã å
ã§ãªãœãŒã¹ã倧éã«æ¶è²»ãããé«äŸ¡ãªãæäœãåçã«å¢ããããã§ãã
ç§ãã¡ã¯Percona Serverã䜿çšããŠããŸãã ãããŠã
innodb_file_per_tableã䜿çšã
ãŸã ã
- éåžžã®MySQLã§äœããã®çç±ã§1ã€ãŸãã¯è€æ°ã®ããŒãã«ãç Žãããå ŽåãããŒã¿ããŒã¹å
šäœããç«ã¡äžããããŸãã Perconã§ã¯ã innodb_corrupt_table_action = assertãªãã·ã§ã³ã䜿çšã§ããŸããinnodb_file_per_tableã䜿çšãããšã ãå£ãããããŒãã«ãããŒã¯ãããŸãããããŒã¿ããŒã¹å
šäœã¯åŒãç¶ãæ©èœããŸãã
- innodb_file_per_tableã䜿çšãããšãããã©ãŒãã³ã¹ãæããã«äœäžããæäœããã¹ããŒãã¢ãããããæ©äŒããã§ã«ãããŸãã ããšãã°ãããŒãã«ã®åé€ã ãã®ãããªç®çã®ããã«ãPerconã«ã¯ãªãã·ã§ã³innodb_lazy_drop_table = 1ããããŸããããã¯ãããã¯ã°ã©ãŠã³ãã§ãã®ãããªæäœãèš±å¯ããã·ã¹ãã å
šäœã®ããã©ãŒãã³ã¹ãäœäžãããŸããã
- innodb_file_per_tableãªãã·ã§ã³ããªã³ã«ãããšãXtraBackupã䜿çšããŠãããŒãã«ã®é«éãã€ããªã€ã³ããŒã/ãšã¯ã¹ããŒããå®è¡ã§ããŸãã
6. max_connect_errorså¥ã®ç¯çœªè
:) MySQLéçºè
ã®é°è¬ã
max_connect_errorsã®ããã©ã«ãå€ã¯10ã§ãã
ããã¯ãå€ããå°ãªããã¢ã¯ãã£ããªãããžã§ã¯ãã§ãäºæããªãé害ãçºçããå Žå-çæçãªãã®ïŒããšãã°ãã¹ã¯ãªããã«èª€ã£ããã¹ã¯ãŒããå
¥åãããããŸãã¯ãããã¯ãŒã¯ã®åé¡ãçºçããå ŽåïŒ-ãããã¯ãããŸãã MySQLãµãŒããŒãåèµ·åãããããFLUSH HOSTSã³ãã³ããå®è¡ããããŸã§ã
ããã¯ãæåä»å
¥ã®åïŒFLUSH HOSTSãæ°åããšã«å®è¡ããã¹ã¯ãªãããäºåã«cronã«æçš¿ããªãã£ãå Žåã®ã¿:)ïŒãããžã§ã¯ããæ©èœããªãããšãæå³ããŸãã ãããå€éã«çºçãã24æéç£èŠãããŠããªãå Žåã¯äžå¿«ã§ãã
äºåã«èªåèªèº«ãä¿è·ãã
max_connect_errorsã®å€
ã倧ããèšå®ããããšãã
å§ãããŸãã äŸïŒ
max-connect-errors = 10000
7.äžæããŒãã«ã·ã¹ãã å
ã®RAMã®å®¹éãèš±ãå Žåã¯ãåžžã«ã¡ã¢ãªå
ã®äžæããŒãã«ãæäœããããšããå§ãããŸãã
ãããæŽçããã®ã¯ç°¡åã§ãã MySQLã®èšå®ïŒ
tmpdir = /dev/shm
ãã¡ã€ã«ã·ã¹ãã ãšããŒãã£ã·ã§ã³ã®èšå®ïŒLinuxã®å Žå-/ etc / fstabãã¡ã€ã«ïŒïŒ
8.äžæããŒãã«ã®ãµã€ãºã¡ã¢ãªå
ã®ããŒãã«ã®ãµã€ãºãæ
åœããåæ§ã®ãã©ã¡ãŒã¿ãŒã2ã€ãããŸãã
max_heap_table_size = 64M tmp_table_size = 64M
max_heap_table_size-ãŠãŒã¶ãŒãäœæã§ããMEMORYã¿ã€ãã®ããŒãã«ã®æå€§ãµã€ãºã
tmp_table_size-ã¡ã¢ãªå
ã«äœæãããäžæããŒãã«ã®æå€§ãµã€ãºïŒãã£ã¹ã¯äžïŒã
ãã£ã¹ã¯ã¢ã¯ãã£ããã£ãå°ãªãã»ã©åªããŠããŸãã ãããã£ãŠãã·ã¹ãã å
ã®RAMã®éã蚱容ããå ŽåïŒã¡ã¢ãªãã©ã³ã¹ãèŠããŠãããŠãã ããïŒãã¡ã¢ãªå
ã®ãã¹ãŠã®äžæããŒãã«ãæäœããããšããå§ãããŸãã
9. table_cacheããã³table_definition_cache table_cache = 4096 table_definition_cache = 4096
ãããã®2ã€ã®ãªãã·ã§ã³ã¯ãéããŠããããŒãã«ã®ãã£ãã·ã¥ã«ä¿åãããããŒãã«ã®æå€§æ°ã決å®ããŸãã
table_cacheã®å€ã¯ãã·ã¹ãã å
ã®ããŒãã«ã®æ°ãã¯ãšãªã§éãããŒãã«ã®æ°ïŒããšãã°ãJOINãä»ããŠãªã³ã¯ãããïŒãããã³ããŒã¿ããŒã¹ãžã®éããŠããæ¥ç¶ã®æ°ã«çŽæ¥äŸåããŸãã
table_definition_cacheã¯ãããŒãã«æ§é ïŒ.frmïŒãã¡ã€ã«ã®ãã£ãã·ã¥ãµã€ãºãå®çŸ©ããŸãã ã·ã¹ãã å
ã«ããã»ã©ã
table_definition_cacheã®å€ã倧ããèšå®ããå¿
èŠããããŸãã
10.é·ããªã¯ãšã¹ãã®éäºååã®èšäºã§ã¯ãPercona Serverãã·ã¹ãã å
šäœã®ããã©ãŒãã³ã¹ã倿ããããã®åªããããŒã«ïŒ
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME ïŒãæã£ãŠããããšãæ¢ã«è¿°ã¹ãŸããã
ããã«ãã©ã®MySQLã§ãããã¹ãŠã®ãé
ããã¯ãšãªããã°ã«èšé²ããåå¥ã«è§£æããããšãã§ããŸãã
Percona Serverã䜿çšãããšãé
ãã¯ãšãªã®ãã°ãããæçã«ãªããŸãã
log_output = FILE slow_query_log = 1 slow_query_log_file = mysql_slow.log long_query_time = 1
1ç§ããé·ãå®è¡ããããã¹ãŠã®ã¯ãšãªã¯ãmysql_slow.logã«æžã蟌ãŸããŸãã æšæºãã°ãšã¯ç°ãªããæ¬¡ã®ããã«ãªããŸãã
ã¯ãšãªã®å®è¡æéããã¹ãã£ã³ããããè¡ã®æ°ãªã©ã ãã§ãªããããè©³çŽ°ãªæ
å ±-ãã«ã¹ãã£ã³ãäžæããŒãã«ã®äœ¿çšãInnoDBã®ã¹ããŒã¿ã¹ã確èªã§ããŸãã
ããã¯ãã¹ãŠãé
ãã¯ãšãªãšãã®ãããã°ã®åæã«å€§ãã«åœ¹ç«ã¡ãŸãã
11. Perconaã䜿çšããªã詳现ãªçµ±èšæšæºã®MySQLã䜿çšããŠããå Žåã§ããåªããã¯ãšãªãããã°ããŒã«ããããŸãïŒãã¡ãããæ¢ã«ããã£ãããããŠèå¥ããŠããå Žå:)ãããšãã°ãã¹ããŒã¯ãšãªã®åããã°ã䜿çšããŸãïŒã
ãããã¡ã€ã«ã®ãããªãã®ããããŸãã ãããã䜿çšããŸããïŒ ããïŒ ç¡é§ã ïŒ
mysql> SHOW PROFILES; Empty set (0.02 sec) mysql> SHOW PROFILE; Empty set (0.00 sec)
ãããã¡ã€ãªã³ã°ããªã³ã«ããŠããªã¯ãšã¹ãã確èªããŸãã
mysql> SET PROFILING=1; Query OK, 0 rows affected (0.00 sec) mysql> SELECT COUNT(*) FROM mysql.user; +
ãããã¯ãŒã¯ããã£ã¹ã¯ã®æäœããã£ãã·ã¥ã®äœ¿çšãªã©ãããã«ããã¯ãäœã§ããããããã«ããããŸãã
12.ãããã¡ã€ã«ã®æ
å ±ã䜿çšããæ¹æ³ã¯ïŒåäžã®é·ãã¯ãšãªãèŠã€ããããšãåŠãã å ŽåïŒããã»ã©é£ãããªã-é
ãã¯ãšãªã®ãã°ãš
SHOW PROCESSLISTã圹ç«ã€ïŒãã·ã¹ãã å
šäœã®ç¶æ
ãæ£ããè©äŸ¡ããå ŽåïŒ
SELECT * FROM INFORMATION_SCHEMA.QUERY_RESPONSE_TIME ãã·ã¹ãã ã®å€éšç£èŠãããšãã°nagios- munin-åæïŒãã·ã¹ãã ã®ããã©ãŒãã³ã¹ã«åœ±é¿ãäžãããã®ãçè§£ããããšã¯éåžžã«éèŠã§ãïŒ
- ã·ã¹ãã ã®ãã¹ãŠã®å
éšãªãœãŒã¹-ããŒã¹ã«ã¯ãCPUãRAMããã£ã¹ã¯ã·ã¹ãã ã®ãããããå€ããããããšã¯ãããŸããã
- ããã¯ïŒããŒãã«ã¬ãã«-MyISAMã®å Žåãå€ããè¡ã¬ãã«-InnoDBïŒ;
- å
éšããã¯ïŒããšãã°ããã¯ãšãªãã£ãã·ã¥ããã¯ã®åŸ
æ©ãïŒã
ãããçè§£ãããããã¡ã€ã«ãŸãã¯äœéã¯ãšãªã®æ¡åŒµãã°ãªã©ã®ããŒã¿ãåæãããšãããŒã¿ããŒã¹ãæäœãããããªãæŠç¥ãåžžã«æ£ããè©äŸ¡ã§ããŸã-ãã®å ŽåãããŒããŠã§ã¢ãã¢ããã°ã¬ãŒãããå¿
èŠããããŸã-ããããŸãã¯ä»ã®èšå®ã倿Žãããããã-åç·šæããŒã¿ããã³ã¯ãšãªæ§é ã
* * *
ããããããªã¥ãŒã ã®ããããè² è·ã§ã®ããŒã¿ããŒã¹ã®æ£åžžãªãããã°ãšæ£åžžãªæäœïŒ :)
* * *
ãã®å Žæãèªãã§ãããŠããããšãïŒ :)

MySQLã®ãã³ããã圹ã«ç«ãŠã°å¹žãã§ãïŒ
ãããŠã
Bitrix24ãããžã§ã¯ãã§MySQLãæäœããçµéšã«ã€ããŠè©±ããŠããã®ã§ã
Habréã®ããã°ã®ãã¹ãŠã®èªè
ã«ãããããªèŽãç©ãããããšæããŸãã
æå®ããããªã³ã¯ã§Bitrix24ã«ç»é²ãããšã2åã®ãã£ã¹ã¯ïŒ10 GBïŒãç¡æã§å
¥æã§ããŸãïŒ
çªç¶Bitrix24ãäœã§ãããããããªãå Žåã¯ã
詳现ãªèª¬æãWebãµã€ãã«ãããŸãã :)