億級數據的高並發通用搜索引擎架構設計


最新的搜索引擎架構,目前已經寫出“搜索查詢接口”和“索引更新接口”的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的高速隊列系統


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM