Elasticsearch:基础篇

一、基本概念名词


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将分片全部移走时,才能退出集群。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值