为何要多域部署?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的方案比较,供参考,即便是不一样的分库分表中间件原理其实都是相似的,你们能够根据实际状况来选择方案和现实方式