首頁 > 科技

前京東大牛,分享內部用MySQL容器化實踐京東到家業務,真香!

2021-06-20 10:43:51

背景

隨著京東到家業務的快速發展,MySQL資料庫的訪問量越來越大,在雲主機上搭建MySQL越來越無法滿足我們的要求。

雲主機的雲硬碟IO效能並不能滿足MySQL所需的高併發訪問需求。雲主機所在宿主機使用不透明,當發生網路或者硬體故障時無法及時定位問題。搭建在雲主機上的MySQL在有變更規格的需求時,需要關機才能變更配置。雲主機上搭建MySQL成本高,採購雲MySQL成本更高。基於上述原因,我們最終選擇採購物理機,在物理機上將MySQL容器化部署來解決以上問題。技術方案

我們認為一套完善的資料庫運維方案包括以下幾個部分:資料庫底層資源平臺、監控系統及資料庫自動化運維平臺。

資料庫底層資源平臺

在物理機上搭建Docker環境,將MySQL例項部署在Docker內,基於Docker的特性,實現資源隔離和資源超賣。自定義規則演算法來進行容器的排程。在高可用方面,針對MHA和Zabbix進行二次開發,實現宕機後快速切換。監控系統

監控系統採用Zabbix,其中每個容器的監控資料(CPU、記憶體等)通過Docker Api來獲取。

資料庫自動化運維平臺

基於Python和Flask框架,開發MySQL自動化運維平臺,實現MySQL完整生命週期自動化運維,提高運維人員的工作效率。

技術實現

資料庫底層資源平臺的搭建

軟硬體選型MySQL運行的場景需求為高併發高IO,我們在軟硬體上做了如下選擇:

物理機:64核、256G記憶體、16*960G SSD組成RAID10 or 4T NVME RAID0作業系統:CentOS 7.5容器:Docker版本1.13.1 、網路模式選擇host模式。(從這也可以看出,我們主要是對CPU和記憶體進行了資源隔離,網路層面沒進行資源隔離)映象:自定義的MySQL5.6.36映象、MySQL5.7.22映象對基於容器的MySQL例項和基於雲主機的MySQL例項,同規格下進行了壓測對比,雲主機中MySQL QPS最大值23K。

容器中的MySQL充分利用了本地SSD硬碟的高IO, QPS最大值達90K。

容器化後MySQL效能遠超雲主機上的MySQL,完全可以滿足京東到家當前的MySQL效能需求。容器排程演算法MySQL作為一種有狀態的服務,DBA不需要對之進行頻繁的操作,要保持相對穩定和健壯,我們自行定義了規則演算法來進行容器的排程。

同一叢集的例項分佈在不同可用區。同一叢集的例項分佈在不同宿主機。根據業務級別不同MySQL分佈不同宿主機,核心業務在一臺宿主機上不能部署過多。分庫系統,各分片MySQL分佈不同宿主機。優先分配CPU、記憶體、磁碟空間資源最空閒的主機。通過Docker超賣CPU,超賣的倍數不超過實際CPU核數2倍。基於以上原則,我們開發了容器排程系統,對容器的分配進行整體排程。

MySQL的高可用實現到家應用伺服器訪問MySQL是通過域名方式來進行連線的,我們對MHA和Zabbix監控系統進行二次開發,故障時通過快速更改域名解析來進行故障切換。整個切換過程在10秒內可以完成。

Zabbix監控系統發現MySQL發生宕機後,首先判斷是主庫還是從庫,如果主庫宕機由MHA Manager來進行處理,從庫宕機由Zabbix監控呼叫指令碼來進行處理。主庫宕機:MHA Manager將Master_Log_File和Read_Master_Log_Pos最高的從庫提升為新主庫,同時MHA Manager也會呼叫DNS解析介面將主庫域名解析到新主庫IP。由於域名DNS解析可能存在快取,域名更新生效時間可能比較長。故障切換系統同時會根據宕機的MySQL資料庫域名查詢連線的所有應用伺服器IP,通過Saltstack批量修改/etc/hosts檔案繫結域名到新IP,下發到各應用主機上,縮短域名解析生效時間,能達到秒級解析生效。從庫宕機:由Zabbix呼叫DNS解析介面,將宕機從庫繫結的域名解析到主庫上,後續操作與主庫宕機操作流程類似。

監控系統

到家的監控系統採用的是Zabbix,使用自定義模板對MySQL運行狀態進行監控。需要注意的是Docker內部CPU和記憶體的監控資料從OS層的獲取值並不準確,我們通過呼叫Docker API的方式進行採集,再彙總到Zabbix。

Zabbix通過設定觸發器,當出現告警時自動執行自定義指令碼,利用這個功能,可以實現MySQL故障後自愈的功能。

MySQL例項觸發所在磁碟空間不足報警時,自動執行指令碼刪除佔冗餘的檔案從而釋放空間。MySQL例項觸發CPU使用率過高報警時,自動執行指令碼將當前運行的SQL及所有連線發郵件給DBA及相關研發,以便快速找到CPU報警的原因。前面提到的MySQL宕機後自動進行域名切換,也是利用Zabbix的這個功能。開發自動化運維平臺

我們基於Python和Flask開發了MySQL自動化運維繫統,從MySQL資源申請、例項創建、銷燬、主從架構部署、叢集不同角色備份策略的選擇、監控新增、銷燬等,將MySQL整個生命週期實現流程化和自動化。MySQL申請及交付

研發通過資料庫運維平臺申請MySQL資源,經DBA審批後,程式根據容器排程演算法,後端會自動創建一套主從架構的MySQL資料庫叢集。併為MySQL自動新增相應的賬號及授權,賬號類型包含:監控、備份、主從、工具類等。同時容器創建之後就包含:MySQL服務端、Zabbix客戶端、SaltStack客戶端、Percona Toolkit、備份指令碼、慢日誌切割指令碼等。整個過程已實現自動化,並且基於映象快速創建容器,5分鐘內可交付一套完整可用的MySQL叢集。配置變更得益於容器的特性,呼叫Docker的update命令可實時改變對應容器的CPU和記憶體配額。從而可以不停地進行MySQL例項規格變更,實現快速擴容或縮容。

MySQL工具MySQL交付之後,我們提供了大量的MySQL工具:語法分析工具、當前慢日誌分析工具、MySQL連線數查詢工具、從庫延遲查詢工具、主從關係查詢工具、正在運行SQL查詢工具、MySQL快速健康檢查、物理機監控、錯誤日誌等。這些工具方便了研發的平時使用,可以藉助這些工具進行排查解決。

總結

目前到家的MySQL例項有95%以上都運行在了容器中,容器化後的MySQL平臺經受住了415週年慶、618、1020等所有大促考驗,對於我們來說,目前的容器化MySQL平臺給我們帶來了三大好處:

滿足效能:運行在物理機Docker內的MySQL例項效能高,能滿足到家多個業務場景的效能需求。降低成本:Docker容器之間可進行資源隔離,可以在同一臺機器上部署多個MySQL例項。而且通過Docker超賣CPU資源,可提高資源利用率,相比在雲主機上搭建MySQL成本降低了50%,比採購雲MySQL成本降低了100%。提高效率:所有MySQL流程自動化,5分鐘內可以交付一套可用的MySQL主從叢集,運維效率得到很大提高。


IT145.com E-mail:sddin#qq.com