精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

1號店訂單系統水平分庫的實踐之路以及關鍵步驟

開發 架構
隨著大型互聯網應用的發展,海量數據的存儲和訪問成為系統設計的瓶頸,分布式處理成為不二選擇。數據庫拆分,特別是水平分庫是個高難度的活,涉及一系列技術決策。

隨著大型互聯網應用的發展,海量數據的存儲和訪問成為系統設計的瓶頸,分布式處理成為不二選擇。數據庫拆分,特別是水平分庫是個高難度的活,涉及一系列技術決策。

本人有幸負責1號店訂單水平分庫的方案設計及實施落地,本人結合項目實踐,對水平分庫做一個系統地剖析,希望為大家水平分庫(包括去IOE)改造提供總體思路,主要內容包括:

[[184540]]

水平分庫說明

分庫維度-- 根據哪個字段分庫

分庫策略-- 記錄如何分配到不同庫

分庫數量-- 初始庫數量及庫數量如何增長

路由透明-- 如何實現庫路由,支持應用透明

分頁處理-- 跨多個庫的分頁case如何處理

Lookup映射—非分庫字段映射到分庫字段,實現單庫訪問

整體架構-- 分庫的整體技術架構

上線步驟-- 分庫改造實施上線

項目總結

水平分庫說明

數據庫拆分有兩種:

1)   垂直分庫

數據庫里的表太多,拿出部分到新的庫里,一般是根據業務劃分表,關系密切的表放同一數據庫,應用修改數據庫連接即可,比較簡單。

2)   水平分庫

某張表太大,單個數據庫存儲不下或訪問性能有壓力,把一張表拆成多張,每張表存放部分記錄,保存在不同的數據庫里,水平分庫需要對系統做大的改造。

[[184542]]

1號店核心的訂單表存儲在Oracle數據庫,記錄有上億條,字段有上百個,訪問的模式也是復雜多樣,隨著業務快速增長,無論存儲空間或訪問性能都面臨巨大挑戰,特別在大促時,訂單庫已成為系統瓶頸。

通常有兩種解決辦法:

Scale up,升級Oracle數據庫所在的物理機,提升內存/存儲/IO性能,但這種升級費用昂貴,并且只能滿足短期需要。

Scale out,把訂單庫拆分為多個庫,分散到多臺機器進行存儲和訪問,這種做法支持水平擴展,可以滿足長遠需要。

1號店采取后一種做法,它的訂單庫主要包括訂單主表/訂單明細表(記錄商品明細)/訂單擴展表,水平分庫即把這3張表的記錄分到多個數據庫中,訂單水平分庫效果如下圖所示:

 

原來一個Oracle庫被多個MySQL庫取代,支持1主多備和讀寫分離,主備之間通過MySQL自帶的數據同步機制(SLA<1秒),所有應用通過訂單服務訪問訂單數據。

分庫維度

水平分庫首先要考慮根據哪個字段作為分庫維度,選擇標準是盡量避免應用代碼和SQL性能受影響,這就要求當前SQL在分庫后,訪問盡量落在單個庫里,否則單庫訪問變成多庫掃描,讀寫性能和應用邏輯都會受較大影響。

對于訂單拆分,大家首先想到的是按照用戶Id拆分,結論沒錯,但***還是數據說話,不能拍腦袋。好的做法是首先收集所有SQL,挑選where語句最常出現的過濾字段,比如用戶Id/訂單Id/商家Id,每個字段在SQL中有三種情況:

單Id過濾,如用戶Id=?

多Id過濾,如用戶Id IN (?,?,?)

該Id不出現

然后進一步統計,假設共有500個SQL訪問訂單庫,3個過濾字段出現情況如下:

過濾字段單Id過濾多Id過濾不出現

用戶Id12040330

訂單Id6080360

商家Id150485

結論明顯,應該選擇用戶Id進行分庫。

等一等,這只是靜態分析,每個SQL訪問的次數是不一樣的,因此還要分析每個SQL的訪問量。我們分析了Top15執行最多的SQL (它們占總執行次數85%),如果按照用戶Id分庫,這些SQL 85%落到單個數據庫, 13%落到多個數據庫,只有2%需要遍歷所有數據庫,明顯優于使用其他Id進行分庫。

通過量化分析,我們知道按照用戶Id分庫是***的,同時也大致知道分庫對現有系統的影響,比如這個例子中,85%的SQL會落到單個數據庫,這部分的訪問性能會優化,堅定了各方對分庫的信心。

分庫策略

分庫維度確定后,如何把記錄分到各個庫里呢?一般有兩種方式:

根據數值范圍,比如用戶Id為1-9999的記錄分到***個庫,10000-20000的分到第二個庫,以此類推。

根據數值取模,比如用戶Id mod n,余數為0的記錄放到***個庫,余數為1的放到第二個庫,以此類推。

兩種分法的優劣比較如下:

評價指標按照范圍分庫按照Mod分庫

庫數量前期數目比較小,可以隨用戶/業務按需增長前期即根據mode因子確定庫數量,數目一般比較大

訪問性能前期庫數量小,全庫查詢消耗資源少,單庫查詢性能略差前期庫數量大,全庫查詢消耗資源多,單庫查詢性能略好

調整庫數量比較容易,一般只需為新用戶增加庫,老庫拆分也只影響單個庫困難,改變mod因子導致數據在所有庫之間遷移

數據熱點新舊用戶購物頻率有差異,有數據熱點問題新舊用戶均勻到分布到各個庫,無熱點

實踐中,為了處理簡單,選擇mod分庫的比較多。同時二次分庫時,為了數據遷移方便,一般是按倍數增加,比如初始4個庫,二次分裂為8個,再16個。這樣對于某個庫的數據,一半數據移到新庫,剩余不動,對比每次只增加一個庫,所有數據都要大規模變動。

補充下,mod分庫一般每個庫記錄數比較均勻,但也有些數據庫,存在超級Id,這些Id的記錄遠遠超過其他Id,比如在廣告場景下,某個大廣告主的廣告數可能占總體很大比例。如果按照廣告主Id取模分庫,某些庫的記錄數會特別多,對于這些超級Id,需要提供單獨庫來存儲記錄。

分庫數量

分庫數量首先和單庫能處理的記錄數有關,一般來說,Mysql 單庫超過5000萬條記錄,Oracle單庫超過1億條記錄,DB壓力就很大(當然處理能力和字段數量/訪問模式/記錄長度有進一步關系)。

在滿足上述前提下,如果分庫數量少,達不到分散存儲和減輕DB性能壓力的目的;如果分庫的數量多,好處是每個庫記錄少,單庫訪問性能好,但對于跨多個庫的訪問,應用程序需要訪問多個庫,如果是并發模式,要消耗寶貴的線程資源;如果是串行模式,執行時間會急劇增加。

***分庫數量還直接影響硬件的投入,一般每個分庫跑在單獨物理機上,多一個庫意味多一臺設備。所以具體分多少個庫,要綜合評估,一般初次分庫建議分4-8個庫。

路由透明

分庫從某種意義上來說,意味著DB schema改變了,必然影響應用,但這種改變和業務無關,所以要盡量保證分庫對應用代碼透明,分庫邏輯盡量在數據訪問層處理。當然完全做到這一點很困難,具體哪些應該由DAL負責,哪些由應用負責,這里有一些建議:

對于單庫訪問,比如查詢條件指定用戶Id,則該SQL只需訪問特定庫。此時應該由DAL層自動路由到特定庫,當庫二次分裂時,也只要修改mod 因子,應用代碼不受影響。

對于簡單的多庫查詢,DAL負責匯總各個數據庫返回的記錄,此時仍對上層應用透明。

對于帶聚合運算的多庫查詢,如帶groupBy/orderby/min/max/avg等關鍵字,建議DAL匯總單個庫返回的結果,上層應用做進一步處理。一方面DAL全面支持各種case,實現很復雜;另一方面,從1號店實踐來看,這樣的例子不多,在上層應用作針對性處理,更加靈活。

DAL可進一步細分為JDBC和DAL兩層,基于JDBC層面實現分庫路由,系統開發難度大,靈活性低,目前也沒有很好的成功案例;一般是基于持久層框架進一步封裝成DDAL(分布式數據訪問層),實現分庫路由,1號店DAL即基于iBatis進行上層封裝而來。

分頁處理

分庫后,有些分頁查詢需要遍歷所有庫,這些case是分庫***的受害者L。

舉個分頁的例子,比如要求按時間順序展示某個商家的訂單,每頁100條記錄,由于是按商家查詢,需要遍歷所有數據庫,假設庫數量是8,我們來看下分頁處理邏輯:

如果取第1頁數據,則需要從每個庫里按時間順序取前100條記錄,8個庫匯總后有800條,然后對這800條記錄在應用里進行二次排序,***取前100條。

如果取第10頁數據,則需要從每個庫里取前1000(100*10)條記錄,匯總后有8000條記錄,然后對這8000條記錄二次排序后取(900,1000)條記錄。

分庫情況下,對于第k頁記錄,每個庫要多取100*(k-1)條記錄,所有庫加起來,多取的記錄更多,所以越是靠后的分頁,系統要耗費更多內存和執行時間。

對比沒分庫的情況,無論取那一頁,都只要從單個DB里取100條記錄,而且無需在應用內部做二次排序,非常簡單。

那如何解決分庫情況下的分頁問題呢?有以下幾種辦法:

如果是在前臺應用提供分頁,則限定用戶只能看前面n頁,這個限制在業務上也是合理的,一般看后面的分頁意義不大(如果一定要看,可以要求用戶縮小范圍重新查詢)。

如果是后臺批處理任務要求分批獲取數據,則可以加大page size,比如每次獲取5000條記錄,有效減少分頁數(當然離線訪問一般走備庫,避免沖擊主庫)。

分庫設計時,一般還有配套大數據平臺匯總所有分庫的記錄,有些分頁查詢可以考慮走大數據平臺。

Lookup映射

分庫字段只有一個,比如這里是用戶Id,但訂單表還有其他字段可唯一區分記錄,比如訂單Id,給定一個訂單Id,相應記錄一定在某個庫里。如果盲目地查詢所有分庫,則帶來不必要的開銷,Lookup映射可根據訂單Id,找到相應的用戶Id,從而實現單庫定位。

可以事先檢索所有訂單Id和用戶Id,保存在Lookup表里,Lookup表的記錄數和訂單庫記錄總數相等,但它只有2個字段,所以存儲和查詢性能都不是問題。實際使用時,一般通過分布式緩存來優化Lookup性能。對于新增的訂單,除了寫訂單表,同時要寫Lookup表。

整體架構

1號店訂單水平分庫的總體技術架構如下圖所示:

上層應用通過訂單服務/分庫代理和DAL訪問數據庫。

代理對訂單服務實現功能透明,包括聚合運算,非用戶Id到用戶Id的映射。

Lookup表用于訂單Id/用戶Id映射,保證按訂單Id訪問時,可以直接落到單個庫,Cache是Lookup的內存數據映像,提升性能,cache故障時,直接訪問Lookup表。

DAL提供庫的路由,根據用戶Id定位到某個庫,對于多庫訪問,DAL支持可選的并發訪問模式,并支持簡單記錄匯總。

Lookup表初始化數據來自于現有分庫數據,新增記錄時,直接由代理異步寫入。

上線步驟

訂單表是核心業務表,它的水平拆分影響很多業務,本身的技術改造也很大,很容易出紕漏,上線時,必須謹慎考慮,1號店整個方案實施過程如下:

首先實現Oracle和MySQL兩套庫并行,所有數據訪問指向Oracle庫,通過數據同步程序把數據從Oracle拆分到多個MySQL分庫,比如3分鐘增量同步一次。

按照上述架構圖搭建整個體系,選擇幾個對數據實時性不高的訪問例子(如訪問歷史訂單),轉向MySQL分庫訪問,然后逐漸增加更多非實時case,以檢驗整套體系可行性。

如果性能和功能都沒問題,再一次性把所有實時讀寫訪問轉向MySQL,廢棄Oracle。

這個上線步驟多了數據同步程序的開發(大約1人周工作量,風險很低),但分散了風險,把***步的技術風險(Lookup/DAL等基礎設施改造)和第二步的業務功能風險(Oracle改MySQL語法)分開。1號店兩階段上線都是一次性成功,特別是第二階段上線,100多個依賴方應用簡單重啟即完成升級,中間沒有出現一例較大問題。

項目總結

1號店完成訂單水平分庫的同時,把訂單庫從Oralce遷到MySQL,設備從小型機換成X86服務器,通過水平分庫和去IOE,不但支持訂單量未來增長,并且總體成本也大幅下降。

由于去IOE和訂單分庫一起實施,帶來雙重的性能影響,我們花了很大精力做性能測試,為了模擬真實場景,大家通過Tcpcopy把線上實際的查詢流量引到測試環境,先后經過13輪的性能測試,最終6個MySQL庫相對一個Oracle,平均SQL執行時間基本持平,性能不降低的情況下,優化了架構,節省了成本。

對核心表做水平分庫之前,必須先做好服務化,即外部系統通過統一的訂單服務訪問相關表,不然很容易遺漏一些SQL。

1號店最終是根據用戶Id后三位取模,初始分6個庫,理論上支持多達768個庫,并且對訂單Id生成規則做了改造,使其包括用戶Id后三位,這樣新訂單Id本身包含庫定位所需信息,無需走Lookup機制,隨著老訂單歸檔到歷史庫,上述架構中lookup部分可廢棄。

水平分庫是一項系統性工作,首先需要在理論模式指導下,結合實際情況,每個方面做出***選擇。其次對于特殊場景,如跨庫分頁,沒有銀彈,可以靈活處理,不走常規路。***控制好節奏,系統改造、數據遷移、上線實施等各個環節做好銜接,全局一盤棋。

大膽設計,小心求證,謹慎實施,分庫并不難。

作者介紹

王慶友,前1號店***架構師,先后就職于ebay、騰訊、1號店等公司,精通電商業務,擅長復雜系統業務建模和架構分析,同時在構建大規模的分布式系統方 面有豐富實踐,尤其在大型系統的SOA改造方面有很深入的理論和實踐,目前在尋找合作機會,微信號Brucetwins,個人公眾號”架構之道”,歡迎一起聊架構。隨著大型互聯網應用的發展,海量數據的存儲和訪問成為系統設計的瓶頸,分布式處理成為不二選擇。數據庫拆分,特別是水平分庫是個高難度的活,涉及一系列技術決策。

本人有幸負責1號店訂單水平分庫的方案設計及實施落地,本人結合項目實踐,對水平分庫做一個系統地剖析,希望為大家水平分庫(包括去IOE)改造提供總體思路,主要內容包括:

水平分庫說明

分庫維度-- 根據哪個字段分庫

分庫策略-- 記錄如何分配到不同庫

分庫數量-- 初始庫數量及庫數量如何增長

路由透明-- 如何實現庫路由,支持應用透明

分頁處理-- 跨多個庫的分頁case如何處理

Lookup映射—非分庫字段映射到分庫字段,實現單庫訪問

整體架構-- 分庫的整體技術架構

上線步驟-- 分庫改造實施上線

項目總結

水平分庫說明

數據庫拆分有兩種:

1)   垂直分庫

數據庫里的表太多,拿出部分到新的庫里,一般是根據業務劃分表,關系密切的表放同一數據庫,應用修改數據庫連接即可,比較簡單。

2)   水平分庫

某張表太大,單個數據庫存儲不下或訪問性能有壓力,把一張表拆成多張,每張表存放部分記錄,保存在不同的數據庫里,水平分庫需要對系統做大的改造。

1號店核心的訂單表存儲在Oracle數據庫,記錄有上億條,字段有上百個,訪問的模式也是復雜多樣,隨著業務快速增長,無論存儲空間或訪問性能都面臨巨大挑戰,特別在大促時,訂單庫已成為系統瓶頸。

通常有兩種解決辦法:

Scale up,升級Oracle數據庫所在的物理機,提升內存/存儲/IO性能,但這種升級費用昂貴,并且只能滿足短期需要。

Scale out,把訂單庫拆分為多個庫,分散到多臺機器進行存儲和訪問,這種做法支持水平擴展,可以滿足長遠需要。

1號店采取后一種做法,它的訂單庫主要包括訂單主表/訂單明細表(記錄商品明細)/訂單擴展表,水平分庫即把這3張表的記錄分到多個數據庫中,訂單水平分庫效果如下圖所示:

原來一個Oracle庫被多個MySQL庫取代,支持1主多備和讀寫分離,主備之間通過MySQL自帶的數據同步機制(SLA<1秒),所有應用通過訂單服務訪問訂單數據。

分庫維度

水平分庫首先要考慮根據哪個字段作為分庫維度,選擇標準是盡量避免應用代碼和SQL性能受影響,這就要求當前SQL在分庫后,訪問盡量落在單個庫里,否則單庫訪問變成多庫掃描,讀寫性能和應用邏輯都會受較大影響。

對于訂單拆分,大家首先想到的是按照用戶Id拆分,結論沒錯,但***還是數據說話,不能拍腦袋。好的做法是首先收集所有SQL,挑選where語句最常出現的過濾字段,比如用戶Id/訂單Id/商家Id,每個字段在SQL中有三種情況:

單Id過濾,如用戶Id=?

多Id過濾,如用戶Id IN (?,?,?)

該Id不出現

然后進一步統計,假設共有500個SQL訪問訂單庫,3個過濾字段出現情況如下:

過濾字段單Id過濾多Id過濾不出現

用戶Id12040330

訂單Id6080360

商家Id150485

結論明顯,應該選擇用戶Id進行分庫。

等一等,這只是靜態分析,每個SQL訪問的次數是不一樣的,因此還要分析每個SQL的訪問量。我們分析了Top15執行最多的SQL (它們占總執行次數85%),如果按照用戶Id分庫,這些SQL 85%落到單個數據庫, 13%落到多個數據庫,只有2%需要遍歷所有數據庫,明顯優于使用其他Id進行分庫。

通過量化分析,我們知道按照用戶Id分庫是***的,同時也大致知道分庫對現有系統的影響,比如這個例子中,85%的SQL會落到單個數據庫,這部分的訪問性能會優化,堅定了各方對分庫的信心。

分庫策略

分庫維度確定后,如何把記錄分到各個庫里呢?一般有兩種方式:

根據數值范圍,比如用戶Id為1-9999的記錄分到***個庫,10000-20000的分到第二個庫,以此類推。

根據數值取模,比如用戶Id mod n,余數為0的記錄放到***個庫,余數為1的放到第二個庫,以此類推。

兩種分法的優劣比較如下:

評價指標按照范圍分庫按照Mod分庫

庫數量前期數目比較小,可以隨用戶/業務按需增長前期即根據mode因子確定庫數量,數目一般比較大

訪問性能前期庫數量小,全庫查詢消耗資源少,單庫查詢性能略差前期庫數量大,全庫查詢消耗資源多,單庫查詢性能略好

調整庫數量比較容易,一般只需為新用戶增加庫,老庫拆分也只影響單個庫困難,改變mod因子導致數據在所有庫之間遷移

數據熱點新舊用戶購物頻率有差異,有數據熱點問題新舊用戶均勻到分布到各個庫,無熱點

實踐中,為了處理簡單,選擇mod分庫的比較多。同時二次分庫時,為了數據遷移方便,一般是按倍數增加,比如初始4個庫,二次分裂為8個,再16個。這樣對于某個庫的數據,一半數據移到新庫,剩余不動,對比每次只增加一個庫,所有數據都要大規模變動。

補充下,mod分庫一般每個庫記錄數比較均勻,但也有些數據庫,存在超級Id,這些Id的記錄遠遠超過其他Id,比如在廣告場景下,某個大廣告主的廣告數可能占總體很大比例。如果按照廣告主Id取模分庫,某些庫的記錄數會特別多,對于這些超級Id,需要提供單獨庫來存儲記錄。

分庫數量

分庫數量首先和單庫能處理的記錄數有關,一般來說,Mysql 單庫超過5000萬條記錄,Oracle單庫超過1億條記錄,DB壓力就很大(當然處理能力和字段數量/訪問模式/記錄長度有進一步關系)。

在滿足上述前提下,如果分庫數量少,達不到分散存儲和減輕DB性能壓力的目的;如果分庫的數量多,好處是每個庫記錄少,單庫訪問性能好,但對于跨多個庫的訪問,應用程序需要訪問多個庫,如果是并發模式,要消耗寶貴的線程資源;如果是串行模式,執行時間會急劇增加。

***分庫數量還直接影響硬件的投入,一般每個分庫跑在單獨物理機上,多一個庫意味多一臺設備。所以具體分多少個庫,要綜合評估,一般初次分庫建議分4-8個庫。

路由透明

分庫從某種意義上來說,意味著DB schema改變了,必然影響應用,但這種改變和業務無關,所以要盡量保證分庫對應用代碼透明,分庫邏輯盡量在數據訪問層處理。當然完全做到這一點很困難,具體哪些應該由DAL負責,哪些由應用負責,這里有一些建議:

對于單庫訪問,比如查詢條件指定用戶Id,則該SQL只需訪問特定庫。此時應該由DAL層自動路由到特定庫,當庫二次分裂時,也只要修改mod 因子,應用代碼不受影響。

對于簡單的多庫查詢,DAL負責匯總各個數據庫返回的記錄,此時仍對上層應用透明。

對于帶聚合運算的多庫查詢,如帶groupBy/orderby/min/max/avg等關鍵字,建議DAL匯總單個庫返回的結果,上層應用做進一步處理。一方面DAL全面支持各種case,實現很復雜;另一方面,從1號店實踐來看,這樣的例子不多,在上層應用作針對性處理,更加靈活。

DAL可進一步細分為JDBC和DAL兩層,基于JDBC層面實現分庫路由,系統開發難度大,靈活性低,目前也沒有很好的成功案例;一般是基于持久層框架進一步封裝成DDAL(分布式數據訪問層),實現分庫路由,1號店DAL即基于iBatis進行上層封裝而來。

分頁處理

分庫后,有些分頁查詢需要遍歷所有庫,這些case是分庫***的受害者L。

舉個分頁的例子,比如要求按時間順序展示某個商家的訂單,每頁100條記錄,由于是按商家查詢,需要遍歷所有數據庫,假設庫數量是8,我們來看下分頁處理邏輯:

如果取第1頁數據,則需要從每個庫里按時間順序取前100條記錄,8個庫匯總后有800條,然后對這800條記錄在應用里進行二次排序,***取前100條。

如果取第10頁數據,則需要從每個庫里取前1000(100*10)條記錄,匯總后有8000條記錄,然后對這8000條記錄二次排序后取(900,1000)條記錄。

分庫情況下,對于第k頁記錄,每個庫要多取100*(k-1)條記錄,所有庫加起來,多取的記錄更多,所以越是靠后的分頁,系統要耗費更多內存和執行時間。

對比沒分庫的情況,無論取那一頁,都只要從單個DB里取100條記錄,而且無需在應用內部做二次排序,非常簡單。

那如何解決分庫情況下的分頁問題呢?有以下幾種辦法:

如果是在前臺應用提供分頁,則限定用戶只能看前面n頁,這個限制在業務上也是合理的,一般看后面的分頁意義不大(如果一定要看,可以要求用戶縮小范圍重新查詢)。

如果是后臺批處理任務要求分批獲取數據,則可以加大page size,比如每次獲取5000條記錄,有效減少分頁數(當然離線訪問一般走備庫,避免沖擊主庫)。

分庫設計時,一般還有配套大數據平臺匯總所有分庫的記錄,有些分頁查詢可以考慮走大數據平臺。

Lookup映射

分庫字段只有一個,比如這里是用戶Id,但訂單表還有其他字段可唯一區分記錄,比如訂單Id,給定一個訂單Id,相應記錄一定在某個庫里。如果盲目地查詢所有分庫,則帶來不必要的開銷,Lookup映射可根據訂單Id,找到相應的用戶Id,從而實現單庫定位。

可以事先檢索所有訂單Id和用戶Id,保存在Lookup表里,Lookup表的記錄數和訂單庫記錄總數相等,但它只有2個字段,所以存儲和查詢性能都不是問題。實際使用時,一般通過分布式緩存來優化Lookup性能。對于新增的訂單,除了寫訂單表,同時要寫Lookup表。

整體架構

1號店訂單水平分庫的總體技術架構如下圖所示:

上層應用通過訂單服務/分庫代理和DAL訪問數據庫。

代理對訂單服務實現功能透明,包括聚合運算,非用戶Id到用戶Id的映射。

Lookup表用于訂單Id/用戶Id映射,保證按訂單Id訪問時,可以直接落到單個庫,Cache是Lookup的內存數據映像,提升性能,cache故障時,直接訪問Lookup表。

DAL提供庫的路由,根據用戶Id定位到某個庫,對于多庫訪問,DAL支持可選的并發訪問模式,并支持簡單記錄匯總。

Lookup表初始化數據來自于現有分庫數據,新增記錄時,直接由代理異步寫入。

上線步驟

訂單表是核心業務表,它的水平拆分影響很多業務,本身的技術改造也很大,很容易出紕漏,上線時,必須謹慎考慮,1號店整個方案實施過程如下:

首先實現Oracle和MySQL兩套庫并行,所有數據訪問指向Oracle庫,通過數據同步程序把數據從Oracle拆分到多個MySQL分庫,比如3分鐘增量同步一次。

按照上述架構圖搭建整個體系,選擇幾個對數據實時性不高的訪問例子(如訪問歷史訂單),轉向MySQL分庫訪問,然后逐漸增加更多非實時case,以檢驗整套體系可行性。

如果性能和功能都沒問題,再一次性把所有實時讀寫訪問轉向MySQL,廢棄Oracle。

這個上線步驟多了數據同步程序的開發(大約1人周工作量,風險很低),但分散了風險,把***步的技術風險(Lookup/DAL等基礎設施改造)和第二步的業務功能風險(Oracle改MySQL語法)分開。1號店兩階段上線都是一次性成功,特別是第二階段上線,100多個依賴方應用簡單重啟即完成升級,中間沒有出現一例較大問題。

項目總結

1號店完成訂單水平分庫的同時,把訂單庫從Oralce遷到MySQL,設備從小型機換成X86服務器,通過水平分庫和去IOE,不但支持訂單量未來增長,并且總體成本也大幅下降。

由于去IOE和訂單分庫一起實施,帶來雙重的性能影響,我們花了很大精力做性能測試,為了模擬真實場景,大家通過Tcpcopy把線上實際的查詢流量引到測試環境,先后經過13輪的性能測試,最終6個MySQL庫相對一個Oracle,平均SQL執行時間基本持平,性能不降低的情況下,優化了架構,節省了成本。

對核心表做水平分庫之前,必須先做好服務化,即外部系統通過統一的訂單服務訪問相關表,不然很容易遺漏一些SQL。

1號店最終是根據用戶Id后三位取模,初始分6個庫,理論上支持多達768個庫,并且對訂單Id生成規則做了改造,使其包括用戶Id后三位,這樣新訂單Id本身包含庫定位所需信息,無需走Lookup機制,隨著老訂單歸檔到歷史庫,上述架構中lookup部分可廢棄。

水平分庫是一項系統性工作,首先需要在理論模式指導下,結合實際情況,每個方面做出***選擇。其次對于特殊場景,如跨庫分頁,沒有銀彈,可以靈活處理,不走常規路。***控制好節奏,系統改造、數據遷移、上線實施等各個環節做好銜接,全局一盤棋。

大膽設計,小心求證,謹慎實施,分庫并不難。

作者介紹

王慶友,前1號店***架構師,先后就職于ebay、騰訊、1號店等公司,精通電商業務,擅長復雜系統業務建模和架構分析,同時在構建大規模的分布式系統方 面有豐富實踐,尤其在大型系統的SOA改造方面有很深入的理論和實踐,目前在尋找合作機會,微信號Brucetwins,個人公眾號”架構之道”,歡迎一起聊架構。

責任編輯:張燕妮 來源: 聊聊架構
相關推薦

2020-11-18 09:39:02

MySQL數據庫SQL

2020-07-30 17:59:34

分庫分表SQL數據庫

2022-11-30 07:58:10

支付業務系統分庫分表

2018-01-12 15:17:40

數據庫水平分庫數據遷移

2022-10-09 18:14:31

訂單系統分庫分表

2013-03-06 10:54:03

云服務實踐關鍵步驟

2014-04-10 09:21:22

Windows Ser

2015-08-06 11:45:28

電商混合云運維實踐

2018-09-07 10:14:58

2021-02-05 10:27:23

轉型計劃項目負責人CIO

2015-08-05 09:38:18

1號店混合云運維

2021-08-02 08:05:05

系統訂單 Python

2022-07-21 14:37:12

云計算安全云架構

2009-12-25 14:52:49

2021-11-24 14:46:06

云計算云遷移數據中心

2023-07-31 11:19:16

2023-02-15 14:09:57

云托管云退出策略

2024-03-26 08:58:55

集成測試軟件開發Python

2020-09-28 06:32:53

VDI測試清單虛擬化

2023-12-21 11:59:29

點贊
收藏

51CTO技術棧公眾號

国产精品久久久久一区二区三区 | 91啪国产在线| 亚洲自拍偷拍图| 91国内外精品自在线播放| 亚洲视频综合在线| 美女视频久久| 国产精品人人妻人人爽| 亚洲精品男同| 在线成人激情黄色| 熟妇女人妻丰满少妇中文字幕| 成年女人在线看片| 欧美激情一区二区| 国产精品成人一区二区三区| 日韩一级片中文字幕| 亚洲区综合中文字幕日日| 亚洲国产天堂久久综合| 激情黄色小视频| 三级在线观看视频| 日韩毛片在线免费观看| 欧洲成人一区二区| 日韩中文字幕免费在线观看| 日本三级亚洲精品| 91精品国产99| 草视频在线观看| jvid福利在线一区二区| 亚洲精品狠狠操| 国产大学生av| 日韩成人综合网| 欧美性猛交xxxx富婆弯腰| 超碰超碰超碰超碰超碰| h视频网站在线观看| 91丨九色丨蝌蚪富婆spa| 91社区国产高清| 欧美人一级淫片a免费播放| 激情成人综合| 欧美日韩高清区| 激情高潮到大叫狂喷水| 国产影视精品一区二区三区| 亚洲国产精久久久久久 | 日韩深夜福利网站| 日本韩国欧美一区二区三区| 欧美在线一区视频| 成人福利片网站| 最新热久久免费视频| 亚洲国产精品久久久久婷婷老年 | 久久亚洲捆绑美女| 国产精品一区二区三区在线观| 99在线精品视频免费观看软件 | 日本乱码高清不卡字幕| 欧美 丝袜 自拍 制服 另类| 丁香花视频在线观看| 亚洲欧美日韩中文字幕一区二区三区| 亚洲人成77777| 3p视频在线观看| 国产精品天天摸av网| 日韩欧美在线电影| 草碰在线视频| 中文字幕欧美区| 一本久久a久久精品vr综合| 91se在线| 成人欧美一区二区三区白人| 宅男av一区二区三区| 嫩草在线视频| 亚洲另类中文字| 国产精品成人久久电影| 高清视频在线观看三级| 一本色道a无线码一区v| 激情五月亚洲色图| 色诱色偷偷久久综合| 欧美妇女性影城| 一区二区三区人妻| 美女一区二区在线观看| 亚洲跨种族黑人xxx| 欧美激情亚洲色图| 99久久九九| 欧美丰满老妇厨房牲生活 | 日韩精品无码一区二区三区久久久 | 拍真实国产伦偷精品| 日韩美女视频19| 黄网站色视频免费观看| 日本不良网站在线观看| 欧美日韩一区二区三区高清| 91欧美一区二区三区| 亚洲国产视频二区| 亚洲欧美变态国产另类| 中文字幕求饶的少妇| 国产精品hd| 亲爱的老师9免费观看全集电视剧| 中文字幕在线播| 韩国视频一区二区| 国产在线一区二| а天堂8中文最新版在线官网| 亚洲人成7777| 北条麻妃在线视频观看| 欧美天堂一区二区| 欧美精品一区二区高清在线观看| 国产精品815.cc红桃| 国产国产精品| 国自产精品手机在线观看视频| 无码人妻精品一区二| 国产在线精品不卡| 欧美久久电影| 日本三级在线观看网站| 91电影在线观看| 伊人影院在线观看视频| 精品美女视频| 欧美一级免费视频| 99国产在线播放| 国产婷婷精品av在线| 青青视频免费在线| 中韩乱幕日产无线码一区| 欧美变态tickling挠脚心| 免费看91的网站| 日韩午夜一区| 亚洲自拍偷拍网址| 9色在线观看| 欧美日韩中文字幕| 91亚洲一线产区二线产区| 日韩欧美综合| 国产a∨精品一区二区三区不卡| 99热这里只有精品在线| 国产精品天美传媒| 青青在线视频观看| 国产精品chinese在线观看| 色琪琪综合男人的天堂aⅴ视频| 国产精品一区二区三区四| 国产麻豆视频精品| 一区二区在线观| 朝桐光一区二区| 国产午夜精品麻豆| 日韩在线观看第一页| 国产精品一区二区免费不卡| 亚洲一二三区精品| 91福利精品在线观看| 亚洲一级一级97网| 精品人妻一区二区三区潮喷在线 | 乱插在线www| 日韩一二三区视频| 国产稀缺精品盗摄盗拍| 麻豆国产欧美日韩综合精品二区| 欧美日韩亚洲一区二区三区在线观看 | 涩爱av在线播放一区二区| 一区二区三区四区在线播放 | 成年人午夜免费视频| 亚洲视频国产精品| 欧美大片免费看| www.天堂在线| 一区二区国产视频| 稀缺呦国内精品呦| 亚洲性感美女99在线| 国产精品久久精品国产| 后进极品白嫩翘臀在线播放| 精品国产一区二区三区四区四| 精品99在线观看| 懂色av一区二区三区免费看| 国产乱人伦精品一区二区三区| 涩爱av色老久久精品偷偷鲁| 欧美老少配视频| 黄色av免费观看| 黄网动漫久久久| 丰满少妇高潮一区二区| 久久在线精品| 亚洲精品视频一二三| 91麻豆精品一二三区在线| 久久亚洲综合国产精品99麻豆精品福利| 亚洲天堂网在线观看视频| 中文字幕中文字幕在线一区| 色黄视频免费看| 在线不卡欧美| 欧洲精品亚洲精品| 亚洲一区导航| 欧美精品第一页在线播放| 日韩有码第一页| 色久优优欧美色久优优| 青青青视频在线播放| 国产激情一区二区三区桃花岛亚洲| 毛片在线视频观看| 羞羞色国产精品网站| 国产精品久久久999| 国产区在线观看| 日韩成人在线免费观看| 中文字幕在线日亚洲9| 亚洲精品欧美综合四区| 成年人的黄色片| 免费人成精品欧美精品| 91成人综合网| 国产在线观看91一区二区三区| 成人字幕网zmw| 白浆在线视频| 色综合影院在线| 全国男人的天堂网| 欧美日韩免费视频| 国产亚洲精久久久久久无码77777| 91蝌蚪porny九色| 久久6免费视频| 久久激情久久| 亚洲一区 在线播放| 精品一区毛片| 俄罗斯精品一区二区三区| 国产经典一区| 亚州欧美日韩中文视频| 香港伦理在线| 亚洲精品小视频| 性猛交富婆╳xxx乱大交天津| 色综合咪咪久久| 久久午夜无码鲁丝片| 欧美国产日韩一二三区| 91精品又粗又猛又爽| 美女免费视频一区二区| 人妻精品无码一区二区三区| 综合av在线| 天天好比中文综合网| 欧美一区自拍| 91在线免费看片| 日本一区二区三区中文字幕| 欧美在线亚洲一区| 91九色在线看| 欧美xxxx18性欧美| 91啦中文在线| 亚洲天堂成人在线视频| 三级在线观看网站| 欧美刺激脚交jootjob| 一级黄色大片免费观看| 日本电影亚洲天堂一区| 国产午夜在线播放| 亚洲国产一区二区三区青草影视| 国产老头老太做爰视频| 国产精品人妖ts系列视频 | 亚洲视频在线一区| 一区二区伦理片| 久久久国产一区二区三区四区小说| 精品一区二区三区四区五区六区| 国产精品白丝jk白祙喷水网站 | 草莓视频18免费观看| 欧美日韩国产精品一区二区三区四区 | 一区二区三区伦理片| 97久久精品人人爽人人爽蜜臀| gogo亚洲国模私拍人体| 国产乱人伦偷精品视频免下载| 8x8x成人免费视频| 精品一区二区三区香蕉蜜桃| 国产喷水theporn| 日本欧美在线观看| 精品999在线| 久久精品国产99久久6| www.日本xxxx| 美女一区二区三区| 自拍偷拍一区二区三区四区| 美女免费视频一区二区| 日韩av.com| 国产精品综合视频| 曰本三级日本三级日本三级| 国产成人精品亚洲日本在线桃色| 女教师高潮黄又色视频| 顶级嫩模精品视频在线看| 亚洲调教欧美在线| 久久亚洲捆绑美女| 老司机精品免费视频| 亚洲视频图片小说| 国产在线观看免费av| 五月激情综合婷婷| 青青草视频在线观看免费| 欧美午夜精品一区二区蜜桃| 一级黄色片免费| 日韩视频免费直播| 亚洲AV成人无码一二三区在线| 精品丝袜一区二区三区| 99re热久久这里只有精品34| 超碰97人人做人人爱少妇| 18aaaa精品欧美大片h| 欧美最近摘花xxxx摘花| 国产三级一区| 成人综合电影| 精品在线99| 中文字幕在线亚洲三区| 国模 一区 二区 三区| 亚洲人成色77777| 久久电影网站中文字幕| 白嫩情侣偷拍呻吟刺激 | 热舞福利精品大尺度视频| 四虎成人av| 国产精品12345| 免费看欧美美女黄的网站| 波多野吉衣在线视频| 久久亚区不卡日本| 国产传媒免费在线观看| 精品国产1区2区| 亚洲最大成人在线视频| 欧美r级在线观看| 国产尤物视频在线| 欧美俄罗斯性视频| 巨胸喷奶水www久久久| 91国产丝袜在线放| 国产中文精品久高清在线不| 亚洲色图都市激情| 日韩精品亚洲专区| www.四虎精品| 国产精品女主播av| 色网站在线播放| 欧美一三区三区四区免费在线看| 外国精品视频在线观看 | 欧美黑人xxxxx| 中文字幕一区二区三区在线视频| 91黄色小网站| 国产suv一区二区三区88区| 丁香花五月婷婷| 香蕉久久一区二区不卡无毒影院| 在线观看毛片av| 亚洲裸体xxxx| www.超碰在线| 99久久自偷自偷国产精品不卡| 国产亚洲电影| 乱人伦xxxx国语对白| 国产精品99久久久久久久女警| 欧美偷拍一区二区三区| 午夜激情综合网| 亚洲精品国产精品乱码不卡| 中文字幕亚洲一区在线观看| 中文字幕乱码中文乱码51精品| 成人三级在线| 欧美一区二区三区另类| 波多野结衣天堂| 久久精品亚洲乱码伦伦中文| 黄色一级片免费看| 欧美精品一区二区在线播放| 成人在线视频亚洲| 国产美女直播视频一区| 精品一区二区三| 国产精品333| 9i在线看片成人免费| 精品深夜av无码一区二区老年| 欧美一区二区三区播放老司机| 调教视频免费在线观看| 国产精品久久久久久久av电影| 妖精一区二区三区精品视频| 97国产精东麻豆人妻电影| 成人激情小说乱人伦| 久久久久久久久久久久久久久久久| 51午夜精品国产| 激情影院在线观看| 成人疯狂猛交xxx| 亚洲91精品| 午夜激情影院在线观看| 亚洲色大成网站www久久九九| 91精品国产乱码久久久| 日韩天堂在线视频| 电影中文字幕一区二区| 可以在线看黄的网站| 国产黄色成人av| 国产一卡二卡在线| 日韩精品在线播放| 欧美第一视频| 日韩欧美精品久久| 蜜臀va亚洲va欧美va天堂| 国产大屁股喷水视频在线观看| 欧美日韩aaaaaa| 黄色动漫在线观看| 99久久精品免费看国产一区二区三区 | av在线一区二区| 午夜婷婷在线观看| 中文字幕精品www乱入免费视频| 欧美aaa级| 超碰10000| 99精品在线免费| 中文字幕在线日本| 色婷婷综合成人| 538任你躁精品视频网免费| 欧美 丝袜 自拍 制服 另类| 国产视频一区二区在线观看| 中文字幕欧美在线观看| 久久国产精品久久国产精品| 国产欧美自拍一区| 99久久国产宗和精品1上映| 国产精品国产精品国产专区不片| 99热这里只有精| 88xx成人精品| 97精品视频| 国产69视频在线观看| 色综合天天综合网国产成人综合天| av在线收看| 岛国视频一区免费观看| 丝袜美腿一区二区三区| www.av免费| 国产视频欧美视频| 亚洲欧洲一二区| 日韩少妇内射免费播放| 中文字幕一区二区视频| 黄片毛片在线看| 国产精品一二三视频| 一区二区视频欧美| 超薄肉色丝袜一二三| 亚洲精品一区二区在线观看| 美女网站视频一区| 久久久天堂国产精品| 国产欧美一区二区精品性色超碰| 精品人妻aV中文字幕乱码色欲 | 一级特黄免费视频| 欧美高清视频在线观看| 成人毛片在线| 国产一级二级在线观看|