一种基于对等网络的阿瑞斯索引系统的实现方法
技术领域
本发明是一种针对ARES(阿瑞斯)特定网络服务的索引系统,主要用来解决ARES网络在内网中搜索资源的问题,进而服务于P2P协议分析系统和缓存系统,属于对等网络领域。
背景技术
P2P是英文Peer-to-Peer(对等计算)的简称,又称作“点对点”技术。它依赖网络中对等点的计算能力和带宽,而不是把依赖都聚集在少数几台服务器上,用户在下载的同时,还要上传资源,本身既是客户端,又是服务器端。所以P2P和传统的C/S方式相比大大减少了对服务器的依赖,但同时又大大增加了网络中的流量和带宽消耗。近年来,P2P的发展呈现出急剧增长的态势,出现了很多相关应用,绝大部分网络资源被P2P应用所占据,其中,作为P2P技术的主流应用之一,ARES也存在着这样的问题。
ARES开始是一个Gnutella客户端,经过改写,基本支持BitTorrent协议。和BitTorrent类似,ARES支持蜂拥、同步下载和从一个对等体到多个对等体的上载,ARES目前支持超过300,000用户,是流行的音乐文件网络。
ARES网络采用混合架构,包含普通节点和超级结点,其中超级节点又分为知名超级节点和普通超级节点。ARES客户端通过知名超级节点连入ARES网络,ARES网络被编组成叶和超节点,拓扑特性的广播类搜索,通过DHT技术提交广大的横向搜索。Ares采用TCP通讯方式,连接不同端口的多个知名超级节点,还会通过UDP来验证知名超级节点的状态和同步信息,并且可以进入聊天室并和其他用户在线聊天(TCP方式,无固定端口)。Ares支持SOCK4、SOCK5代理以及使用多重代理超级节点。
面对复杂的ARES网络应用,网络运营商需要把资源集中在内网以提高用户下载资源的速率,大大减少主干网的带宽消耗。索引系统的作用在于向用户提供内网资源的列表,过滤掉拥有资源的外网节点地址,索引系统作为协议分析系统和缓存系统之间的桥梁,使得用户对资源的获取能够限制在内网中,通过索引系统的部署,可以大大缓和P2P技术和带宽消耗的矛盾,真正使得基础网络运营商能够以有限的投入满足用户日益增长的P2P应用需求,从而大大减少P2P技术日益发展带来的带宽冲击。
发明内容
技术问题:本发明的目的是提供一种基于对等网络的阿瑞斯索引系统的实现方法,从而实现对内网用户hash(哈希)搜索请求进行分析,通过与缓存系统的配合,向内网用户返回拥有资源的内网节点地址和缓存系统地址,从而达到将P2P流量限制在内网中,减少骨干网上带宽消耗的目的。同时解决了索引海量数据响应时间长的问题,较之以往的方案,该方案具有新颖性、灵活性、易扩展性和易操作性,并且对ARES网络具有针对性,具有很好的市场前景。
技术方案:本发明是集中的、可管的、可控的。其主要目的是对ARES网络的内网用户返回拥有资源的内网节点和缓存系统地址,以完成索引系统的核心功能。
根据从协议分析系统发送过来的ARES客户端的Hash搜索请求,在索引系统中查找相应的资源信息,如果有,则返回给协议分析系统;如果没有,则发送命令,让缓存系统到外网去搜索并下载,接收缓存系统发来的搜索到的资源列表,对外网节点进行过滤,选择最优的15个内网节点资源进行存储更新,从而保证索引系统保存的都是最新的拥有资源的内网节点信息。
索引系统逻辑功能主要由以下几个部分组成:数据快速检索功能、与协议分析系统交互功能、与缓存系统交互功能、发送信息功能、过滤外网节点功能以及数据库更新功能的逻辑模块。
基于对等网络的阿瑞斯索引系统的实现方法基于对等网络的阿瑞斯索引系统包含有数据库子模块,伊珀尔epoll子模块和套接字socket通信子模块;系统启动后首先启动epoll子模块用来接收来自协议分析系统的资源请求报文,然后启动数据库子模块,根据epoll子模块接收到的hashid(哈希值)请求,在数据库子模块中的memcached(一种分布式的快取系统)服务器中进行查找,如果memcached中存在相应的hashid信息,则在memcached中提取其对应的peerlist(节点列表)信息,由epoll子模块返回给协议分析系统,如果在memcached中没找到相应信息,则连接数据库子模块的mysql(一个小型关系型数据库管理系统)数据库,根据hashid值查询数据库,如果在mysql数据库中找到了相应的hashid信息,则将hashid对应的peerlist值插入到memcached服务器中并使用epoll子模块将peerlist信息返回给协议分析系统,如果在mysql数据库中没找到相应hashid的记录,则使用socket(套接字)通信子模块请求缓存系统下载相应hashid的文件,缓存系统将文件下载完成以后,socket通信子模块接收缓存系统返回的节点信息和文件的hash(哈希)值,数据库子模块的mysql记录相应信息,通过mysql的触发器机制将hash值信息同步到数据库子模块的memcached服务器中,当数据库中的记录被访问次数超过一定阈值的时候,使用socket通信子模块通知缓存系统更新相应hashid的peerlist列表,mysql进行相应的更新,过滤掉外网节点信息并通过触发器机制将hash值信息同步到memcached服务器中;
所述的数据库子模块包含有一套分散式的快取系统memcached服务器和一个小型关系型数据库管理系统mysql数据库,mysql数据库中的数据在阿瑞斯ARES索引系统启动时拷贝到memcached服务器中,当来自协议分析系统的用户哈希hash请求到来时,先在memcached服务器中查找该hash请求对应的节点列表peerlist信息,若找到则按照造包格式将内网的peer信息返回给协议分析系统,若没找到则连接mysql数据库,根据哈希值hashid查询数据库;所述的数据库子模块在两种情况下更新mysql与memcached服务器中的信息,第一种情况是对于来自协议分析系统的hashid,没有在memcached服务器和mysql中找到其对应的peerlist信息,第二种情况是在mysql中建立一张内存表mysql数据库中的表名cinmemory(数据库中表的名称),表cinmemory仅包含hashid和数据库中用于计数的变量名count(变量名称,用于计数)两个字段,hashid用来存放资源的hash值,count用来对资源进行访问计数,同一个hashid一旦被访问一次,则count值加一,设定阈值为15,即当count值增加到15以后便通知缓存系统更新相应的hashid和peerlist列表,同时count值清零;
所述的epoll子模块的作用是与协议分析系统交互,在交互过程中,索引系统相当于服务器端,协议分析系统相当于客户端,epoll子模块通过循环来等待和处理来自协议分析系统的hash请求,具体步骤如下:
步骤1).epoll子模块调用epoll_wait(函数名称)函数等待来自协议分析系统的hash请求;
步骤2).epoll子模块调用accept(函数名称)函数接受协议分析系统的连接;
步骤3).判断是否有空闲线程,若有,则设置线程活动标志为活动,接受客户端连接,设置服务索引,协议分析系统和索引系统连接成功,交互完毕后释放连接并设置线程活动标志位空闲;若没有空闲线程就丢弃客户端连接;
所述的socket通信子模块在与缓存系统交互过程中,索引系统作为客户端,缓存系统作为服务器端。
有益效果:本发明提取一个针对ARES特定网络服务的索引系统的实现方法,相比以往的方法有一些显著的优点:
数据检索速度快:本发明采用mysql(一个小型关系型数据库管理系统)数据库与memeached(一套分散式的快取系统)服务器混合的方式进行数据的存储与查询,索引系统接收到来自协议分析系统的hash搜索请求以后,首先在memcached服务器中查找,如果没找到相关信息,再到mysql数据库中进行查找。数据检索的响应时间在毫秒级。
完善的功能:通过对基于对等网络的ARES索引系统功能与需求的详细划分,我们使得整套ARES索引系统在功能上能够接收协议分析系统发来的请求,快速查询,并将查询结果返回给协议分析系统,如果没有在mysql数据库中检索到相应信息,则将hash请求发送给缓存系统,让其去外网搜索,接收缓存系统发来的搜索到的资源列表,对外网节点进行过滤,选择最优的15个内网节点资源进行存储更新,从而保证索引系统保存的都是最新的内网节点所有资源信息。
模块化设计:整个基于对等网络的ARES索引系统按照功能需求分成数个模块,模块之间分工明确,耦合性低,可复用性高,便于系统的升级和重新配置,如数据库子模块,epoll(伊珀尔)子模块等。
良好的系统扩展性:由于系统模块之间采用的是独立模块化,功能并行层次化设计,系统模块之间的通信机制完全采用层次化的结构,因此可以方便地添加新的功能,也可以很容易地升级现有的功能,所以该系统具有很好的可扩展性。
高度的可靠性和稳定性:通过对基于对等网络的ARES索引系统的单元测试,集成测试以及整个索引系统的系统测试表明该索引系统运行状况良好,占用系统资源少,拥有良好的容错机制以及灾难恢复能力。
附图说明
图1是整个基于对等网络的ARES系统的组成结构图。图中包括ARES客户端,协议分析系统,索引系统,缓存系统。
图2是各子模块与所实现功能的对应关系图。其中子模块包括数据库子模块,epoll子模块和socket(套接字)通信子模块,所实现的功能包括数据快速检索功能,过滤外网节点功能,数据库更新功能,与协议分析系统交互功能,与缓存系统交互功能。
图3是数据库子模块的工作流程图。接收到hash请求后首先在memcached服务器中查找,如果没找到相应信息则在mysq1中查找。
图4是mysql数据库的信息更新流程图。通过与缓存系统的交互完成mysql的更新。
图5是epoll子模块的工作流程图。经过一系列的初始化,epoll子模块是通过循环来等待和处理epoll事件。
图6是索引系统和协议分析系统基于epoll子模块的交互处理流程图。epoll子模块使用空闲线程处理连接请求。
具体实施方式
体系结构
整个基于对等网络的ARES系统的组成结构如图1所示。从图1可以看出,索引系统在整个ARES系统中作为协议分析系统和缓存系统之间的桥梁,处于核心的地位,通过详细的规划与设计,为基于对等网络的ARES系统中的内网节点提供拥有资源的内网节点地址,促使缓存系统去外网下载内网没有的资源。在该图中,协议分析系统用于识别ARES客户端的hash请求,将资源请求发送给索引系统。缓存系统接收来自索引系统的热点资源更新请求,去外网搜索资源并下载,并将搜索到的资源信息发送给索引系统。协议分析系统,缓存系统以及索引系统相互配合,最终将P2P流量限制在内网范围内。
具体来看,基于对等网络的ARES索引系统可以划分为数据库子模块,epoll子模块和socket通信子模块这三个部分,各子模块与所实现功能的对应关系如图2所示。在图2中,我们可以看到,数据库子模块用来存储资源和内网节点的对应信息,其最主要的功能就是数据快速检索功能,当接收到的来自协议分析系统的hash请求在数据库中没有查找到相应信息时,数据库子模块通知缓存系统下载并接受反馈信息,因此需要外网节点过滤功能和数据库更新功能;epoll子模块则用于索引系统和协议分析系统的交互,在交互中,索引系统相当于服务器端而协议分析系统相当于客户端。socket通信子模块用于索引系统和缓存系统的交互,在设计与实现上,socket通信子模块与epo1l子模块相类似,不同的就是在交互过程中索引系统相当于客户端而缓存系统相当于服务器端。
方法流程
该部分详细说明发明内容各个部分的设计与实现:
(1)数据库子模块的设计与实现
数据库子模块是基于对等网络的ARES索引系统的核心模块,数据库子模块在索引系统中用于实现数据快速检索的功能,外网节点过滤功能和数据库更新功能。考虑到对海量数据的快速查询检索的需求,在数据库子模块的没计中我们考虑引入memcached服务器,数据库子模块包含有memcached服务器和mysql数据库。接收协议分析系统的hash请求以后,数据库子模块工作流程如图3所示,基于对等网络的ARES索引系统启动时,首先将mysql数据库中的数据拷贝到memcached服务器中,当来自协议分析系统的用户hash请求到来时,先在memcached服务器所管理的内存数据库中查找该hash请求对应的peerlist(节点列表)信息,若找到了相应的peer1ist信息,则通过memcached_get()函数提取存在memcached服务器中的peerlist值,按照造包格式将内网的peer信息返回给协议分析系统;反之,对于来自协议分析系统的用户hash请求,如果在memcached服务器中没有找到相应的peerlist信息,则连接mysq1数据库,根据hashid(哈希值)值查询数据库,若mysq1数据库中存在相应hashid的记录,则通过memcached_set()函数将peerlist的值插入到memcached服务器中并按照造包格式将内网peer信息返回给协议分析系统,若没有在mysql数据库中发现所需查询的表项,索引系统发送命令给协议分析系统,使其放弃对内网用户请求报文的篡改,同时发送下载请求给缓存系统进行下载。下载完成后,mysql数据库记录缓存系统返回的节点信息和文件hashid,按照节点信息中的IP地址段过滤掉外网节点,将过滤后的信息添加至表中,完成更新工作,同时通过mysql的触发机制,将表项同步至memcached服务器,以待用户查询。
在数据库子模块的设计中,我们指定数据库子模块中存储的hashid对应的peerlist信息最多包含15条内网节点的信息。在mysql中建立数据库abitno,在abitno中建立表ares,表ares包含以下字段:hashid,host1,port1,shost1,sport1,username1,…,host15,port15,shost15,sport15,username15。其中,hashid用来存放资源的hash值,host1表示内网节点1的ip,port1表示内网节点1的端口号,shost1表示内网节点1所挂载的超级节点的ip,sport1表示内网节点1所挂载的超级节点的端口号,usernamel表示超级节点分配给内网节点1的昵称,内网节点2…内网节点15的情况可以此类推。对于一个hashid来说,后面挂载着一个peerlist,在我们的设计中,mysql存放着内网中所有资源的hashid以及对应的peerlist信息。考虑到memcached中存放的信息都是在内存中的,如果中途重新启动机器或者发生断电,则memeached中的信息存在丢失的风险,所以在mysql中同步存放所有的信息是对索引系统可靠性的坚实保障,同时,由于内网节点的动态性,拥有资源的节点往往会动态的下线,或者发生故障,所以我们对mysql中各个hashid对应的peerlist信息也要动态地更新,考虑到热门资源的访问是符合幂律分布的,即少数的资源被多次访问,所以仅对mysq1中的热门资源的信息进行更新。mysql中的信息更新如图4所示。
在两种情况下mysql被触发进行信息更新,第一种情况是来自协议分析系统的查询请求中hashid没有在mysql中找到,索引系统请求缓存系统下载相应的hashid文件,mysql记录缓存系统返回的节点信息和下载文件的hash值,过滤掉外网节点信息并通过mysql的触发器机制将hash值信息同步到memcached服务器中;第二种情况是在数据库中的记录被访问超过一定阈值的时候,通知缓存系统更新相应的hashid和peerlist列表,再由mysql进行相应的更新,最后过滤掉外网节点信息并通过mysql的触发器机制将hash值信息同步到memcached服务器中。在第二种情况的实现中,我们在mysql中建立一张内存表cinmemory,表cinmemory仅包含hashid和count两个字段,hashid用来存放资源的hash值,count用来对资源进行访问计数,同一个hashid一旦被访问一次,则count值加一,我们设定阈值为15,即当count值增加到15以后便通知缓存系统更新相应的hashid和peerlist列表,同时count值清零。这样的设计主要是考虑到同样的资源被多次搜索并下载说明内网中据有此资源的节点越来越多,对mysql进行相应的更新可以在拥有资源的节点中实时的找出能力较强的添加到peerlist中,而将原先能力较弱的节点在peerlist中删除。
(2)epoll子模块的设计与实现
epo1l子模块在索引系统中的作用是与协议分析系统交互,在交互过程中,协议
分析系统是客户端,索引系统是服务器端。epoll子模块的工作流程如下:
步骤1:通过epoll_create(int maxfds)函数来创建一个epoll的句柄,其中maxfds为epoll所支持的最大句柄数。函数返回一个新的epoll句柄,之后的所有操作将通过这个句柄来进行操作;
步骤2:在网络主循环里面,调用epoll_wait(int epfd,epoll_event events,int max events,int timeout)函数来查询所有的网络接口,看哪一个可以读,哪一个可以写。在本发明中,调用格式为nfds=epoll wait(kdpfd,events,max_events,-1),其中kdpfd是用epoll_create创建之后的句柄,events是一个epoll_event*的指针,当epoll_wait这个函数操作成功之后,epoll_events里面将储存所有的读写事件。max_events是当前需要监听的所有socket句柄数。最后一个timeout是epoll_wait的超时,为0的时候表示马上返回,为-1的时候表示一直等下去,直到有事件发生,为任意正整数的时候表示等这么长的时间,如果一直没有事件,则放弃。由于本发明网络主循环是单线程,所以用-1来等,这样可以保证效率。
步骤3:epoll wait返回之后循环遍历所有的事件:如果是主socket的事件的话,则表示有新连接进入了,进行新连接的处理,并将新连接置于非阻塞模式。随后将新连接也加入EPOLL的监听队列。设置好event之后,将这个新的event通过epoll_ctl加入到epoll的监听队列里面,这里用RPOLL_CTL_ADD来加一个新的epoll事件,通过POLL_CTL_DEL来减少一个epoll事件,通过EPOLL_CTL_MOD来改变一个事件的监听方式。如果不是主socket的事件的话,则代表是一个用户socket的事件,则来处理这个用户socket的事情,比如说read(fd,xxx)之类的,或者一些其他的处理。
步骤4:用close()函数来关闭这个创建出来的epoll句柄。
整个epoll子模块实现的流程如图5所示,首先创建线程池并且初始化,然后创建监听服务并且初始化,接下来调用epoll_ereate,epoll_ctl函数向epoll集合添加套接字,进入无限循环,等待协议分析系统发送hash请求,并处理接收到的hash请求。而索引系统和协议分析系统基于epoll子模块的交互处理流程如图6所示可分解为以下步骤:
步骤1:epoll子模块调用epoll_wait函数等待来自协议分析系统的hash请求;
步骤2:epoll子模块调用accept函数接受协议分析系统的连接;
步骤3:判断是否有空闲线程,若有,则设置线程活动标志为活动,接受客户端连接,设置服务索引,协议分析系统和索引系统连接成功,交互完毕后释放连接并设置线程活动标志位空闲;若没有空闲线程就丢弃客户端连接。
(3)socket通信子模块的设计与实现
socket通信子模块在索引系统中的作用是与缓存系统交互,在交互过程中,索引系统是客户端,缓存系统是服务器端。socket通信子模块的工作流程如下:
步骤1:使用socket()函数创建客户端套接字;
步骤2:使用connect(int sockfd,struct sockaddr*servaddr,int addrlen)函数向缓存系统发出连接请求,其中参数servaddr指定缓存系统的套接字地址,包括缓存系统的IP地址和端口号;
步骤3:使用recv()函数和send()函数和缓存系统进行网络通信;
步骤4:使用close()函数关闭套接字。
具体实施方式如下:
1.用户打开ARES客户端,连入网络并请求资源;
2.协议分析系统截获用户的hash请求并发给索引系统,索引系统的epoll子模块接收hash请求;
3.根据接收到的hash请求,在memcached服务器中进行查找;
4.如果memcached服务器中存在相应的peerlist信息,则在memcached中提取相应的peerlist值,按照造包格式返回给协议分析系统;
5.如果memcached服务器中没找到相应的peerlist信息,则连接mysql数据库,根据hashid值查询数据库;
6.如果在mysql数据库中找到了相应hashid的记录,则将peerlist值插入到memcached服务器中并按照造包格式返回给协议分析系统;
7.如果在mysql数据库中没找到相应hashid的记录,则使用socket通信子模块请求缓存系统下载相应hashid的文件;
8.缓存系统将文件下载完成以后,mysq1记录缓存系统返回的节点信息和文件的hash值;
9.对于接收到的缓存系统返回的节点信息,针对节点的IP地址进行过滤,过滤掉外网节点信息;
10.通过mysql的触发器机制将hash值信息同步到memcached服务器中;
11.当数据库中的记录被访问次数超过一定阈值的时候,通知缓存系统更新相应hashid的peerlist列表;
12.mysql进行相应的更新,过滤掉外网节点信息并通过触发器机制将hash值信息同步到memcached服务器中。