上文,筆者使用一個簡單的測試案例驗證審計插件的功能:一文搞懂MySQL開源審計功能
一. 為什麼要做性能測試?
1. 從測試的角度看,軟體支持的特性和功能並不是唯一的問題,而性能測試的目標不僅僅是發現錯誤,還有消除性能的瓶頸。
2. 從個人學習的角度看,筆者想通過性能測試更全面地了解一個關鍵參數的調整、一款軟體的選擇是否真的能夠提升性能。只有測試時考慮全面,上生產時才能更有信心,而不是道聽途說,人云亦云。自己動手實踐,對知識的理解更加深刻。
二. 等保測評的要求
1) 開啟審計,審計事件類型全面。
2) 不影響資料庫性能。
3) 審計日誌至少保存6個月以上。
硬體配置
DB參數配置
測試要求
測試指標
其他
由於測試的硬體環境比較低配,故增加了阿里雲RDS的硬體配置作為參考。阿里雲RDS 部分售賣配置參考。
2. 參數配置
阿里雲RDS有幾個參數模板,RDS 資料庫將使用高可用_高性能模板。
innodb_flush_log_at_trx_commit 等於1,表示每次事務的 redo log 都直接持久化到磁碟,保證 MySQL 異常重啟之後數據不丟失;innodb_flush_log_at_trx_commit 等於2,則表示事務在提交時需要將Redo日誌寫到OS的緩存區中,但並不需要保證將日誌真正刷到磁碟。這種情況下,即使資料庫掛了,而作業系統沒掛,事務的持久性還是可以保證的。sync_binlog 等於1,表示每次事務的 binlog 都持久化到磁碟,這樣可以保證 MySQL 異常重啟之後 binlog 不丟失。sync_binlog 等於N,每進行n次事務提交之後,MySQL將進行一次fsync之類的磁碟同步指令將binlog_cache中的數據強制寫入磁碟。由於測試環境的硬體配置比較糟心,所以在參數配置上儘可能往高性能方向靠攏。測試環境不配置主從複製。測試需求 :200並發線程,10張200W的表,總共壓測300s。筆者覺得200的並發量不夠過癮,後續會針對各類雲資料庫進行高並發測試,看看哪家強。sysbench一般用於基準測試,但合理使用工具,將插件作為變量,通過壓測,也是可以了解哪款產品的功能和性能最佳。sysbench oltp.lua --mysql-host=192.168.117.131 --mysql-port=3308 \
--mysql-user=root --mysql-password=123456 \
--oltp-test-mode=complex --mysql-db=test_load \
--oltp-tables-count=10 --oltp-table-size=2000000 \
--threads=200 --time=300 --report-interval=5 preparesysbench oltp.lua --mysql-host=192.168.117.131 --mysql-port=3308 \
--mysql-user=root --mysql-password=123456 \
--oltp-test-mode=complex --mysql-db=test_load \
--oltp-tables-count=10 --oltp-table-size=2000000 \
--threads=200 --time=300 --report-interval=5 \
run >> sysbench_`date +%Y%m%d_%H%M%S`.logsysbench oltp.lua --mysql-host=192.168.117.131 --mysql-port=3308 \
--mysql-user=root --mysql-password=123456 \
--oltp-test-mode=complex --mysql-db=test_load \
--oltp-tables-count=10 --oltp-table-size=2000000 \
--threads=200 --time=300 --report-interval=5 cleanup
4. 測試指標本次測試將以"A"作為基線,各個檢測項如無特殊說明將使用平均值記錄。這種方法不是很專業,但對於小型測試應該沒什麼問題。結合 sar、vmstat、top 觀察,測試數據以sar為準,取平均值。每次測試前清空審計文件,壓測完畢後,觀察每次壓測生成的審計文件大小。
舉例:C 的平均QPS為20000,A的平均QPS為23000。((20000-23000)/23000)*100%=13%1. 以上Cpu使用率、QPS、TPS每項指標各60組數據。2. 測試環境是虛擬機,PC應退出一切與測試無關的程序。比如,瀏覽器。3. 測試過程中,如果出現CPU使用率波動,通過"show engine innodb status\G"查看鎖信息,確保測試數據儘可能不受鎖的影響。1. MySQL-Null
2. init-connect + binlog
3. general.log
4. McAfee 插件
5. MariaDB 插件
6. 阿里雲 RDS-Null
7. 作圖 : Python + Highcharts
第一次壓測,數據還沒熱身,QPS上不來。所以,以第二次壓測的數據為準。1.2 QPS_TPS_CPU使用率
測試環境在沒審計的情況,QPS在2w3左右,TPS在1150左右,Cpu使用率在75%左右,這其實也是測試環境的性能瓶頸。
如果再增加並發量,就真的吃不消了。
root@localhost:mysql.sock [(none)]>set global general_log_file = '/mysql/log/3308/general/general_3308.log';
root@localhost:mysql.sock [(none)]>set global general_log=ON;
root@localhost:mysql.sock [(none)]>show variables like 'general%';
+---+--+
| Variable_name | Value |
+---+--+
| general_log | ON |
| general_log_file | /mysql/log/3308/general/general_3308.log |
+---+--+3.2 general日誌
日誌信息如圖,可讀性還是挺不錯的,關聯 init-connect 審計表 的conn_id欄位可以獲取會話的登陸信息。但還不如直接使用init-connect的方式。
3.3 QPS_TPS_CPU使用率
開啟general.log 後,不僅Cpu使用率下降了,而且支持的事務量也下降了。根據TPS計算,DB性能下降了30%左右,這樣誰還敢開啟general.log用於審計。
此外,在資料庫沒有審計的情況下,有些等保測評機構要求開啟general.log,這看似為了安全,實際上是一種"飲鴆止渴"的做法。
使用McAfee總共測了6次,因為前4次CPU使用率在後期均有大幅度下降,通過show engine innodb status\G發現有鎖;還有PC的瀏覽器沒關,佔用了一些C資源。清理無關要緊的程序後,重測2次的CPU都比較穩定,數據相對可靠。4.2 QPS_TPS_CPU使用率
QPS、TPS、CPU使用率均有一定的下降幅度,但是在可接受的範圍內。
TPS由原來的1150左右下降至1080左右,跟MySQL無審計的情況下相差不大。5.2 QPS_TPS_CPU使用率
QPS、TPS、CPU使用率只有小幅度下降。結合比較全面的審計功能,不得不說MariaDB審計插件真是一款良心插件呀
6.1 性能指標
由於無法登陸RDS的作業系統,只能通過性能趨勢觀察CPU使用率,從圖中可以看出,RDS壓測期間Cpu使用率基本上在50%內,所以用Python作圖時,Cpu使用率的數據統一定為50%
6.2 QPS_TPS_CPU使用率
在不使用開源插件的情況下,阿里雲RDS的QPS和TPS是測試環境的3倍。
1. 阿里雲RDS的內存配置比測試環境多了40G,畢竟規格就在那裡,愛買不買。2. 雲資料庫自身有很多監控進程,這些也會佔用一點資源。
3. 阿里雲RDS的buffer pool、general.log等參數無法通過自建帳號進行修改,本來想通過開啟general.log觀察性能差異,有點遺憾,無法完成該項測試。不過,從這點說明了雲資料庫的性能之所以高,其實在使用規範和標準化上採取了嚴格的措施。接下來,我們一起來看看以上審計方式的測試結果(以"A"為基線),性能差異計算以TPS為準,計算公式參考[4.5 性能差異]。開啟general.log的方式應該是審計裡性能最差的一種方式了。我們看到有些插件的Cpu使用率比較高,但同時也需要觀察QPS和TPS是否與基線"A"接近,還有產生的審計日誌大小,結合這幾種情況,筆者更加偏向於MariaDB的審計插件。1. 對於社區版MySQL的 審計而言,如果沒有旁路軟體,那麼就使用MariaDB的審計插件(上線後,需要對以上檢測項觀察一段時間)。但這種方式僅僅只是用於審計,相對於產品服務來說,缺少分析功能。
2. 旁路方式,以阿里雲RDS為例,資料庫審計服務通過旁路監聽模式,支持完全獨立於資料庫的部署。在不影響資料庫日常運行效能的前提下,實現靈活的審計與監控。舉例:
1) 具備風險狀況、運行狀況、性能狀況、語句分布的實時監控能力。
2) 分析、追查資料庫安全事件等等。
3. 如需要本文作圖的源碼[Python+Highcharts],請在公眾號回覆:作圖
以上內容僅代表個人觀點,測試難免會有考慮不周,如有侵權或者不妥之處,請聯繫,謝謝!下次有機會分享業界內各雲資料庫的性能差異,雖然需要精力和花錢,但是我們的徵途是資料庫的星辰大海,所以,前進吧!!!