elasticsearch 集群

集群

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

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

ES集群相关概念:

  • 集群(cluster):一组拥有共同的 cluster name 的 节点。

  • 节点(node) :集群中的一个 Elasticearch 实例

  • 分片(shard):索引可以被拆分为不同的部分进行存储,称为分片。在集群环境下,一个索引的不同分片可以拆分到不同的节点中

    解决问题:数据量太大,单点存储量有限的问题。

  • 主分片(Primary shard):相对于副本分片的定义。

  • 副本分片(Replica shard)每个主分片可以有一个或者多个副本,数据和主分片一样。

数据备份可以保证高可用,但是每个分片备份一份,所需要的节点数量就会翻一倍,成本实在是太高了!

为了在高可用和成本间寻求平衡,可以这样做:

  • 首先对数据分片,存储到不同节点
  • 然后对每个分片进行备份,放到对方节点,完成互相备份

这样可以大大减少所需要的服务节点数量,如图,我们以3分片,每个分片备份一份为例:

现在,每个分片都有1个备份,存储在3个节点:

  • node0:保存了分片0和1
  • node1:保存了分片0和2
  • node2:保存了分片1和2

搭建ES集群

首先编写一个docker-compose.yml文件,内容如下:
复制代码
 1 version: '2.2'
 2 services:
 3   es01:
 4     image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
 5     container_name: es01
 6     environment:
 7       - node.name=es01
 8       - cluster.name=es-docker-cluster
 9       - discovery.seed_hosts=es02,es03
10       - cluster.initial_master_nodes=es01,es02,es03
11       - bootstrap.memory_lock=true
12       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
13     ulimits:
14       memlock:
15         soft: -1
16         hard: -1
17     volumes:
18       - data01:/usr/share/elasticsearch/data
19     ports:
20       - 9200:9200
21     networks:
22       - elastic
23   es02:
24     image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
25     container_name: es02
26     environment:
27       - node.name=es02
28       - cluster.name=es-docker-cluster
29       - discovery.seed_hosts=es01,es03
30       - cluster.initial_master_nodes=es01,es02,es03
31       - bootstrap.memory_lock=true
32       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
33     ulimits:
34       memlock:
35         soft: -1
36         hard: -1
37     volumes:
38       - data02:/usr/share/elasticsearch/data
39     networks:
40       - elastic
41   es03: // 定义了集群的服务名称
42     image: docker.elastic.co/elasticsearch/elasticsearch:7.12.1
43     container_name: es03 // 定义了容器的名称
44     environment: // 定义了集群的环境
45       - node.name=es03 // 定义了节点的名称
46       - cluster.name=es-docker-cluster // 定义了集群的名称
47       - discovery.seed_hosts=es01,es02 // 定义了集群的种子节点
48       - cluster.initial_master_nodes=es01,es02,es03 // 定义了集群的初始主节点
49       - bootstrap.memory_lock=true // 锁定内存
50       - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
51     ulimits: // 定义了容器中进程的资源限制
52       memlock: // 指定了对内存锁定(locked memory)的限制
53         soft: -1 // 设置了内存锁定的软限制为无限制
54         hard: -1 // 设置了内存锁定的硬限制为无限制
55     volumes:
56       - data03:/usr/share/elasticsearch/data
57     networks:
58       - elastic
59 
60 volumes: // 定义数据卷
61   data01: // 定义了一个名为data01的数据卷
62     driver: local // 使用本地驱动, 意味着卷的数据将存储在宿主机的本地文件系统中,但具体的存储路径由 Docker 管理
63   data02:
64     driver: local
65   data03:
66     driver: local
67 
68 networks: // 自定义网络
69   elastic: // 定义了一个名为elastic的网络
70     driver: bridge // 桥接网络(bridge)
View Code
复制代码

导航到包含 docker-compose.yml 文件的目录,运行docker-compose.yml文件

docker-compose up -d

docker compose up -d

docker-compose和docker compose 的区别

  1. 安装方式

    • docker-compose up 需要单独安装 Docker Compose。
    • docker compose up 是 Docker CLI 的内置插件,无需单独安装。
  2. 命令命名空间

    • docker-compose up 使用独立的命名空间 docker-compose
    • docker compose up 使用 docker 命令下的子命令 compose
  3. 功能和行为

    • 两者在大多数情况下功能相似,但在某些高级用法或新特性上可能有所不同。docker compose 通常会包含更多的改进和优化。
    • docker compose 可能支持更多的 Docker CLI 标准化选项和参数。

集群状态监控

kibana可以监控es集群,不过新版本需要依赖es的x-pack 功能,配置比较复杂。

这里推荐使用cerebro来监控es集群状态,官方网址:https://github.com/lmenezes/cerebro

解压即可使用,非常方便。

解压好的目录如下:

进入对应的bin目录:

双击其中的cerebro.bat文件即可启动服务。

访问http://localhost:9000 即可进入管理界面:

输入你的elasticsearch的任意节点的地址和端口,点击connect即可:

绿色的条,代表集群处于绿色(健康状态)。

创建索引库

1)利用kibana的DevTools创建索引库

在DevTools中输入指令:

复制代码
PUT /itcast
{
  "settings": {
    "number_of_shards": 3, // 分片数量
    "number_of_replicas": 1 // 副本数量
  },
  "mappings": {
    "properties": {
      // mapping映射定义 ...
    }
  }
}
复制代码

2)利用cerebro创建索引库

利用cerebro还可以创建索引库:

填写索引库信息:

查看分片效果

回到首页,即可查看索引库分片效果:

 

posted @   一杯水M  阅读(19)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
阅读排行:
· DeepSeek 开源周回顾「GitHub 热点速览」
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
历史上的今天:
2020-01-22 JavaWeb学习之HttpServletRequest 和 HttpServletResponse
点击右上角即可分享
微信分享提示