由一次mycat+mysql水平拆分集羣問題引發的思考

近段時間部署和測試了一個mycat+4 Percona+tokudb的水平拆分集羣,前段應用是將一類獎狀數據不斷地寫入到這個庫中,只有insert操作,前幾天運行狀態還比較好。


從昨天開始,由於業務量突然增加了一些,磁盤IO負載變得很高,而且仔細分析之後,發現磁盤讀的性能遠遠高於磁盤寫的性能,這完全是有問題的。因爲insert操作肯定主要是寫操作,而且寫都是順序寫,讀操作應該不會太大。


經過對mycat和mysql多方面的查看,都難以解釋的通,不太確定問題的方向和原因。後來與同事溝通,又回到了系統的起點:

先確認cpu,然後確認內存,結果發現內存中cache已經用滿,開始用了大量的swap分區,由此爲出發點,確認思路如下:

wKioL1ZW55bjZLHOAAd9aW6XRmc944.jpg


於是再次與同事溝通:

應該就是內存不足,才需要讀取swap

top裏看一下各個mysql實例佔用的內存大小

就你發的這些圖來看,是有查詢操作。

insert操作因爲要維護索引,應該會有跌宕讀,但是否會以查詢的形式體現我就不確認了

先要確認內存爭用是mysql觸發,還是其它進程

對於數據庫服務器,swap最好不要使用

有些極端的場景,會把swap設置成0,就是爲了避免用磁盤上的文件交換

這個會對性能造成很大影響的

你現在可以需要先調小innodb的內存參數,然後將會話相關的參數也都逐個往小了調

先把內存爭用降下來


於是根據整個系統的物理內存爲48g,各個實例的內存最多爲50%,現在四個實例,每個實例分配6g內存,由於tokudb採用的是 非directio的模式 “tokudb_directio = 0”,所以講各個實例的內存設置爲4g,讓更多的內存用於系統的cache,使系統讀操作都使用系統cache,不使用swap分區,保證內存命中率,減少磁盤IO操作。


這樣修改了之後,系統的資源變爲:

wKioL1ZW56bjZtxnAAANS8YFztA373.png


通過iostat看,寫請求也大於讀請求了,insert操作的狀態正常了:

wKioL1ZW57DQmK7iAACKoZ9Mht4470.png


通過這個問題的處理,我有幾點感悟:

1. 對於架構設計和性能方面的問題,還是應該回到最初:

系統資源監控:

cpu

內存

磁盤

網絡

總體


對應的stat命令:

vmstat

iostat    iotop

mpstat

ifstat

dstat


深刻理解這些基本的系統資源,原理,查看方法,才能認識清楚性能和架構問題,並找到問題解決的突破口; 


2. 對於水平拆分來說:

聊天記錄:

從這個問題的處理也感覺到,硬件資源不足,只有一個機器,只從軟件mycat+mysql這種方式進行水平拆分,資源消耗和爭用的問題還是比較大的

水平拆分不能只從mycat,mysql軟件上水平拆,硬件系統資源也要充分,或者夠用才行

不然所有的事務都在一臺物理機上,資源爭用和問題,還是會很多的;

尤其是面對業務負載壓力和變化的時候,即使mycat分片很合理,cpu,內存,磁盤IO這些資源不足,整體性能還是會有很多問題的


光mycat 邏輯上分片還不行

要合理利用硬件 特別是io 資源

防止硬件熱點

一個磁盤 分太多的分片是沒用的 io 競爭

合理利用 網絡io 磁盤 io 內存 cpu

比如rain0 根rain10 幾塊 盤 每個分片在哪個盤上 這纔是真正dba 需要規劃的

dba 真正的是規劃好這些底層的資源優化


3. 真正好的架構設計,不僅僅是軟件的設計,而是整個軟件,硬件,業務相互結合和配合的設計。


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