Mysql

mysql 5.5 的 my.cnf 是否適合併針對以下硬體規格進行了很好的調整?

  • March 14, 2013

我的硬體規格

Technology: Ivy Bridge
CPU: Intel Xeon E3 1245v2 
Intel Smart Cache: 8MB
Cores / Threads: 4 / 8
Frequency: 3.4GHz+ / 3.8GHz Turbo Boost
RAM: 32 GB DDR3
Hard disk: 2x 2TB SATA3
Raid 1 by software
Bandwidth: 100 Mbps guaranteed

ubuntu 12.04.2 LTS 64 位伺服器版

mysql

5.5.29 版,64 位

我的應用架構

https://stackoverflow.com/questions/11272776/using-phusion-passenger-nginx-running-same-rails-app-with-multiple-instance

所以我的伺服器包含 100 個帶有 100 個 mysql 數據庫的 rails 應用程序,每個數據庫有大約 100 個表

我的伺服器流量

每秒 10 到 200 個(最大)請求

每天 3000 到 10,000(最大)請求

Mysql 和 Rails 之間的連接

我用插座 socket = /var/lib/mysql/data/mysql.sock

https://tools.percona.com/wizard為上述硬體規格生成的my.cnf

[mysql]

# CLIENT #
port                           = 3306
socket                         = /var/lib/mysql/data/mysql.sock

[mysqld]

# GENERAL #
user                           = mysql
default_storage_engine         = InnoDB
socket                         = /var/lib/mysql/data/mysql.sock
pid_file                       = /var/lib/mysql/data/mysql.pid

# MyISAM #
key_buffer_size                = 32M
myisam_recover                 = FORCE,BACKUP

# SAFETY #
max_allowed_packet             = 16M
max_connect_errors             = 1000000
skip_name_resolve
innodb                         = FORCE
innodb_strict_mode             = 1

# DATA STORAGE #
datadir                        = /var/lib/mysql/data/

# BINARY LOGGING #
log_bin                        = /var/lib/mysql/data/mysql-bin
expire_logs_days               = 14
sync_binlog                    = 1

# CACHES AND LIMITS #
tmp_table_size                 = 32M
max_heap_table_size            = 32M
query_cache_type               = 0
query_cache_size               = 0
max_connections                = 500
thread_cache_size              = 50
open_files_limit               = 65535
table_definition_cache         = 4096
table_open_cache               = 10240

# INNODB #
innodb_flush_method            = O_DIRECT
innodb_log_files_in_group      = 2
innodb_log_file_size           = 512M
innodb_flush_log_at_trx_commit = 1
innodb_file_per_table          = 1
innodb_buffer_pool_size        = 26G

# LOGGING #
log_error                      = /var/lib/mysql/data/mysql-error.log
log_queries_not_using_indexes  = 1
slow_query_log                 = 1
slow_query_log_file            = /var/lib/mysql/data/mysql-slow.log

我已經看到innodb_buffer_pool_size = 26G,所以在 32 GB RAM 中,mysql 至少會使用 27 到 28 GB,所以執行 100 個 rails 應用程序的空間只有更少,所以請有人編輯和優化我的 mysql 配置 my.cnf發布在pastebin中,以獲得足夠的空間和速度來執行 mysql 和 rails 應用程序。

我計劃在單機上使用100個數據庫連接100個rails應用程序,所以我使用mysql套接字進行連接,與使用mysql和埠連接相比是否會有性能提升。

更新

有關應用程序的更多資訊

我的應用程序不是任務關鍵型應用程序,它只是學校的學生資訊系統。Mysql 備份到遠端 ftp 通過 webmin 計劃每天 2 次,所以我計劃將 100 個學校放在一個伺服器上,所以 100 個 rails 應用程序 + 相應的 100 個 mysql 數據庫

目前應用程序沒有執行,現在我處於生產設置階段,所以我需要對my.cnf提出一些建議,考慮到 rails 和 mysql 的同等資源處理。

您需要考慮一些選項

InnoDB 緩衝池

選擇 26G 的原因是您有 32GB 的 RAM,其中 80% 是 25.6 G。由於您提到您將擁有 100 個數據庫和 100 個應用程序,使其成為多租戶數據庫伺服器,因此您將不得不獲得 InnoDB 緩衝區泳池剛剛好。

請執行此查詢:

SELECT IFNULL(B.engine,'Total') "Storage Engine",
CONCAT(LPAD(REPLACE(FORMAT(B.DSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Data Size", CONCAT(LPAD(REPLACE(
FORMAT(B.ISize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Index Size", CONCAT(LPAD(REPLACE(
FORMAT(B.TSize/POWER(1024,pw),3),',',''),17,' '),' ',
SUBSTR(' KMGTP',pw+1,1),'B') "Table Size" FROM
(SELECT engine,SUM(data_length) DSize,SUM(index_length) ISize,
SUM(data_length+index_length) TSize FROM
information_schema.tables WHERE table_schema NOT IN
('mysql','information_schema','performance_schema') AND
engine IS NOT NULL GROUP BY engine WITH ROLLUP) B,
(SELECT 3 pw) A ORDER BY TSize;

這將告訴您 MySQL 實例目前佔用了多少空間。無論 InnoDB 數據大小和索引大小的總和是多少,這就是您使用的。如果該總數超過 80% 的限制,那麼您必須達到 80%(將innodb_buffer_pool_size 保留為 26G)。

由於您有一個四核伺服器,請將innodb_buffer_pool_instances設置為 4。

InnoDB 事務日誌文件

由於選擇 26G 作為innodb_buffer_pool_size,您將需要盡可能大的事務日誌。可能為innodb_log_file_size選擇了值 512M,因為沒有任何跡象表明將實際處理的事務數據量(以字節為單位)。

調整事務日誌的大小

mysql -u... -p... -e"SET GLOBAL innodb_fast_shutdown = 0;"
service mysql stop

下一次編輯my.cnf,替換

innodb_log_file_size           = 512M

有了這個

innodb_log_file_size           = 2047M

然後,像這樣替換事務日誌

mv /var/lib/mysql/ib_logfile0 /var/lib/mysql/ib_logfile0.bak
mv /var/lib/mysql/ib_logfile1 /var/lib/mysql/ib_logfile1.bak
service mysql start

經過幾個月的高峰活動後,您可以在高峰期執行此查詢:

SET @TimeInterval = 300;
SELECT variable_value INTO @num1 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SELECT SLEEP(@TimeInterval);
SELECT variable_value INTO @num2 FROM information_schema.global_status
WHERE variable_name = 'Innodb_os_log_written';
SET @ByteWrittenToLog = @num2 - @num1;
SET @KB_WL = @ByteWrittenToLog / POWER(1024,1) * 3600 / @TimeInterval;
SET @MB_WL = @ByteWrittenToLog / POWER(1024,2) * 3600 / @TimeInterval;
SET @GB_WL = @ByteWrittenToLog / POWER(1024,3) * 3600 / @TimeInterval;
SELECT @KB_WL,@MB_WL,@GB_WL;

根據返回的內容,您應該再次調整事務日誌的大小。

請參閱我之前關於這樣做的文章:

多核參與

當 MySQL 5.1.38 中引入 InnoDB 外掛時,它點燃了 MySQL 的世界。為什麼?因為 InnoDB 是單執行緒的。您必須安裝外掛才能獲得允許 InnoDB 使用多個核心的新設置。

與其寫冗長的東西,不如閱讀我之前關於調整 MySQL 5.5 以使 InnoDB 使用多個核心的文章:

# BINARY LOGGING #
log_bin                        = /var/lib/mysql/data/mysql-bin
expire_logs_days               = 14
sync_binlog                    = 1

# LOGGING #
log_error                      = /var/lib/mysql/data/mysql-error.log
log_queries_not_using_indexes  = 1
slow_query_log                 = 1
slow_query_log_file            = /var/lib/mysql/data/mysql-slow.log

你不希望你的日誌在你的數據目錄中。這將在您啟動 mysql 時顯示一個“mysql-bin”數據庫。您可能會在啟動時的錯誤日誌中看到一些不需要的錯誤。最好保持它盡可能乾淨,這樣當有東西出現時你可以注意。

無論如何,將日誌放在 /var/log 中是一般慣例。此外,如果可能,最好將日誌文件系統放在與數據目錄不同的一組主軸上。雖然這聽起來不太可能,但在保持數據目錄和登錄不同的文件系統方面仍然可能有一些好處,即使仍然在相同的底層磁碟上。

請注意 expire_logs_days 將清除二進制日誌,無論天氣如何,奴隸是最新的。當然,如果你有一個壞掉的奴隸已經關閉了 14 天以上,你就會遇到更大的問題。通常,您需要保留足夠的 binlog 緩衝區,以便您可以根據備份計劃輕鬆啟動新的從站。

您可能會考慮使用歸檔腳本將二進制日誌解除安裝到更永久的歸檔伺服器並管理清除。

引用自:https://dba.stackexchange.com/questions/36465