全文检索之sphinx源码分析--配置文件和轮转操作

    从索引的数据来源、实时可见性的角度来看,我们可以认为conf配置文件是Sphinx组件的中心。所有有关数据来源、索引文件包含的数据量、数据属性、检索程序searchd监听的端口、响应时间等等一系列配置参数都来自conf文件。

    下面以一些典型的配置文件配置项来进行解释:

    source xxx:基本数据来源,每次创建索引文件时都是都执行该段的sql_qurey语句,从中获取基本数据提供给indexer。

    sql_query:索引数据来源,必须有id列。我们可以通过关键字从searchd中取得id值,然后通过id值反查数据库。

    Index XXXXXX:这些字段就是用来定义每一个索引文件的具体属性的。需要注意如果我们没有设置docinfo因此会采取默认值none,也就是说不存储任何doc里的信息;而hitless_words=all则表示我们忽略了所有的的hitPos信息。这两个字段的设置可以使我们的索引文件所占空间大大减小(spa和spp分别负责这两部分信息的存储,可以看到如果按照这样的设置则每个索引中这两个文件基本都是空的)。sphinx支持分布式的索引(distributed),该类型索引中的local字段包含了分布式可查的所有索引文件,如果配置了agent则可以指向远程searchd服务端口。当分布式索引接收到请求时会向local下的所有索引文件进行查询,同时将接收到的语句传给agent。而当远程监听的searchd接收到该语句后就对自己名下的索引文件进行检索,再返回给searchd_present,最终由searchd_present进行汇总返回。下图是一个典型的分布式索引

    Indexer和searchd:分别对建索引的indexer和查索引的searchd进行了设置。需要注意不同配置文件针对不同的searchd,因此监听的端口和pid文件路径会有所不同,其中pid文件很关键,在rotate属性被激活时,indexer会通过该文件中记录的searchd的id号发送sighup信号。

    关于indexer和searchd各自的设置项目在官方文档里都有明确的解释,即使只看名称也可以猜个大概,这里就不多说了,需要重点说明的几个参数是:

    preopen_indexes:索引预开启,是否在启动是强制重新打开所有索引文件。可选选项,默认为1(全部打开)。设置为 1 时,会对所有提供服务的索引打开 preopen 选项,在代码层面会在prealloc函数中直接打开spd、spp、spi等文件(默认只打开spi的checkpoint列表,在查询时才会打开需要检索的索引文件spd和spp)Preopen_indexes可以防止rotatequery交插进行时引起的查询失败,所以sphinx建议打开。

    max_matches:最大返回匹配数,守护进程在内存中为每个索引所保持并返回给客户端的匹配数目的最大值。可选选项,默认值为1000。我们在进行查询到的时候会有cutoff和max_matches两个参数可配,conf文件的max_matches是查询时的max_matches的最大值,代表一次查询返回的结果行数,而cutoff则很奇怪,意思是对每个索引文件进行查询返回的最大结果行数,通常设置这两个值相同即可

    ROTATE轮转

    当rotate选项被激活时,indexer在完成创建或merge的操作后indexer需要将.tmp文件重命名为.new文件,然后indexer会向searchd发送sighup命令。

    Searchd可以采取多种模式,主要是针对每个查询可以采取串行模式(每次只有一个查询,新的查询在队列里排着)、PRE_FORK模式(预分配一定的槽位等查询来)、MPM_THREADS模式(也就是对每一个查询都新起一个线程应对)。Rotate的具体操作是由g_tRotateThread线程调用RotationThreadFunc函数进行定时检查的,具体的各个线程配合方式可见下图: