Elasticsearch 分片集群原理、搭建、与SpringBoot整合

单机es能够用,没毛病,可是有一点咱们须要去注意,就是高可用是须要关注的,通常咱们能够把es搭建成集群,2台以上就能成为es集群了。集群不只能够实现高可用,也能实现海量数据存储的横向扩展。

新的阅读体验地址: http://www.zhouhong.icu/post/138

1、Elasticsearch分片机制:

  • 每一个索引能够被分片,每一个主分片都包含索引的数据。
  • 副本分片是主分片的备份,主挂了,备份仍是能够访问,这就须要用到集群了。
  • 同一个分片的主与副本是不会放在同一个服务器里的,由于一旦宕机,这个分片就没了。

以下图:左边每一个索引主备分片都会分配在三台服务器上的不一样节点上面,右图粗方框表示主分片,细节点表示备节点。java

2、搭建Elasticsearch集群

一、前置操做
  • ​ES中以前的data目录,必定要清空,这里面包含了原先的索引库数据。
  • 使用三台服务器:
  • 192.168.1.184(主), 192.168.1.185(从), 192.168.1.186(从)
  • 关于Elasticsearch单机的简介、安装配置请转到:http://www.zhouhong.icu/post/128
二、配置集群
  • 修改每台服务器上ES的elasticsearch.yml这个配置文件以下,每台服务器node.name不同分别为es-node一、es-node二、es-node3.

# 配置集群名称,保证每一个节点的名称相同,如此就能都处于一个集群以内了
cluster.name: es-cluster
# 每个节点的名称,必须不同
node.name: es-node1
# http端口(使用默认便可)
http.port: 9200
# 主节点,做用主要是用于来管理整个集群,负责建立或删除索引,管理其余非master节点(至关于企业老总)
node.master: true
# 数据节点,用于对文档数据的增删改查
node.data: true
# 集群列表
discovery.seed_hosts: ["192.168.1.184", "192.168.1.185", "192.168.1.186"]
# 启动的时候使用一个master节点,未指定ES会进行选举
cluster.initial_master_nodes: ["es-node1"]
三、最后能够经过以下命令查看配置文件的内容:(过滤掉“#”后面的注释)

more elasticsearch.yml | grep ^[^#]
四、切换到esuser后启动,访问集群各个节点,查看信息:
  • http://192.168.1.184:9200/
  • http://192.168.1.185:9200/
  • http://192.168.1.186:9200/

主节点宕机以后会从生下的两个从节点选举新的主节点,主节点恢复后成为从节点。

3、Elasticsearch集群脑裂现象

一、什么是脑裂
  • 若是发生网络中断或者服务器宕机,那么集群会有可能被划分为两个部分,各自有本身的master来管理,那么这就是脑裂。

二、脑裂解决方案
  • master主节点要通过多个master节点共同选举后才能成为新的主节点。就跟班级里选班长同样,并非你1我的能决定的,须要班里半数以上的人决定。
  • 解决实现原理:半数以上的节点赞成选举,节点方可成为新的master。

discovery.zen.minimum_master_nodes=(N/2)+1
  • N为集群的中master节点的数量,也就是那些 node.master=true 设置的那些服务器节点总数。
三、ES 7.X
  • 在最新版7.x中,minimum_master_node这个参数已经被移除了,这一块内容彻底由es自身去管理,这样就避免了脑裂的问题,选举也会很是快。‘’

4、Elasticsearch集群的文档读写原理

  • 文档写原理:p1,p2,p0是主节点,r0,r1,r2是副本节点
  • 若是客户端选择了中间节点进行写数据,那这个节点就会变成协调节点,接受用户请求,会对文档进行路由,计算这个文档会写入到哪一个主分片中,有主分片把数据同步到副本分片,都写入完成以后,在跳回到协调节点,由协调节点相应请求。

  • 文档读原理:p1,p2,p0是主节点,r0,r1,r2是副本节点
  • 若是客户端请求到了第一个节点,那第一个节点也会变成协调节点,而后根据文档的数据进行路由,而后从主分片或者副本分片轮询读数据。无论从主分片仍是副本分片读取数据,最后都会跳回到协调节点,由协调节点相应客户端

5、Elasticsearch集群与SpringBoot整合

一、建立工程,引入依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
    <version>2.2.2.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
    <scope>test</scope>
</dependency>
二、配置yml文件:客户端链接的是 9300
spring:
  data:
    elasticsearch:
      cluster-name: es-cluster
      cluster-nodes: 192.168.1.184:9300,192.168.1.185:9300,192.168.1.186:9300
版本协调:
目前springboot-data-elasticsearch中的es版本贴合为es-6.4.3,如此一来版本须要统一,把es进行降级。等springboot升级es版本后能够在对接最新版的。
三、解决启动时 Netty issue fix 问题
在启动类同一级目录下建立 ESConfig.java 配置类

@Configuration
public class ESConfig {
    /**
     * 解决netty引发的issue
     */
    @PostConstruct
    void init() {
        System.setProperty("es.set.netty.runtime.available.processors", "false");
    }
}
相关文章
相关标签/搜索