HandlerSocket使用經驗

HandlerSocket 是一個日本人開發的mysql的插件,目的是用HandlerSocket把mysql改造成nosql的數據庫。官方稱qps可以到達70w/s+。
HandlerSocket其實是繞過mysql的sql解析部分,直接讀寫innodb,然後對外維護一個epoll的連接,通過簡單的文本協議與客戶端通訊。他對外提供的服務也是簡單的k-v增刪改。mysql的sql解析是非常耗時的,HandlerSocket繞開這一過程,大大加速了讀寫速率,又加上innodb的數據和索引放在一塊,直接讀寫速度很快。
我們最近的項目使用了HandlerSocket,下面介紹一些我的經驗。

1. 消減數據

HandlerSocket達到高性能的必要點是:數據必須能夠放到緩存中。一旦緩存經常性命中失敗,HandlerSocket性能將會大幅度下降。一個簡單的估計方式是查看原始數據大小與db server的內存,如果原始數據遠大於db server,就要考慮拆分或者換用別的技術方案。

2. 多線程讀寫數據庫

要想榨乾HandlerSocket的性能,必須建立多條tcp的鏈接讀寫數據庫。單鏈路讀寫數據庫的性能遠遠小於期望值。可能也就性能差幾十倍多吧。

3. 長連接讀寫數據庫

HandlerSocket提供的客戶端支持的語言非常少,很多情況需要自己去讀寫客戶端實現協議。這時候注意,由於建立連接的消耗非常大,除非在業務非常變態,否則都要建立長連接讀寫數據庫。

4. 儘量用批量操作

HandlerSocket提供兩種方式,一種是單條模式,這種模式下客戶端發送一個相應,等待服務器端回覆相應(通常是這條成功還是失敗,或者是讀取的數值)以後在進行後續過程,第二種方式是批量的訪問,客戶端批量發送一批增刪改的指令,服務器端也回覆對應着一批指令的效應。第一種方式說白了就是阻塞是訪問,阻塞的開銷非常大,大大降低數據庫的性能,建議儘量用批量操作的性能。可以在本地做一個buffer,批量讀寫進數據庫。

5. 鎖表問題

HandlerSocket在有客戶端鏈接的情況下,會將mysql表鎖住。由於innodb是行鎖,所以針對數據的查詢修改刪除不受影響,但是針對表級的rename, drop, truncate會被阻住,得不到表。如果你的應用有離線數據入庫的場景,需要在入庫的時候停止其他客戶端的讀寫。
一個比較好的方案是:假設數據庫爲A,先入庫到A_tmp表;停止客戶端讀寫,rename A到A_mp2, rename A_tmp 到 A;啓動客戶端讀寫;後臺truncate A_tmp2;刪除 A_tmp2;
先truncate在drop的原因是drop耗時太長。

6. 其他

handlersocket使用起來注意的地方挺多,最好的方法是將他封裝成中間件。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章