今年因为项目需要,在阿里云开了300多台ECS机器做计算,计算生成的数据需要下载到本地机房的服务器硬盘里保存,用到了阿里云高速通道、ECS高性能计算、IDC网络架构、任务调度等技术,项目持续了两个月,期间学习和解决了一些问题,也踩了一些坑,今天把项目中遇到的问题及解决方案整理出来,供大家参考。
说明:25GB数据=200Gbps带宽 / 8Byte
需求很简单,使用高频CPU计算数据,然后把每秒产生的25GB数据下载到本地机房的机械硬盘里存储。
其中的关键问题有:
1、300台ECS机器的调度问题
每秒需要计算的数据量巨大,单台ECS肯定完不成,需要数百台机器同时计算,管理这些机器和计算任务是一个问题。
2、每秒25GB数据网络传输问题
25GB数据需要使用200Gbps带宽,传输如果用公网流量费用会高的吓人,而且会严重影响城市骨干网络的稳定。只能使用专线,阿里云单条专线最大只有100G,我们用了两条100G专线。
3、每秒25GB的存储问题
除了解决计算和传输问题,存储也是个大问题,企业级机械硬盘的读写速度只有120MB/s,单块硬盘肯定接不住,需要在IDC机房组建服务器集群下载数据。
4、下载任务的调度问题
因为在阿里云使用了数百台ECS服务器,每台机器计算任务完成时间不同,下载时间也会不同,还要考虑每台ECS的配置不同,这块就踩了一个巨大的坑,后面会讲细节。
具体方案:
首先要在阿里云申请开通高速通道(专线服务),申请通过后才可以进入阿里云机房施工(拉专线),施工费:15000元/次,100G的专线费用:33900元/月。以上完成后就可以进入阿里云机房和自己的机房施工了。
从阿里云机房拉一条光纤到自己机房的交换机上,交换机选用华为的百G交换机,服务器网卡通过pci-e接口都换成了万兆网卡,交换机到服务器使用万兆网线。每台交换机下面挂20台万兆服务器,主要是保证能把100G的专线接满,还要考虑服务器死机,掉盘等情况,所以每台交换机的服务器至少在10台以上。
为了能跑满单条100G的专线,服务器全部安装pci-e的万兆网卡,使用的是14T机械硬盘,磁盘读写平均在120MB/s,每台机器万兆带宽,就是1250MB/s的数据,至少需要安装11块硬盘。
任务调度和下载服务需要解决的问题:
1、给每台ECS分配任务,并监控任务的状态
2、将完成的任务信息上传到数据库,包括:服务器ip、任务名称、文件名称、文件路径
3、线下机房每台服务器中安装下载脚本,处理下载任务
4、下载脚本获取本机磁盘空间,根据剩余空间排序,远程下载文件
5、下载完成后上报数据库,修改文件状态,并通知ECS服务器删除此文件
我们使用Python+MySql开发了上述的任务调度系统,使用Python开发脚本部署在每台服务器处理下载任务,文件下载使用的scp命令。
遇到的最大坑,整个架构运行后总是达不到200Gbps,我们检查了IDC的两台百G交换机,检查了万兆网卡,检查了磁盘读写速度、检查了万兆网线、检查了两条百G专线,整个网络链路和设备都可以达到理想性能,但是整体性能到不了,导致任务拥堵。经过一天排查发现是阿里云ECS的单机网卡问题导致的,原因是不同配置的ECS,上行和下行带宽大小是不一样的,有的机器是10Gbps,有的只有1Gbps,后来我们修改的下载任务的分配机制,当ESC的带宽是1Gbps时,同时只分配一个下载任务,10Gbps的ECS同时最多分配10个下载任务。
其它总结:整个项目中最大困难是对整个网络链路和设备的部署,为了能承接单条100G的专线,需要交换机、网线、网卡、主板、硬盘等链路中的环节都能发挥到极限。
实际上两台100G专线+两台百G交换机≤200G,理论情况可以达到200G,实际上最高只能到95%,因为线路和设备会有损耗,任务的执行环节会有空闲,所以设计系统的负荷时不能按理论值计算。