官术网_书友最值得收藏!

3.2.13 分發索引

為了實現分布式的搜索,需要把索引從一臺服務器備份到另外一臺服務器。最簡單的方法是:在生成索引的服務器上用tar命令壓縮索引目錄,然后在另外一臺搜索服務器上執行wget獲得壓縮成一個文件的索引。在Windows下,可以使用7-zip軟件中的7z壓縮格式備份正在寫入的索引。

當增加、修改索引時,Lucene索引文件一般不會發生太大的變化。優化索引時,索引文件才會有大的變化。所以,實際中可以通過只傳送修改的文件(也就是同步索引文件目錄)的方式實現索引分發。rsync(http://samba.anu.edu.au/rsync/)是一個開源的工具,提供了快速的增量文件傳輸功能。使用rsync可以保持主服務器中的索引目錄能夠定期同步到從服務器的索引目錄中。rsync支持通過SSH進行網絡加密傳輸,也可以利用SSH客戶端密鑰建立服務器之間的信任關系。當在兩臺服務器之間保持大型、復雜目錄結構同步的時候,使用rsync比tar或wget等方式都要快,而且可以做到精確同步。使用rsync的分布式垂直搜索架構如圖3-8所示。

圖3-8 分布式垂直搜索架構

rsync命令的基本形式如下:

        rsync [OPTION]... 來源地址路徑 目的地地址路徑

rsync可以通過兩種不同的方式連接一個遠程系統:使用一個遠程shell程序(例如ssh或rsh)作為中轉,或者通過TCP直接連接一個rsync守護進程。當地址路徑信息包含“::”分隔符時啟動服務器傳輸模式;當地址路徑包含單個冒號“:”分隔符時啟動遠程shell傳輸模式。

首先可以在主服務器和從服務器上都安裝最新的rsync軟件。rsync的編譯安裝非常簡單,只需要以下簡單的幾步:

        # ./configure
        # make
        # make install

然后用一個命令就可以一次性同步索引目錄:

        #rsync -ave ssh master:/home/index/ /home/index/

這個命令把遠端master機器上的/home/index/目錄中的內容同步到本地的/home/index/目錄下。

在創建索引的機器上,通過在rsync命令中聲明--daemon參數可以運行rsync守護進程。在索引機器上建立配置文件rsyncd.conf和密碼文件rsyncd.secrets。前臺搜索機器通過crontab定時運行rsync獲取最新的索引文件。

配置rsync守護進程的方法是修改/etc/rsyncd.conf并把rsync守護進程設置成自啟動方式。Linux中的大部分網絡服務都是由inetd啟動的,修改/etc/xinetd.d/rsync文件把其中的disable = yes改成disable = no。在/etc/目錄下建立配置文件rsyncd.conf。

        #cat /etc/rsyncd.conf


        use chroot = yes # 使用chroot
        max connections = 4 # 最大連接數為4
        pid file = /var/run/rsyncd.pid
        lock file = /var/run/rsync.lock
        log file = /var/log/rsyncd.log # 日志記錄文件


        [index] # 這里是認證的模塊名,在client端需要指定
        path = /home/index # 需要做鏡像的目錄
        auth users = index # 認證的用戶名
        uid = index
        gid = index
        secrets file = /etc/rsyncd.secrets  # 認證文件名
        read only = yes # 只讀

在/etc/目錄下建立配置文件rsyncd.secrets。rsyncd.secrets是rsyncd的密碼文件,保存有登錄Linux系統的用戶名和密碼。

        #cat /etc/rsyncd.secrets


        index:abcde # 用戶名index密碼abcde

然后配置客戶端。為了避免以交互的方式輸入密碼,大多使用密碼文件。也可以將兩臺服務器生成密鑰互相設為信任認證,這樣做的麻煩是程序不通用,而且每兩臺服務器都需要生成證書。假設密碼文件是rsyncd.secrets。

        #cat /home/index/rsyncd.secrets
        abcde

需要把密碼文件改為只有所屬人有權限。

        #chmod 600

把文件同步命令寫到一個可執行的腳本:

        #cat index_rsyncd.sh
        #! /bin/bash
        rsync -tvzrp --progress --password-file=/home/index/rsyncd.secrets --delete
        --exclude /home/index/logs index@master::index  /home/index/

通過crontab設定,讓這個腳本每10分鐘運行一次。

        #echo "0,10,20,30,40,50  index_rsyncd.sh">>/etc/crontab

為了實現搜索從服務器和索引主服務器的索引同步,在索引主服務器上,為索引做階段性的檢查點。每分鐘的時候,關閉IndexWriter,并且從Java中執行cp -lr index index.DATE命令,這里DATE是指當前時間。這樣通過構建硬連接樹,而不是制作完全的備份,就有效地制作了一個索引的備份。如果Lucene重寫了任何文件(例如segments文件),將會創建新的inode,而原來的備份不變。

在每個搜索從服務器上,定期檢查新的檢查點。當發現一個新的index.DATE時,使用cp -lr index index.DATE準備一份備份,然后使用rsync-W -delete master:index.DATE index.DATE得到增量的索引改變,最后使用原子性的符號連接操作安裝更新的索引 (ln -fsn index.DATE index)。

在從服務器上,當索引版本改變的時候將重新打開“index”。最好是在一個獨立的線程中定時檢查索引版本。當索引版本改變時,打開新的索引版本,執行一些熱門查詢操作,預加載Lucene緩存。然后在一個同步塊中,替換在線服務的Searcher變量。

在主索引服務器的一個crontab中,定時移走最舊的檢查點索引。

這樣可以實現每分鐘的同步,將主索引服務器上的mergeFactor設為2,以最小化產品中的segments數量。主服務器有一個熱備份。

當增加文檔到已經存在的索引庫時,會生成新的.cfs文件。這個文件需要全部傳輸(而不是差量傳輸),因為文件名改了。所以,為了使增量更新更有效率,盡量不要讓索引使用復合文件格式。

主站蜘蛛池模板: 栾城县| 锦屏县| 荆门市| 辽宁省| 万山特区| 和林格尔县| 炎陵县| 龙州县| 马鞍山市| 策勒县| 纳雍县| 灌阳县| 连云港市| 三门县| 玛沁县| 临潭县| 安平县| 同心县| 哈密市| 浠水县| 定州市| 宁海县| 临沂市| 加查县| 孟村| 独山县| 台山市| 怀来县| 丹凤县| 怀仁县| 墨竹工卡县| 江山市| 柘城县| 棋牌| 晋江市| 嘉荫县| 武汉市| 项城市| 陆良县| 唐山市| 甘肃省|