開通讀寫分離功能后,事務會默認全部路由至主實例上執行。本文將以常用的MySQL壓測工具Sysbench 0.5版本為例,介紹如何正確配置其參數來進行讀寫分離性能的測試。
前提條件
- 已開通讀寫分離功能。詳細步驟請參見開通讀寫分離。
- 已安裝壓測工具Sysbench 0.5。下載地址及安裝步驟,請參見Sysbench的官方文檔。
注意事項
- 建議測試讀寫分離的負載均衡不要用帶prepare或者帶事務的case。
- 避免因寫壓力過大而造成的主從延遲時間超過設定的監控檢查閾值。
- 推薦使用如下Sysbench腳本,您可以實際情況構造具體的SQL。
function thread_init(thread_id) db_connect() end function event(thread_id) rs = db_query("select 1") end
設置Sysbench的參數
Sysbench oltp.lua腳本測試默認使用事務,若使用默認參數,所有SQL都會在事務中執行,即使是只讀SQL也會全部路由至主實例執行。所以,使用Sysbench壓測讀寫分離的性能時,必須根據需求設置Sysbench的參數。例如,您可以通過設置oltp-skip-trx
參數可以使Sysbench運行SQL時不在事務中執行。
設置常用參數
請根據您的實際業務情況,設置如下參數值。
名稱 | 描述 |
---|---|
test | 指定測試文件路徑。 |
mysql-host | MySQL服務器地址。 |
mysql-port | MySQL服務器端口。 |
mysql-user | 用戶名。 |
mysql-password | 密碼。 |
mysql-db | 測試使用數據庫,需提前創建。 |
oltp-tables-count | 建立表的個數。 |
oltp-table-size | 每個表產生的記錄數量。 |
rand-init | 是否隨機初始化數據。 |
max-time | 壓測持續時間。 |
max-requests | 壓測期間請求總數。 |
num-threads | 并發線程數量。 |
report-interval | 運行日志打印間隔。 |
設置事務及讀寫SQL相關參數
如下參數會影響事務及讀寫SQL,在進行讀寫分離性能測試時按照實際需求設置參數值。
名稱 | 描述 |
---|---|
oltp-test-mode | 測試類型,但在Sysbench 0.5版本中此參數沒有生效,可以忽略。可選參數值如下:
|
oltp-skip-trx | 是否跳過SQL語句開頭的begin和結尾的commit。可選參數值如下:
說明 在壓測讀寫分離性能時,參數值需選擇on,SQL語句前后不需要begin/commint。
|
oltp-read-only | 是否產生只讀SQL。可選參數值如下:
說明 請根據需求選擇參數值,進行只讀或讀寫測試。
|
壓測示例
測試讀寫性能
- 執行如下命令,準備數據。
sysbench --test=./tests/db/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3001 --mysql-user=abc --mysql-password=abc123456 --mysql-db=testdb --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=5 --oltp-skip-trx=on --oltp-read-only=off --rand-init=on --max-requests=0 --max-time=300 --num-threads=100 prepare;
- 執行如下命令,運行測試。
說明 非事務的讀寫測試更新數據時容易出現類似
ALERT: Error 1062 Duplicate entry 'xxx' for key 'PRIMARY'
的錯誤,所以需要增加參數--mysql-ignore-errors=1062
來跳過這個錯誤。若參數mysql-ignore-errors
沒有生效,則說明Sysbench版本較低,需將其升級至最新的0.5版本。sysbench --test=./tests/db/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3001 --mysql-user=abc --mysql-password=abc123456 --mysql-db=testdb --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=5 --oltp-skip-trx=on --oltp-read-only=off --mysql-ignore-errors=1062 --rand-init=on --max-requests=0 --max-time=300 --num-threads=100 run;
- 執行如下命令,清除數據。
sysbench --test=./tests/db/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3001 --mysql-user=abc --mysql-password=abc123456 --mysql-db=testdb --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=5 --oltp-skip-trx=on --oltp-read-only=off --rand-init=on --max-requests=0 --max-time=300 --num-threads=100 cleanup;
測試只讀性能
- 執行如下命令,準備數據。
sysbench --test=./tests/db/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3001 --mysql-user=abc --mysql-password=abc123456 --mysql-db=testdb --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=5 --oltp-skip-trx=on --oltp-read-only=on --rand-init=on --max-requests=0 --max-time=300 --num-threads=100 prepare;
- 執行如下命令,運行測試。
sysbench --test=./tests/db/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3001 --mysql-user=abc --mysql-password=abc123456 --mysql-db=testdb --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=5 --oltp-skip-trx=on --oltp-read-only=on --rand-init=on --max-requests=0 --max-time=300 --num-threads=100 run;
- 執行如下命令,清除數據。
sysbench --test=./tests/db/oltp.lua --mysql-host=127.0.0.1 --mysql-port=3001 --mysql-user=abc --mysql-password=abc123456 --mysql-db=testdb --oltp-tables-count=10 --oltp-table-size=500000 --report-interval=5 --oltp-skip-trx=on --oltp-read-only=on --rand-init=on --max-requests=0 --max-time=300 --num-threads=100 cleanup;