多域部署時的sequence方案

爲何要多域部署?mysql

從穩定性上:當業務不斷髮展後,會面臨系統穩定性、容災、業務隔離等多種問題sql

從業務需求上:國際化應用每每須要全球化部署數據庫

 

數據庫的面臨的問題緩存

多域部署時,每每會伴隨着數據的遷移、雙寫等問題spa

數據如何同步?分庫分表場景下如何生成全局惟一id?中間件

 

咱們的場景是什麼?blog

咱們目前在單元A(中心節點)部署了本身的系統,如今但願將系統部署到單元B,而數據庫(mysql)是分庫分表的,咱們須要在單元B也部署一套一樣數據庫,單元A讀寫單元A數據庫,單元B讀寫單元B數據庫,這樣只要不會出現雙寫,就不會有一致性風險。單元A存儲全量數據,單元B存儲單元數據,一部分業務遷移到單元B中內存

 

分庫分表如何保證id全局惟一開發

咱們的分庫分表中間件使用的是tddl,核心是一張sequence表(這張sequence表也是分庫的),記錄id的範圍,tddl會將id的步長範圍內的id區間段讀取到應用的內存中,每次獲取id的時候會讀取內存中的值部署

例若有一個業務表叫xxx_test,分4個庫,每一個庫單表,那麼四個庫的表分別是xxx_test_0一、xxx_test_0二、xxx_test_0三、xxx_test_04,若是步長是1000,那外步長就是1000*4 = 4000,那麼這4個庫的sequence表分別存儲的起始值是0、1000、2000、3000,應用會隨機從一個數據庫中取一個id,使用內步長以內的id段,例如取了xxx_test_02,那麼取到的就是1001~2000這個id段緩存在應用內存中自增使用,取完以後1000會依照外步長更新成5000,此時4個sequence表的數據分別是0、5000、2000、3000,對於每一張sequence表永遠按照外步長更新,所以永遠不會衝突

 

分庫分表+多域部署如何保證id全局惟一

方案一:基於初始id的範圍

直接訂正sequence裏各數據表的初始值便可,僅初始化的時候作好這項工做就行,基本無需開發工做

 

方案二:多數據源的sequence的佔位錯開

由於tddl能夠根據dbGroupKeys的佔位符來實現錯位取值,所以能夠利用dbGroupKeys的佔位符來實現隔離,可是若是兩個單元是不一樣的分庫結構,這個方案是有問題的,仍然須要使用其餘手段實現隔離

 

方案三:增長區域id的後綴

sequence表新增字段區域ID來標記各個單元,區域ID是在[1,99]區間內的一個整數值,而後使用以下公式來計算新的sequence值

regionSequence = sequence *100 + 區域ID

方案三也分爲多種實現方法,可是隻要在能獲取到該區域的id便可,這個數據不論從數據庫或者diamond獲取都可以

 

 

 以上只是分庫分表場景下多域部署全局惟一id的方案比較,供參考,即便是不一樣的分庫分表中間件原理其實都是相似的,你們能夠根據實際狀況來選擇方案和現實方式

相關文章
相關標籤/搜索