1、解析ES的分布式架构
1.1 分布式架构的透明隐藏特性
ElasticSearch是一个分布式系统,隐藏了复杂的处理机制。
(1)集群发现机制(cluster discovery):
比如当前我们启动了一个es进程,当启动了第二个es进程时,这个进程作为一个node自动就发现了集群,并且加入了进去
(2)shard负载均衡:
比如现在有10shard,集群中有3个节点,es会进行均衡的进行分配,以保持每个节点均衡的负载请求
1.2 扩容机制
垂直扩容:购置新的机器,替换已有的机器
水平扩容:直接增加机器
1.3 rebalance
增加或减少节点时会自动均衡
1.4 master节点
主节点的主要职责是和集群操作相关的内容,如创建或删除索引,跟踪哪些节点是群集的一部分,并决定哪些分片分配给相关的节点。稳定的主节点对集群的健康是非常重要的。
1.5 节点对等
每个节点都能接收请求
每个节点接收到请求后都能把该请求路由到有相关数据的其它节点上
接收原始请求的节点负责采集数据并返回给客户端
2、分片和副本机制
(1)index包含多个shard
(2)每个shard都是一个最小工作单元,承载部分数据;每个shard都是一个lucene实例,有完整的建立索引和处理请求的能力
(3)增减节点时,shard会自动在nodes中负载均衡
(4)primary shard和replica shard,每个document肯定只存在于某一个primary shard以及其对应的replica shard中,不可能存在于多个primary shard
(5)replica shard是primary shard的副本,负责容错,以及承担读请求负载
(6)primary shard的数量在创建索引的时候就固定了,replica shard的数量可以随时修改
(7)primary shard的默认数量是5,replica默认是1,默认有10个shard,5个primary shard,5个replica shard
(8)primary shard不能和自己的replica shard放在同一个节点上(否则节点宕机,primary shard和副本都丢失,起不到容错的作用),但是可以和其他primary shard的replica shard放在同一个节点上
3、单节点环境下创建索引分析
PUT /myindex
{
"settings" : {
"number_of_shards" : 3,
"number_of_replicas" : 1
}
}
这个时候,只会将3个primary shard分配到仅有的一个node上去,另外3个replica shard是无法分配的(一个shard的副本replica,他们两个是不能在同一个节点的)。集群可以正常工作,但是一旦出现节点宕机,数据全部丢失,而且集群不可用,无法接收任何请求。
4、两个节点环境下创建索引分析
将3个primary shard分配到一个node上去,另外3个replica shard分配到另一个节点上
primary shard 和replica shard 保持同步
primary shard 和replica shard 都可以处理客户端的读请求
5、水平扩容的过程
(1)扩容后primary shard和replica shard会自动的负载均衡
(2)扩容后每个节点上的shard会减少,那么分配给每个shard的CPU,内存,IO资源会更多,性能提高
(3)扩容的极限,如果有6个shard,扩容的极限就是6个节点,每个节点上一个shard,如果想超出扩容的极限,比如说扩容到9个节点,那么可以增加replica shard的个数
(4)6个shard,3个节点,最多能承受几个节点所在的服务器宕机?(容错性)
任何一台服务器宕机都会丢失部分数据
为了提高容错性,增加shard的个数:
9个shard,(3个primary shard,6个replicashard),这样就能容忍最多两台服务器宕机了
总结:
扩容是为了提高系统的吞吐量,同时也要考虑容错性,也就是让尽可能多的服务器宕机还能保证数据不丢失
6、ElasticSearch容错机制
以9个shard,3个节点为例:
(1).如果master node 宕机,此时不是所有的primary shard都是Active status,所以此时的集群状态是red。
容错处理的第一步:是选举一台服务器作为master
容错处理的第二步:新选举出的master会把挂掉的primary shard的某个replica shard 提升为primary shard,此时集群的状态为yellow,因为少了一个replica shard,并不是所有的replica shard都是active status
容错处理的第三步:重启故障机,新master会把所有的副本都复制一份到该节点上,(同步一下宕机后发生的修改),此时集群的状态为green,因为所有的primary shard和replica shard都是Active status
7、文档的核心元数据
(1)_index:
说明了一个文档存储在哪个索引中
同一个索引下存放的是相似的文档(文档的field多数是相同的)
索引名必须是小写的,不能以下划线开头,不能包括逗号
(2)_type:
表示文档属于索引中的哪个类型
一个索引下只能有一个type
类型名可以是大写也可以是小写的,不能以下划线开头,不能包括逗号
(3)_id:
文档的唯一标识,和索引,类型组合在一起唯一标识了一个文档
可以手动指定值,也可以由es来生成这个值
8、文档id生成方式
(1)手动指定
put /index/type/88
通常是把其它系统的已有数据导入到es时
(2)由es生成id值
post /index/type
es生成的id长度为20个字符,使用的是base64编码,URL安全,使用的是GUID算法,分布式下并发生成id值时不会冲突
9、_source元数据分析
其实就是我们在添加文档时request body中的内容
指定返回的结果中含有哪些字段:
#默认_source返回的是所有字段的数据
get /index/type/1?_source=name