Elasticsearch是一个强大的分布式搜索引擎广泛应用于全文检索日志分析监控等场景。

现在越来越多的公司都在用Elasticsearch。掌握Elasticsearch已经成为后端工程师的一项重要技能。

但是Elasticsearch的学习曲线比较陡。特别是集群部分涉及到分布式的各种概念很多人不知道从哪里开始学也不知道怎么学才能高效入门。

我最开始学Elasticsearch的时候,也是一头雾水走了很多弯路。后来慢慢摸索出了一条学习路线才逐渐入门。

今天想分享一下我学习Elasticsearch集群的路线和经验。希望能帮大家少走弯路快速入门。

一、我的学习背景

先说说我的学习背景。

我是做后端开发的平时主要用Java和PHP。之前,对搜索技术了解不多只知道Lucene是一个搜索引擎库,但是没实际用过。

后来公司要做一个全文检索的功能需要用Elasticsearch。领导把这个任务交给了我。

于是我就开始了Elasticsearch的学习之路。

最开始我以为Elasticsearch就是一个数据库存数据查数据应该很简单。但是真正开始学之后,才发现完全不是,那么回事。

Elasticsearch的概念很多索引类型文档分片副本节点集群等等一大堆。而且集群的配置和维护也很复杂。

我最开始走了很多弯路,比如一上来就看官方文档结果看了半天也看不懂。比如一上来就搭集群结果各种问题搞不定。

后来我慢慢调整了学习方法按照一条循序渐进的路线来学才逐渐入门。

二、学习路线

下面是我总结的Elasticsearch集群学习路线分为五个阶段。

第一阶段:基础概念

第一阶段先搞清楚Elasticsearch的基础概念。

不要一上来就搭集群写代码。先把概念搞清楚不,然后面会很痛苦。

需要掌握的基础概念包括:

  1. 什么是Elasticsearch:它是一个分布式的搜索引擎基于Lucene构建提供RESTful API支持全文检索结构化搜索分析等。
  2. 索引(Index):索引是具有相同属性的文档的集合类似关系型数据库中的数据库。
  3. 类型(Type):类型是索引下的一个逻辑分类类似关系型数据库中的表。注意Elasticsearch 6.x之后,一个索引只能有一个类型7.x之后,类型被移除了。
  4. 文档(Document):文档是Elasticsearch中存储的基本单元类似关系型数据库中的一行记录用JSON格式表示。
  5. 字段(Field):字段是文档中的属性类似关系型数据库中的列。
  6. 分片(Shard):分片是索引的子集一个索引可以分成多个分片分布在不同的节点上。分片分为主分片和副分片。
  7. 副本(Replica):副本是主分片的拷贝用于故障转移和,提高查询性能。
  8. 节点(Node):节点是Elasticsearch集群中的一个实例一台服务器上可以运行一个或多个节点。
  9. 集群(Cluster):集群是由多个节点组成的分布式系统共同提供索引和,搜索功能。

这些概念一定要搞清楚不,然后面学集群的时候,会很懵。

第二阶段:单机安装和基本操作

第二阶段在本地安装Elasticsearch做一些基本的操作。

不要一上来就搭集群先把单机玩熟。

需要掌握的内容包括:

  1. 安装Elasticsearch:下载Elasticsearch解压运行bin/elasticsearch启动。
  2. 安装Kibana:Kibana是Elasticsearch的可视化工具提供了Dev Tools可以方便地执行RESTful API。
  3. 基本的RESTful API

- 创建索引:PUT /indexname - 删除索引:DELETE /indexname - 查看索引:GET /indexname - 插入文档:PUT /indexname/type/id {"field": "value"} - 查询文档:GET /indexname/type/id - 更新文档:POST /indexname/type/id/update {"doc": {"field": "newvalue"}} - 删除文档:DELETE /index_name/type/id

  1. 批量操作:_bulk API批量插入更新删除文档。
  2. 映射(Mapping):定义索引中字段的类型和属性。比如textkeywordintegerdate等等。
  3. 基本查询

- match查询:全文检索 - term查询:精确匹配 - range查询:范围查询 - bool查询:组合查询mustshouldmust_not

把这些基本操作练熟了对Elasticsearch就有了基本的感觉。

第三阶段:高级查询和分析

第三阶段学习高级查询和分析功能。

这部分是Elasticsearch的核心也是最常用的。

需要掌握的内容包括:

  1. 高级查询

- matchphrase:短语查询 - multimatch:多字段查询 - wildcard:通配符查询 - regexp:正则查询 - fuzzy:模糊查询 - nested:嵌套查询 - haschild/hasparent:父子查询

  1. 聚合(Aggregation)

- terms聚合:分组统计 - sum/min/max/avg:数值统计 - date_histogram:时间直方图 - range聚合:范围聚合 - nested聚合:嵌套聚合

  1. 分析器(Analyzer)

- 什么是分析器:分词过滤的组件 - 内置分析器:standardsimplewhitespacelanguage等等 - 自定义分析器:自定义tokenizerfilter - 中文分词:IK分词器jieba等等

  1. 高亮(Highlight):查询结果中高亮匹配的关键词。
  2. 排序(Sort):按指定字段排序。
  3. 分页(From/Size):查询结果分页。
  4. 搜索模板(Search Template):复用查询模板。

这部分内容比较多需要多练习多实践。

第四阶段:集群搭建和配置

第四阶段才开始学习集群搭建和配置。

这是重点也是难点。

需要掌握的内容包括:

  1. 集群架构

- 主节点(Master Node):负责集群管理索引创建删除节点加入离开等等。 - 数据节点(Data Node):负责存储数据执行查询和索引操作。 - 协调节点(Coordinating Node):负责接收请求转发到对应节点汇总结果。 - 摄取节点(Ingest Node):负责数据入库前的预处理。

  1. 集群搭建

- 多机集群:多台服务器各运行一个节点组成集群。 - 单机多节点:一台服务器运行多个节点组成集群用于测试。 - 配置文件:elasticsearch.yml配置集群名节点名节点角色网络发现等等。

  1. 分片和副本

- 主分片数:索引创建时指定不能修改。 - 副本数:可以动态修改。 - 分片分配:Elasticsearch自动把分片分配到不同的节点上。

  1. 集群健康

- green:所有主分片和副分片都正常。 - yellow:所有主分片正常部分副分片不正常。 - red:部分主分片不正常。

  1. 节点发现

- 单播发现(unicast):配置一组主机列表节点通过这些主机发现集群。 - Zen Discovery:Elasticsearch的发现机制。

  1. 脑裂问题

- 什么是脑裂:网络分区导致集群分裂成多个主节点。 - 如何避免:配置discovery.zen.minimummasternodes一般设为(主节点数/2)+1。

  1. 集群扩容和缩容

- 扩容:增加节点Elasticsearch自动迁移分片。 - 缩容:移除节点先排除节点等待分片迁移完成再关闭。

这部分需要实际动手搭集群多实验才能真正理解。

第五阶段:性能优化和运维

第五阶段学习性能优化和运维。

这是进阶内容需要一定的经验积累。

需要掌握的内容包括:

  1. 索引性能优化

- 批量写入:用bulk批量插入数据。 - 刷新间隔:调整refreshinterval写入密集时调大。 - 副本数:写入时临时关闭副本写完再打开。 - 事务日志:调整translog配置。

  1. 查询性能优化

- 路由:用routing把相关文档存到同一个分片。 - 过滤上下文:用filter代替must利用缓存。 - 字段数据:避免对text字段做聚合排序。 - 分页深度:避免深度分页用search_after。

  1. 集群监控

- 集群健康:cluster/health - 节点状态:nodes/stats - 索引状态:stats - 任务管理:tasks - 用Kibana Monitoring或者,ElasticHQCerebro等工具监控。

  1. 备份和恢复

- 快照仓库:配置共享文件系统S3HDFS等仓库。 - 创建快照:snapshot/repo/snapshot - 恢复快照:snapshot/repo/snapshot/_restore

  1. 常见问题排查

- 集群不健康:检查分片分配节点状态。 - 查询慢:检查查询语句索引映射集群负载。 - 写入慢:检查批量大小刷新间隔磁盘IO。 - OOM:检查JVM内存配置字段数据缓存查询负载。

这部分需要在实际项目中积累经验遇到的问题越多成长越快。

三、学习资源推荐

除了学习路线再推荐一些学习资源。

1. 官方文档:Elasticsearch的官方文档写得很详细是最好的学习资料。虽然是英文的,但是要坚持看。

2. 《Elasticsearch权威指南》:虽然有点老了,但是基础概念讲得很清楚适合入门。

3. 《Elasticsearch实战》:比较新的书有很多实战案例适合进阶。

4. Elasticsearch官方博客:有很多技术文章和,最佳实践值得关注。

5. GitHub上的开源项目:看别人怎么用Elasticsearch能学到很多。

6. 技术社区:Elastic中文社区Stack Overflow等等遇到问题可以去搜,或者问。

四、学习建议

最后给一些学习建议。

1. 多动手多实践:Elasticsearch是实践性很强的技术光看不练是学不会的。一定要多动手搭环境写代码做实验。

2. 循序渐进:不要一上来就学集群学高级特性。按照学习路线循序渐进先把基础打牢。

3. 理解原理:不要只会用API要理解背后的原理。比如分片是怎么工作的查询是怎么执行的集群是怎么选举的等等。理解了原理才能更好地使用和排错。

4. 做笔记:学习过程中要多做笔记把学到的东西整理下来。这样以后忘了可以翻笔记快速回忆。

5. 不要怕踩坑:学习Elasticsearch肯定会踩很多坑。不要怕踩坑每踩一个坑都是一次成长。把踩过的坑记录下来以后就不会再踩了。

五、写在最后

以上就是我学习Elasticsearch集群的路线和经验。

Elasticsearch确实不容易学概念多配置复杂集群维护也不简单。但是,只要按照正确的路线循序渐进多动手多实践一定能入门,并且逐渐精通。

我自己也是从一无所知慢慢学过来的。现在,虽然不敢说精通,但是基本的集群搭建配置维护性能优化都能独立完成。

希望我的这些经验能帮大家少走弯路快速入门Elasticsearch。

最后用一句话结束这篇文章:"Elasticsearch学习之路漫漫,但是,只要坚持就一定能看到风景。"

愿大家都能学好Elasticsearch成为搜索技术的高手。