SpringCloud学习笔记(十)ElasticSearch10集群

10.10 ES集群

单机ElasticSearch做数据存储面临两个问题:海量数据存储问题、单点故障问题。

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

10.10.1搭建集群

使用docker模拟多台ES。

0.修改Linux系统权限

es运行需要修改Linux权限

# 打开配置文件
vi /etc/sysctl.conf
# 控制一个进程可以拥有的最大内存区域数量,以保证es正常运行
vm.max_map_count=262144
# 加载修改后的文件,使配置生效
sysctl -p

1.编写docker-compose文件,上传到linux并启动

version: '3'
services:
es01:
  image: elasticsearch:8.8.1
  container_name: es01
  environment:
    - node.name=es01
    - cluster.name=es-docker-cluster #es支持集群,名称一致的节点在一个集群
    - discovery.seed_hosts=es02,es03 #集群其他节点的ip地址,docker容器互联故可直接使用名称
    - 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:8.8.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:8.8.1
  container_name: es03
  environment:
    - node.name=es03
    - cluster.name=es-docker-cluster
    - discovery.seed_hosts=es02,es01
    - 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 #使用本地驱动,数据存储在docker所在机器
data02:
  driver: local
data03:
  driver: local
networks:
elastic:
  driver: bridge

10.10.2集群状态监控

方法一:使用kibana监控es集群,需要依赖es的x-pack功能,比较复杂;

方法二:使用cerebro,官方网址

下载并解压,运行bat文件,即可在9000端口启动cerebro

image-20230713122144673
image-20230713122559063

10.10.3集群职责及脑裂

ES集群的节点角色

elasticsearch中集群节点的职责划分如下:

image-20230713122649762

默认情况下es节点同时具有以上四种角色,可以通过修改默认值修改职责。例如下面示例集群:

image-20230713123233843

脑裂

image-20230713123604951

此时若网络恢复,则同一个集群会出现两个主节点,而两个主节点控制的节点数据不一致,出现问题。

解决方法:

为了避免脑裂,要求选票超过(eligible节点数量+1)/2才能当选为主,因此eligible节点数量最好是奇数。对应配置项是discovery.zen.minimum_master_nodes,在es7.0之后已经是默认配置,故一般不会发生脑裂问题。

10.10.4分布式新增和查询流程

新增文档时应该保存到不同的分片,保证数据均衡。这个工作由coordinating node完成。

具体算法:

image-20230713131437990

分布式新增

image-20230713131559061

分布式查询

image-20230713131748852

10.10.5故障转移

image-20230713132010215

示例:当es01恢复正常时,数据分片也会恢复到原始状态。

image-20230713132255966

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注