陈潇潇 蔡迎归 李妩可
摘 要: CDN流量采集系统是通过CDN流量数据进行采集分析以此来判断CDN服务质量的好坏,其依赖于一个可靠稳定的数据中心服务器。本文详细地论述了数据中心服务器模块所具备的功能,为监测CDN系统的运行和CDN流量统计系统提供了坚实可靠的数据基础。
关键词:CDN 流量采集 中心服务器
中图分类号:TP393 文献标识码:A 文章编号:1672-3791(2016)06(a)-0000-00
本文系湖南文理学院2015年校级科研项目《基于数据分流的并行入侵检测系统研究》(项目编号:15YB10) 论文。
1.引言
随着我国互联网技术的发展,涌现出了很多的CDN提供商。为了更好地了解CDN服务质量的好坏以便给客户提供优质的服务, CDN提供商往往给出了流量统计、流量监控等服务,这些服务提供的依据,都必须依赖CDN流量采集系统。本文针对系统的核心模块——中心服务器进行设计与实现。
2.中心服务器运行流程
中心服务器运行在CDN流量采集系统数据中心,主要包括数据监听线程、线程池模块和数据处理入库线程(也即工作线程)三大功能模块,其作用主要是接收各个节点发送过来的数据,然后存储在数据库中。主要工作流程大致如下:
当启动服务端的程序后,首先应确保程序的单实例运行,然后初始化运行日志,再读取服务器的配置文件后进行环境参数的配置。在上述工作就绪之后,服务器将首先创建网络环境并初始化参数,然后创建并初始化线程池。接收数据进程模块监听着服务器上的端口,如果发现有Client端有数据传输过来,则把Client端的ID号存入连接缓冲区,如果到来的事件是表明有已经连接的客户端的通信数据到来,就向线程池中抛入一个任务。同时唤醒空闲的任务线程来处理相关的业务请求。 当处理线程接收了数据之后,便存入一个内存缓冲区。在缓冲区达到一定的数量的时候,统一插入到数据库中。
3.功能设计
3.1监听线程模块
本文设计的服务器程序功能需要在同一时间接收多个CDN节点采集程序发送过来的数据,也就是说,服务器既要监听套接口,又要处理已经连接的套接口,这里就需要用到I/O复用的技术(I/O multiplexing)。监听线程模块为了能够适应接收多个Client的访问请求,有必要加入EPOLL机制。改进后的算法如下:
3.2线程池模块
由于流量采集业务复杂、采集的数据量大,CDN数据中心服务器必须具备较高的性能要求,在数据存储量、吞吐量、响应时间等方面都力争最大化,因此有必要采用线程池技术来实现这些要求。
(1)线程池的创建和初始化
在创建一个线程池的过程中我们使用了两个参数,一个是 min_num,表示线程池最小数目,一个是max_num,表示线程池数目的上限。线程池的运行过程中,会让数目维持在这两者之间。这样一方面不会占有过多的资源,另外一方面也不会使得过渡的创建线程而降低线程池的工作效率[2]。在线程池初始化过程中,我们主要做了两个工作。一个是对创建工作线程并对工作线程进行初始化。另外一个是创建一个管理线程,用于动态的管理线程池,让其更好的工作,使得资源更加协调。
(2)任务的处理
在客户端请求发送递交到线程池的时候,会对任务进行一系列的处理后,并将其信息回馈给客户端。其中任务放入线程池的策略就是找到第一个处于空闲状态的线程,然后将任务与线程绑定在线程上来达到目的。在修改线程状态的时候先是加锁,完成修改之后再解锁(这是有效控制线程同步运行的关键),并将任务和相关参数绑定到制定的结构中 。
(3)线程池状态计算和关闭销毁
在线程池的管理中,是用线程池的状态来维护线程池的动态平衡的。管理线程根据线程池的状态做出一定的管理操作。当线程池处于空闲状态返回0,当处于忙碌或者正常状态的时候,返回1。当忙碌线程数目占总线程数目一半及其以上的时候,线程处于忙碌或正常状态。当忙碌线程数目占总线程数目一半以下的时候,线程处于空闲状态。线程池处理完客户请求,不需要的时候,这时候可以关闭并销毁线程池,避免资源的浪费。
(4)线程池的监控
线程池在最初创建的时候会创建出一个管理线程,用于对线程池的动态管理。他会每隔一段时间对线程池进行监控,根据它的的状态来进行相应的操作,来创建和销毁线程池中的线程,合理的利用了计算机系统资源。
3.3 数据处理入库模块
在系统的实际运行中,我们采用了Mysql数据库。因为Mysql数据库因其是一个快速、多线程、多用户的SQL数据库服务器,其出现虽然只有短短的数年时间,但凭借着“开放源代码”的东风,它从众多的数据库中脱颖而出,成为很多电子商务网站的首选数据库。同时它也提供了很多现成的接口函数,便于我们用C语言对其进行编程访问。
4 小结
本文详细地论述了CDN流量采集系统数据中心服务器模块所具备的功能。为了保证能够同时处理多个连接请求,数据监听模块采用了epoll多路复用机制。为了保证系统的高并发性,我们采取了线程池技术。为了保证数据数据库不发生频繁的读写,我们采用了SQL缓冲区技术,在数据达到一定量的情况下统一插入数据库。
参考文献
[1] Gammo L, Brecht T, Shukla A. Comparing and evaluating epoll, select, and poll event mechanisms[J]. Pro of the Linux Symposium,2004(7): 45-48.
[2] 杨继张. UNIX网络编程[M]. 北京: 清华大学出版社, 2006.