解密sphinx分布式索引

sphinx分佈式索引原理:

當searchd收到一個對分佈式索引的查詢時,它做如下操作:連接到遠程代理執行查詢(在遠程代理執行搜索的同時)對本地索引進行查詢接收來自遠程代理的搜索結果將所有結果合併,刪除重複項將合併後的結果返回給客戶端。在應用程序看來,普通索引和分佈式索引完全沒有區別。任一個searchd實例可以同時做為主控端(master,對搜索結果做聚合)和從屬端(只做本地搜索)。這有如下幾點好處:

1. 集群中的每臺機器都可以做為主控端來搜索整個集群,搜索請求可以在主控端之間獲得負載平衡,相當於實現了一種HA(high availability,高可用性),可以應對某個節點失效的情況。

2. 如果在單臺多CPU或多核機器上使用,一個做為代理對本機進行搜索的searchd實例就可以利用到全部的CPU或者核。更好的HA支持已在計劃之中,到時將允許指定哪些代理之間互相備份、有效性檢查、跟蹤運行中的代理、對檢索請求進行負載均衡,等等。

sphinx分佈式索引配置:

index dist1{ # local index to be searched # there can be many local indexes configured local = test1 local = test1stemmed # remote agent # multiple remote agents may be specified # syntax for TCP connections is 'hostname:port:index1,[index2[,...]]' # syntax for local UNIX connections is '/path/to/socket:index1,[index2[,...]]' agent = localhost:9313:remote1 agent = localhost:9314:remote2,remote3 # agent = /var/run/searchd.sock:remote4 # blackhole remote agent, for debugging/testing # network errors and search results will be ignored # agent_blackhole = testbox:9312:testindex1,testindex2 # remote agent connection timeout, milliseconds # optional, default is 1000 ms, ie. 1 sec agent_connect_timeout = 1000 # remote agent query timeout, milliseconds # optional, default is 3000 ms, ie. 3 sec agent_query_timeout = 3000}

原理和配置還是比較簡單的,對於索引文件過大的情況,分佈式索引非常有用。但是碰到搜索量非常大的時候,分佈式索引就顯得力不從心了。這個時候就需要做索引複製了。索引複製同步的問題一般採用的方案有兩種。

第一種方案是主從同步。有一個主搜索服務器和多個從搜索服務器。在主搜索服務器上生成的增量索引會同步從索引服務器。從而達到主從同步。為了避免網絡或者其他情況導致的增量索引不同步的情況,需要定期在一個階段把主從服務器的主索引同步一次。新增加搜索服務器的話需要在增量索引生成的間隔數據去拷貝其他搜索服務器的主索引。

第二種方案是每個搜索服務器根據增量數據去生成增量索引。通過表來記錄不同的搜索服務器是否生成增量索引。來達到同步的目的。新增加搜索服務器的話,就需要去比歷史上所有的增量數據全部生成一遍。

這兩種策略都是可行的。增量數據在一定時間段量很大的話建議用第一種方案,否則用第二種方案。


分享到:


相關文章: