三地五中心(ldc(逻辑数据中心)单元化)和容灾

什么是LDC

LDC 的全称为: Logic Data Center, 逻辑数据中心,之所以叫LDC,是跟传统的IDC( Internet Data Center )相比而提出来的概念。

IDC 相信大家都很清楚,就是物理的数据中心,说白了就是能够建站的物理机房。

LDC(逻辑数据中心),核心架构思想就是不管你物理机房部署是怎样的,比如你可能有三个IDC,分别在二个不同城市(常说的两地三中心),在逻辑上是统一的,我逻辑上看成一个整体,统一协调调配。

三地五中心,每个中心都是单元化架构,独立的,没有灾备(灾备的话再下面三地五中心的灾备里面会讲)的概念了,每时每刻生产流量运行的

其实每个中心都是另一个中心备份,但时都是生产数据中心,每时每刻对外提供服务

数据中心双向数据同步,这样不会出问题

对比:

两地三中心 主中心出故障的话,但是切换不是立马能切换的,因为要各种检查网关路由之类的

三地五中心就是搞单元化架构了 

ldc 单元化的负载策略和 两地三中心不一样 ,按照用户去id去路由到指定的中心去,而双活按照流量随机路由

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第1张图片

 

单元化架构最小组成就是 zone ,一个独立的逻辑单元

每个单元的服务和数据完全隔离 不受别的单元影响,每个单元都是独立的

rzone 指的就是三个单元

每个rzone里面的比如 zk之类的注册中心也是完全隔离的

每个应用也是完全对等 比如第一个单元四个节点,那么第二个应用也是四个节点,即资源对等

三地两中心和三地五中心最大差别 尤其是是数据层面的,因为双活同步数据(数据库)是双向同步的,存在数据冲突问题,三地五中心不存在这个问题,每个中心数据独立的,跟其他机房同步数据不会出现冲突,灾备的话会有fo解决,下面会说。

还有个不同 就是上面讲的双活流量负载均衡,单元化是 用户id之类路由的

所以这样看三地五中心高可用能力更强

rzone 如果是跨机房访问的话,那么可能性能比较差,所以这里出来个gzone

gzone维护全量的数据,所以全量读的话都在gzone里面

否则如果有的数据需要三个机房数据查出来汇总聚合,那么这样的话效率差,稳定性不好。

rzone是按照用户纬度拆分,比如交易可以按照用户id负载均衡做rzone

但是有的不好这么拆分,比如全局性的规则配置,值对象数据等,强行分开的话维护和效率比较差,那么这种就使用gzone去维护,下面举个例子来说明

比如合同,早期有一个模板,模板是全局性的数据,

rzone里面的用户需要的合同模板的话就去gzone获取合同,然后再rzone生成这个用户的合同数据

gzone是独立的,只能存在一个地方,不能存两三个地方

gzone是解决全局性数据查询复杂度的问题(全局性数据访问都在这边)

所以rzone一般来说是局部读写,不能跨机房访问其他zone,除非做容灾能力才会切换访问 

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第2张图片

总结如下:

数据不利于查询: Gzone 来存储需要提供外部使用的公共数据,此时 Gzone 只处理读请求

1、对于符合Rzone拆分的业务,只从Rzone中读写数据,所有读写请求通过路由层进行分发。 2、对于不能拆分的业务,抽离出来后单独部署于 Gzone 中 

但是这样的话gzone会有性能问题因为只放在一个机房,其他机房都来访问

所以使用czone解决,下面我们来说czone

czone 解决跨城市问题: 

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第3张图片

 

每一个城市的每一个机房加一个czone 

gzone数据存储同步到czone,这样rzone访问本机房的czone

一般来说,全局性数据的写频率比较低,读的频率比较高, 对延迟有容忍度的,不需要太高,所以可以这样从gzone同步到czone里面

双十一 也是这个架构,因为性能没法提升那就只能用架构提升 

因为应用性能优化到这个地步已经不会有太大空间了

总结下:

跨机房城市延迟: 其一:

服务间调用优先 zone 内调用,减少跨zone的请求;

其二 :跨 zone 调用优先请求同一物理机房;

其三:Rzone 调用 Gzone 情况下,无法避免跨机房访问,则在每个物理机房添加一个 Czone 用来同步 Gzone的数据,提供给同一机房内其他 zone 调用 (这样整个请求都在逻辑单元如rzone里面闭环,跨zone调用优先还是在本机房里跨zone调用,这样请求耗时不会有太大问题。)

这样的话就有一个调用的优先级:

ZONE访问顺序: R>C R>G C>G G>R

解释如下:

gzone(架构层面的设计,解决全局数据问题)可以调用rzone数据,因为全局数据可能需要rzone数据来聚合,比如客服需要用户数据来查询rzone里面的数据 ,不同用户在不同rzone里面,那么这时候就需要调用不同的rzone然后聚合

gzone调用czone坚决杜绝,因为czone从gzeon同步数据的

每个服务都有标签,这样gzone发现访问的是czone就不会去访问

LDC-架构约束

LDC约束:

1、每个rzone不能连接gzone的db和其它存储

2、czone不能连rzone的db和其它存储

3、rzone gzone可以连czone的db和其它存储

4、rzone中的db rpc msg都要实现uid sharding

5、rzone只能连本zone的 uid相应的存储

6、RPC调用顺序:R->C R->G G->R G->C不允许C->G C->R

我们先来回顾下双活的数据同步方式: 

uid 0和uid1的用户:

都是随机访问的,所以两个机房都可能访问到

数据库是双主模式

uid1的用户在左边库产生数据 会异步同步到右边库,反过来右边库的数据也会异步同步到左边库

这种适合日志这种容许丢失的数据

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第4张图片

不容许数据丢失的话那就使用一主一备,只不过这样的话数据时效性就有慢了

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第5张图片

 

主和从节点,   主节点产生数据同步到主节点的库是没问题的 ,如果访问到从节点即第二个机房怎么办呢

从节点即机房2会把数据达到主节点即第一机房然后再同步过来到第二个机房来,也就是说不管怎么样 uid1的用户数据都会来到机房1的主数据库 

三地五中心数据同步方式

uid1会直接打到第一个zone,uid2打到第二个zone,uid3打到第三个zone,这三个db是完全独立的,每个zone都是隔离的不会去相互访问,不同的zone不会做数据同步(数据同步会做容灾fo这样的,下面会说)

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第6张图片

三个zone的数据都会回流到gzone里面那么就可以全局读了 

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第7张图片

LDC-如何解决异地调用问题?

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第8张图片

 这里硬负载指硬件负载,vip就是虚拟ip

服务级容灾:也就是本机房找不到服务那么就跨机房调用

其中

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第9张图片

 跨机房调用的代理,因为每个机房里面zk都是独立的别的机房不知道的,所以通过这玩意找到别的机房的指定服务

接下来说容灾,先再来看一张三地五中心的架构图

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第10张图片

 db和应用的数字可以理解为分片00-19id的用户路由到第一个机房处理这样。

机房1 故障怎么容灾:三地五中心的容灾架构

应用级层面:只要应用无状态切到机房2里面的应用。

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第11张图片

 数据库里面有fo

也就是说其他机房的库在机房里面都有

这样支持同城级容灾,也支持跨城级容灾从可用性来考虑了,这样才能说达到4个九的目标的

容灾场景:1 2 和3三个用户

uid为1 的 机房1不可用了,会去机房2访问,跨zone访问  

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第12张图片

 这里特别提一句,机房内的高可用上主库不能用那么就访问备库,这是应用层面的高可用

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第13张图片

机房级高可用 :请求打到机房2的 fo里面的00的库 

三地五中心(ldc(逻辑数据中心)单元化)和容灾_第14张图片

同理 ,上面是同城容灾,要是同城都挂了直接打到异地机房三的of库的 00-19里面

最后灾备期间的fo数据(例如上面本应该在机房1结果打到机房2的数据库的流量)都要回写到主库(就是数据回迁了,因为00-19的主库机房1恢复了)

,然后主库需要回写到别的fo库,容灾过程的话需要应用去做 业务层,因为 mysql 和oracle 很难做到强一致 

这里有三个状态:

不可用就是fo状态,数据要写入fo库

fb状态 fallback回迁状态,回迁到主库就变成normal状态,这样流量就可以迁移回来了

机房级切换:应用无状态,业务层做容灾逻辑,因为数据库侧无法保证

就算oceanbase开启强一致,对性能损耗就大,因为至少大于二分之一的节点写入

所以可靠性和性能是冲突的

你可能感兴趣的:(大数据,运维)