精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

国产伦精品一区| zzjj国产精品一区二区| 国产免费一区二区三区视频| 青青草免费在线| 久久国产精品第一页| 色中色综合影院手机版在线观看| 性色av蜜臀av色欲av| 日本韩国欧美| 一区二区三区视频在线观看| 免费电影一区| 国产丰满美女做爰| 久久久亚洲人| 欧美激情欧美激情在线五月| 国产精品理论在线| 久久久久97| 欧美精三区欧美精三区| 一女被多男玩喷潮视频| 免费黄网站在线| 91丨九色丨尤物| 成人性教育视频在线观看| 亚洲成人第一网站| 国内精品美女在线观看| 中文字幕亚洲欧美| 蜜桃av免费看| 欧美绝顶高潮抽搐喷水合集| 懂色av噜噜一区二区三区av| 午夜精品一区二区三区在线视 | 你懂的国产视频| 国产精品福利在线观看播放| 亚洲美女性视频| 一区二区在线免费观看视频| 国产精品66| 欧美午夜女人视频在线| 人妻少妇精品久久| 在线播放免费av| 一色屋精品亚洲香蕉网站| 日本10禁啪啪无遮挡免费一区二区| 亚洲国产精品国自产拍久久| 国产自产高清不卡| 国产精品视频区1| 日本三级一区二区三区| 免费日韩视频| 日本精品免费一区二区三区| 色婷婷av国产精品| 亚洲激情社区| 97国产在线观看| 久久精品国产亚洲AV无码男同| 一精品久久久| 久青草国产97香蕉在线视频| 日本裸体美女视频| 国产精品国产三级国产在线观看 | 宅男在线观看免费高清网站| 中文字幕在线不卡一区| 在线一区高清| www红色一片_亚洲成a人片在线观看_| 中文字幕在线不卡| 日本丰满大乳奶| 在线看福利影| 亚洲综合一二区| 久久久久久人妻一区二区三区| 久久香蕉一区| 午夜精品久久久久久久99水蜜桃| 九一国产精品视频| 亚洲精品mv| 91国偷自产一区二区开放时间| 欧美国产日韩在线播放| 国产精品伊人| 日韩一区二区精品在线观看| 丰满少妇xbxb毛片日本| 猛男gaygay欧美视频| 亚洲性夜色噜噜噜7777| 91导航在线观看| 888久久久| 久久久久久久久综合| 国产精品久久久久久久妇| 欧美一级网站| 成人激情视频在线| 女人18毛片一区二区三区| 91视频精品在这里| 亚洲激情一区二区| 影音先锋在线播放| 黄色成人av在线| 国产一线二线三线在线观看| 国产精品**亚洲精品| 亚洲第一av在线| 亚洲综合色一区| 亚洲天堂免费| 2019中文字幕在线观看| 中文字幕在线观看1| 国产成人av资源| 欧美亚洲一级二级| 91精选在线| 色又黄又爽网站www久久| 亚洲无在线观看| 啪啪国产精品| 久久亚洲电影天堂| 日韩美女黄色片| 蜜臀av一级做a爰片久久| 国产精品乱码| 色大18成网站www在线观看| 亚洲国产精品尤物yw在线观看| 欧美激情国产精品日韩| 高清久久一区| 亚洲性无码av在线| 91精品国产乱码在线观看| 精品一区二区在线播放| 美日韩精品免费| 在线电影福利片| 欧美午夜电影网| 国产精品福利导航| 中文字幕一区二区精品区| 国产精品pans私拍| 欧美一区二区黄片| 亚洲欧美日韩在线| 性欧美videossex精品| 欧美黑人巨大videos精品| 久久精品视频一| 免费无码国产精品| 99国产精品久久久久久久久久久| 潘金莲一级淫片aaaaaa播放1| 另类专区亚洲| 亚洲精品videossex少妇| 国产高清在线免费观看| 免费观看日韩av| 欧美一二三四五区| 在线免费av资源| 亚洲国产精彩中文乱码av在线播放| av激情在线观看| 久久精品二区亚洲w码| 欧美一区二区高清在线观看| 日本а中文在线天堂| 欧美大片国产精品| 免费中文字幕在线| 国产在线看一区| 一区在线电影| 中文成人在线| 日韩在线观看免费全| 中文在线字幕av| 欧美—级在线免费片| 日本999视频| 凹凸成人精品亚洲精品密奴| 国产91九色视频| 国产在线网站| 欧美色大人视频| 亚洲色图 激情小说| 日本美女一区二区| 亚洲精美视频| 精品伊人久久| 欧美国产日韩中文字幕在线| xxxwww在线观看| 亚洲午夜三级在线| 99re这里只有| 亚洲在线黄色| 亚洲国产日韩欧美| 巨大黑人极品videos精品| 色播久久人人爽人人爽人人片视av| 欧美在线视频精品| 国产精品久久久久婷婷| 亚洲自拍第三页| 黑丝一区二区| 久久久久久久久一区| 大胆人体一区二区| 国产亚洲日本欧美韩国| 国产又黄又粗又猛又爽| 亚洲精品久久久蜜桃| 精品无码av一区二区三区不卡| 欧美色一级片| 精品日韩电影| a屁视频一区二区三区四区| 色哟哟网站入口亚洲精品| 99久久久国产精品无码网爆| 亚洲一二三四区| 中文字字幕码一二三区| 麻豆视频观看网址久久| 91社在线播放| 露出调教综合另类| 国产精品igao视频| 在线免费av导航| 亚洲欧美www| 国产熟女一区二区三区五月婷 | 日韩欧美亚洲视频| 久久免费美女视频| 亚洲第一区第二区第三区| 亚洲经典自拍| 日韩欧美在线观看强乱免费| 久久久久久久久久久久电影| 97在线看免费观看视频在线观看| 韩国精品视频| 精品成人在线观看| 国产精品51麻豆cm传媒 | 亚洲日日夜夜| 91极品视频在线| 日韩av中文| 日韩电影大全免费观看2023年上 | 精品少妇一区二区三区在线视频| 国产精品100| 伊人一区二区三区| 国产三级av在线播放| 国产.欧美.日韩| 91制片厂毛片| 精品动漫3d一区二区三区免费| 日韩理论片在线观看| 成人av影音| 国产在线一区二区三区| 樱花草涩涩www在线播放| 久热国产精品视频| 国产三级视频在线播放线观看| 精品国产第一区二区三区观看体验| 波多野结衣一本一道| 亚洲成a人片在线不卡一二三区| 人妻熟人中文字幕一区二区| 26uuu久久综合| 人妻换人妻a片爽麻豆| 久久国产精品区| caopor在线视频| 亚洲一区久久| 国产老熟妇精品观看| 欧美在线视屏| 宅男av一区二区三区| 国产成人1区| 久久综合久久久| 国产精品乱战久久久| 亚洲一区二区三区sesese| 成人国产网站| 国产精品福利在线观看| 亚洲欧美韩国| 2018中文字幕一区二区三区| 国产啊啊啊视频在线观看| 久久综合久久八八| 免费网站免费进入在线| 日韩中文有码在线视频| 福利在线播放| 亚洲图片欧洲图片av| 国产高清一区在线观看| 国产视频久久久久久久| 色播色播色播色播色播在线 | 亚洲国产片色| 全黄性性激高免费视频| 国模 一区 二区 三区| 久久这里只有精品8| 欧美体内she精视频在线观看| 老司机av福利| 综合色一区二区| 亚洲黄色网址在线观看| 亚洲经典一区| www.一区二区.com| 激情另类综合| 日本网站免费在线观看| 亚洲一区观看| 日韩中文字幕免费在线| 青娱乐精品视频在线| 日本人视频jizz页码69| 国内欧美视频一区二区| 国产精品久久久久久9999| 国产成人av一区| 欧类av怡春院| 国产亚洲一区字幕| 国产视频123区| 亚洲久本草在线中文字幕| 欧美交换国产一区内射| 红桃av永久久久| 超碰在线免费97| 日韩一区二区三区免费看 | 在线观看精品国产视频| 欧美成年黄网站色视频| 欧美激情2020午夜免费观看| 麻豆mv在线观看| 国产成人精品av在线| 国产精品久久乐| 99免费在线观看视频| 色狠狠久久av综合| 亚洲看片网站| 在线播放精品| 男女啪啪网站视频| 国产精品资源网站| 成人手机在线免费视频| 国产清纯在线一区二区www| 成人自拍小视频| 精品久久中文字幕| 中文字幕乱码人妻二区三区| 日韩一区二区精品葵司在线 | 久久久久久一级片| 国产三级精品三级观看| 亚洲国产精品久久久久婷婷884 | 婷婷久久五月天| 亚洲一级毛片| 成人黄色片视频| 国产精品白丝av| 国产美女免费网站| 亚洲黄色录像片| 中文字幕天堂在线| 精品久久一二三区| 免费人成在线观看播放视频| 91av在线国产| 欧州一区二区三区| 日韩欧美手机在线| 亚洲国产清纯| www.桃色.com| 久久久高清一区二区三区| 久久国产免费观看| 欧美丰满美乳xxx高潮www| 日韩欧美亚洲系列| 欧美日本啪啪无遮挡网站| 国产日韩电影| 国产精品国模大尺度私拍| 凹凸成人精品亚洲精品密奴| 国产 福利 在线| 国产丶欧美丶日本不卡视频| 老司机福利在线观看| 亚洲v精品v日韩v欧美v专区| 国产精品一区二区黑人巨大| 亚洲精品午夜精品| 182在线播放| 亚洲xxxx视频| 久久婷婷蜜乳一本欲蜜臀| 欧美v在线观看| 成人网男人的天堂| 青青草国产在线观看| 欧美视频一区二| 日韩二区三区| 91精品国产免费久久久久久| 国产成人免费视频网站视频社区| 亚洲 日韩 国产第一区| 亚洲综合日本| 亚洲一区二区乱码| 亚洲国产三级在线| 亚洲第一色视频| 久久99久久久久久久噜噜| 91精品国产一区二区在线观看 | 番号集在线观看| 欧美有码在线视频| 卡通动漫国产精品| 成人免费网站入口| 高清免费成人av| 九九热精彩视频| 日韩欧美综合一区| 日本在线免费中文字幕| 国产在线久久久| 91精品国产福利在线观看麻豆| 亚洲精品自拍网| 欧美国产视频在线| 中文在线观看免费高清| 色妞一区二区三区| 日韩大陆av| 久久久成人精品一区二区三区 | 色伊人久久综合中文字幕| 色视频精品视频在线观看| 日韩免费观看高清| 国产在视频线精品视频www666| 免费看a级黄色片| 欧美国产精品一区二区| 中文字幕av在线免费观看| 伊人亚洲福利一区二区三区| 国精品产品一区| 国产精品jizz在线观看老狼| 国产精品一区二区黑丝| 国产一级片视频| 日韩精品在线第一页| 欧美电影网站| 伊人久久大香线蕉成人综合网| 极品美女销魂一区二区三区免费| 亚洲一级生活片| 欧美精品一区二区三区久久久| 国产理论在线| 久久精品国产精品国产精品污| 日韩精品91亚洲二区在线观看| 婷婷国产成人精品视频| 日韩三级免费观看| 午夜不卡影院| 一区二区三区四区国产| 国产激情偷乱视频一区二区三区| 黄色小说在线观看视频| 亚洲毛茸茸少妇高潮呻吟| 国产a亚洲精品| a天堂资源在线观看| 久久久精品综合| 国产精品国产精品国产专区| 久久久久久亚洲| 欧美综合在线视频观看| 久久久精品视频国产| 欧美日韩激情视频8区| 9色在线观看| 国产一区福利视频| 青青国产91久久久久久| 久久久久久久极品内射| 亚洲图中文字幕| av成人男女| 91女神在线观看| 舔着乳尖日韩一区| 免费在线观看黄色网| 久久久久久久久四区三区| 精品一区在线看| 三级网站在线播放| 久久99亚洲热视| av资源久久| 中国特级黄色大片| 555www色欧美视频| 一区一区三区| 欧洲精品在线播放| 中文字幕在线不卡一区|