2015-03-13 48 views
0

我有一個Drupal應用程序,它已經在單個MySQL數據庫服務器上運行了12個月,並且性能相對較好(除峯值負載事件外)。我們需要能夠支持比當前的數據庫服務器更高的峯值,而在32GB的情況下,從簡單的垂直擴展單個數據庫服務器就沒有多少收穫。MariaDB Galera集羣服務器以100%CPU和負載上升運行

我們決定設置一個具有2x 32GB實例的新MariaDB Galera集羣。我們儘可能將配置與即將成爲obselete的數據庫服務器進行匹配。

遷移到新數據庫服務器後,我們注意到這些實例的CPU使用率始終保持在100%,並且負載穩步增加。在1小時的過程中,平均負載從0.1到150.

最初我們認爲它可能與服務器之間的同步有關,但即使關閉了1臺服務器,也沒有發生同步,它仍然是最大的只要Web應用程序向它發出請求就可以使用CPU。

經過大量實驗後,我發現減少一些配置選項對CPU使用率和負載有着深遠的影響。在做出以下更改後,兩種情況下的平均負載穩定在4到6之間。

CPU utilisation & Load average

的問題

  • 哪些是在新老服務器之間的CPU使用率如此巨大差異的一些可能的原因,儘管本質上從舊服務器遷移的配置?
  • 負載目前在4到6之間徘徊(這對我們的網站來說是一個低流量期)。我應該考慮怎樣降低這個價值,並確保當這個網站被一些真正的流量所擊中時,它不會崩潰?

配置改變

innodb_buffer_pool_instances

  • 原始值:(有498個表總量中的所有數據庫)
  • 新值:

table_cache

  • 原始值:
  • 新值:

MAX_CONNECTIONS

  • 原始值:
  • 新值:

當前配置

下面是從服務器/etc/mysql/my.cnf

[client] 
port = 3306 
socket = /var/run/mysqld/mysqld.sock 

[mysqld_safe] 
socket = /var/run/mysqld/mysqld.sock 
nice = 0 

[mysqld] 

binlog_format=ROW 
default-storage-engine=innodb 
innodb_autoinc_lock_mode=2 
query_cache_type=1 
bind-address=0.0.0.0 

max_connections = 400 
wait_timeout = 600 
key_buffer_size = 16M 
max_allowed_packet = 16777216 
max_heap_table_size = 512M 
table_cache = 92 
thread_stack = 196608 
thread_cache_size  = 8 
myisam-recover   = BACKUP 
query_cache_limit = 1048576 
query_cache_size  = 128M 
expire_logs_days = 10 
general_log = 0 
max_binlog_size   = 10485760 
server-id = 0 
innodb_file_per_table 
innodb_buffer_pool_size = 25G 
innodb_buffer_pool_instances = 4 
innodb_log_buffer_size = 8388608 
innodb_additional_mem_pool_size = 8388608 
innodb_thread_concurrency = 16 
net_buffer_length = 16384 
sort_buffer_size = 2097152 
myisam_sort_buffer_size = 8388608 
read_buffer_size = 131072 
join_buffer_size = 131072 
read_rnd_buffer_size = 262144 
tmp_table_size = 512M 

long_query_time = 1 
slow_query_log = 1 
slow_query_log_file = /var/log/mysql/mysql-slow.log 

# Galera Provider Configuration 
wsrep_provider=/usr/lib/galera/libgalera_smm.so 
#wsrep_provider_options="gcache.size=32G" 

# Galera Cluster Configuration 
wsrep_cluster_name="xxx" 
wsrep_cluster_address="gcomm://xxx.xxx.xxx.107,xxx.xxx.xxx.108" 

# Galera Synchronization Congifuration 
wsrep_sst_method=rsync 
#wsrep_sst_auth=user:pass 

# Galera Node Configuration 
wsrep_node_address="xxx.xxx.xxx.107" 
wsrep_node_name="xxx01" 


[mysqldump] 
quick 
quote-names 
max_allowed_packet = 16777216 

[isamchk] 
key_buffer_size = 16777216 

回答

1

innodb_buffer_pool_instances不應表的數量的函數的一個完整的配置文件。手冊提倡每個實例不小於1GB。所以,我建議92甚至太高。但my.cnf只說innodb_buffer_pool_instances = 4 ??

的table_cache = 92

也許你的意見是搞砸了? 500將更合理table_open_cache。 (table_cache名稱。)

這可能是問題:

query_cache_size變量= 128M

每當在寫操作發生,所有條目在QC爲表(s)被從QC中清除。建議不要超過50M。或者,更好的是,完全關閉QC。

您打開緩慢日誌。 pt-query-digest說什麼是頂級的幾個查詢? (這個可能是是你解決問題的最好方法。)

+0

是的,你在這兩點上都是正確的。 Percona工程師還建議我們禁用QC,而table_open_cache是​​該配置的正確名稱。 – nicksanta 2015-03-14 06:08:27

1

我們最終得到了一個Percona顧問來幫助解決這個問題。他們發現的主要問題是正在執行大量的EXPLAIN查詢。原來這是一些調試代碼,它被啓用(devel。模塊查詢記錄drupal devs)。禁用此功能會導致CPU使用率下降。

Guess what time we disabled the EXPLAIN queries?

有一定數量的,他們建議我們實行的其他修復。

  • 將第三個節點添加到羣集以充當觀察者並維護羣集的完整性。
  • 將主鍵添加到沒有的主鍵。
  • 將MyISAM表更改爲InnoDB。
  • 將wsrep_sst_method從rsync更改爲xtrabackup-v2。
  • 將innodb_log_file_size設置爲512M。
  • 將innodb_flush_log_at_trx_commit設置爲2,因爲集羣維護數據的完整性。

我希望這些信息可以幫助遇到類似問題的任何人。

相關問題