京東物流倉儲系統(tǒng)在618大促保障背后的這6條運維秘訣
京東物流極速的購物體驗背后隱藏著怎樣的秘訣?倉儲和配送時效是其中最為關(guān)鍵的一環(huán)。京東物流超強倉配體系,特別是在電商行業(yè)中獨有的倉儲系統(tǒng),在其中起到了決定性的作用。
當(dāng)前京東的庫房已經(jīng)遍布全國,京東倉儲管理系統(tǒng)(簡稱 WMS 系統(tǒng))是最核心的生產(chǎn)系統(tǒng),涵蓋了從入庫,復(fù)核,打包,出庫、庫存和報表等等環(huán)節(jié)。
而作為系統(tǒng)最后端的數(shù)據(jù)庫,不僅僅承擔(dān)著存儲數(shù)據(jù)的任務(wù),還是系統(tǒng)可用性的最后一道防線,如何保證倉儲系統(tǒng)數(shù)據(jù)庫的高性能和高可用,直接決定了庫房生產(chǎn)是否能順暢進行。
在本篇我們將會詳細(xì)介紹京東物流倉儲系統(tǒng)的數(shù)據(jù)庫架構(gòu),以及如何通過運維自動化平臺、性能優(yōu)化、故障自愈和數(shù)據(jù)結(jié)轉(zhuǎn)等步驟進行數(shù)據(jù)庫運維架構(gòu)的演進。
一、數(shù)據(jù)庫架構(gòu)
倉儲系統(tǒng)的數(shù)據(jù)庫架構(gòu),主要分為兩種模式,一種是本地模式,一種是集中模式:
1.1 本地模式
本地模式是指當(dāng)前 WMS 系統(tǒng)的應(yīng)用和數(shù)據(jù)庫服務(wù)器都部署在本地庫房,目的是減少網(wǎng)絡(luò)延遲,提高作業(yè)效率。缺點是機房的電力和網(wǎng)絡(luò)環(huán)境略差,運維難度較高。部署架構(gòu)圖如下:
1.2 集中模式
集中模式是指在 IDC 機房部署一套 WMS 系統(tǒng),多個區(qū)域的園區(qū)或庫房都通過網(wǎng)絡(luò)專線訪問,優(yōu)點是減少資源部署,架構(gòu)更為合理,便于運維管理,缺點是部分區(qū)域網(wǎng)絡(luò)延遲較高,一旦 IDC 發(fā)生故障影響范圍較廣。部署架構(gòu)圖如下:
以上是京東倉儲系統(tǒng)數(shù)據(jù)庫的兩種主要部署模式,目前主要是園區(qū)部署模式,也就是一個或多個庫房園區(qū)共用一個集群(屬于本地模式的一種)。
但是隨著業(yè)務(wù)規(guī)模的增長,全國各地庫房建設(shè)日益增多,數(shù)據(jù)量也與日倍增,而對系統(tǒng)的高性能和高可用的要求卻越來越高,如何在現(xiàn)有架構(gòu)模式下,還能保障系統(tǒng)的高效穩(wěn)定運行,故障及時恢復(fù),都對倉儲系統(tǒng)的運維帶來極大的挑戰(zhàn)。
以下章節(jié)就詳細(xì)闡述一下我們是如何應(yīng)對這些挑戰(zhàn)的。
二、UDBA 運維自動化平臺
工欲善其事必先利其器,想要做好大規(guī)模系統(tǒng)的運維管理,一定需要有自動化的運維平臺作為支持,同時也為了提高工作效率,減少和研發(fā)的溝通成本,庫房運維 DBA 開發(fā)了 UDBA 數(shù)據(jù)庫自動化運維平臺。該平臺除了是 DBA 日常自動化運維的操作平臺,還為 WMS 研發(fā)、運營人員提供了日常所需的技術(shù)支持和信息查詢。
UDBA 數(shù)據(jù)庫自動化運維平臺的主要功能模塊如下所示:
三、性能優(yōu)化
由于倉儲業(yè)務(wù)邏輯復(fù)雜,并且系統(tǒng)是從早期的 SQLServer 遷移到 MySQL 的,對數(shù)據(jù)庫是強依賴的關(guān)系。很多業(yè)務(wù)場景尤其 WMS5 的報表業(yè)務(wù)會涉及很多超大表 (單表數(shù)據(jù)量超過 1 千萬行) 的關(guān)聯(lián),且查詢條件根據(jù)現(xiàn)場工作人員需求進行組合修改,再加上部分表設(shè)計不合理以及查詢 SQL 語法不規(guī)范等問題,給數(shù)據(jù)庫優(yōu)化帶來極大挑戰(zhàn)。
我們主要通過以下方式來保證數(shù)據(jù)高性能:
- 實時監(jiān)控數(shù)據(jù)庫性能,針對突發(fā)性數(shù)據(jù)庫出現(xiàn)性能問題及時進行故障排查和故障恢復(fù),保證業(yè)務(wù)生產(chǎn)正常進行。
 - 每天對 MySQL 慢日志進行分析匯總后郵件抄送給相關(guān)研發(fā)同事,配合研發(fā)同事一起進行數(shù)據(jù)庫優(yōu)化。
 - 周期性對數(shù)據(jù)庫進行巡檢,檢查數(shù)據(jù)庫運行狀態(tài),對壓力較大的數(shù)據(jù)庫進行重點分析優(yōu)化。
 - 定期對研發(fā)同事尤其新入職同事進行 SQL 培訓(xùn),主要針對 MySQL 語法規(guī)范、MySQL 表設(shè)計、MySQL 查詢優(yōu)化等方面,提升研發(fā)同事的數(shù)據(jù)庫設(shè)計能力和 SQL 編寫能力,在開發(fā)過程中提前規(guī)避常見的性能問題。
 - 將優(yōu)化過程中遇到的問題歸納分析整理,幫助研發(fā)同事認(rèn)識性能問題后的本質(zhì)原因,避免重復(fù)出現(xiàn)相同故障。
 - 積極與研發(fā)同事溝通學(xué)習(xí),深入了解業(yè)務(wù)以便更好地從業(yè)務(wù)角度對數(shù)據(jù)庫進行優(yōu)化。
 
在一次服務(wù)器巡檢中,我們使用 SHOW ENGINE INNODB STATUS 查看 MySQL 服務(wù)器運行狀態(tài)時,發(fā)現(xiàn)該數(shù)據(jù)庫存在死鎖問題,通過多次排查,發(fā)現(xiàn)死鎖發(fā)生頻率較高,由于死鎖告警信息中的事務(wù)信息不全,我們第一時間聯(lián)系相關(guān)業(yè)務(wù)人員,了解相關(guān)業(yè)務(wù)實現(xiàn)邏輯,該業(yè)務(wù)通過程序來保證數(shù)據(jù)唯一性,采用 “先嘗試更新,后嘗試插入” 的事務(wù)順序來操作,在詳細(xì)了解業(yè)務(wù)邏輯后,通過模擬測試幫助研發(fā)同事認(rèn)識到該死鎖的核心原因,并在此基礎(chǔ)上提供改進建議,最后將該問題優(yōu)化方案整理成文檔抄送給更多研發(fā)同事。
四、故障自愈
倉儲數(shù)據(jù)庫故障自愈系統(tǒng)主要解決兩個問題,一個是故障的自動切換,一個是組件的自動恢復(fù)。系統(tǒng)功能圖如下所示:
首先硬件作為應(yīng)用系統(tǒng)的底層基礎(chǔ)設(shè)施,一旦出現(xiàn)故障將大大降低系統(tǒng)的可用性,倉儲業(yè)務(wù)的數(shù)據(jù)庫集群分散在全國各地幾百個庫房,數(shù)據(jù)庫服務(wù)如何在遇到硬件等異常時快速的故障轉(zhuǎn)移,如何能降低各地網(wǎng)絡(luò)等外界環(huán)境對數(shù)據(jù)庫的性能影響?
其次系統(tǒng)在日常運行中,因為 Bug 或者其他原因,可能會導(dǎo)致數(shù)據(jù)庫宕機,從庫復(fù)制進程中斷,復(fù)制延遲過大等等問題,如何快速解決這些問題,也成為服務(wù)質(zhì)量優(yōu)良的關(guān)鍵衡量標(biāo)準(zhǔn)。
基于以上這些考慮和實際需求,我們結(jié)合基礎(chǔ)信息系統(tǒng),監(jiān)控系統(tǒng),以及業(yè)界成熟的 MHA 高可用方案,實現(xiàn)了故障的自動切換,當(dāng)數(shù)據(jù)庫主庫或者從庫遇到異常,能夠順利得進行自動切換,保障數(shù)據(jù)庫服務(wù)的持續(xù)性,當(dāng)服務(wù)器有維護需求時,提供手動切換管理,更方便的進行硬件維護。
同時基于 UDBA 數(shù)據(jù)庫自動運維平臺,對全部 MySQL 群集復(fù)制情況進行自動探測,自動識別高延遲實例,并通過修改 innodb_flush_log_at_trx_commit 和 sync_binlog 的刷盤策略參數(shù)進行快速恢復(fù),一旦復(fù)制正常,參數(shù)將自動調(diào)整為標(biāo)準(zhǔn)值,同時復(fù)制的 IO 線程或 SQL 線程異常停止,也可進行自動啟動。
上面的處理結(jié)果都將以短信、微信和郵件等方式,通知值班同事,處理過程在 UDBA 自動運維平臺上同樣可以查詢,方便對故障切換的進一步分析和統(tǒng)計。
五、數(shù)據(jù)結(jié)轉(zhuǎn)
庫房數(shù)據(jù)有時效性強和生命周期短的特點,對于數(shù)據(jù)量較大且操作頻繁的業(yè)務(wù)表,如果不進行歷史數(shù)據(jù)歸檔,會存在嚴(yán)重性能問題和磁盤存儲瓶頸,因此我們采用生產(chǎn)庫保留三月 + 報表庫保留一年的歸檔策略,對生產(chǎn)庫上超過三月” 歷史數(shù)據(jù)” 進行刪除,對報表庫上超過一年的 “歷史數(shù)據(jù)” 結(jié)轉(zhuǎn)到 IDC 機房進行存放。
在未引入自動化結(jié)轉(zhuǎn)平臺前,需要 DBA 手動在每套服務(wù)器上部署結(jié)轉(zhuǎn)程序,當(dāng)結(jié)轉(zhuǎn)條件發(fā)生變化時需要通過命令行共計批量更新每套服務(wù)器上的配置信息,DBA 無法準(zhǔn)確掌握每套服務(wù)器的結(jié)轉(zhuǎn)情況,導(dǎo)致運維難度高且存在較高的誤操作風(fēng)險。
針對庫房數(shù)據(jù)結(jié)轉(zhuǎn)的各項痛點,在對結(jié)轉(zhuǎn)流程的抽象分析基礎(chǔ)上開發(fā)了自動化結(jié)轉(zhuǎn)平臺,其架構(gòu)為:
自動化優(yōu)化平臺有以下優(yōu)點:
- 調(diào)度作業(yè)集中管理,無需 DBA 再到每套服務(wù)器上部署代理作業(yè),結(jié)轉(zhuǎn)平臺根據(jù)調(diào)度配置自動將調(diào)度作業(yè)推送到庫房服務(wù)器上運行,可以根據(jù)業(yè)務(wù)需求輕松調(diào)整調(diào)度時間和結(jié)轉(zhuǎn)條件以及結(jié)轉(zhuǎn)服務(wù)器。
 - 歷史庫動態(tài)擴容,在京東率先引入新一代分布式關(guān)系型數(shù)據(jù)庫 CockroachDB 作為歷史歸檔服務(wù)器,支持高并發(fā)的密集寫入操作,可以按需對集群進行動態(tài)擴容,且能很好動態(tài)適應(yīng)報表庫上表結(jié)構(gòu)變化。
 - 數(shù)據(jù)職責(zé)分離,DBA 作為數(shù)據(jù)庫管理員而不是數(shù)據(jù)管理員,能提供數(shù)據(jù)庫服務(wù)器相關(guān)信息但無法定義數(shù)據(jù)結(jié)轉(zhuǎn)條件,自動結(jié)轉(zhuǎn)平臺將結(jié)轉(zhuǎn)條件的管理接口在權(quán)限控制的基礎(chǔ)上提供給數(shù)據(jù)管理員,明確劃分職責(zé)權(quán)限。
 - 實時掌握結(jié)轉(zhuǎn)調(diào)度信息,自動結(jié)轉(zhuǎn)平臺提供豐富的報表和管理界面,幫助 DBA 輕松掌握當(dāng)前結(jié)轉(zhuǎn)調(diào)度信息和歷史結(jié)轉(zhuǎn)情況。
 
六、升級擴容
由于各種歷史原因,目前庫房數(shù)據(jù)庫仍主要使用 2011 年發(fā)布的 MySQL 5.5 版本,隨著 MySQL 5.7 版本的逐漸穩(wěn)定,我們通過謹(jǐn)慎測試評估發(fā)現(xiàn),MySQL 5.7 可以帶來極大的性能提升,并且其完善和改進了很多高可用性及可維護性方面的功能,能幫助 DBA 更好的管理 MySQL 數(shù)據(jù)庫。
- 升級 MySQL 5.7 可以帶來如下優(yōu)勢:
 - 性能提升,在官方測試報告中,MySQL 5.7 在高并發(fā)環(huán)境下的處理能力相對 MySQL 5.5 有數(shù)十倍提升。
 - 高可用性,MySQL5.7 版本引入多線程復(fù)制和基于 AfterSync 模式的半同步等復(fù)制特性,能有效減少主從復(fù)制延遲,提升數(shù)據(jù)安全。
 - 可維護性,MySQL5.7 版本引入 GTID 復(fù)制、Online DDL 及新版系統(tǒng)視圖和管理函數(shù)等,極大提升數(shù)據(jù)庫可維護性,降低 DBA 運維風(fēng)險和管理難度
 
由于庫房數(shù)據(jù)庫服務(wù)器長期運行在惡劣的機房環(huán)境中,從而產(chǎn)生 RAID 卡電源故障、服務(wù)器硬件老化、過保等引起老舊服務(wù)器性能變差的問題,導(dǎo)致 DBA 疲于處理服務(wù)器宕機或服務(wù)器硬件引起性能瓶頸的各種事件,因此在升級 MySQL 版本同時,我們也優(yōu)先對業(yè)務(wù)操作頻繁的重點倉進行升級擴容,使用 IO 性能更好的 SSD 硬盤以及 CPU 和內(nèi)存配置更高的服務(wù)器,提升數(shù)據(jù)庫高性能和高可用性,為庫房順利且高效生產(chǎn)提供有力保障。
為避免數(shù)據(jù)庫升級擴容影響現(xiàn)有生產(chǎn),我們將所有風(fēng)險操作安排到半夜庫房停產(chǎn)運行,將升級過程進行拆分細(xì)化,對每個升級環(huán)節(jié)進行評估論證,編寫大量升級工具和檢查腳本來提升升級效率和降低誤操作風(fēng)險,并積極配合研發(fā)同事進行測試驗證,努力將升級擴容帶來的負(fù)面影響降到最低,保障庫房正常生產(chǎn)。




















 
 
 




 
 
 
 