编辑: 旋风 | 2017-12-26 |
国家自然科学基金(61402450);
北京市自然科学基金(4154088) 收稿时间:2016-01-27;
收到修改稿时间:2016-03-14 [doi:10.15888/j.cnki.csa.005372]
2016 年第25卷第10 期http://www.c-s-a.org.cn 计算机系统应用System Construction 系统建设
103 实例达到
10 万规模, 可以在
10 秒内快速扩展上千个 容器, 以应对商品秒杀、商品详情页、图片展示产生 的突发流量;
容器成功地在羊年春晚为 1.02 亿用户同 时抢微信红包提供服务;
蘑菇街采用容器技术实现了 持续集成, 灰度升级, 弹性伸缩;
腾讯的 Gaia 平台作 为腾讯大数据平台的底层资源管理和调度系统, 服务 于腾讯所有事业群, 在2014 年10 月份正式上线 Docker, 解决各个业务的环境依赖;
阿里云 ECS 支持 部署 Docker 容器应用;
Baidu App Engine(BAE)以Docker 作为其 PaaS 云基础环境. 虽然大规模的容器集群为互联网应用提供了快速 扩容的能力, 但是在突发的峰值访问到来的时候, 容 器的稳定性依然需要得到足够的关注. 例如
2015 年双 十一购物狂欢节, 京东, 支付宝等网站访问异常, 造 成数据加载失败, 订单无法完成, 无法完成支付, 严 重影响了用户体验. 根据亚伯丁集团的报告,
1 秒的 延迟, 会带来 11% 用户点击数的下降, 16% 客户满意 程度的下降和 7% 的经济损失 . 所以通过监测技术及 时发现异常并通知系统管理员, 以保证系统的服务质 量变得非常重要. 对于容器虚拟化支撑平台的监测, 由于物理机上 运行的容器个数及类型随业务需求不断发生变化, 导 致待监测对象具有动态性. 我们用下面的例子来解释 被监测对象的动态变化对监测造成的挑战. 监测初期, 我们只需要监测装着 Tomcat 的容器, 在传统的监测方 式中, 我们为度量设定固定的阈值, 例如内存使用上 限是 1GB. 当监测进行到某一时间点, 系统中新增了 一个装着 MySQL 的容器, 由于容器环境中存在资源 抢占问题, 所以 Tomcat 原有的内存阈值就要根据 MySQL内存占用率进行调整, 这种调整在被监测实例 个数很多的时候变得不切实际, 因此容器虚拟化环境 下为度量设定静态阈值难以准确检测异常. 另一方面, 监测系统多久能够发现异常, 很大程度上依赖于监测 周期. 当突发的峰值访问到来的时候, 容器更容易异 常, 因此应该使用更小的监测周期进行密集监测. 但 是如果将监测周期设置的过小开销较大. 而且已有的 研究表明容器集群的监测会占用较多的系统资源. 例 如普通配置的物理机可以启动数百个容器, 由于集群 节点可能位于地理位置不同的数据中心, 如果
1000 个 应用部署在节点规模为
500 的集群上, 监测这些应用 需要 230M/S 的带宽. 这就导致容器虚拟化环境下很 难通过固定的监测周期在保证监测及时性的前提下降 低监测开销.
2 相关工作 当前的研究工作提出了很多异常检测方法, 这些 方法大致可以分为如下几类: 基于规则的方法通过为 每个度量设定阈值来检测异常, 例如 Zabbix, Nagios, Hyperic HQ 等监测系统, 但是这种方法不适合度量繁 多且动态变化的场景. 基于统计的方法假设数据服从 一些标准的分布模型, 找出偏离分布的离群点[1] , 但 是由于大部分模型基于单变量的假设, 对于多维数据 的鲁棒性不够好, 与此同时, 这些模型从原始数据空 间计算得到, 会受到噪音数据的干扰[2] . 基于距离的 方法[3] 不需要对于数据分布的先验知识, 通过计算样 本与其第 k 个最邻近实例的距离来判断是否异常, 但 是这种方法不适用于数据分布属于多重簇结构的场景 [4] . 为了解决上述发现的问题, 学术界提出了基于密 度的方法, 这种类型的方法中比较有代表性的是 LOF(Local Outlier Factor)[5] , 即基于密度的本地异常 因子来度量每个数据实例的异常程度. LOF 最重要的 属性是能够通过对本地数据的密度估计来识别离群点. 但是本地数据的密度估计在样本数据规模很大的时候 会造成很大的计算开销[6] . 基于角度的离群点检测算 法(Angle-Based Outlier Detection, ABOD)[7] 计算每一个 目标实例与其他数据之间的角度变化, 这种方法基于 一个观察: 离群点会比正常点造成更大的角度偏差. 由于需要计算大量的样本对, 所以在样本数据规模很 大的时候 ABOD 方法的计算开销过大. 现有监测系统普遍采用固定的监测周期来轮询系 统的异常情况, 这种方式可以通过离线测试确定适用 于当前环境的监测周期, 在被监测度量比较固定、单 一的场景下取得了很好的效果, 但是该方法需要特定 的领域知识, 而且容器虚拟化环境下被监测对象多且 动态变化的特点导致难以通过离线测试确定合适的监 测周期.