Sphinx/分布式搜索
来自站长百科
为提高可伸缩性,Sphnix提供了分布式检索能力。分布式检索可以改善查询延迟问题(即缩短查询时间)和提高多服务器、多CPU或多核环境下的吞吐率(即每秒可以完成的查询数)。这对于大量数据(即十亿级的记录数和TB级的文本量)上的搜索应用来说是很关键的。
其关键思想是对数据进行水平分区(HP,Horizontally partition),然后并行处理。
分区不能自动完成,您需要
- 在不同服务器上设置Sphinx程序集(indexer和searchd)的多个实例;
- 让这些实例对数据的不同部分做索引(并检索);
- 在searchd的一些实例上配置一个特殊的分布式索引;
- 然后对这个索引进行查询。
这个特殊索引只包括对其他本地或远程索引的引用,因此不能对它执行重新建立索引的操作,相反,如果要对这个特殊索引进行重建,要重建的是那些被这个索引被引用到的索引。
当searchd收到一个对分布式索引的查询时,它做如下操作
- 连接到远程代理;
- 执行查询;
- (在远程代理执行搜索的同时)对本地索引进行查询;
- 接收来自远程代理的搜索结果;
- 将所有结果合并,删除重复项;
- 将合并后的结果返回给客户端。
在应用程序看来,普通索引和分布式索引完全没有区别。也就是说,分布式索引对应用程序而言是完全透明的,实际上也无需知道查询使用的索引是分布式的还是本地的。
任一个searchd实例可以同时做为主控端(master,对搜索结果做聚合)和从属端(只做本地搜索)。这有如下几点好处:
- 集群中的每台机器都可以做为主控端来搜索整个集群,搜索请求可以在主控端之间获得负载平衡,相当于实现了一种HA(high availability,高可用性),可以应对某个节点失效的情况。
- 如果在单台多CPU或多核机器上使用,一个做为代理对本机进行搜索的searchd实例就可以利用到全部的CPU或者核。
如果在单台多CPU或多核机器上使用,一个做为代理对本机进行搜索的searchd实例就可以利用到全部的CPU或者核。