MySQL毫無疑問是當前OLTP領域的霸主,最新的MySQL 8。0版本更是能夠輕鬆跑出百萬QPS。
在KV記憶體領域,雖然這些年Redis風頭正勁,但老大哥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呢?最後的結果如下所示:
可以看到Memcached非常強悍,在128個執行緒下可以跑到超過400萬的QPS。
對比MySQL,雖然使用KV介面減少了SQL解析的開銷,使用InnoDB的自適應雜湊索引提升效能,但B+樹的資料結構,依然無法匹敵Memcached。128執行緒下,MySQL的效能約280萬。
只讀測試讓我有些鬱悶,即便自適應雜湊索引加持,MySQL依然無法戰勝Memcached。效能差不多為Memcached只讀測試的70%。
本以為接下去的測試會是一邊倒的情況,沒想到,只寫測試,Memcached“翻車”了!!!
可以看到 Memcached 在Set只寫測試中,8執行緒能夠跑出35萬的QPS,但是隨著執行緒的增加,效能不斷下降。反覆測試,結果依然如此。
對比MySQL,在32執行緒下可以取得18萬的Set結果。要知道這時,MySQL有事務的保障,需要有額外的開銷。
這一輪,雖然Memcached的極限效能值更高,但是MySQL的表現更為平穩,並且有事務保障,資料不會丟失。這一輪,MySQL勝。
最後,我們來看看混合讀寫測試場景,大多KV資料庫用於讀多寫少的場景,這裡我們測試選擇讀寫比例5:1,讀取比例超過80%。最後的測試結果為:
測試結果與只寫測試類似,在低併發下,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的測試結果如下所示:
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麼?
仔細想想,是不是都是錯誤的架構!!!
科學尚未普及。
希望各位粉絲看完後點擊右下角的“
點贊
”,以示鼓勵。長期堅持原創很不容易,多次想放棄。堅持是一種信仰,專注是一種態度,一路陪伴,一起星辰大海。