10分钟快速入门海量数据搜索引擎Elasticsearch

作者:jeremyshi , 腾讯 TEG 后台开发工程师
1. 背景随着移动互联网、物联网、云计算等信息技术蓬勃发展 , 数据量呈爆炸式增长 。如今我们可以轻易得从海量数据里找到想要的信息 , 其中离不开搜索引擎技术的帮助 。特别是其中的索引、检索和排序机制 , 我们无需深入了解背后复杂的信息检索原理 , 即可实现基本的全文检索功能 。数据量达到十亿 , 百亿规模仍然可以秒级返回检索结果 。对于系统容灾、数据安全性、可扩展性、可维护性等我们关注的实际问题 , 在开源搜索引擎领域排名第一的 Elasticsearch 里均能得到有效解决 。
2. Elasticsearch 介绍Elasticsearch(ES)是一个基于 Lucene 构建的开源分布式搜索分析引擎 , 可以近实时的索引、检索数据 。具备高可靠、易使用、社区活跃等特点 , 在全文检索、日志分析、监控分析等场景具有广泛应用 。由于高可扩展性 , 集群可扩展至百节点规模 , 处理 PB 级数据 。通过简单的 RESTful API 即可实现写入、查询、集群管理等操作 。除了检索 , 还提供丰富的统计分析功能 。以及官方功能扩展包 XPack 满足其他需求 , 如数据加密、告警、机器学习等 。另外 , 可通过自定义插件 , 如 COS 备份、QQ 分词等满足特定功能需求 。下面主要介绍 ES 的架构以及基本原理 。
2.1 Elasticsearch 架构与原理

10分钟快速入门海量数据搜索引擎Elasticsearch

文章插图
Elasticsearch集群
基本概念 :
  • Cluster「集群」:由部署在多个机器的 ES 节点组成 , 以处理较大数据集和实现高可用 。
  • Node「节点」:机器上的 ES 进程 , 可配置不同类型的节点 。
  • Master Node「主节点」:用于集群选主 。由其中一个节点担任主节点 , 负责集群元数据管理 , 如索引创建 , 节点离开加入集群等 。
  • Data Node「数据节点」:负责索引数据存储 。
  • Index「索引」:索引数据的逻辑集合 , 可类比关系型数据的 DataBase 。
  • Shard「分片」:索引数据子集 , 通过将分片分配至集群不同节点 , 实现数据横向扩展 。以解决单个节点 CPU、内存、磁盘处理能力不足的情况 。
  • Primary Shard「主分片」:数据分片采用主从模式 , 由分片接收索引操作 。
  • Replica Shard「副本分片」:主分片的拷贝 , 以提高查询吞吐量和实现数据高可靠 。主分片异常时 , 其中一个副本分片会自动提升为新的主分片 。为了便于大家理解 ES 里的数据模型 , 将它与关系型数据库 MySQL 做类比:

10分钟快速入门海量数据搜索引擎Elasticsearch

文章插图
数据模型类别
从上面架构图可以看出 , ES 架构非常简洁 。内置自动发现实现 Zen discovery , 当一个节点启动后 , 通过联系集群成员列表即可加入集群 。由其中一个节点担任主节点 , 用于集群元数据管理 , 维护分片在节点间的分配关系 。当新节点加入集群后 , Master 节点会自动迁移部分分片至新节点 , 均衡集群负载 。
10分钟快速入门海量数据搜索引擎Elasticsearch

文章插图
节点加入集群
分布式集群难免有节点故障 。主节点会定期探测集群其他节点存活状态 , 当节点故障后 , 会将节点移出集群 。并自动在其他节点上恢复故障节点上的分片 。主分片故障时会提升其中一个副本分片为主分片 。其他节点也会探活主节点 , 当主节点故障后 , 会触发内置的类 Raft 协议选主 , 并通过设置最少候选主节点数 , 避免集群爆裂 。
10分钟快速入门海量数据搜索引擎Elasticsearch

文章插图
节点离开集群
除了集群管理 , 索引数据读写也是我们关心的重要部分 。ES 采用 peer-to-peer 架构 , 每个节点保存全量分片路由信息 , 也就是每个节点均可以接收用户读写 。如发送写入请求至节点 1 , 写入请求默认通过文档 ID 的 Hash 值确定写入到哪个主分片 , 这里假设写入到分片 0 。写完主分片 P0 , 并行转发写入请求至副本分片 R0 所在节点 , 当副本分片所在节点确认写入成功后返回客户端报告写入成功 , 保障数据安全性 。并且写入前 , 会确保 quorum 数量的副本数 , 避免网络分区导致写入数据不一致 。


推荐阅读