多域部署时的sequence方案

为什么要多域部署?

从稳定性上:当业务不断发展后,会面临系统稳定性、容灾、业务隔离等多种问题

从业务需求上:国际化应用往往需要全球化部署

数据库的面临的问题

多域部署时,往往会伴随着数据的迁移、双写等问题

数据如何同步?分库分表场景下如何生成全局唯一id?

我们的场景是什么?

我们目前在单元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_01、xxx_test_02、xxx_test_03、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的方案比较,供参考,即使是不同的分库分表中间件原理其实都是类似的,大家可以根据实际情况来选择方案和现实方式

原文地址:https://www.cnblogs.com/cishengchongyan/p/10268862.html

时间: 2024-10-18 04:59:36

多域部署时的sequence方案的相关文章

SCCM2012 R2系统部署时,客户端报0x80004005错误(2)

错误现象: 裸机部署过程中,报"Task Sequence:任务序列名 has failed with the error code(0x80004005)"错误,并生动重启计算机. 分析过程: 通过SCCM的"部署状态"查看此任务序列的部署过程: 解决方案: 通过查看任务序列的"部署状态"确定是任务序列配置的问题,接下来我们打开此任务序列.发现此任务序列的"应用操作系统"和"应用数据映像1"执行的操作都是

域部署下的脚本应用实践。

公司上个月需要部署 360企业版,替换原有的杀毒软件. 360官方随提供了域部署工具.该脚本控制器需要在域服务器一直开启.在两个部门测试的过程中发现,偶尔有一些电脑域登录后未能自动安装企业版.并且能安装企业版的电脑,也需要经过下载.验证.安装客户端,三个流程,过程有将近10分钟. 最后选择自己尝试编写域部署脚本. 备注:所谓域部署,可执行文件(本文使用.bat 批处理文件)置于域服务器的netlogon文件夹中,再在每个用户在域服务器上的"环境文件"栏目写上脚本名称,这样域用户每次域登

React Native for Android 热部署图片自己定义方案

情景 热部署时,我们期望升级包中包括js代码与图片资源. bundle的热部署网上已经有两种方案了,一种是用反射,一种是利用RN自带函数.将bundle初始化时直接放到指定文件夹下,之后通过替换bundle文件实现代码热部署. 我们希望图片也能够实现热部署,以下是一个比較简单的解决方式. 详细需求:client解析从server下发的压缩包(zip),当中含js源文件index.android.bundle 和 图片包,解压后ReactNative指向 解压后index.android.bund

Openfire 集群部署和负载均衡方案

一.   概述 Openfire是在即时通讯中广泛使用的XMPP协议通讯服务器,本方案采用Openfire的Hazelcast插件进行集群部署,采用Haproxy进行负载均衡,在示例环境中测试通过. 二.   示例环境 服务器配置如下: 服务器名 用途 操作系统 IP PC647 Openfire节点1 Windows7 10.200.10.11 seasky Openfire节点2 Windows xp 10.200.10.18 Lub1 Mysql数据库 LUbuntu 12 10.200.

前端解决跨域问题的8种方案(转)

前端解决跨域问题的8种方案(最新最全) 原文:http://www.cnblogs.com/JChen666/p/3399951.html 1.同源策略如下: URL 说明 是否允许通信 http://www.a.com/a.jshttp://www.a.com/b.js 同一域名下 允许 http://www.a.com/lab/a.jshttp://www.a.com/script/b.js 同一域名下不同文件夹 允许 http://www.a.com:8000/a.jshttp://www

创建BDC域控制器时,提示“出站复制验证失败。在复制源域控制器上未启用出站复制”的解决办法

创建BDC域控制器时,在完成角色添加后的部署界面,进行配置后的先决条件检查,提示失败如下: 后在现有DC上通过windows powershell(CMD管理员模式)运行repadmin /showrepl,得到 运行repadmin /options [YourServerName] -disable_inbound_replrepadmin /options [YourServerName] -disable_outbound_repl 两个命令,去除disable repl选项后,即可开启

WAVSEP在Linux系统中部署时常见错误

使用Tomcat部署时常见错误 环境:Debian7 , tomcat7, WAVSEP v1.5 安装时提示: javax.servlet.ServletException: java.sql.SQLException: Database 'db/WavsepConfigDB'  not found 原因: tomat用户没有写入根目录的权限. 解决办法: 以root身份运行,在根目录建立db目录并将所有权授予tomcat用户. #mkdir /db #chown -R tomcat:tomc

Windows Server 2012 AD 站点和域部署系列(一)部署准备工作

本系列开始将模拟搭建一套(单林.多站点.多域树.多辅域.多子域)拓扑实验环境,希望通过此系列的实验,可以让你对域和站点有进一步的了解和认知. 首先进入Windows Server 2012 AD 站点和域部署系列(一)部署前的准备工作: 物理结构: 本实验模拟三个物理点:北京.广州.上海,根据物理点位置关系创建三个站点:BJ.GZ.SH. BJ站点子网:  172.16.10.0/24, GZ站点子网:  172.16.29.0/24, SH站点子网:  172.16.28.0/24. 下图为物

javascript fetch 跨域请求时 session失效问题

javascript 使用fetch进行跨域请求时默认是不带cookie的,所以会造成 session失效. fetch(url, { method: 'POST', credentials: 'include', headers: { 'Content-Type': 'application/x-www-form-urlencoded', }, body: JSON.stringify({ data: options.data }) }) credentials: 'include' 可以是f