分布式个性
es 反对集权模式,是一个分布式系统,益处有二:
- 增大零碎容量,磁盘 内存 使得 es集群能够反对pb级别的业务
- 进步零碎可用性 即便局部节点进行服务 整个集群能够失常应用
es集群由多个es实例组成
- 不同的集群通过集群名称组成,通过 cluster.name 定义
- 每个es实例实质上是一个jvm过程,且有本人的名字 通过 node.name定义
构建集群
启动一个节点
bin/elasticsearch -E cluster.name=my_cluster -E node.name=node1
cluster state
es集群的相干数据称为 cluster state 次要记录如下信息:
- 节点信息 节点名称 连贯地址等
- 索引信息 索引名称 配置等
master node
能够批改 cluster state 的节点称为 master 节点 一个集群只能有一个
cluster state 存储在每个节点上,master 保护最新版本并同步给其余节点
master节点通过集群中所有节点选举产生,能够被选举的节点称为master eligible节点
node.master=true
分片
- 如何将数据分簿于所有节点上
引入分片解决问题 分片是es反对pb事务的基石
- 分片存储了局部数据,能够散布于任意节点上
- 分片数在索引创立时指定,且后续不容许更改,默认为五个
- 分片有主分片和正本分片的区别,实现数据高可用
- 正本分片数据由主分片同步,能够有多个,从而进步吞吐量
- 持续减少节点是否进步索引的数据容量?
不能,只有三个分片,新增节点上的资源无奈被利用 - 持续减少正本数是否进步索引的数据吞吐量?
不能,新增正本还是散布在已有节点上,资源并没有增多
衰弱状态
通过api GET _cluster/health 能够查看集群的健康状况,包含三种:
- green 衰弱 指所有的主副分片都失常
- yellow 指所有的主分片都失常 然而有正本分片未失常调配
- red 所有分片都未调配
故障转移
node1 所在的集器宕机,集群会如何解决?
- node2 发现主分片p0未调配,将R0晋升为主分片,此时因为所有的主分片都失常,集群状态为yellow
- node2 为p0和p1生成新的正本,集群状态为绿色
分布式存储
- 应用映射算法将文档平均的散布在所有的分片上,以充分利用资源
- es 应用 shard = hash(routing)%number_of_primary_shards
- hash算法能够保障将数据平均的散布在分片中
- routing 默认为文档id
文档创立流程
- client向node3发动文档创立申请
- node3通过routing计算出该文档应该存储在shard1上,查问cluster state后确认主分片在p1
在node2中,转发创立申请到node2上 - p1接管并创立文档,将同样的申请发送到正本分片r1
- r1接管并执行创立文档申请后告诉p1创立胜利
- p1接管正本分片后果后,告诉node3创立胜利
- node3将后果返回给client
文档读取流程
- client向node3发动读取文档1的申请
- node3通过routing计算该文档在shard1上,查问cluster state后获取shard1的主副分片列表,而后轮询获取shard,例如R1,转发申请到node1
- R1接管并执行读取文档,将后果返回node3
- node3返回后果给client
脑裂问题
- 当集群中呈现网络网体,node2 与 node3 从新组成集群选举一个master,并更新cluster state
- node1 本人组成集群后,也会更新cluster state
- 同一个大集群有两个master 并且有两个 cluster state 网络复原后无奈决定哪个是正确的master 和 cluster state
解决 减少选举条件 可被选举为master-eligible节点数大于等于quorum 时才能够进行master选举
- quorum=master-eligible 节点数/2+1 例如三个master-eligible节点时,quorum为2
- 设定 discovery.zen.minimum_master_nodes为quorum可防止脑裂
shard
倒排索引不可变更
- 倒排索引一旦生成,不能更改
- 不必思考并发写文件的问题,防止锁机制带来的性能问题
- 能够充分利用缓存,载入一次,屡次读取
- 利于对文件进行压缩存储,节俭磁盘和内存存储空空间
- 写入新文档时,必须从新构建倒排索引文件,而后替换老文件,新文档才会被检索,实时性差
文档搜寻实时性
- lucene构建单个倒排索引称为segment 合在一起称为index,与 es 中的index不同,es中一个shard对应一个lucene index。
- lucene 会有一个专门的文件来记录所有的segment信息,称为commit point。
文档搜寻实时性 - refresh
- segment 写入缓存,并凋谢查问,该过程称为refresh
- 在refresh前文档会先存储在一个buffer中,refresh时将buffer中的所有文档清空并生成segment
- es默认每一秒执行一次refresh,因而文档的实时性被进步到1秒,这也是es被称为近实时的起因
translog
如果缓存中segment还没写入磁盘时产生宕机怎么办?
- es 引入 translog机制,写入到buffer时,同时将操作写入translog。
- translog文件会即时写入磁盘fsync,6.X默认每个申请都会落盘,能够批改每五秒一次,这个危险为失落五秒内数据,祥光配置为index.translog.*
- es 启动时会查看translog文件,并且从中复原数据
flush
flush 负责将内存中的segment 写入磁盘
- 将translog 写入磁盘
- 将index buffer 清空,其中的文档生成新的segment 相当于refresh操作
- 更新 commit point并写入磁盘
- 执行fsync操作 将内存中的segment写入磁盘
- 删除旧的translog
删除与更新文档
- lucene专门保护一个 .del文件,记录所有的曾经删除的文档,.del上记录的文芳时lucene外部的文档id
- 在分会查问后果前会过滤掉.del中的文档
- 更新文档等于先删除,在创立新文档
segment merging
- 随和segment增多 一次查问的segment过多 查问速度变慢
- es 定时在后盾进行 segment merge 缩小segment数量
- 通过force_mergeapi 能够手动 merge操作