文章目录
一、基本概念名词
1.1 集群(cluster)
一个集群中有多个节点,其中有一个为主节点,这个主节点是可以通过选举产生的,主从节点是对于集群内部来说的。es的一个概念就是去中心化,字面上理解就是无中心节点,这是对于集群外部来说的,因为从外部来看es集群,在逻辑上是个整体,你与任何一个节点的通信和与整个es集群通信是等价的。
# 查看集群基本信息
bash-4.2# curl localhost:9200
{
# 节点名称
"name" : "tpaas-es-nodes-0",
# 集群名称
"cluster_name" : "tpaas-es",
"cluster_uuid" : "z8eRvMfVTE67Y0myRme33w",
"version" : {
# ES 版本号
"number" : "6.8.13",
"build_flavor" : "default",
"build_type" : "tar",
"build_hash" : "be13c69",
"build_date" : "2020-10-16T09:09:46.555371Z",
"build_snapshot" : false,
# lucene 版本号
"lucene_version" : "7.7.3",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
# 查看集群状态
bash-4.2# curl localhost:9200/_cat/health?v
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1671500790 01:46:30 tpaas-es yellow 3 3 2618 1307 0 0 12 0 - 99.5%
参数说明:
- cluster:集群名称
- status:集群状态
green 表示集群一切正常,所有主分片和副分片都可用;
yellow 表示集群不可靠但可用,所有主分片可用,但不是所有副分片都可用;
red 集群不可用,有故障,不是所有的主分片都可用;
- node.total:节点总数量
- node.data:数据节点的数量
- shards:存活的分片数量
- pri:主分片数量
- relo:迁移中的分片数量
- init:初始化中的分片数量
- unassign:未分配的分片
- pending_tasks:准备中的任务
- max_task_wait_time:任务最长等待时间
- active_shards_percent:激活的分片百分比
1.2 节点(node)
一个节点就是一个启动了es服务的服务器,是你的集群的一部分,存储数据,并且参与集群和搜索功能,一个节点可以通过配置特定的名称来加入特定的集群,在一个集群中,你想启动多少个节点就可以启动多少个节点。
# 查看集群的节点信息
bash-4.2# curl localhost:9200/_cat/nodes?v
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
10.12.41.9 49 59 15 3.66 5.00 5.95 mdi - tpaas-es-nodes-1
10.12.45.24 37 74 17 8.35 9.43 9.03 mdi * tpaas-es-nodes-2
10.12.134.27 46 74 25 12.41 19.69 22.80 mdi - tpaas-es-nodes-0
参数说明:
- ip:节点ip
- heap.percent:堆内存使用百分比
- ram.percent: 运行内存使用百分比
- cpu:cpu使用百分比
- master:带* 表明该节点是主节点,带-表明该节点是从节点
- name:节点名称
1.3 索引(index)
一个索引就是含有某些共有特性的文档的集合,一个索引被一个名称唯一标识,并且这个名称被用于索引通过文档去执行搜索,更新和删除操作,类似于mysql里面的表。
# 查看所有索引
curl localhost:9200/_cat/indices?v
# 查看指定索引的信息
bash-4.2# curl localhost:9200/_cat/indices/hids_sec_asset_2022.05.25?v
health status index uuid pri rep docs.count docs.deleted store.size pri.store.size
green open hids_sec_asset_2022.05.25 Ka-grePQSiySzYSpT8rEYA 5 1 153199 0 236.1mb 118mb
参数说明:
- index: 索引名称
- docs.count:文档总数
- docs.deleted:已删除文档数
- store.size: 存储的总容量
- pri.store.size:主分片的存储总容量
1.4 分片(shards)
es可以把一个完整的索引分成多个分片,这样的好处是可以把一个大的索引拆分成多个,分布到不同的节点上。构成分布式搜索。分片的数量只能在索引创建前指定,并且索引创建后不能更改。
# 查看所有索引的分片信息
curl localhost:9200/_cat/shards?v
# 查看指定索引的分片信息
bash-4.2# curl localhost:9200/_cat/shards/hids_sec_asset_2022.05.25?v
index shard prirep state docs store ip node
hids_sec_asset_2022.05.25 3 p STARTED 30595 23.6mb 10.12.41.9 tpaas-es-nodes-1
hids_sec_asset_2022.05.25 3 r STARTED 30595 23.6mb 10.12.134.27 tpaas-es-nodes-0
hids_sec_asset_2022.05.25 1 p STARTED 30625 23.6mb 10.12.41.9 tpaas-es-nodes-1
hids_sec_asset_2022.05.25 1 r STARTED 30625 23.6mb 10.12.134.27 tpaas-es-nodes-0
hids_sec_asset_2022.05.25 2 p STARTED 30574 24mb 10.12.41.9 tpaas-es-nodes-1
hids_sec_asset_2022.05.25 2 r STARTED 30574 24mb 10.12.134.27 tpaas-es-nodes-0
hids_sec_asset_2022.05.25 4 p STARTED 30730 23.2mb 10.12.41.9 tpaas-es-nodes-1
hids_sec_asset_2022.05.25 4 r STARTED 30730 23.2mb 10.12.134.27 tpaas-es-nodes-0
hids_sec_asset_2022.05.25 0 p STARTED 30675 23.5mb 10.12.41.9 tpaas-es-nodes-1
hids_sec_asset_2022.05.25 0 r STARTED 30675 23.5mb 10.12.134.27 tpaas-es-nodes-0
参数说明:
- index:索引名称
- shard:分片数
- prirep:分片类型,p为主分片,r为复制分片
- state:分片状态,STARTED为正常
- docs:记录数
- store:存储大小
- ip:节点ip
- node:节点名称
1.5 文档(document)
一个文档是一个基本的搜索单元,类似于mysql里面的行,每个 document 有多个 field,每个 field 就代表了这个 document 中的一个字段的值。
# 查看指定索引内所有文档
curl localhost:9200/hids_sec_asset_2022.05.25/_search?pretty
二、基本原理
2.1 数据分布
ES支持数据分片和分片副本:
- 主分片与副本分片一般分布在不同的节点(HA高可用)
- 不同的主分片可以在同一个节点
- 数据更新只能发生在主分片
- 查询请求可以在主副分片
- 当主分片丢失时,会自动选择一个最新的副本分片作为主
分片分布在哪个节点上是不固定的,随着集群的数据变化和节点的增加删除,分片会在不同节点之间移动。这个由master主节点来负责协调。
2.2 数据请求
集群所有节点均可接收用户请求。
每个节点会保存其他节点的信息,所以当一个用户请求到来时,当前节点负责解析用户请求,并从本地节点列表中选择有相关分片的节点(数据分片往往被打散到不同的节点)将请求转发过去。
对于写请求:
1)Node A收到用户请求,解析后确定需要写Node B所保存的主分片,则Node A将请求转发给Node B
2)Node B完成主分片的写入(注意,只有主分片能写,副本分片从主分片同步数据)
3)Node B将数据同步给集群内其他副本分片,待所有分片均返回后,响应Node A写入成功
4)Node A响应用户请求
对于读请求:
1)Node A收到用户请求,解析后确认涉及哪些分片,从本地节点列表中找出有相关分片的节点将请求转发过去
2)各分片完成查询,将数据返回给Node A
3)Node A将数据运算汇总后,响应用户请求
2.3 master主节点
主节点是由集群自动选举出来的。
集群内有且只能有一个master主节点,它负责集群的协调工作,比如新节点加入、分片的转移等。
集群选举
1)选举由node.master配置为true的节点发起,当某个候选节点发现当前集群缺少master的时候,会主动发起选举(节点之间会相互通过ping交换信息,包括主节点信息,如果超过半数的节点都连不上主节点时,就认为没有主节点)
2)选举的方式是集群所有节点投票,投票规则是每个节点都选择本地列表中version最高的(如果存在并列最高,则选id最小的那个节点),节点通过join指令投票。
3)被选节点通过收集join的次数,超过集群节点总数的一半+1的节点选自己为主节点时,选举即成功。
4)否则超时开启下一轮选举,直到集群选出master。
关于脑裂
当集群存在两个或以上的master时,我们称之为脑裂。这种情况会导致集群的一致性受到威胁。
略有遗憾的是ES存在小概率的脑裂问题。比如当Node A发起选举,Node X投了一票;但选举迟迟未成功,接着又有个节点发起了一轮投票,刚好这时Node X发现Node B的版本更高,又投了一票给Node B。于是Node X投出了两票,条件契合的情况下,Node A/B可能同时认为自己被选上。这种情况可以通过引入选举周期来解决,同一周期一个节点只投一票,最终选择周期最新的节点为主。
特别注意:只有两个节点的集群,一旦通讯异常,master就选不出来了,因为拿不到总节点数/2 + 1的票数。
类似的,当集群有超过半数的节点宕机,集群将变的不可用。
2.4 节点发现和退出
节点发现:
当有节点需要加入集群时,通过给它配置discovery.zen.ping.unicast.hosts: [xx.xx.xx.xx, yy.yy.yy.yy]参数来完成自动发现,加入集群。原理是节点会向上述hosts列表发送请求,寻找master,然后join master。该hosts建议配置成所有的主候选节点。
节点退出:
节点需要退出时,先标记待退出状态,待master将分片全部移走时,才能退出集群。