coreseek(sphinx)分布式设置
sphinx默认是单线程的,无论你是多少核的服务器,它始终只会使用一个核心。 有两个办法可以实现sphinx多核利用,两种都是使用sphinx的分布式设置。
1. 使用agent,远程索引声明
- 建立一个分布式索引,这个索引不会用来存储数据,只是用来合并查询数据,提供客户端调用而已
- 设置分布式索引的type=distributed
- 将local属性指向自身就行,这里就是dist
- agent执行独立运行的searchd进程,可以是本机的,也可以在其它机器上面运行,不过注意的是agent的数据源必须相同,否则无法合并。
- agent的数据源是我们采用一定的算法将一个数据源拆分成积分,如id取模或者是其它方式。
- 客户端进行搜索的时候就直接使用dist索引进程查询就行了。
index dist { type = distributed local = chunk1 agent = localhost:9312:chunk2 agent = localhost:9312:chunk3 agent = localhost:9312:chunk4 }
2. 使用local,本地索引声明
- 严格来说不算是分布式,只是多线程搜索
- coreseek4.1的手册上面明确的写着“全部本地索引会被依次搜索,仅使用1个CPU或核。”。
-
不过手册中没有翻译的文档中有一个dist_threads参数,这个参数指明并发查询现场数,里面写到,从sphinx-2.0.1-bata(coreseek4.1正是基于这个版本的sphinx)开始就可以使用了,它指明以多少个线程的方式去查询索引,线程数最好和索引数相同(不包括聚合索引,这里就是dist_test)。这里可以这样配置:
index dist_test { type = distributed local = chunk1 local = chunk2 local = chunk3 local = chunk4 } #... dist_threads = 4
-
这里的chunk1 - chunk4正是我们配置的多个索引,需要在同一份配置文件中配置,它们的数据源也是和上文一样的方式从一个数据源中拆分出来的。 可以参考这篇文章。
coreseek4.1 基于sphinx-2.0.1-bata,其多线程查询支持可能并不完善,可能我们需要升级更高版本的sphinx才能更好的支持这一特性(我在虚拟机上面配置,似乎就没有启用多线程)。
而且基于数据源拆分实现的分布式,可能会有一些隐患,需要我们仔细分析。 如果想实现比较完美的分布式搜索引擎可能solr,elasticsearch这些为分布式而生的搜索引擎会更符合我们的需要。