<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    jinfeng_wang

    G-G-S,D-D-U!

    BlogJava 首頁 新隨筆 聯系 聚合 管理
      400 Posts :: 0 Stories :: 296 Comments :: 0 Trackbacks
    http://blog.s135.com/post/385/
    http://blog.s135.com/post/360/


    曾經在七月,寫過一篇文章──《基于Sphinx+MySQL的千萬級數據全文檢索(搜索引擎)架構設計》,前公司的分類信息搜索基于此架構,效果明顯,甚至將很大一部分帶Where條件的MySQL SQL查詢,都改用了Sphinx+MySQL搜索。但是,這套架構仍存在局限:一是MySQL本身的并發能力有限,在200~300個并發連接下,查詢和更新就比較慢了;二是由于MySQL表的主鍵與Sphinx索引的ID一一對應,從而無法跨多表建立整站查詢,而且新增加類別還得修改配置文件,比較麻煩;三是因為和MySQL集成,無法發揮出Sphinx的優勢。

      最近,我設計出了下列這套最新的搜索引擎架構,目前已經寫出“搜索查詢接口”和“索引更新接口”的beta版。經測試,在一臺“奔騰四 3.6GHz 雙核CPU、2GB內存”的普通PC機,7000萬條索引記錄的條件下,“搜索查詢接口”平均查詢速度為0.0XX秒(查詢速度已經達到百度、谷歌、搜狗、中國雅虎等搜索引擎的水平,詳見文章末尾的“附2”),并且能夠支撐高達5000的并發連接;而“索引更新接口”進行數據分析、入隊列、返回信息給用戶的全過程,高達1500 Requests/Sec。

      “隊列控制器”這一部分是核心,它要控制隊列讀取,更新MySQL主表與增量表,更新搜索引擎數據存儲層Tokyo Tyrant,準實時(1分鐘內)完成更新Sphinx增量索引,定期合并Sphinx索引。我預計在這周寫出beta版。

    點擊在新窗口中瀏覽此圖片

      圖示說明:
      1、搜索查詢接口:
      ①、Web應用服務器通過HTTP POST/GET方式,將搜索關鍵字等條件,傳遞給搜索引擎服務器的search.php接口;
      ②③、search.php通過Sphinx的API(我根據最新的Sphinx 0.9.9-rc1 API,改寫了一個C語言的PHP擴展sphinx.so),查詢Sphinx索引服務,取得滿足查詢條件的搜索引擎唯一ID(15位搜索唯一ID:前5位類別ID+后10位原數據表主鍵ID)列表;
      ④⑤、search.php將這些ID號作為key,通過Memcache協議一次性從Tokyo Tyrant中mget取回ID號對應的文本數據。
      ⑥⑦、search.php將搜索結果集,按查詢條件,進行摘要和關鍵字高亮顯示處理,以JSON格式或XML格式返回給Web應用服務器。

      2、索引更新接口:
      ⑴、Web應用服務器通過HTTP POST/GET方式,將要增加、刪除、更新的內容告知搜索服務器的update.php接口;
      ⑵、update.php將接收到的信息處理后,寫入TT高速隊列(我基于Tokyo Tyrant做的一個隊列系統);
      注:這兩步的速度可達到1500次請求/秒以上,可應對6000萬PV的搜索索引更新調用。

      3、搜索索引與數據存儲控制:
      ㈠、“隊列控制器”守護進程從TT高速隊列中循環讀取信息(每次50條,直到末尾);
      ㈡、“隊列控制器”將讀取出的信息寫入搜索引擎數據存儲層Tokyo Tyrant;
      ㈢、“隊列控制器”將讀取出的信息異步寫入MySQL主表(這張主表按500萬條記錄進行分區,僅作為數據永久性備份用);
      ㈣、“隊列控制器”將讀取出的信息寫入MySQL增量表;
      ㈤、“隊列控制器”在1分鐘內,觸發Sphinx更新增量索引,Sphinx的indexer會將MySQL增量表作為數據源,建立增量索引。Sphinx的增量索引和作為數據源的MySQL增量表成對應關系;
      ㈥、“隊列控制器”每間隔3小時,短暫停止從TT高速隊列中讀取信息,并觸發Sphinx將增量索引合并入主索引(這個過程非常快),同時清空MySQL增量表(保證了MySQL增量表的記錄數始終只有幾千條至幾十萬條,大大加快Sphinx增量索引更新速度),然后恢復從TT高速隊列中取出數據,寫入MySQL增量表。

      本架構使用的開源軟件:
      1、Sphinx 0.9.9-rc1
      2、Tokyo Tyrant 1.1.9
      3、MySQL 5.1.30
      4、Nginx 0.7.22
      5、PHP 5.2.6

      本架構自主研發的程序:
      1、搜索查詢接口(search.php)
      2、索引更新接口(update.php)
      3、隊列控制器
      4、Sphinx 0.9.9-rc1 API的PHP擴展(sphinx.so)
      5、基于Tokyo Tyrant的高速隊列系統





    在DELL PowerEdge 6850服務器(四顆64 位Inter Xeon MP 7110N處理器 / 8GB內存)、RedHat AS4 Linux操作系統、MySQL 5.1.26、MyISAM存儲引擎、key_buffer=1024M環境下實測,單表1000萬條記錄的數據量(這張MySQL表擁有int、datetime、varchar、text等類型的10多個字段,只有主鍵,無其它索引),用主鍵(PRIMARY KEY)作為WHERE條件進行SQL查詢,速度非常之快,只耗費0.01秒。

      出自俄羅斯的開源全文搜索引擎軟件Sphinx,單一索引最大可包含1億條記錄,在1千萬條記錄情況下的查詢速度為0.x秒(毫秒級)。Sphinx創建索引的速度為:創建100萬條記錄的索引只需3~4分鐘,創建1000萬條記錄的索引可以在50分鐘內完成,而只包含最新10萬條記錄的增量索引,重建一次只需幾十秒。

      基于以上幾點,我設計出了這套搜索引擎架構。在生產環境運行了一周,效果非常不錯。有時間我會專為配合Sphinx搜索引擎,開發一個邏輯簡單、速度快、占用內存低、非表鎖的MySQL存儲引擎插件,用來代替MyISAM引擎,以解決MyISAM存儲引擎在頻繁更新操作時的鎖表延遲問題。另外,分布式搜索技術上已無任何問題。



      一、搜索引擎架構設計:
      1、搜索引擎架構圖:
      點擊在新窗口中瀏覽此圖片

      2、搜索引擎架構設計思路:
      (1)、調用方式最簡化:
      盡量方便前端Web工程師,只需要一條簡單的SQL語句“SELECT ... FROM myisam_table JOIN sphinx_table ON (sphinx_table.sphinx_id=myisam_table.id) WHERE query='...';”即可實現高效搜索。

      (2)、創建索引、查詢速度快:
      ①、Sphinx Search 是由俄羅斯人Andrew Aksyonoff 開發的高性能全文搜索軟件包,在GPL與商業協議雙許可協議下發行。
      Sphinx的特征:
      •Sphinx支持高速建立索引(可達10MB/秒,而Lucene建立索引的速度是1.8MB/秒)
      •高性能搜索(在2-4 GB的文本上搜索,平均0.1秒內獲得結果)
      •高擴展性(實測最高可對100GB的文本建立索引,單一索引可包含1億條記錄)
      •支持分布式檢索
      •支持基于短語和基于統計的復合結果排序機制
      •支持任意數量的文件字段(數值屬性或全文檢索屬性)
      •支持不同的搜索模式(“完全匹配”,“短語匹配”和“任一匹配”)
      •支持作為Mysql的存儲引擎

      ②、通過國外《High Performance MySQL》專家組的測試可以看出,根據主鍵進行查詢的類似“SELECT ... FROM ... WHERE id = ...”的SQL語句(其中id為PRIMARY KEY),每秒鐘能夠處理10000次以上的查詢,而普通的SELECT查詢每秒只能處理幾十次到幾百次:
      點擊在新窗口中瀏覽此圖片

      ③、Sphinx不負責文本字段的存儲。假設將數據庫的id、date、title、body字段,用sphinx建立搜索索引。根據關鍵字、時間、類別、范圍等信息查詢一下sphinx,sphinx只會將查詢結果的ID號等非文本信息告訴我們。要顯示title、body等信息,還需要根據此ID號去查詢MySQL數據庫,或者從Memcachedb等其他的存儲中取得。安裝SphinxSE作為MySQL的存儲引擎,將MySQL與Sphinx結合起來,是一種便捷的方法。
      創建一張Sphinx類型表,將MyISAM表的主鍵ID和Sphinx表的ID作一個JOIN聯合查詢。這樣,對于MyISAM表來所,只相當于一個WHERE id=...的主鍵查詢,WHERE后的條件都交給Sphinx去處理,可以充分發揮兩者的優勢,實現高速搜索查詢。

      (3)、按服務類型進行分離:
      為了保證數據的一致性,我在配置Sphinx讀取索引源的MySQL數據庫時,進行了鎖表。Sphinx讀取索引源的過程會耗費一定時間,由于MyISAM存儲引擎的讀鎖和寫鎖是互斥的,為了避免寫操作被長時間阻塞,導致數據庫同步落后跟不上,我將提供“搜索查詢服務”的和提供“索引源服務”的MySQL數據庫進行了分開。監聽3306端口的MySQL提供“搜索查詢服務”,監聽3406端口的MySQL提供“索引源服務”。

      (4)、“主索引+增量索引”更新方式:
      一般網站的特征:信息發布較為頻繁;剛發布完的信息被編輯、修改的可能性大;兩天以前的老帖變動性較小。
      基于這個特征,我設計了Sphinx主索引和增量索引。對于前天17:00之前的記錄建立主索引,每天凌晨自動重建一次主索引;對于前天17:00之后到當前最新的記錄,間隔3分鐘自動重建一次增量索引。

      (5)、“Ext3文件系統+tmpfs內存文件系統”相結合:
      為了避免每3分鐘重建增量索引導致磁盤IO較重,從而引起系統負載上升,我將主索引文件創建在磁盤,增量索引文件創建在tmpfs內存文件系統“/dev/shm/”內。“/dev/shm/”內的文件全部駐留在內存中,讀寫速度非常快。但是,重啟服務器會導致“/dev/shm/”內的文件丟失,針對這個問題,我會在服務器開機時自動創建“/dev/shm/”內目錄結構和Sphinx增量索引。

      (6)、中文分詞詞庫:
      我根據“自整理的中文分詞庫”+“搜狗拼音輸入法細胞詞庫”+“LibMMSeg高頻字庫”+... 綜合整理成一份中文分詞詞庫,出于某些考慮暫不提供。你可以使用LibMMSeg自帶的中文分詞詞庫。
    posted on 2010-04-15 16:35 jinfeng_wang 閱讀(1855) 評論(0)  編輯  收藏 所屬分類: ZZwebsite
    主站蜘蛛池模板: 久久狠狠躁免费观看| 99久久精品毛片免费播放| 亚洲一区二区三区久久| 一区二区亚洲精品精华液| 蜜臀亚洲AV无码精品国产午夜.| 色偷偷亚洲第一综合网| 四虎影视在线永久免费看黄| 久久久久久亚洲精品| 亚洲专区一路线二| 成人浮力影院免费看| 亚洲高清无码综合性爱视频| 亚洲AV日韩AV永久无码绿巨人| 无码免费一区二区三区免费播放| 午夜一级免费视频| 亚洲精品美女久久777777| 亚洲欧美成人综合久久久| 18女人毛片水真多免费| 亚洲国产成人久久综合野外| av成人免费电影| 黄a大片av永久免费| 久久亚洲精品无码网站| 特级做A爰片毛片免费69 | 国产精品成人免费视频网站京东| 亚洲一级特黄大片在线观看| 亚洲精品天堂在线观看| 最近免费中文在线视频| 国产精品无码亚洲一区二区三区| 亚洲国产专区一区| 色婷婷综合缴情综免费观看| 无码国产精品一区二区免费式直播 | 中文字幕无码免费久久99 | 日本视频在线观看永久免费| 亚洲国产美女精品久久久久| 久久99精品视免费看| 亚洲精品无码一区二区 | 亚洲欧洲国产精品香蕉网| 特级做a爰片毛片免费看| 亚洲欧洲在线观看| 免费91最新地址永久入口| 国产亚洲色婷婷久久99精品| 无码国产精品一区二区免费虚拟VR|