ElasticSearch简介
- ElasticSearch是一个高性能,基于Lucene的全文检索服务,是一个分布式的Restful风格的搜索和数据分析引擎,也可以作为NoSQL数据库使用。
- 对Lucene进行了扩展
- 原型环境和生产环境可无缝切换
- 能够水平扩展
- 支持结构化和非结构化数据
ElasticSearch特点

ElasticSearch应用场景
- 用于日志搜索和分析、时空检索、时序检索、智能搜索等场景。
- 检索的数据类型复杂:如需要查询的数据有结构化数据、半结构化数据、非结构化数据等,ElasticSearch可以对以上数据类型进行清洗、分词、建立倒排索引等一系列操作,然后提供全文检索的能力。
- 检索条件多样化:全文检索条件可以包括词或短语。
- 边写边读:写入的数据可以实时的进行检索。
ElasticSearch生态圈
- ELK/ELKB提供了一整套解决方案,并且都是开源软件,之间互相配合使用,完美衔接,高效的满足了很多场合的应用。

ElasticSearch系统架构

ElasticSearch内部架构
- 通过RESTfulAPI或者其他语言(比如Java)API提供丰富的访问接口。
- 集群发现机制。
- 支持脚本语言。
- 底层基于Lucene,保持Lucene
- 绝对的独立性。
- 通过本地文件、共享文件、HDFS完成索引I存储。

ElasticSearch核心概念
- Index
- 索引,是ElasticSearch中一个逻辑命名空间。
- Type
- 文档类型,用于存储不同类型的文档。ElasticSearch7已删除Type
- Document
- 文档,是可以被索引的基本单位。
- Mapping
- 映射,用来约束字段的类型。
- Cluster
- 代表一个集群,集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。
- EsNode
- ElasticSearch节点,一个节点就是一个ElasticSearch实例。
- EsMaster
- 主节点,可以临时管理集群级别的一些变更,例如新建或删除索引、增加或移除节点等。主节点不参与文档级别的变更或搜索,在流量增长时,该主节在流量增长时,该主节点不会成为集群的瓶颈。
- shards
- 代表索引分片,ElasticSearch可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。
- replicas
- 代表索引副本,ElasticSearch可以设置多个索引I的副本,副本的作用一是提高系统的容错性,当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高ElasticSearch的查询效率,ElasticSearch会自动对搜索请求进行负载均衡。
- Recovery
- 代表数据恢复或叫数据重新分布,ElasticSearch在有节点加入或退出时会根据机器的负载对索引分片进行重新分配,挂掉的节点重新启动时也会进行数据恢复。
- GateWay
- 代表ElasticSearch索引快照的存储方式,ElasticSearch默认是先把索引存放到内存中,当内存满了时再持久化到本地硬盘。GateWay对索引快照进行存储,当这个ElasticSearch集群关闭再重新启动时就会从GateWay中读取索引备份数据。ElasticSearch支持多种类型的GateWay,有本地文件系统(默认),分布式文件系统,Hadoop的HDFS和amazon的s3云存储服务。
- Transport
- 代表ElasticSearch内部节点或集群与客户端的交互方式,默认内部是使用TCP协议进行交互,同时它支持http协议(Json格式)、Thrift、Servlet、memcached、zeroMQ等的传输协议(通过插件方式集成)。
ElasticSearch倒排索引
- 正排索引:是通过Key寻找Value,即从关键点出发,然后再通过关键点找到信息中满足搜索条件的特定信息。
- 倒排索引:ElasticSearch所采用得排序方式,是通过Value找Key。而在全文搜索中Value就是要搜索的关键词,通过Value找到对应的文档。

ElasticSearch访问接口
- ElasticSearch可通过RESTful请求来对数据进行操作。请求分5种:GET、POST、PUT、DELETE、HEAD,以实现对文档和索引增删改查。
ElasticSearch路由算法
- Elasticsearch中提供了两种路由算法:
- 默认路由:shard=hash(routing)%number_of_primary_shards,这里路由策略扩展受到shards个数的限制,扩容的时候需要成倍扩容(ES6.x),并且在创建index的时候要指定未来允许扩容的规模。ES5.x不支持扩容;ES7.x可以自由扩容。
- 自定义路由:该路由方式,通过指定routing的方式,可以影响文档写入到哪个shard,也可以仅仅检索特定的shard。
ElasticSearch平衡算法
- Elasticsearch中提供了自动平衡功能
- 适用场景:扩容、减容、导入数据场景
- 算法如下:
weight_index(node, index) = indexBalance * (node.numShards(ndex) - avgShardsPerNode(index)
Weight_node(node, index) = shardBalance * (node.numShards() - avgShardsPerNode)
weight(node, index) = weight_index(node, index) + weight_node(node, index)
ElasticSearch扩容
- 扩容场景:
- 物理资源消耗过大,即ElasticSearch的服务节点的CPU、内存占用率过高、磁盘空间不足
- ElasticSearch单实例的索引数据太大,索引的数目达到1o亿条或是数据大小达到1TB。
- 扩容方式:
- 增加EsNode实例。
- 增加节点,在新节点增加EsNode实例。
- 扩容后,采用自动均衡策略。
ElasticSearch减容
- 减容场景:
- 节点需要重新安装操作系统。
- 集群数据量减少。
- 退服场景。
- 减容方式:
- 在CloudSearchService管理界面上删除ElasticSearch实例。
- 减容注意事项:
- 确保要删除的实例上的shard下的replica在其他实例存在。
- 确保要删除的实例上的数据已经迁移到其他节点。
ElasticSearch索引|HBase数据
- Elasticsearch索引lHBase数据是HBase数据写入的同时,在Elasticsearch建立相应的HBase索引I数据。其中索引lid与HBase数据的rowkey对应,保证每条索引l数据与HBase数据的唯一,实现HBase数据的全文检索。
- 批量索引:针对HBase中已有的数据,通过提交MR任务的形式,将HBase中的全部数据读出,然后在Elasticsearch中建立索引。

ElasticSearch单节点多实例部署
- 在同一个节点上部署多个Elasticsearch实例,根据IP和不同的端口号来区分不同的Elasticsearch实例。可以提高单节点CPU、内存和磁盘的利用率,同时提高Elasticsearch的索引和搜索能力。

ElasticSearch副本自动跨节点分配策略
- 单节点多实例部署下,多副本时,如果只做到跨实例分配,存在单点故障,增加默认配置cluster.routing.allocation.same_shard.host:true即可。

ElasticSearch其他特性
- HBase全文索引特性
- 通过建立HBase表和ElasticSearch索引l的映射关系,支持索引存储ElasticSearch,而原始数据存储HBase。通过HBase2ES工具离线索引。
- 加密鉴权特性
- 对于安全集群,支持对ElasticSearch访问的加密和鉴权。
缩略语
- JMX: Java Management Extensions, Java管理扩展
- NoSQL:Not Only SQL,非关系型数据库
- ELK:Elasticsearch Logstash Kibana,三个开源软件的缩写
- Es:ElasticSearch,分布式全文检索
- HTTP:Hyper Text Transfer Protocol,超文本传输协议
- Js:JavaScript,是一种具有函数优先的轻量级,解释型或即时编译型的编程语言
- Doc:Document,文档
- CPU:Central Processing Unit,中央处理器
- ELKB:Elasticsearch Logstash Kibana Beats,四个开源软件的缩写