2019年7月8日 星期一

MySQL 效能及安全性檢查

先使用別人提供的工具

因為我是自行以 source 安裝 mysql ,所以在本機連線時,需要指定 mysql.socket 的路徑,並且 mysqladmin/mysql 這兩個指令必須在 $PATH 可找到的路徑內,然後帳號密碼是用 mysql_config_editor 儲存,並且必須以 --login-path=client 方式來提供給這個 perl script 使用。所以我執行的參數如下
mysqltuner.pl --socket /MySQL/inst1/mysql.sock --output /tmp/health.txt
如果只想要輸出可能有問題的項目,可以加上參數
mysqltuner.pl --socket /MySQL/inst1/mysql.sock --nogood --noinfo

另外這個 script 執行時會去檢查兩個檔案是否存在,basic_passwords.txt  及vulnerabilities.csv。

前者是用一些常見的帳號密碼組合,來檢查系統中是否有太容易被嘗試就取得登入權限的帳號。後者是針對 mysql 版本的 CVE 記錄來檢查,看起來應該只是單純比對 mysql 是否符合 CVE 所記錄的版本號。

如果要用這個 perl script 作為定期檢查的工具的話,可能需要定期調整這兩個輔助檔案的內容,才比較能發揮效果。

在跑出來的建議裡,有幾個項目引起我的注意。第一個是
innodb_log_file_size should be (=256M) if possible, so InnoDB total log files size equals to 25% of buffer pool size

這句話關係到三個參數:
* innodb_log_file_size
* innodb_log_files_in_group
* innodb_buffer_pool_size。

這三個參數都可以從 SHOW VARIABLES like "%innodb%" 取得,其中關鍵是 innodb_log_file_size 這個值。

我這邊 my.cnf 裡相關的設定值是
innodb_buffer_pool_size = 2048M
innodb_log_file_size = 2048M
innodb_log_files_in_group 則是維持系統預設值 2
而這個 perl script 提出的建議公式是
log file size * log files group / buffer pool size = 0.25
=> log file size = buffer pool size * 0.25 / log files group
=> log file size = 2048M * 0.25 / 2 = 256M
所以得出上面那句敘述。
那這樣的公式是否有任何有效的憑據? 我查了幾篇文章

官網 (針對 version 5.7) 上的並沒有任何建議的公式,主要提供如下說明
log file size 如果設定的太小,會造成太多非必要的檔案寫入動作,如果設定太大,則會造成在災後復原的時間太久。
關鍵性的一句是
Make your redo log files big, even as big as the buffer pool.


一篇在這個原則下,採取以下計算方式作為建議。
從 show engine innodb status 取得 Log sequence number,然後看一分鐘的時間內,寫了多少 log size。文章的案例是一小時大約寫入 110MB,於是作者建議 log file size 只需要 128MB 就足夠,因為 log files group 是 2 ,所以最後 log file size 設定為 64MB。
這種計算方式沒有考慮 buffer pool size,純粹以 log 寫入的速度,及盡可能縮短災後復原的時間來做考量。

另外一篇則是認為,log file size 設定大一點不是問題,文章中的案例是 pool size 為 64G,log file size 設定為 15G, log files group 則是預設值 2 。以這樣的參數來看,比前面 perl script 建議的 0.25 高 (這篇算起來是  15 * 2 / 64 約等於 0.5)。這篇另外提供一個不錯的參考數值, 10GB 的 log file size 大約需要使用 20min 來復原,25GB 的 log file size 則是使用約 45min 來復原。也就是說,如果這個復原所需的時間是可以接受的,那 log file size 可以設定大一點。

所以綜合以上幾篇來說,我覺得可以不依循 perl script 的建議,官網都說了盡可能讓 log file size 大一些,甚至和 buff pool size 一樣大。

另一個引起我注意的建議項目是
innodb_buffer_pool_instances(=2)
關於這個參數的解釋可以看這篇,而我直接去看這個 perl script 的 source ,它的計算建議方式很簡單,如果 pool size 小於 1G,那就設為 1 個 instance,否則估算每一個 instance 可以有 1G 的 pool size 可以使用,也就是說 pool size 設為多少 GB (上限 64GB),就設定多少個 pool instances 。因為我這邊的 pool size 設定為 2GB,所以 pool instances 數量也就建議為 2 了。不過這應該還要搭配其他數據來看,而且從其他文章來看,當 pool size 足夠大的時候,這個設定值對效能的影響就沒有很明顯。

其他一些建議值,像是 query cache 的部分,因為這台 mysql server 是 lab 測試用的,平常沒有資料在上面跑,所以可能要找運作中的系統來跑測試,看看建議值是否會有所不同。

沒有留言: