mysql 5.5 的 my.cnf 是否適合併針對以下硬體規格進行了很好的調整?
我的硬體規格
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 位
我的應用架構
所以我的伺服器包含 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;
根據返回的內容,您應該再次調整事務日誌的大小。
請參閱我之前關於這樣做的文章:
Jul 21, 2012
: InnoDB - ibdata1 文件和 ib_logfile0 上的高磁碟寫入 I/OFeb 16, 2011
:如何安全地更改 MySQL innodb 變數“innodb_log_file_size”?多核參與
當 MySQL 5.1.38 中引入 InnoDB 外掛時,它點燃了 MySQL 的世界。為什麼?因為 InnoDB 是單執行緒的。您必須安裝外掛才能獲得允許 InnoDB 使用多個核心的新設置。
與其寫冗長的東西,不如閱讀我之前關於調整 MySQL 5.5 以使 InnoDB 使用多個核心的文章:
May 26, 2011
:關於單執行緒與多執行緒數據庫的性能Sep 12, 2011
:可以讓 MySQL 使用多個核心嗎?Sep 20, 2011
:多核和 MySQL 性能
# 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 緩衝區,以便您可以根據備份計劃輕鬆啟動新的從站。
您可能會考慮使用歸檔腳本將二進制日誌解除安裝到更永久的歸檔伺服器並管理清除。