ElasticSearch集群

我们ES集群主要解决的是这两个问题:海量数据存储问题、单点故障问题

海量数据存储问题:单机的ES,数据存储能力是有上限的

单点故障问题:如果单机上的Elasticsearch节点发生故障,整个系统会停止服务,导致数据不可访问甚至丢失,造成损失

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

·海量数据存储问题:将索引库从逻辑上拆分为N个分片(shard),每一份叫做一个分片,存储到多个节点,多台机器上,这样我的存储能力是多个节点存储能力总和,机器越多,理论存储的上限就可以越高,存储能力就得到提升了:

单点故障问题:将分片数据做一个备份,并且一个分片的主分片和副分片绝对不能放在同一个节点,避免这个节点挂了,什么都没有了 ,这样可以在一定的程度上解决单点故障问题,当然成本也越高。

部署es集群

docker-compose:在一个文本文件里描述多个容器的部署方式,从而实现一键部署,描述了三个es节点容器的部署方案;

部署es集群可以直接使用docker-compose来完成,不过要求你的Linux虚拟机至少有4G的内存空间,我们现在利用三个docker容器模拟3个ed节点(3个机器),容器之间相互隔离:

java 复制代码
version: '2.2'
services:
  es01:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
    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:
      - data01:/usr/share/elasticsearch/data
    ports:
      - 9200:9200
    networks:
      - elastic
  es02:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
    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:
      - data02:/usr/share/elasticsearch/data
    networks:
      - elastic
  es03:
    image: docker.elastic.co/elasticsearch/elasticsearch:7.17.5
    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:
      - data03:/usr/share/elasticsearch/data
    networks:
      - elastic

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

networks:
  elastic:
    driver: bridge

在这个compose的文件里,其实就是描述了我们要部署的三个es节点的部署方案,es01、es02、es03的写法基本上一致的:

  • Image镜像:每一个容器都采用的都是elasticSearch7.12.1。
  • container_name容器的名称
  • Environment:环境变量
  • node.name节点名称,在elasticSearch里边,每个节点都要有自己的名字,不能重复。
  • Cluster.name集群名称,这个就很重要了,elasticSearch天生是支持集群的,你启动多台机器以后,只需要让他们的集群名称一样就可以了。因为集群名称一样,es就会自动把它们组装成一个集群,非常的方便。
  • Discovery.seed_hosts其实就是集群中的另外两个节点的ip地址,那这里我为什么没有写i p地址呢?是因为docker容器内可以直接用容器名互联
  • initial_master_nodes:初始化的主节点/配置候选主节点,既然是集群,一定有主从之分
  • ES_JAVA_OPTS:配置JVM堆内存大小,最小内存和最大内存都配成了512M
  • Volumes:数据卷
  • Port端口映射:注意一下三个节点容器外的端口不能一致

第一步:

java 复制代码
vi /etc/sysctl.conf

第二步:

java 复制代码
​​​​​​​vm.max_map_count = 262144

第三步: 让配置生效

java 复制代码
sysctl -p 
java 复制代码
[root@db301601 ~]# docker restart es
es
[root@db301601 ~]# docker ps
CONTAINER ID   IMAGE                  COMMAND                  CREATED          STATUS          PORTS                                                                                  NAMES
877298bbcfdf   elasticsearch:7.12.1   "/bin/tini -- /usr/l..."   22 minutes ago   Up 23 seconds   0.0.0.0:9200->9200/tcp, :::9200->9200/tcp, 0.0.0.0:9300->9300/tcp, :::9300->9300/tcp   es
881f28a337e6   kibana:7.12.1          "/bin/tini -- /usr/l..."   2 hours ago      Up 2 hours      0.0.0.0:5601->5601/tcp, :::5601->5601/tcp                                              kibana
[root@db301601 ~]# vi /etc/sysctl.conf
[root@db301601 ~]# sysctl -p 
vm.swappiness = 0
kernel.sysrq = 1
net.ipv4.neigh.default.gc_stale_time = 120
net.ipv4.conf.all.rp_filter = 0
net.ipv4.conf.default.rp_filter = 0
net.ipv4.conf.default.arp_announce = 2
net.ipv4.conf.lo.arp_announce = 2
net.ipv4.conf.all.arp_announce = 2
net.ipv4.tcp_max_tw_buckets = 5000
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_max_syn_backlog = 1024
net.ipv4.tcp_synack_retries = 2
net.ipv4.tcp_slow_start_after_idle = 0
vm.max_map_count = 262144
[root@db301601 ~]# 

第四步:运行

如果报错请看这篇博客: docker-compose: command not found-CSDN博客

java 复制代码
docker-compose up -d

我们可以用kibana去监控集群的状态,但是kibana默认只能连接到其中的一个节点,并且还依赖x-pack,所以采用cerebro:

然后你输入节点的地址,就可以访问虚拟机上任意节点的地址了:

集群下的数据查询、存储是什么样子的呢

相关推荐
焦耳热科技前沿17 小时前
中科大EMA:3秒焦耳热一步合成双功能催化剂用于甲醇氧化协同高效制氢
大数据·人工智能·自动化·能源·材料工程
向量引擎小橙18 小时前
推理革命与能耗:AI大模型应用落地的“冰山成本”与破局之路
大数据·人工智能·深度学习·集成学习
一条咸鱼_SaltyFish18 小时前
[Day15] 若依框架二次开发改造记录:定制化之旅 contract-security-ruoyi
java·大数据·经验分享·分布式·微服务·架构·ai编程
TMT星球19 小时前
星动纪元携人形机器人家族亮相CES 2026,海外业务占比达50%
大数据·人工智能·机器人
chen<>19 小时前
Git原理与应用
大数据·git·elasticsearch·svn
焦耳热科技前沿19 小时前
西华大学Adv. Sci.:超高温焦耳热冲击制备拓扑缺陷碳,用于催化碳纳米管可控生长
大数据·人工智能·能源·材料工程·电池
hepingfly19 小时前
外链的两个指标,DR 和 UR 一次性讲清楚
搜索引擎·个人开发·seo
故乡de云20 小时前
Google Cloud与AWS大数据AI服务对比:2026年企业选型指南
大数据·人工智能·aws
米粒120 小时前
操作系统原理--处理机调度
大数据
数说星榆18120 小时前
在线高清泳道图制作工具 无水印 PC
大数据·人工智能·架构·机器人·流程图