随着索引数据的增大以及请求的增多,分布式搜索是最好的一种解决方案,主要解决两个问题,其一是能让单台机器load所有索引数据到内存中,其二是请求延时大,解决请求latency问题。我之前为团队写了篇专利,内容是关于分布式搜索解决方案的,所以粗略的看了下大部分开源的搜索引擎是怎么实现分布式的,后面的文章我会简单说下常见的搜索引擎的分布式解决方案。
首先我们先说下几个简单概念,分布式搜索都是M*N(横向切分数据,纵向切分流量)这个维度去解决问题的,虽然不同产品或场景概念不完全相同,读者可以简单认为一份完整的数据,被均分为M份,每一份被称为一个分配(Shard或者Partition),然后提供对每个Shard提供N份副本(Replica)。那么分布式的设计就围绕着以下问题:
- 如何选择合适的分片(Shard),副本(Replica)的数量
- 如何做路由,即怎么在所有Shard里找到一份完整的数据(找到对应的机器列表)
- 如何做负载均衡
- 如果提高服务的可扩展性
- 如何提高服务的服务能力(QPS),当索引和搜索并发量增大时,如何平滑解决
- 如何更新索引,全量和增量索引的更新解决方法
- 如果提高服务的稳定性,单台服务挂掉怎么不影响整体服务等等
下面就说下常见的搜索引擎的分布式解决方案,因为开源的搜索产品基本上都没有在工作中用过,对代码细节并不是太了解,只是研究了下其原理,所以理解的会有些偏差,看官们如果发现错误直接指出即可。