在过去几年中,我们自己开发的大数据SaaS应用大数据实验室采用混合云体系结构在全国各地进行了几十次部署。在实际使用过程中,遇上了非常多的问题。本文主要分享在实际软件开发和维护过程中遇上的各种问题和解决方案分享。
# - 一、大数据实验室介绍
大数据SaaS应用大数据实验室是指:旨在帮助大数据从业人员和学生更好地了解和学习大数据产品以及各种大数据真实案例,快速进行大数据科研创新的软件产品包。大数据实验室作为一站式大数据实训和科研创新平台,为各行业用户提供简单易用的大数据真实环境,让数据价值触手可及。用户可通过简单快捷的可视化操作,对各种大数据进行数据采集、数据加工、数据开发、数据管理、数据分析和机器学习等操作,快速探索各种大数据创新应用。
大数据实验室底层采用混合云架构,中间层部署了一系列PaaS引擎,上层部署了软件包和课程包的SaaS应用,具体如下图所示:
- 大数据实验室后台支撑平台: 部署在高配的阿里云ECS+RDS+OSS上,并根据访问负载扩容ECS带宽。大数据实验室后台支撑平台主要完成大数据实验室整体架构的搭建,负责整个实验室的安全管理、资源调度、权限管控等,完成分布式环境下每个用户都拥有自己独立的多租户,相互之间的数据、文件和项目都实现完全隔离。
- 离线分布式计算平台引擎:公有云采用阿里云云原生大数据计算服务 MaxCompute,私有云采用Apache Hadoop 3.0+ Apache Spark 3.2 。通过混合云对接模块,大数据实验室实现上层SaaS应用与底层公有云和私有云离线分布式计算资源的对接。公有云环境下,针对每个用户每个单独的实验开辟出独立的公共云资源,完成相应的驱动转换,保障每个用户都在独立的多租户环境中完成相应的实验。支持RAM子账号模式,支持多个学生消费的云资源在同一个主账号进行计费。私有云环境下,针对每个具体实践开辟出独立的虚拟机资源,生成多租户实践环境。
- 机器学习平台: 公有云采用阿里云机器学习平台PAI, 私有云主要使用开源TensorFlow 2.0。通过混合云对接模块,大数据实验室实现上层SaaS应用与底层公有云和私有云机器学习平台计算资源的对接。
- 大数据ETL引擎: 公有云采用阿里云大数据开发治理平台 DataWorks,私有云采用开源Kettle等。通过混合云对接模块,大数据实验室实现与底层大数据ETL引擎功能对接,支持实验数据、案例数据和科研数据的的导入导出等功能。数据接口提供多种方式支持,比如service接口方式、数据文件导出支持(CSV、TXT等)、数据文件的导入支持等。
- 数据可视化和BI报表引擎: 公有云采用阿里云报表工具QuickBI和数据可视化大屏引擎DATAV, 私有云采用开源工具Echarts等;
- 中间层PaaS引擎: 公有云主要使用阿里云提供的各种PaaS引擎服务,私有云部分主要基于开源引擎提供相应的功能;
- 上层SaaS应用: 具体包括实训室的管理功能、科研平台的管理功能、混合云负载管理功能等。
# - 二、实际使用过程中遇上的问题
过去几年我们在全国部署了很多套大数据实验室,随着大数据实验室部署的客户越来越多和每个用户内部使用人数的扩大,大数据实验室后台支撑平台公有云访问峰值用户数超过了10万人,每个用户现场部署的私有云峰值访问用户数也超过了千人。随着业务负载越来越大,整个大数据实验室系统遇上了各种性能相关的问题。同时,随着阿里云各个底层平台的升级, 构建在其上的大数据实验室SaaS软件不兼容的问题也逐步凸显。以下是总结后遇上的部分问题:
1. 业务负载压力上升过快, 现有ECS带宽负载吃紧, 无法满足大数据实验室业务峰值时访问负载需求。
2. 在私有云环境中,原生Apache HIVE集群访问并发受限,当业务负载升级到千人以上出现集群不响应现象。
3. 混合云用户管理无法做到统一,公有云和私有云底层平台用户和大数据实验室用户管理系统出现杂乱现象,版本升级时容易出现问题。
4. 多个集群的统一管理遇上问题,底层使用的各种公有云集群和私有云集群各种资源,如何做到统一管控是一个系统性问题。
5. 在业务峰值时,系统负载不均衡现象越来越严重。随着互联网技术的发展,大并发和海量数据处理场景越来越普遍,很多用户所使用的SaaS软件也逐步过渡到分布式架构体系中来。我们在实际部署SaaS软件的过程中,逐步发现在应用上层面临着越来越大的压力,瞬间访问负载激增的情况下SaaS应用面临访问崩溃的风险。
# - 三、相关问题解决经验分享
经过多个项目的实际试错和调整,上述问题目前采用如下方式进行了初步解决:
1. 针对业务负载持续上升的问题,主要通过以下方式进行解决:
a) 首先对ECS带宽进行扩容,从整体上保障业务运行所需的带宽资源。
b) 其次是优化SaaS软件中所有交互相关的内容资源,比如课程包中的PDF文档、数据文件、PPT和视频等,都是需要高并发的同时打开, 非常消耗带宽资源,通过优化和压缩内容资源的大小, 整体降低所需带宽资源负载需求。
c) 最后尝试对内容资源进行序列化并通过压缩算法将内容资源进一步压缩大小,从而提升现有带宽利用效率。
2. 针对在私有云环境中,原生Apache HIVE集群访问并发压力过大的问题,主要通过以下几种方式进行解决:
a) 在架构上,针对高并发访问需求的用户, 在实际部署过程中通过部署多个Apache Hive集群的方式予以解决。
b) 同时弹性负载均衡组件负责调度用户访问需求,防止热点数据节点出现。
3. 针对混合云用户管理杂乱的现象,主要通过以下方式进行解决:
a) 从架构上进行优化,增加混合云用户管理模块,并增加一层映射,以大数据实验室内部用户和权限管理为主,并分别对应其所需访问的底层集群资源用户名、密码和访问权限等。
b) 从运维部署角度,提供公有云RAM子账户和私有云集群账户创建初始化脚本和模板,进一步简化部署难度。
4. 针对多个集群的统一管理和调度的问题,主要在架构层面进行优化,增加多集群管控组件用来来解决混合云环境下多个大数据集群、机器学习机器的集成管控问题,统一协调负载实现实验室整体高可用和高并发访问,具体包括以下功能:
a) 混合云架构下底层多种大数据集群和机器学习集群的统一管控
b) 解决私有云环境下Hadoop机器以及Spark集群并发负载偏小的问题,通过并发多集群的方式实现整体实验室环境的高可用和高并发
c) 解决公有云环境下多种大数据ETL机器、大数据离线分布式计算机器、流计算机器和机器学习机器的集中管控问题
5. 针对在业务峰值时,系统负载不均衡现象,主要通过以下方式进行解决:
a) 在系统整体层面,新增负载均衡组件,通过对多台云服务器进行均衡的流量分发调度,消除单点故障提升应用系统的可靠性与吞吐力。
b) 负载均衡组件通过使用散列函数(Hash function)进行负载均衡分发,在应用层弹性负载均衡主要基于散列函数(Hash function)的方式实现,并在后续版本迭代过程中将散列函数升级为一致性哈希算法。
c) 散列函数(Hash function)又称散列算法、哈希函数,是一种从任何一种数据中创建小的数字“指纹”的方法。散列函数把消息或数据压缩成摘要,使得数据量变小,将数据的格式固定下来。该函数将数据打乱混合,重新创建一个叫做散列值(hash values,hash codes,hash sums,或hashes)的指纹。散列值通常用一个短的随机字母和数字组成的字符串来代表。好的散列函数在输入域中很少出现散列冲突。在散列表和数据处理中,不抑制冲突来区别数据,会使得数据库记录更难找到。--维基百科散列函数定义。
d) 在软件开发过程中,我们主要通过散列表(哈希表)的方式存储相应的数据记录,支持弹性负载均衡组件可以使用散列表快速检索和查询到相关的数据记录以便进行负载分发。
e) 在新的弹性负载均衡开发过程中,引入分布式散列表(DHT),也就是使用分布式散列表DHT取代传统的散列表,通过使用一致性哈希来划分分布式系统的节点。 通过使用一致性哈希算法,优化弹性负载均衡的分发过程,相比于传统哈希表中添加或者删除一个槽位基本上需要对所有的关键字进行重新映射,在使用一致性哈希算法时,哈希表槽位数的改变平均来看只需要对K/N 个关键字重新映射(K:关键字数量; N: 槽位数量)。一致性哈希算法最早是由麻省理工学院(MIT)的Karger等人提出的,其在1997年发表的《Consistent Hashing and Random Trees: Distributed Caching Protocols for Relieving Hot Spots on the World Wide Web.》学术论文中介绍了如何使用一致性哈希算法解决分布式Web服务中用户易变的问题。