解析es的分布式架构
1.1 分布式架构的透明隐藏特性
ElasticSearch是一个分布式系统,隐藏了复杂的处理机制
分片机制:
我们不用关心数据是按照什么机制分片的、最后放入到哪个分片中
分片的副本:
集群发现机制(cluster discovery):新节点自动发现集群自动加入
shard负载均衡:比如现在有10shard,隼群中有3个节点,es会进行均衡地分配,以保持每个节点均衡的负载请求。
请求路由
1.2扩容期
垂直扩容:构置新机器,替换已有机器
水平扩容:直接增加机器
1.3 rebalance
塯加成减少节点时会目动均衡
1.4 master节点
主节点的主要职责是和集群相关的内容,如创建或删除索引,跟踪哪些节点是集群的一部分,并决定哪些分配分配给相关节点。稳定的主节点对集群的健康是很重要的。
1.5 节点对等
每个节点都能接收请求,每个节点接收到请求后都能把该请求路由到有相关数据的其它节点上,接收原始请求的节点负责采集数据并返回给客户端。
2分片和副本机制
1 . index(索引)包含多个shard(分片)
- 每个shard(分片)都是一个最小工作单元,承载部分数据,每个shard(分片)都是一个lucene实例,有完整的建立索引和处理请求的能力。
- 增减节点时,shard会目动在nodes中负载均衡。
- primary shard和replica shard,每个document^宝只存在于某一个primary shard以及其对应的replica shard中,不可能存在于多个primary shard中
- replica shard是primary shard的副本,负责容错 和 读请求负载
- primary shard的数量在创建素引的时候就固定了,replica shard的数量可以随时修改
- primary shard的默认数量是5, replica默认是 1, 默 认 有 10个shard, 5个primary shard, 5个replica shard
- primary shard不能和目己的replica shard放在同一令节点上(否则节点宕机,primary shard和副本都丢失,起不到容错的作用,但是可以和其他
primary shard 的 replica shard放在同一个节点上。
3. 单节点环境下创建索引分析
集群可以正常工作,但是一旦出现节点宕机,数据全部丟失,而且集群不可用,无法接收任何请求。如果每一个索引的主分片和副本分配都能够进行很好的分配,那么久是green
//
#3个主分片,一个副本分片,一个ES节点
put lib4
{
"settings":{
"index":{
"number_of_shards":3,
"number_of_replicas":1
}
}
}
#primary_shard1 primary_shard2 primary_shard3 在一个ES节点上
#但是由于primary_shard 和 replica_shard不能在同一个分片上,所以副本分片不能成功创建。
#查看ES监控状况:yellow是警告色,黄色也不影响存储,只不过没有副本了
GET /_cat/health
1560754932 07:02:12 elasticsearch yellow 1 1 21 21 0 0 6 0 - 77.8%
4. 两个节点环境下创建索引分析
将3个primary shard分配到一个node上去,另外3个replica shard分配到另一个节点上。
node1 : p1 p2 p3
node2 : r1 r2 r3
5. 将2个及节点再扩容至3个节点
# primary_shard:1, replicat
node1 : p1 p3
node2 : p2 r2
node3 : p3 r1
6. 扩容的极限
每个es节点上运行一个分片(3主3从 = 6)
7. 新增节点超出扩容的极限?
增加副本数
8. 容错性(能容忍多少台node宕机?)
- 3个节点,6个shard(3个主,每个主1个从),最多接受一个node宕机
(死了一主一从。死的主还有活的从,死的从还有活的主) - 3个节点,9个shard(3个主,每个主2个从)最多接受2个node宕机
9. 容错性
3节点9shard,(3个主,每个主2个从)。3个节点中有一个是master节点
1)宕机一个节点,节点包含primary_shard,GET /_cat/health red
- ES将丢失primary_shard的一个副本shard转变为primary_shard,此时所有的primary_shard都是活跃的,但是GET /_cat/health 是yellow,因为副本丢失。
3)宕机的节点重启,master会将每个primary_shard上的数据拷贝一份副本来。此时所有的primary_shard和replicate_shard都在线,GET /_cat/health 是green
二、 文档的核心元数据
primary shard和replica shard都是Active status
- index:
说明了一个文档存储在哪个索引中
同一个索引下存放的是相似的文档(文档的field多数是相同的)
索引名必需是小写的,不能以下划线开头,不能包括逗号 - _type:
表示文档属子索引中的哪个类型 (ES7.0.0已弃用)
一个索引下只能有一个type
类型名可以是大写也可以是小写的,不能以下划线开头,不能包括逗号 - _id:
文档的唯一标识和索引,和索引、类型组合在一起唯一标识了一个文档
可以手动指定值,也可以甶es来生成这个值
3.8文挡id生成方式
1.手动指走
put /index/type/66
通常是把其它系统的已有数据导入到es时
2.由es生成id值
post /index/type
es生成的id长度为20个字节,使用的是base64编码,URL安全,使用的是GUID算法, 分布式下并发生成id值时不会冲突。
3.9 _source元数据分析
其实就是我们添加文档时request body中的内容
指定返回的结果中含有哪些字段:
get /index/type/1?_source=name,id,sex
3.10改变文档内容原理解析:PUT POST
//
#根据id获取文档
GET /myindex/_doc/article2
#全部替换文档内容
PUT /myindex/_doc/article2
{
"post_date" : "2019-06-10",
"tile" : "xixi",
"content" : "I like html",
"id" : 120,
"age" : 20,
"test" : [
"html",
"good"
],
"intrest" : "xi huan tingyinyue,cooking,running"
}
#部分替换(更新)文档内容
POST /myindex/_update/article2
{
"doc": {"tile" : "hello world2"}
}
put post对比
网友评论