发明名称 一种高可用分布式全文索引方法
摘要 本发明公开了一种高可用分布式全文索引方法,该方法首先启动基础服务系统,然后在各个节点上启动索引集群服务和查询集群服务,再在全文数据上创建、更新和删除索引,最后查询索引;本发明分离查询与索引过程,可以同时支持增量或批量式地建立已有的索引,批量式索引在短时间对大规模数据建立索引,而增量式索引避免重建索引。本发明将索引文件划分为三层结构,包括索引文件、索引分片、索引子分片,以增强索引文件的扩展性和可用性;本发明提供动态索引任务配置服务,通过设置索引任务中的参数,能够动态地满足用户对不同数据建立索引的需求。
申请公布号 CN102779185A 申请公布日期 2012.11.14
申请号 CN201210226357.2 申请日期 2012.06.29
申请人 浙江大学 发明人 陈岭;鲁伟明;余斌
分类号 G06F17/30(2006.01)I 主分类号 G06F17/30(2006.01)I
代理机构 杭州求是专利事务所有限公司 33200 代理人 周烽
主权项 一种高可用分布式全文索引方法,其特征在于,该方法包括以下步骤:(1)启动基础服务系统,包括分布式文件系统、分布式列式数据库以及元数据目录服务;所述分布式文件系统用于存储索引节点建立的索引文件,同时为查询集群中的节点提供索引文件;所述分布式列式数据库用于提供本发明中的操作日志服务,存储本发明执行的各项操作,此外,分布式列式数据库还用于存储原始全文数据文件,分布式列式数据库应支持按列存储,;元数据目录服务实现元数据的存储;(2)在各个节点上启动索引集群服务和查询集群服务,其中,索引集群服务包括索引主节点服务和索引节点服务,查询集群服务包括查询主节点服务和查询节点服务;该步骤具体为:首先,索引主节点和搜索主节点分别启动,进入安全模式,并分别扫描并监听元数据目录中索引节点和查询节点目录节点,以分别管理这些目录下的节点;其次,索引节点和查询节点启动,并将自身的信息注册到元数据节点目录之上,此时索引主节点和搜索主节点监听到消息,将新加入的节点纳入自身管理之中;最后,如果在安全模式下,节点不在发生变化,那么退出安全模式;至此完成了整个分布式全文索引系统启动的过程;(3)在全文数据上创建索引、更新索引、删除索引;其中,创建索引包括增量式创建索引和批量式创建索引;该步骤通过以下子步骤来实现:(3.1)所述的增量式创建索引,需要用户在索引任务定义中将创建索引的模式设置为增量式模式;增量式创建索引的过程包括:(3.1.1)当数据插入到存储系统中,触发增量建立索引的任务,索引主节点通过反射机制实例化索引任务定义中的索引分片策略,判定该数据的索引归属于哪一个索引分片,此后从元数据目录中读取索引分片与索引节点的映射关系,找到负责建立该索引分片的索引节点;最后将节点ID写入到消息中;(3.1.2)索引主节点将3.1.1生成的消息通过远程调用的方式将该消息随机塞到任意一个索引节点的本地消息队列中;(3.1.3)索引节点读取对应的消息,如果该消息属于该节点,那么获取消息后的索引节点会根据消息中的数据主键从数据存储系统中读出数据,封装成索引单元,否则此消息不属于该节点,那么通过远程调用以及消息中的节点信息将该消息转发到对应索引节点;(3.1.3)索引节点处理该消息,如果不存在与该消息对应索引处理器,则创建索引处理器,并根据索引任务定义实例化索引器;索引器读入索引单元,根据索引任务中的预定义索引域,对存储于索引单元中的数据进行索引,同时在操作日志1中记录索引分片ID与操作消息,并且在操作日志2中记录数据主键与对应的索引子分片的名字;(3.1.4)如果此时满足索引子分片文件上传的条件且此时该索引处理器中合并线程不在运行,那么停止当前的索引子分片文件上的索引器,新建一个文件目录作为新的索引器的索引目录,转步骤3.1.3;上传索引文件线程并执行步骤3.1.5;否则依然将索引建在本地的索引子分片目录之下,转步骤3.1.3;(3.1.5)将旧的索引子分片文件重新命名为合并文件,设置索引正在合并的标志,并且在合并文件目录上启动一个索引文件合并线程,将索引文件合并;上传索引文件线程将合并的结果上传到分布式文件系统中的索引子分片文件目录;并且将新增索引子分片的操作消息插入到元数据目录中的Master_queue上;(3.1.6)如果上传成功,那么就删除与该索引分片对应的索引操作日志1,否则跳转至步骤3.1.5重复上传索引分片的过程;(3.2)更新索引的过程包括:(3.2.1)更新数据的操作触发更新索引的任务,索引主节点根据索引分片策略判定该数据归属于哪一个索引分片,并从元数据目录上读取索引分片与索引节点的映射关系,找到对应的索引节点;(3.2.2)索引主节点通过远程调用将生成的更新索引消息传递给任意索引节点的本地消息队列,该索引节点从中读取对应的更新消息,如果该消息不属于当前节点,那么该节点根据消息中的节点信息将消息转发到真正的处理节点;(3.2.3)获取更新消息后的索引节点会根据消息中的信息,根据数据ID在该索引分片的操作日志2中查找对应的索引子分片,将索引子分片ID写入消息中,如果此时索引子分片在本地磁盘上,转步骤3.2.4;否则转步骤3.2.5;(3.2.4)根据该数据的文档主键,如果此时该数据的索引在本地的索引子分片之中,直接更新对应的索引;并在操作日志1中记录索引分片ID和对应的消息,转步骤3.2.2;(3.2.5)判定当前更新缓存队列中的消息数目是否到达阈值,如果没有到达则将该消息存入该队列,返回步骤3.2.2;否则转步骤3.2.6;(3.2.6)将更新缓存队列中的消息全部交给处理队列,启动更新线程,更新线程处理每一个消息,根据每一个数据主键和索引子分片的对应关系,生成索引子分片与索引主键的一对多映射关系,此后,从分布式文件系统中将索引子分片下载本地磁盘,在该分片上实例化出索引处理器以及对应的索引器,根据消息中的数据主键从分布式列式数据库中读取数据,封装成索引单元并执行更新索引操作,成功之后在操作日志1中记录该索引子分片执行的更新操作;(3.2.7)当完成该索引子分片中所有更新操作,关闭在该目录上的索引器,并将更新目录中的索引文件上传至分布式索引子分片的目录;删除操作日志1中与该索引子分片相关的操作记录,同样的操作重复执行直至遍历完映射关系;(3.3)删除索引的过程包括:(3.3.1)删除数据的操作触发删除索引的任务,索引主节点根据索引分片策略判定该数据归属于哪一个索引分片,并从元数据目录上读取索引分片与索引节点的映射关系,找到对应的索引节点;(3.3.2)索引主节点通过远程调用将生成的删除索引消息传递给任意索引节点的本地消息队列,该索引节点从中读取对应的删除消息,如果该消息不属于当前节点,那么该节点根据消息中的节点信息将消息转发到真正的处理节点;(3.3.3)获取删除消息后的索引节点会根据消息中的信息,根据数据ID在该索引分片的操作日志2中查找对应的索引子分片,将索引子分片ID写入消息中,如果此时索引子分片在本地磁盘上,转步骤3.3.4;否则转步骤3.3.5;(3.3.4)根据该数据的文档主键,如果此时该数据的索引在本地的索引子分片之中,直接删除对应的索引;并在操作日志1中记录索引分片ID和对应的消息,转步骤3.3.2;(3.3.5)判定当前删除缓存队列中的消息数目是否到达阈值,如果没有到达则将该消息存入该队列,返回步骤3.3.2;否则转步骤3.3.6;(3.3.6)将删除缓存队列中的消息全部交给处理队列,启动删除线程,删除线程处理每一个消息,根据每一个数据主键和索引子分片的对应关系,生成索引子分片与索引主键的一对多映射关系,此后,从分布式文件系统中将索引子分片下载本地磁盘,在该分片上实例化出索引处理器以及对应的索引器,根据消息中的数据主键从分布式列式数据库中读取数据,封装成索引单元并执行删除索引操作,成功之后在操作日志1中记录该索引子分片执行的删除操作;(3.3.7)当完成该索引子分片中所有删除操作,关闭在该目录上的索引器,并将删除目录中的索引文件上传至分布式索引子分片的目录;删除操作日志1中与该索引子分片相关的操作记录,同样的操作重复执行直至遍历完映射关系;(3.4)所述的批量式索引模式是当用户在索引任务定义中定义了批量式建立索引模式,此时,索引主节点将模式转换为批量式索引模式,批量式索引方法具体包含以下步骤:(3.4.1)调用MapReduce框架,在Map阶段调用索引分片策略,将数据划分为n个数据集合;然后将每个数据集合中的数据随机划分到若干个索引节点上;(3.4.2)每个索引节点对划分的数据根据其所属的索引分片,分别建立索引子分片,每一个索引子分片按照大小划分,当索引子分片大小超过阈值,则创建新的索引子分片;(3.4.3)在Reduce阶段,每个索引节点将自身中索引子分片文件合并到的对应的索引分片文件,将会生成n个索引分片文件;(3.4.4)当完成批量式建索引任务之后,索引主节点在元数据目录下的Master_queue下写入载入索引分片的操作;查询主节点根据此操作通过节点选择策略将索引分片分配给若干个查询节点,并且在元数据目录下的Node_queue中写入载入索引分片的操作,各个对应的查询节点执行此操作,载入对应的索引;(4)查询索引,包括以下子步骤:(4.1)查询客户端根据查询内容生成分布式查询,对该查询进行解析,产生对应的解析结果;(4.2)此后查询客户端利用步骤4.1中产生的结果,调用本地的查询节点选择策略;该策略会远程调用查询主节点上的索引分片选择策略,根据元数据目录保存的查询节点与索引分片的信息,决定该查询属于哪些索引分片,由于一个索引分片有多个索引子分片,因此根据元数据目录中索引子分片与查询节点的映射关系,利用负载均衡技术从这些节点中选择负载最轻的查询节点,生成与该查询相对应的查询节点列表;最后,将该列表返回给查询客户端;(4.3)查询客户端获取该查询节点列表,通过远程调用的方法,并行向这些查询节点发布查询请求;(4.4)查询节点执行该查询请求,通过一个线程池在不同的索引分片之上查询对应的结果,将结果返回给查询客户端;(4.5)客户端获取各个查询节点的查询结果之后,对查询结果进行合并操作,完成整个查询过程。
地址 310058 浙江省杭州市西湖区余杭塘路388号