本文介绍下Elasticsearch集群的相关知识。
什么是Elasticsearch
Elasticsearch 是一个分布式、高扩展、高实时的搜索与数据分析引擎。它能很方便的使大量数据具有搜索、分析和探索的能力。充分利用Elasticsearch的水平伸缩性,能使数据在生产环境变得更有价值。
为什么要用集群
用ElasticSearch集群,将单个索引的分片到多个不同分布式物理机器上存储,从而实现高可用、容错性等。ElasticSearch会自动选举实现主备服务器。
达到基本高可用,一般要至少启动3个节点,3个节点互相连接,单个节点包括所有角色,其中任意节点停机集群依然可用。
关键概念
节点角色
- Master,集群管理
- Voting,投票选举节点
- Data,数据节点
- Ingest,数据编辑节点
- Coordinate,协调节点
- Machine Learning,集群学习节点
索引
一般意义上的索引是一种基于文档(数据)生成、建立的,用于快速定位指定文档的工具。而 ElasticSearch 对索引的定义有所不同,ElasticSearch 中的索引对应 MySQL 中的 Database ,也就说 ElasticSearch 中的索引更像是一种数据存储集合,即用于存储文档。
分片
分片(Shard),是Elasticsearch中的最小存储单元。
- Shards分片:代表索引分片,ElasticSearch可以把一个完整的索引分成多个分片,这样的好处是可以把一个
大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引
创建后不能更改。 - Replicas分片:代表副本分片,ElasticSearch可以设置多个索引的副本,副本的作用一是提高系统的容错性,
当某个节点某个分片损坏或丢失时可以从副本中恢复。二是提高ElasticSearch的查询效率,ElasticSearch
会自动对搜索请求进行负载均衡。
数据路由
- 当客户端发起创建document的时候,ElasticSearch需要确定这个document放在该索引哪个shard上。这个过程就是数据路由。
- 路由算法:分片位置shard=hash(routing) % number_of_primary_shards
- 如果number_of_primary_shards在查询的时候取余发生变化,则无法获取到该数据。即:在查询的时候,底层根据文档id%主分片数量获取分片位置
1 | 1.客户端向 ES1节点(协调节点)发送写请求,通过路由计算公式得到值为0,则当前数据应被写到主分片 S0 上。 |
脑裂现象
正常情况下,集群中的所有节点,应该对主节点的选择是一致的,即一个集群中只有一个选举出来的主节点。然而,在某些情况下,比如网络通信出现问题、主节点因为负载过大停止响应等等,就会导致重新选举主节点,此时可能会出现集群中有多个主节点的现象,即节点对集群状态的认知不一致,称之为脑裂现象。
为了尽量避免此种情况的出现,可以通过discovery.zen.minimum_master_nodes
来设置最少可工作的候选主节点个数,建议设置为(候选主节点数 / 2) + 1。保证集群中有半数以上的候选主节点。
安装
现在开始介绍如何通过docker
搭建一个简单的Elasticsearch集群服务