團隊介紹
網易樂得dba組,負責網易樂得電商、網易郵箱、網易技術部資料庫日常運維,負責資料庫私有雲平台的開發和維護,負責資料庫及資料庫中介軟體cetus的開發和測試等等。
一、背景
隨著業務的爆發式增長,電商系統中的讀寫壓力越來越高,單節點mysql例項壓力越來越大,單純公升級伺服器硬體已經無法滿足生產環境的需要。解決讀請求壓力,需要支援從庫擴充套件;解決寫請求壓力,對資料分片增加多個節點,降低單節點mysql例項的壓力成了更優的選擇。
傳統的分片是通過dao層進行的,但是dao層對資料分片存在諸多問題。從業務角度看,配置修改需要重啟服務,代價巨大;需要對分片結果集進行處理,業務邏輯愈加複雜;功能相對簡單。從資料庫運維角度看,配置管理的統一化難度較大;db的公升級、遷移等操作複雜。
網易電商同樣面臨著這些問題,為了徹底解決資料庫瓶頸,網易樂得團隊在實際生產中研發了自己的中介軟體cetus。其具有正統基因,基於官方mysql-proxy的版本進行全面修復和再創新,已於不久前開源,在各個產品線上得到廣泛應用,效能和穩定性均表現良好。
cetus相容mysql協議,前端應用不用修改即可通過cetus訪問資料庫,方便dba運維同學和開發同學使用,實現了資料庫層面的橫向擴充套件。
目前cetus有讀寫分離和sharding兩個版本,可通過編譯引數選擇適合的版本。它支援對使用者透明的多項功能,例如分布式事務、連線池、結果集壓縮、安全管理、狀態監控、tcp stream傳輸等等。
二、負載均衡策略及效能優化
本文所討論的負載均衡,指的是讀流量的負載均衡,即讀流量如何分配到後端同一mysql集群內的各個db。
cetus的負載均衡策略,主要分為兩部分:
具體實現時候,流量的分配單位與atlas等中介軟體也略有不同,進行了效能優化。下面章節將依次詳細介紹。
1、主從庫之間讀流量的負載策略
預設情況下,非事務中、未通過注釋強制路由主庫或未使用鎖的讀流量會優先路由到從庫,各個從庫之間負載均衡。只有當從庫都不可用時,讀流量才會路由到主庫。
有些業務場景下,主庫可以分擔部分讀流量,這時就涉及到讀流量在主庫和從庫上配置負載策略了。
cetus中,可以通過配置引數read-master-percentage來指定預設的讀流量路由到主庫的百分比,該引數的取值範圍是[0, 100]。
該值預設為0,即所有讀流量會優先路由從庫,所有從庫均不可用時,才會路由主庫;如果該引數設定為100時,則所有讀流量都會路由到主庫;如果該值設定為(0, 100)時,則會按照設定的比例進行路由。需要注意的是,該值表示的是主庫和所有從庫的比例。
2、從庫之間的讀流量負載策略
路由到從庫的流量會在各個從庫之間進行負載均衡。目前cetus各個從庫之間的讀流量負載策略僅支援輪詢(rr)方式。
在流量分配方面,cetus也進行了優化。一些mysql資料庫中介軟體(例如atlas)是基於sql的維度做負載均衡的,不會考慮sql是同乙個連線還是不同連線傳送來的,中介軟體依次將接收到的sql按照策略發往後端的資料庫。
在實際使用中發現,長連線的場景下,該策略會造成大量的連線切換,從而導致session級變數的頻繁調整,影響sql執行效率。因此,cetus對其進行了優化,並非完全按照sql的維度做負載均衡。
cetus考慮了同乙個連線連續傳送sql請求的情況,不會立即將當前sql使用完的cetus與mysql的連線放回連線池復用,而是持有短暫(256毫秒)時間,以期後續仍有sql執行,從而避免了session級變數的調整,大大增加了sql執行的效率。
長連線場景下,對優化前後的cetus進行了簡單測試。通過測試發現,通過優化後的cetus針對長連場景下的讀流量的吞吐量有了明顯提公升。下圖是在docker環境下的簡單測試對比:
為了防止io過高,簡單改造了sysbench傳送的sql,限制了返回的結果集大小。禁用事務和prepare的情況下,採用100個執行緒每次測試60s,連續測試5次,結果如下:
由於本機docker效能較差,且sysbench模擬測試的語句較為簡單,不涉及session變數的切換,因此對比效果不甚明顯,本次測試效能僅提公升30%左右。長連線業務場景下,效能優化可能會更加明顯。
3、讀流量的路由策略總結
在存在至少1個可用從庫的情況下,影響查詢語句的路由策略的因素主要有:
事務中的查詢;
select...for update 或 select ... lock in share mode;
cetus設定引數master-preferred=true所有流量預設全部路由主庫;
cetus設定引數read-master-percentage控制主從讀流量負載;
使用注釋/*#mode=readwrite*/或/*#mode=readonly*/。
預設情況下,讀流量會優先路由到從庫,從庫之間按照輪詢策略在各個從庫之間做負載均衡;一旦所有從庫均不可用,會路由到主庫上。目前cetus的各個從庫暫不支援按照權重做負載。
上面的各個因素的優先順序,注釋的優先順序最高,其次是引數master-preferred,最後是引數read-master-percentage。
三、總結
mysql資料庫中介軟體的主要特性是對客戶端傳送的sql進行路由,而其中負載均衡便是路由策略中的重要部分。通過了解cetus的負載均衡機制,可以在後續維護過程中,更好的對資料庫中介軟體進行調優,更靈活地控制sql的路由。
mysql中介軟體
mysql proxy,mycat,都是比較靠譜的中介軟體軟體,不管是用來做讀寫分離,還是做分庫分表。我們所說的更好,首先體現在系統的管理和運維上。雲上的,基於中介軟體的分布式資料庫,相對於單純的中介軟體來說,建立 管理方便 關鍵指標視覺化 自動化告警 複雜運維 如水平擴充套件中的資料遷移 自動化等...
關於中介軟體整理
2020 4 6 99 條訊息 中介軟體未來會消失嗎?知乎 1 3 對於樓上提到了中介軟體的概念和優越性,我們還可以更大範圍的談一談,然後說說為什麼中介軟體不會消 失。概念 廣義和狹義 中介軟體是一種獨立的系統軟體或服務程式,它是物件技術和分布式計算發展的產物。借助中介軟體軟體在 不同的技術之間共享...
關於訊息中介軟體的總結
今天了解了一下訊息中介軟體,對現在比較流行且用的廣泛的訊息中介軟體進行分析總結。1.rabbitmq 2.kafka 3.nsq 4.redis 主要針對以上四款進行說明,其它不說明是因為網上已經很多部落格進行了分析和比較,以及說明了為什麼不實用的原因。首先對其適用的場景進行說明 rabbitmq ...