笔记来源 → B站学习视频:最新ElasticSearch6实战教程。
v+数字是视频序号,内容根据我的理解微调了。
上篇介绍了一些简单的查询:elasticsearch6实战教程学习笔记(三)
本篇内容:(1)什么是扩容 - v24;(2)es6的容错机制 - v25;(3)文档数据路由原理 - v32;(4)文档增改查原理 - v33、v29、v35;(5)更新文档对并发问题的处理 - v31;(6)写一致性原理和quorum机制 - v34。
本篇的代码没有对应实例,使用的时候请自行修改。
目录
1. 扩容
(1)垂直扩容
增加节点容量,可以增加服务器容量(不推荐)。
(2)水平扩容
增加服务器(节点)容量。其中:
① 扩容的极限:每个节点上一个shard( primary + replica )。
② 容错性:保证服务器宕机时,每个shard至少有一个primary或replica shard存在。
2. 容错机制
发生宕机时,若存在primary shard不活跃,则集群的状态为red(不健康)。es将进行容错处理:
① 重新选举其他节点作为master。
② master会把丢失的primary shard的某一个副本提升为primary shard。此时,集群状态为yellow(亚健康),因为存在副本不活跃。
③ 宕机服务器重启。master会把每个primary shard上的数据拷贝一份到恢复的服务器上。
3. 文档数据路由原理
数据路由:es确定文档存储在哪个分片上,这个过程称为数据路由(routing)。
数据路由算法:shard=hash(routing)%number_of_primary_shards
(1)每次增删改查时,都有一个routing值,默认为文档_id;
(2)计算routing值的哈希函数值;
(3)计算出的hash值与主分片个数取余。
对应的余数即为文档所在的分片。(所以分片的个数不可修改)
4. 文档增改查原理
(1)增加doc
假设存在3个分片,每个分片有1个副本,共计6个shard。6个shard均匀分布在3个节点上。则:
① 用户可请求任意节点,被请求的节点为“协调节点”。“协调节点”将根据数据路由算法,算出文档应存在哪个分片上。
② “协调节点”将请求转发给数据路由后的节点上。
③ 节点存储文档后,将数据同步到它的副本上。
④ 完成所有操作后,“协调节点”对用户进行响应。
(2)修改文档
① 使用put修改文档(全部替换):es查询出数据展示给用户,用户修改后提交数据,旧文档被标记为deleted document,创建新文档new doc。旧文档在后续会被es删除。
② 使用post修改文档(部分替换):用户直接提交需要修改的数据,es修改数据,旧文档被标记为deleted document,创建新文档new doc。旧文档在后续会被es删除。
总结:post比put需要的网络传输次数要少,从而提高了性能。post的查询文档到修改都是在es内部实现的。
并发时,post比put发生冲突的可能性更小。
(3)查询文档
与前面的机制相似,由“协调节点”接受请求、转发请求并响应用户。
转发请求时,es通过“轮询调度”把请求均匀分配给primary和replica。
特例:当数据存在与primar且不存在于replica时,若请求被转发到replica上,则会提示查找不到doc。
5. 更新文档对并发问题的处理
es使用的是乐观锁,当文档更新发生冲突时,根据doc的版本version进行更新。
使用POST方式进行文档更新时:
POST /index/type/id/_update?retry_on_conflict=3&version=5
// retry_on_conflict:更新失败时,重新获取文档数据和版本信息进行更新,重复次数为设定的3次。
6. 写一致性原理和quorum机制
(1)consistency
① 只要索引下的分片有一个为活跃的,则写操作可执行。
PUT /index/type/id?consistency=one
{
"name":"Ginna",
"age":28,
"sex":"female",
"interests":["movies"]
}
②只要索引下的分片全部为活跃的,才能执行写操作。
PUT /index/type/id?consistency=all
{
"name":"Ginna",
"age":28,
"sex":"female",
"interests":["movies"]
}
③只要索引下的分片多数为活跃的,才能执行写操作。consistency的默认值为qurom。
PUT /index/type/id?consistency=qurom
{
"name":"Ginna",
"age":28,
"sex":"female",
"interests":["movies"]
}
④quorum机制
多数shard可用: [int((primary个数 + 每个primary的replica个数)/2)+1] 个shard可用。
例A:假设存在3个分片,每个分片有1个副本,共计6个shard。6个shard均匀分布在3个节点上。则需要[int((3 + 1)/2)+1] = 3 个shard可用。
例B:假设存在1个分片,有3个副本,共计4个shard。4个shard分布在2个节点上。则需要[int((1 + 3)/2)+1] = 3 个shard可用。
由于相同的副本不能放在同一个节点上,所以只有1个primary和一个replica活跃,故执行失败。
(2)timeout
当shard的活跃数未达标时,es会默认等待60s,若等待期间的shard活跃数没有增加,则显示timeout。timeout可自行设置。
PUT /index/type/id?timeout=60s
下篇:准备整理一篇关于查询的