集群环境部署
es集群环境搭建过程,参考之前写的“Elasticsearch专栏-2.es环境安装”
springboot集成
springboot集成es,无论其实单机还是集群,集成方法都是一样的。参考“Elasticsearch专栏-9.springboot集成es”
集群读写过程
- es集群组成结构
从上图中,可以看出来es集群的基本组成单元:
- es集群由多个节点组成,每个节点就是一个es实例。
- es实例会包含多个索引。每个索引由多个分片组成,
- es索引中每个分片就是一个独立的lucence索引。
- lucence索引是由多个segment构成。
- segment是倒排索引的文档集合。
- segment最终存入磁盘,不过在写入过程中,小的segment会合并成大的segment。
- es集群读写过程
上图举例的索引是3个分片,每个主分片挂一个副本。现结合上图,简要说下es集群读写过程:
写过程:
- 集群写入时,会先随机选取一个节点(node),该节点可以称之为“协调节点”。
- 新文档写入前,es会对其id做hash取模,来确定该文档会分布在哪个分片上。
- 当分片位置确定好后,es会判图当前“协调节点”上是否有该主分片。如果有,直接写;如果没有,则会将数据路由到包含该主分片的节点上。
- 整个写入过程是,es会将文档先写入主分片上(如p0),写完后再将数据同步一份到副本上(如r0)
- 待副本数据也写完后,副本节点会通知协调节点,最后协调节点告知客户端,文档写入结束。
读过程:
1.es引入副本的概念,除了做高可用外,再一个功能就是负载均衡。所以当一个读请求过来时(如根据id查文档),es集群随机选取一个节点作为协调节点处理请求。之后协调节点会对id做取模运算(和写入一样),确定该文档分布在哪些节点上(包含主分片、副本)。之后会将包含该文档主分片、副本所在的节点信息一起返回。由协调节点做负载均衡调用,获取结果。
2.如果做聚合计算,数据会分布在不同分片和节点上。此时,协调节点会将请求发至不同节点,由节点计算完数据后,一并返回给协调节点。协调节点在同一做汇总、聚合、分页等工作。最后将查询数据返回客户端。
高可用原理及验证
es集群高可用的原理是,当某一节点挂掉(或新增一个节点),原数据分片都会重新分配。以三个节点举例(索引分片为3主+1副):当节点挂掉时候,存储在另外两台机器上的该节点主分片对应的副本,其中一个会提升为主分片。而丢失的副本也会重新进行创建。验证结果如下:
原始节点
节点 | 分片分布 |
88.207 | p1-r0 |
88.206 | p2-p0 |
88.110 | r1-r2 |
删除一个110节点
节点 | 分片分布 |
88.207 | p1-r0-r2 |
88.206 | p2-p0-r1 |
88.110 |
重启110节点
节点 | 分片分布 |
88.207 | r1-r0 |
88.206 | p0-r2 |
88.110 | p1-p2 |
新增101节点
节点 | 分片分布 |
88.207 | r0 |
88.206 | p0 |
88.110 | p1-p2 |
88.101 | r1-r2 |
删除101节点
节点 | 分片分布 |
88.207 | r0-r1 |
88.206 | p0-r2 |
88.110 | p1-p2 |
88.101 |