SpringCloud(10)— Elasticsearch集群

SpringCloud(10)— Elasticsearch集群

一 搭建ES集群

单机的 Elasticsearch 做数据存储,必然面临两个问题:海量数据存储问题,单点故障等

  • 海量数据存储问题:将索引库从逻辑上拆分为 N 个分片(shard),存储到多个节点
  • 单点故障问题:将分片数据在不同节点上备份(replica)

在这里插入图片描述

es 集群中的数据备份使用了错位备份的原理,即当前节点的数据将会备份在其他节点上。这样做保证了当某一节点宕机后,数据仍然完整

1.创建 docker-compose 文件

执行 docker-compose 文件之前,需要修改部分文件权限

# 1.进入文件进行编辑
vim /etc/sysctl.conf
# 2.添加如下内容
vm.max_map_count=262144
# 3.然后执行,让其生效
sysctl -p

创建 docker-compose 文件,复制一下内容到服务器。运行即可。

version: '3.4'

services:
  es01:
    image: elasticsearch:7.12.1
    container_name: es01
    environment:
      - node.name=es01
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es02,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: elasticsearch:7.12.1
    container_name: es02
    environment:
      - node.name=es02
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es03
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data02:/usr/share/elasticsearch/data
    ports:
      - 9201:9200
    networks:
      - elastic
  es03:
    image: elasticsearch:7.12.1
    container_name: es03
    environment:
      - node.name=es03
      - cluster.name=es-docker-cluster
      - discovery.seed_hosts=es01,es02
      - cluster.initial_master_nodes=es01,es02,es03
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    volumes:
      - data03:/usr/share/elasticsearch/data
    ports:
      - 9202:9200
    networks:
      - elastic

volumes:
  data01:
    driver: local
  data02:
    driver: local
  data03:
    driver: local

networks:
  elastic:
    driver: bridge

2.运行 docker-compose 文件

运行完成后,将创建 Elasticsearch 集群,其中有3台 Elasticsearch 服务器

docker-compose up -d

二 集群状态监控

1.使用 cerebro

这里不再使用 kibana 来监控集群状态(kibana 的配置较为复杂),而是通过 cerebro 来监控。

cerebro 的官方文档:GitHub - lmenezes/cerebro

Docker Hub 地址: https://hub.docker.com/r/lmenezes/cerebro/

使用 docker 部署 cerebro:

# 1.拉取镜像
docker pull lmenezes/cerebro
# 2.运行镜像
docker run --name renebro -p 9000:9000 -d lmenezes/cerebro
# 3.浏览器访问 9000 端口即可

2.访问 cerebro

在这里插入图片描述

在主界面输入任一ES集群的地址,即可进入管理界面,

例如:http://192.168.119.101:9200

在这里插入图片描述

集群列表中的 实心星星 表示为主节点,其余为 候选节点

3.设置分片

可在创建索引库时设置分片信息

PUT /test
{
  "settings": {
    "number_of_shards": 3,     //分片数量
    "number_of_replicas": 1    //副本树量
  },
  "mappings": {
    "properties": {
      "firstName": {
        "type": "keyword"
      },
      "lastName": {
        "type": "keyword"
      }
    }
  }
}

三 节点角色划分和脑裂

1.节点角色划分

elasticsearch中集群节点的不同的职责划分

在这里插入图片描述

elasticsearch中的每一个节点都有着属于自己的不同职责,因此建议集群部署时,每个节点都有独立的角色

在这里插入图片描述

2.脑裂问题

默认情况下,每个节点都是master-eligible,因此一旦master节点宕机,其他候选节点会选举一个新的节点成为主节点。

当主节点与其他节点网络故障时,可能发生脑裂问题。

脑裂问题:一个集群中因为某种原因出现了多个主节点,导致数据不同步

为了避免脑裂,需要要求 ”选票“ 数量超过 ( eligible +1 ) / 2 才能当选。因此 eligible 最好为奇数。

在这里插入图片描述

对应的配置项为 discovery.zen.minmun_master_nodes。在 es 7.0 以后已经成为了默认配置,因此一般不会发生脑裂。

四 ES集群的分布式存储

1.查看数据位置

新增文档时,应该保存到不同分片,保证数据均衡。

GET /test/_search
{
    "query":{
        "match_all":{}
    },
    "explain":true
}

explain:通过 explain 命令,可以看到插入的数据具体在集群上的哪一个分片中。

在这里插入图片描述

2.分布式存储算法

elasticsearch 通过 hash 算法来计算文档应该存储到哪个分片中

在这里插入图片描述

说明:

  • _routing:默认是文档id
  • number_of_shards:表示分片数量
  • 算法与分片数量有关,因此索引库一旦创建,分片数量不能修改

3.分布式新增流程

在这里插入图片描述

4.分布式查询流程

在这里插入图片描述

五 故障转移

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

尝试停掉 es01服务,此时 cerebro 给出警告提示:

在这里插入图片描述

稍微等待一会儿,es 集群将会自己完成迁移,迁移完成后,索引库状况如下:

在这里插入图片描述

这样便保证了集群中数据的安全性

在这里插入图片描述

故障转移保证了 es 集群可以任意伸缩且不出现任何故障

Elasticsearch 知识点完结。后续想起什么了再补充

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值