我所在的就是search group。听Randy讲这一段的时候还是理解的不错的。同样的,从功能切分和横向扩展两个方面来谈Search Engine的Partition。
- Functional Segmentation
Search是个read only的操作,所以search这一块是从transaction databases中独立出来的。
Read-only search function decoupled from write-intensive transactional databases .
- Horizontal Split
搜索引擎内部也必须做Horizontal Split的:
- Search index divided into grid of N slices (“columns”) by modulo of a key.
- Each slice is replicated to M instances (“rows”).
- Aggregator parallelizes query to one node in each column, aggregates results.
我们知道在搜索引擎中,索引是很重要的,但是eBay有那么多的物品,包含所有物品的Index根本没有办法放进一台机器里面。所以我们只能把完整的很大的索引切分成small chunks。每一个index chunk放到一个"column"里面。而每个column里面都有很多rows,一个col里面的一个row就是一个搜索节点,同一个column里面的搜索节点都是完全一样的。
当我们的Index变大的时候,我们可以使用更多的Partition,也就是更多的Column。当我们要servef更多的traffic,或者更多耗资源的Query的时候,我们可以在每个Column里面加入更多的row。
对用户来说,他看到的是一个搜索引擎,而不是N个Column,为了返回用户完整的搜索结果(因为每个Column只能返回1/N的结果),所以注意到上面图上有一种叫aggregator的组件。外部的query先到aggregator, aggregator把query送到每一个Column,当然每个Column里面只有一个节点server query(The aggregator send this query to one machine each of the columns),然后每个column里面server query的那个节点把结果返回给aggregator,aggregator把所有column返回的信息收集起来,汇总后返回用户。
我想不单单eBay是这样的,Google也一样。关于Google的架构,这里我提供两篇文章,有兴趣的同学可以看看:
- The Anatomy of a Large-Scale Hypertextual Web Search Engine
- WEB SEARCH FOR A PLANET:THE GOOGLE CLUSTER ARCHITECTURE
在现场,有位同事问了一个非常好的问题,事实上,我在平时做Production Support的时候也碰到过这样的问题:
Question:
Aggregator使得Partition 成N份(暂且假设N=20)的index看起来像一个完整的index。但是从网络上来讲,当一个query到达的时候,aggregator需要连接所有的Column,也就是说当N=20的时候,对于一个Query,aggregator会打开20个不同的network port。如果Traffic很高的情况下,Aggregator会不会因为打开了太多的network port而导致资源耗尽?
[非常经典,大家想想-:)]