剛剛,MySQL 戰勝了老大哥 Memcached

MySQL毫無疑問是當前OLTP領域的霸主,最新的MySQL 8。0版本更是能夠輕鬆跑出百萬QPS。

在KV記憶體領域,雖然這些年Redis風頭正勁,但老大哥Memcached憑藉其多執行緒的特性,依然牢牢佔據一定的市場份額。

剛剛,MySQL 戰勝了老大哥 Memcached

在前一篇文章:震驚!MySQL 8。0 220W QPS輕鬆達成,我們已經利用MySQL的Memcached Plugin外掛跑出了220萬的QPS,透過Memcached協議訪問MySQL,然後讀取InnoDB儲存引擎中的資料。

所以,

完全可以將MySQL資料庫打造成一個KV資料庫

那麼,既然都是KV,MySQL KV和Memcached KV,誰的效能更好呢?

好了,這次安排~~~

測試

業界沒有好用的Memcached基準測試程式,所以,這次還是使用之前自己寫的my_test測試程式,測試分為三種場景:

只讀:Get 請求;

只寫:Set 請求;

讀寫:Get、Set請求,讀寫比例 5:1;

只讀測試是記憶體KV資料庫的強項,但是我們的MySQL已經跑出了220萬QPS,所以MySQL能否挑戰Memcached呢?最後的結果如下所示:

剛剛,MySQL 戰勝了老大哥 Memcached

可以看到Memcached非常強悍,在128個執行緒下可以跑到超過400萬的QPS。

對比MySQL,雖然使用KV介面減少了SQL解析的開銷,使用InnoDB的自適應雜湊索引提升效能,但B+樹的資料結構,依然無法匹敵Memcached。128執行緒下,MySQL的效能約280萬。

只讀測試讓我有些鬱悶,即便自適應雜湊索引加持,MySQL依然無法戰勝Memcached。效能差不多為Memcached只讀測試的70%。

本以為接下去的測試會是一邊倒的情況,沒想到,只寫測試,Memcached“翻車”了!!!

剛剛,MySQL 戰勝了老大哥 Memcached

可以看到 Memcached 在Set只寫測試中,8執行緒能夠跑出35萬的QPS,但是隨著執行緒的增加,效能不斷下降。反覆測試,結果依然如此。

對比MySQL,在32執行緒下可以取得18萬的Set結果。要知道這時,MySQL有事務的保障,需要有額外的開銷。

這一輪,雖然Memcached的極限效能值更高,但是MySQL的表現更為平穩,並且有事務保障,資料不會丟失。這一輪,MySQL勝。

最後,我們來看看混合讀寫測試場景,大多KV資料庫用於讀多寫少的場景,這裡我們測試選擇讀寫比例5:1,讀取比例超過80%。最後的測試結果為:

剛剛,MySQL 戰勝了老大哥 Memcached

測試結果與只寫測試類似,在低併發下,Memcached優勢明顯,高併發下MySQL後來居上。極限值Memcached可以達到近100萬的QPS,MySQL 32執行緒下表現最佳,效能可達62萬QPS。

黑科技

上述測試,我們都是將MySQL當做事務型記憶體KV在和Memcached對比。

如果允許MySQL側降低事務的要求,榮仍資料的丟失,那麼我們還可以對MySQL Memcached Plugin做如下的配置:

daemon_memcached_enable_binlog = OFF

skip_log_bin = 1innodb_flush_log_at_trx_commit = 0

loose_daemon_memcached_r_batch_size = 10

loose_daemon_memcached_w_batch_size = 10

transaction_isolation = READ-UNCOMMITTED

上面的配置中關閉了二進位制日誌的寫入,然後將重做日誌的重新整理設定為每秒1次。接著就是比較

魔幻

的幾個引數。

首先,在KV層設定為讀寫發生10次才提交一次,進一步降低刷盤頻率。由於每10次寫入才提交一次,因此需要將事物隔離級別設定為READ-UNCOMMITTED,這樣才能讀取到未提交的資料!

最後,我們還能繼續降低寫的頻率,即透過下面的命令關閉InnoDB層的redo日誌寫入:

mysql > ALTER INSTANCE disable InnoDB redo_log;

這樣在SET的過程中,沒有任何二進位制日誌和重做日誌的寫入,進一步提升了MySQL Memcached Plugin在Set下的效能表現,最終SET的測試結果如下所示:

剛剛,MySQL 戰勝了老大哥 Memcached

Memcached Plugin+就是啟用“黑科技”後的MySQL效能,可以看到SET下效能得到了大幅提升,32、64執行緒極限值可達到48萬+的QPS。

當然,取得上述效能的表現是因為我們犧牲了資料安全性!!!

最後,我再拋幾個思考題給同學:

1。 目前還是有髒頁重新整理磁碟的問題,如何不修改核心將MySQL打造一個純記憶體KV資料庫?

2。 如何修改InnoDB層核心程式碼,將MySQL打造成段頁式全記憶體資料庫。其效能又能達到多少?

總結

可以看到,即便開啟事務安全的配置,將MySQL打造成KV的效能是完全不輸原生Memcached的,在寫場景和混合讀寫場景都能比原生Memcached更好的表現。

Memcached的優勢在於他需要的資源更少,但他的缺點是他只能做KV操作。而將InnoDB表對映為KV訪問,則不但能提升MySQL資料庫的效能,也能利用MySQL的事務特性、複製功能、SQL查詢等功能,而這是傳統KV資料庫所不具備的能力。

BTW,你們的線上記憶體KV效能多少?一般也就5-10W QPS吧,所以,真的需要Memcached麼?

仔細想想,是不是都是錯誤的架構!!!

科學尚未普及。

希望各位粉絲看完後點擊右下角的“

點贊

”,以示鼓勵。長期堅持原創很不容易,多次想放棄。堅持是一種信仰,專注是一種態度,一路陪伴,一起星辰大海。