百度如何能搜出五分鐘之前的網(wǎng)頁?
產(chǎn)品提了一個需求:檢索的時效性,對用戶體驗來說很重要,必須檢索出5分鐘之前的新聞,1秒鐘之前發(fā)布的帖子,不復(fù)雜吧?
百度為何能實時檢索出5分鐘之前新出的新聞?同城為何能實時檢索出1秒鐘之前發(fā)布的帖子?

實時搜索引擎系統(tǒng)架構(gòu)的要點是什么?
大數(shù)據(jù)量、高并發(fā)量情況下的搜索引擎為了保證實時性,架構(gòu)設(shè)計上的兩個要點:
- 索引分級;
- dump&merge;
首先,在數(shù)據(jù)量非常大的情況下,為了保證倒排索引的高效檢索效率,任何對數(shù)據(jù)的更新,并不會實時修改索引。
畫外音:因為,一旦產(chǎn)生碎片,會大大降低檢索效率。
既然索引數(shù)據(jù)不能實時修改,如何保證最新的網(wǎng)頁能夠被索引到呢?
索引分級,分為全量庫、日增量庫、小時增量庫。

如上圖所述:
- 300億數(shù)據(jù)在全量索引庫中;
- 1000萬1天內(nèi)修改過的數(shù)據(jù)在天庫中;
- 50萬1小時內(nèi)修改過的數(shù)據(jù)在小時庫中;
當(dāng)有修改請求發(fā)生時,只會操作最低級別的索引,例如小時庫。

當(dāng)有查詢請求發(fā)生時,會同時查詢各個級別的索引,將結(jié)果合并,得到最新的數(shù)據(jù):
- 全量庫是緊密存儲的索引,無碎片,速度快;
- 天庫是緊密存儲,速度快;
- 小時庫數(shù)據(jù)量小,速度也快;
分級索引能夠保證實時性,那么,新的問題來了:
小時庫數(shù)據(jù)何時反映到天庫中,天庫中的數(shù)據(jù)何時反映到全量庫中呢?
dump&merge,索引的導(dǎo)出與合并,由這兩個異步的工具完成:

- dumper:將在線的數(shù)據(jù)導(dǎo)出。
- merger:將離線的數(shù)據(jù)合并到高一級別的索引中去。
小時庫,一小時一次,合并到天庫中去;
天庫,一天一次,合并到全量庫中去;
這樣就保證了小時庫和天庫的數(shù)據(jù)量都不會特別大;
如果數(shù)據(jù)量和并發(fā)量更大,還能增加星期庫,月庫來緩沖。
簡單小結(jié)一下
超大數(shù)據(jù)量,超高并發(fā)量,實時搜索引擎的兩個架構(gòu)要點:
- 索引分級;
- dump&merge;
知其然,知其所以然。
思路比結(jié)論更重要。































