Elasticsearch集群:搭建集群环境

Elasticsearch集群:搭建集群环境

1. 创建相应目录

在/root/es-cluster目录下创建以下目录

mkdir -p es01/data
mkdir -p es01/logs

mkdir -p es02/data
mkdir -p es02/logs

mkdir -p es03/data
mkdir -p es03/logs

mkdir -p kibana_config

2. 创建配置文件

创建docker-compose.yml

version: '3'
services:
  es01:
    image: elasticsearch:7.4.0
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"  
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./es01/data:/usr/share/elasticsearch/data
      - ./es01/logs:/usr/share/elasticsearch/logs
      - /usr/share/elasticsearch/plugins/:/usr/share/elasticsearch/plugins/
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9201:9200
    networks:
      - elastic

  es02:
    image: elasticsearch:7.4.0
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./es02/data:/usr/share/elasticsearch/data
      - ./es02/logs:/usr/share/elasticsearch/logs
      - /usr/share/elasticsearch/plugins/:/usr/share/elasticsearch/plugins/
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9202:9200
    networks:
      - elastic

  es03:
    image: elasticsearch:7.4.0
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - bootstrap.memory_lock=true
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    ulimits:
      memlock:
        soft: -1
        hard: -1
    volumes:
      - ./es03/data:/usr/share/elasticsearch/data
      - ./es03/logs:/usr/share/elasticsearch/logs
      - /usr/share/elasticsearch/plugins/:/usr/share/elasticsearch/plugins/
      - ./elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
    ports:
      - 9203:9200
    networks:
      - elastic

  kibana01:
    image: kibana:7.4.0
    container_name: kibana01
    links:
      - es01
      - es02
      - es03
    ports:
      - 5602:5601
    volumes:
      - ./kibana_config/:/usr/local/kibana/config/
    environment:
      ELASTICSEARCH_HOSTS: http://es01:9200
    networks:
      - elastic

networks:
  elastic:
    driver: bridge

创建elasticsearch.yml文件

network.host: 0.0.0.0

http.cors.enabled: true
http.cors.allow-origin: "*"

3. 修改目录文件权限

sudo chown -R 1000:1000 /root/es-cluster/

4. 运行docker-compose命令

进入/root/es-cluster目录下,执行以下名称

docker-compose up -d

如果需要停止则输入

docker-compose down

5. 安装cerebro监控ES集群

docker search cerebro 

docker pull yannart/cerebro 

docker run -d --name cerebro -p 9000:9000 yannart/cerebro

访问:
http://192.168.174.129:9000/

6. 创建索引库

创建一个test索引库,指定分片数为3,副本数为1

PUT test
{
  "settings": {
    "number_of_shards": 3
    , "number_of_replicas": 1
  }
}

Elasticsearch集群:搭建集群环境_第1张图片

7、Elasticsearch集群:JavaAPI操作集群

  1. spring-boot-data-elasticsearch,修改yml配置即可
spring:
  elasticsearch:
    rest:
      uris:
        - http://192.168.174.129:9201
        - http://192.168.174.129:9202
        - http://192.168.174.129:9203
  1. 运行导入数据的方法

发现可以正常导入数据到ES

8. Elasticsearch集群:脑裂问题

何为脑裂?

  • 一个正常es集群中只有一个主节点(Master),主节点负责管理整个集群。如创建或删除索引,并决定哪些分片分配给哪些节点。此外还跟踪哪些节点是集群的一部分。
  • 脑裂就是一个集群出现多个主节点从而使集群分裂,使得集群处于异常状态。简单来说就是一个集群里只能有一个老大来指挥工作,如果有多个老大,就乱套了。
    Elasticsearch集群:搭建集群环境_第2张图片

脑裂原因

  1. 网络原因:网络延迟、网络波动
    一般es集群会在内网部署,也可能在外网部署,比如阿里云。
    内网一般不会出现此问题,外网的网络出现问题的可能性大些。
  2. Master节点负载
    主节点的角色既为master又为data。数据访问量较大时,可能会导致Master节点停止响应(假死状态)。
  3. JVM内存回收
    当Master节点设置的JVM内存较小时,引发JVM的大规模内存回收,造成ES进程失去响应

避免脑裂

脑裂产生的原因:

  • 网络原因:网络延迟较高
  • 节点负载:主节点的角色既为master又为data
  • JVM内存回收:JVM内存设置太小

避免脑裂:

  • 网络原因:discovery.zen.ping.timeout 超时时间配置大一点。默认是3S

  • 节点负载:角色分离策略

    • 主节点配置:

      node.master: true # 是否有资格参加选举成为master
      node.data: false # 是否存储数据
      
    • 数据节点配置:

      node.master: false # 是否有资格参加选举成为master
      node.data: true # 是否存储数据
      
  • JVM内存回收:修改 config/jvm.options 文件的 -Xms 和 -Xmx 为服务器的物理内存一半。

  • 还可以在选举层面解决脑裂问题(即不让第二个老大产生):

    # 声明获4得大于几票,主节点才有效,请设置为(master eligble nodes / 2) + 1
    discovery.zen.minimum_master_nodes: 5
    

Elasticsearch集群:搭建集群环境_第3张图片

9. Elasticsearch集群:故障迁移

集群的master节点会监控集群中的节点状态,如果发现有节点宕机,会立即将宕机节点的分片数据迁移到其它节点,确保数据安全,这个叫做故障转移。

1.例如一个集群结构如图:
现在,node1是主节点,其它两个节点是从节点。

Elasticsearch集群:搭建集群环境_第4张图片
2. 突然,node1发生了故障:

docker-compose stop es01

Elasticsearch集群:搭建集群环境_第5张图片

宕机后的第一件事,需要重新选主,例如选中了node2:

Elasticsearch集群:搭建集群环境_第6张图片

node2成为主节点后,会检测集群监控状态,发现:shard-1、shard-0没有副本节点。因此需要将node1上的数据迁移到node2、node3:

Elasticsearch集群:搭建集群环境_第7张图片

你可能感兴趣的:(elasticsearch,docker)