天天看點

性能測試:自建資料庫對比RDS中應當注意的地方(适用于MySQL,SQL SERVER,MongoDB) 性能測試:自建資料庫對比RDS中應當注意的地方

<a>背景</a>

常常很多使用者對比測試自建資料庫和rds的性能差異,其測試結果往往是rds不如ecs自建。

從資料庫測試的角度來看,測試首先必須是的公平的進行,其結果才具有說服力。rds作為一個公共的關系資料庫服務,其必須要包括穩定高可用,高安全,然後才是高性能。沒有前面的兩者,我相信沒有多少人願意去使用即不穩定又不安全的服務。是以rds在穩定性上必須上主備雙節點的,雙節點甚至是在不同機房,萬一其中一個機房異常還可以快速切換到另外一個機房。其次rds必須要保證資料的安全,如果你寫入送出的一條資料突然不見了,如果突然有一天你的資料庫被黑客sql注入了,你是否還願意繼續使用rds。作為服務廠商rds必須為使用者考慮資料安全,在資料的存取上rds加入了中間層,所有的請求經過中間層後如果有sql注入的請求都會被中間層攔截掉;在底層資料寫入上rds采用了最高安全級别的寫入,保證在主機異常掉電的情況下資料不會出現丢失。最後在性能上,rds源碼團隊持續對mysql源碼優化,在标準的基準測試中性能和穩定性上都是高于社群版本的。

下面我們來總結一下rds和自建資料庫在性能測試中需要注意的地方:

rds有單可用區和多可用區之分,單可用區是的資料庫主備都在同一個機房,多可用區的資料庫主備在不同機房,是以在測試rds的過程中需要保證ecs和rds是在同一個可用區的。

從ecs到rds的網絡鍊路中有多個環節,包括了ecs--&gt;dns--&gt;slb--&gt;proxy--&gt;db,是以對比ecs自建資料庫(ecs--&gt;ecs),rds的網絡鍊路比ecs自建資料庫多出了3個鍊路環節。

•1、

某電商系統遷移上雲測試過程中發現性能較低

•2、

應用代碼,資料庫配置完全一樣

性能測試:自建資料庫對比RDS中應當注意的地方(适用于MySQL,SQL SERVER,MongoDB) 性能測試:自建資料庫對比RDS中應當注意的地方

rds通路鍊路:

性能測試:自建資料庫對比RDS中應當注意的地方(适用于MySQL,SQL SERVER,MongoDB) 性能測試:自建資料庫對比RDS中應當注意的地方

rds的規格配置主要包括了記憶體和cpu,在測試rds的過程中,需要保證ecs的cpu核數和rds的cpu核數保持一緻

  (1).安全配置:rds的為了保證資料的安全性,在參數配置上采用了事務送出和binlog刷寫的最高保護級别。

a.innodb_flush_log_at_trx_commit 參數指定了 innodb 在事務送出後的日志寫入頻率,當取值為 1 時,每次事務送出時,log buffer 會被寫入到日志檔案并刷寫到磁盤。這也是預設值。這是最安全的配置,但由于每次事務都需要進行磁盤i/o,是以有一定的性能損耗。

  b.sync_binlog 是 mysql 的binlog日志同步到磁盤的頻率。mysql在binlog每寫入sync_binlog

次後,刷寫到磁盤,設為 1 最安全,在每個語句或事務後同步一次 binary log,即使在崩潰時也最多丢失一個語句或事務的日志,但是以也最慢。

  (2).性能配置:rds開放了除規格配置以外的參數供使用者進行配置,絕大部分的參數都已經由官方團隊優化過,使用者不需要過多調整線上的參數就可以把資料庫比較好的運作起來。但這些參數隻是适合大多數的應用場景,但針對一些特殊使用者場景,需要使用者進行特殊定制。

tmp_table_size

  作用:該參數用于決定内部記憶體臨時表的最大值,每個線程都要配置設定(實際起限制作用的是tmp_table_size和max_heap_table_size的最小值),如果記憶體臨時表超出了限制,mysql就會自動地把它轉化為基于磁盤的myisam表,優化查詢語句的時候,要避免使用臨時表,如果實在避免不了的話,要保證這些臨時表是存在記憶體中的。

  現象:如果複雜的sql語句中包含了group

by/distinct等不能通過索引進行優化而使用了臨時表,則會導緻sql執行時間加長。

  建議:如果應用中有很多group

by/distinct等語句,同時資料庫有足夠的記憶體,可以增大tmp_table_size(max_heap_table_size)的值,以此來提升查詢性能。

query_cache_size

  作用:該參數用于控制mysql

query cache的記憶體大小;如果mysql開啟query cache,再執行每一個query的時候會先鎖住query cache,然後判斷是否存在query cache中,如果存在直接傳回結果,如果不存在,則再進行引擎查詢等操作;同時insert、update和delete這樣的操作都會将query cahce失效掉,這種失效還包括結構或者索引的任何變化,cache失效的維護代價較高,會給mysql帶來較大的壓力,是以當我們的資料庫不是那麼頻繁的更新的時候,query cache是個好東西,但是如果反過來,寫入非常頻繁,并集中在某幾張表上的時候,那麼query cache lock的鎖機制會造成很頻繁的鎖沖突,對于這一張表的寫和讀會互相等待query cache lock解鎖,導緻select的查詢效率下降。

  現象:資料庫中有大量的連接配接狀态為checking query cache for query、waiting for query

cache lock、storing result in query cache;

  建議:rds預設是關閉query

cache功能的,如果您的執行個體打開了query cache,當出現上述情況後可以關閉query cache;當然有些情況也可以打開query cache,比如:巧用query cache解決資料庫性能問題。

•1、 某客戶正在将本地的業務系統遷移上雲

•2、 在rds上運作時間明顯要比線下自建資料庫運作時間要慢1倍

使用者本地參數配置:

join_buffer_size = 128m

read_rnd_buffer_size = 128m

tmp_table_size = 128m

rds參數配置

join_buffer_size = 1m

read_buffer_size = 1m

tmp_table_size =256k

rds采用了主從複制的高可用模式,同時打開了半同步複制,半同步複制是mysql異步複制的改進,當主庫在執行完用戶端送出的事務後不是立刻傳回給用戶端,而是等待從庫接收到并寫到relay log中才傳回給用戶端。相對于異步複制,半同步複制提高了資料的安全性,同時它也造成了一定程度的延遲,這個延遲最少是一個tcp/ip往返的時間。是以半同步複制增加了事務的響應時間。

性能測試:自建資料庫對比RDS中應當注意的地方(适用于MySQL,SQL SERVER,MongoDB) 性能測試:自建資料庫對比RDS中應當注意的地方

備注:sqlserver高可用采用mirror,同樣存在上述的問題。

綜上所述,在測試對比兩個環境的時候,一定要考慮測試環境在資料庫架構差異,資料庫參數設定差異,網絡配置差異等因素。

rds mysql正在将事務日志以及binlog日志的寫盤參數開放出來供使用者配置。