随着每个公司国际业务的发展,为了数据符合各国家安全要求和提高用户体验,上云志在必得。而海外公有云环境与国内私有云环境有一定差异。所以主要内容包括公有云与私有云的差距、双边数据互通、网关、内网错综复杂的微服务和各种持久化存储等。
# 一、主要差异
【1】网络延迟: 海外AWS
与国内私有云之间有明显的网络延迟,根据不同区域延迟不同,比如新加坡到上海的延迟基本为80ms
左右。
【2】框架组件支持: 海外AWS
上部署和使用框架与国内私有云有一些差异,主要包含:Redis/QMQ/MySQL/SOA
等。
【3】网络流量: 海外AWS
与国内私有云之间的宽带有限,尽量减少/减小两者之间传输的数据。
【4】成本费用: 海外AWS
的费用大概是国内的10倍左右,根据不同的框架这个差距不同,开发人员需要进行代码重构,减少资源的使用。
# 二、上云的挑战
通常一个大型项目会依赖/牵扯到成百上千个应用。如果将所有的应用都迁移到云上,从开发成本和硬件成本考量都不太合理。所以需要先部署依赖就少的服务,比如某个活动服务【只包含一个API
】等。
# 三、GateWay 的挑战
目前GateWay
只能按照服务的维度转发流量,而无法基于API
转发。当流量从AWS
的IDC A
进入GateWay
时,无法支持只转发API
到IDC A
,其余API
转发到IDC B
。
应用发布时会依赖多个Redis
、MySQL
等服务,但是AWS IDC
之间的存储由于安全问题,是无法直接相互访问的,最终导致应用启动失败。当然我们也可以请各个框架组件排期支持点火动态配置,根据当前IDC
的配置,判断哪些组件需要点火。但是这无疑会让框架和应用本身都变得很笨重,合理性值得探讨。反之如果把这些存储依赖在每个IDC
都重复部署一次,势必会导致硬件和开发成本的浪费。
# 四、云上数据的持久化【Redis/MySQL】
Redis
在AWS
上的使用,采用框架CRedis
客户端接入,代码API
方法使用上与在携程私有云上无差别。在AWS
和私有云的主要差异是环境部署和数据同步: 云上服务依赖的Redis
根据业务情况可以有以下解决方案:
# 方案一:访问国内Redis服务
直接通过在IDC
之间架设专线,通常Redis
响应都是几毫秒,而网络延迟都具有不稳定的特点,极端可能要几百毫秒,所以专线的网络延迟对实时业务来说是不可接受的。退一步,即使部分业务能够接受网络延迟,整个公司业务都以这种方法进行数据访问,这条专线未来会变成一个瓶颈。
# 方案二:海外部署Redis集群
将依赖的Redis
部署到多个AWS IDC
。很多公司都有自研的持久化KV
存储来代替Redis
达到降低硬件成本的目的。接下来就是数据同步的问题:根据业务决定是否需要同步,是进行单向同步还是双向同步
# 不需要同步
例如Redis
负责基于Http
请求的Cache
不需要同步,框架代码无需做改变,默认访问IDC
本地机房Redis
。换言之,IDC A
的应用读写IDC A
的Redis
实例,IDC B
的应用读写IDC B
的Redis
实例,保证各个国家数据安全性的同时提高用户体验。
# 单向同步
某项目的业务特点只读不写,实时从国内IDC
同步数据,所以只需单向同步,并且对延迟性要求低。
多个机房部署,其中一个机房为master
,支持读写功能,master
只能选择上海机房。master
会将数据同步到其他机房。其他机房为slave
,只支持读取功能。此模式下,AWS
公有云上只能读取本机房的数据,无法进行写操作
# 双向同步
多个机房部署时,每个都是master
,支持读写功能,master
之间做双向的数据同步。
WARNING
申请新集群时的重名检查,是不区分机房的,即使两个集群部署在完全不同的机房,也会被认为是重名。
扩展Redis
集群: 指已经在私有云部署的集群,需要在AWS
上部署同名的实例来使用。也就是Redis集群实例扩容或者缩容。
# 五、云上文件的存储与共享
大型项目常常会用到读写本地文件的技术。应用会在IDC
内网传输共享这些文件,而这些文件有些很大,可达10
个G
。
# 方案一:国外访问国内服务
基于KISS
原则,我们首先尝试让AWS IDC A
的服务通过专线直接访问IDC B
的文件。但是由于网络不知名的原因,文件可以传输,却始终无法成功。但是即使成功,仍然带来很多隐患,例如:如此大的文件会瞬间把专线带宽长期占满,而真正有实时需求的通讯会卡顿受阻。
# 方案二:各AWS都部署
但是迁移上去后,背后依赖的数据库是否需要部署,甚至是数据库后面庞大的Hadoop
集群也一并重复部署一次?
# 方案三:添加中间件
通过AWS S3
的服务在不同IDC
之间共享文件,发现性能满足业务要求。
![AWS](../../../assets/img/file.d9401b60.png)
从方案的选择上来看,AWS S3
的使用场景是值得商讨的。用云上产品一般都会有一个顾虑,就是太过依赖某种云的一个具体产品,当后期如果要换成其他云时,会有大量的迁移成本。例如AWS
的S3 API
就是定制化的:
使用AmazonS3客户端的listBucket方法,如果成功,会返回存储桶列表。
// 导入
import com.amazonaws.regions.Regions;
import com.amazonaws.services.s3.AmazonS3;
import com.amazonaws.services.s3.AmazonS3ClientBuilder;
import com.amazonaws.services.s3.model.Bucket;
List<Bucket> bucket = s3.listBuckets();
for (Bucket b: bucket) {
// xxxx
}
2
3
4
5
6
7
8
9
10
← DDD[领域驱动模型] 上云流程 →