百度、垂直搜索(站内搜索)
搜索:通过一个关键词或一段描述,得到你想要的(相关度高)结果。
关系型数据库:性能差、不可靠、结果不准确(相关度低)
- 倒排索引的数据结构
- 包含这个关键词的 document list
- 关键词在每个 doc 中出现的次数 TF term frequency
- 关键词在整个索引中出现的次数 IDF inverse doc frequency
- 关键词在当前 doc 中出现的次数
- 每个 doc 的长度,越长相关度越低
- 包含这个关键词的所有 doc 的平均长度
- Lucene:jar 包,帮我们创建倒排索引,提供了复杂的 API
- 如果用 Lucene 做集群实现搜索,会有那些问题
- 节点一旦宕机,节点数据丢失,后果不堪设想,可用性差。
- 自己维护,麻烦(自己创建管理索引),单台节点的承载请求的能力是有限的,需要人工做负载(雨露均沾)。
- 分布式的搜索,存储和数据分析引擎:
- 优点:
- 面向开发者友好,屏蔽了 Lucene 的复杂特性,集群自动发现(cluster discovery)
- 自动维护数据在多个节点上的建立
- 会帮我做搜索请求的负载均衡
- 自动维护冗余副本,保证了部分节点宕机的情况下仍然不会有任何数据丢失
- ES 基于 Lucene 提供了很多高级功能:复合查询、聚合分析、基于地理位置等。
- 对于大公司,可以构建几百台服务器的大型分布式集群,处理PB级别数据;对于小公司,开箱即用,门槛低上手简单。
- 相遇传统数据库,提供了全文检索,同义词处理(美丽的 cls >漂亮的 cls),相关度排名。聚合分析以及海量数据的近实时(NTR)处理,这些传统数据库完全做不到。
- 应用领域:
- 百度(全文检索、高亮、搜索推荐)
- 各大网站的用户行为日志(用户点击、浏览、收藏、评论)
- BI(Business Intelligence商业智能),数据分析:数据挖掘统计。
- Github:代码托管平台,几千亿行代码
- ELK:Elasticsearch(数据存储)、Logstash(日志采集)、Kibana(可视化)
- cluster(集群):每个集群至少包含两个节点.
- node:集群中的每个节点,一个节点不代表一台服务器
- field:一个数据字段,与 index 和 type 一起,可以定位一个 doc
- document:ES 最小的数据单元 Json
- Type:逻辑上的数据分类,es 7.x 中删除了 type 的概念
- Index:一类相同或者类似的 doc,比如一个员工索引,商品索引。
- Shard分片:
- 一个 index 包含多个 Shard,默认 5P,默认每个 P 分配一个 R,P 的数量在创建索引的时候设置,如果想修改,需要重建索引。
- 每个 Shard 都是一个 Lucene 实例,有完整的创建索引的处理请求能力。
- ES 会自动在 nodes 上做 shard 均衡。
- 一个 doc 是不可能同时存在于多个 PShard 中的,但是可以存在于多个 RShard 中。
- P 和对应的 R 不能同时存在于同一个节点,所以最低的可用配置是两个节点,互为主备。
两个配置:node.master 和 node.data
-
node.master = true node.data = true
这是 ES 节点默认配置,既作为候选节点又作为数据节点,这样的节点一旦被选举为 Master,压力是比较大的,通常来说 Master 节点应该只承担较为轻量级的任务,比如创建删除索引,分片均衡等。
-
node.master = true node.data = false
只作为候选节点,不作为数据节点,可参选Master节点,当选后成为真正的Master节点。
-
node.master = false node.data = false
既不当候选节点,也不作为数据节点,那就是仅协调节点,负责负载均衡
-
node.master=false node.data=true
不作为候选节点,但是作为数据节点,这样的节点主要负责数据存储和查询服务。
节点类型
-
Master:主节点,每个集群都有且只有一个
尽量避免 Master 节点 node.data = true
-
voting:投票节点
Node.voting_only = true(仅投票节点,即使配置了data.master = true,也不会参选, 但是仍然可以作为数据节点)。
-
coordinating:协调节点
每一个节点都隐式的是一个协调节点,如果同时设置了 data.master = false 和 data.data=false,那么此节点将成为仅协调节点。
-
Master-eligible node(候选节点):
-
Data node(数据节点):
-
Ingest node:可以看作是数据前置处理转换的节点
-
Machine learning node(机器学习节点):
- ES 在分配单个索引的分片时会将每个分片尽可能分配到更多的节点上。但是,实际情况取决于集群拥有的分片和索引的数量以及它们的大小,不一定总是能均匀地分布。
- ES 不允许 Primary 和它的 Replica 放在同一个节点中,并且同一个节点不接受完全相同的两个 Replica。
- 同一个节点允许多个索引的分片同时存在。
- 每台节点的 Shard 数量越少,每个 shard 分配的 CPU、内存和 IO 资源越多,单个 Shard 的性能越好,当一台机器一个 Shard 时,单个 Shard 性能最好。
- **稳定的 Master 节点对于群集健康非常重要!**理论上讲,应该尽可能的减轻 Master 节点的压力,分片数量越多,Master 节点维护管理 shard 的任务越重,并且节点可能就要承担更多的数据转发任务,可增加“仅协调”节点来缓解 Master 节点和 Data 节点的压力,但是在集群中添加过多的仅协调节点会增加整个集群的负担,因为选择的主节点必须等待每个节点的集群状态更新确认。
- 反过来说,如果相同资源分配相同的前提下,shard 数量越少,单个 shard 的体积越大,查询性能越低,速度越慢,这个取舍应根据实际集群状况和结合应用场景等因素综合考虑。
- 数据节点和 Master 节点一定要分开,集群规模越大,这样做的意义也就越大。
- 数据节点处理与数据相关的操作,例如 CRUD,搜索和聚合。这些操作是 I/O,内存和 CPU 密集型的,所以他们需要更高配置的服务器以及更高的带宽,并且集群的性能冗余非常重要。
- 由于仅投票节不参与 Master 竞选,所以和真正的 Master 节点相比,它需要的内存和 CPU 较少。但是,所有候选节点以及仅投票节点都可能是数据节点,所以他们都需要快速稳定低延迟的网络。
- 高可用性(HA)群集至少需要三个主节点,其中至少两个不是仅投票节点。即使其中一个节点发生故障,这样的群集也将能够选举一个主节点。生产环境最好设置 3 台仅 Master 候选节点(node.master = true node.data = true)
- 为确保群集仍然可用,集群不能同时停止投票配置中的一半或更多节点。只要有一半以上的投票节点可用,群集仍可以正常工作。这意味着,如果存在三个或四个主节点合格的节点,则群集可以容忍其中一个节点不可用。如果有两个或更少的主机资格节点,则它们必须都保持可用