Toggle navigation
Home
Java
Spring
Spring框架
SpringBoot
SpringCloud
SpringGateway
Nacos
Apollo配置中心
中间件
Redis
Mysql
ElasticSearch
算法
LeetCode
Docker 安装ES集群 8.4
## Docker 安装ES集群 我们以elasticsearch:8.4.1 为例使用docker 安装三节点集群版。 ### 拉取镜像 `docker pull elasticsearch:8.4.1` ### 创建ES 目录映射 ``` mkdir -p /data/service/es_cluster/node1/data mkdir -p /data/service/es_cluster/node1/logs mkdir -p /data/service/es_cluster/node1/config mkdir -p /data/service/es_cluster/node1/plugins mkdir -p /data/service/es_cluster/node2/data mkdir -p /data/service/es_cluster/node2/logs mkdir -p /data/service/es_cluster/node2/config mkdir -p /data/service/es_cluster/node2/plugins mkdir -p /data/service/es_cluster/node3/data mkdir -p /data/service/es_cluster/node3/logs mkdir -p /data/service/es_cluster/node3/config mkdir -p /data/service/es_cluster/node3/plugins ``` 我们准备将es的配置文件,插件目录,数据文件,以及日志 的目录中的数据保存在宿主机上,那么我们需要分别为三个节点创建目录。 需要注意的是 /data/service/es_cluster 这个目录是我为了便于管理所统一存放的目录可以根据自己需求进行更改。 当然这里只是进行路径创建,因为docker需要目录的操作权限,我这里就简单粗暴一些直接为整个目录赋予 777 权限。 ``` chmod -R 777 /data/service/es_cluster ``` 到这里,我们在宿主的每个目录就创建完了。接下来,我们需要为es创建配置文件。 ### 创建配置文件 分别在三个节点的配置文件目录下创建, 配置文件是用来定制你Elasticsearch实例的行为的。`elasticsearch.yml` 是Elasticsearch的主配置文件,它是YAML格式的. ``` /data/service/es_cluster/node1/config /data/service/es_cluster/node2/config /data/service/es_cluster/node3/config ``` 三个节点的内容如下: 1. 节点1 配置文件: `/data/service/es_cluster/node1/config/elasticsearch.yml` ``` cluster.name: "es_cluster" node.name: "elasticsearch1" network.host: 0.0.0.0 http.port: 9201 transport.port: 9301 discovery.seed_hosts: ["192.168.31.36:9302", "192.168.31.36:9303"] cluster.initial_master_nodes: ["elasticsearch1", "elasticsearch2", "elasticsearch3"] path.data: /usr/share/elasticsearch/data path.logs: /usr/share/elasticsearch/logs path.repo: /usr/share/elasticsearch/snapshots xpack.security.enabled: false ``` 2. 节点2 配置文件:`/data/service/es_cluster/node2/config/elasticsearch.yml` ``` cluster.name: "es_cluster" node.name: "elasticsearch2" network.host: 0.0.0.0 http.port: 9202 transport.port: 9302 discovery.seed_hosts: ["192.168.31.36:9301", "192.168.31.36:9303"] cluster.initial_master_nodes: ["elasticsearch1", "elasticsearch2", "elasticsearch3"] path.data: /usr/share/elasticsearch/data path.logs: /usr/share/elasticsearch/logs path.repo: /usr/share/elasticsearch/snapshots xpack.security.enabled: false ``` 3. 节点3 配置文件:`/data/service/es_cluster/node3/config/elasticsearch.yml` ``` cluster.name: "es_cluster" node.name: "elasticsearch3" network.host: 0.0.0.0 http.port: 9203 transport.port: 9303 discovery.seed_hosts: ["192.168.31.36:9301", "192.168.31.36:9302"] cluster.initial_master_nodes: ["elasticsearch1", "elasticsearch2", "elasticsearch3"] path.data: /usr/share/elasticsearch/data path.logs: /usr/share/elasticsearch/logs path.repo: /usr/share/elasticsearch/snapshots xpack.security.enabled: false ``` 当然,如上的配置中192.168.31.36 是我主机的ip可以根据情况修改成自己需要的。 在这些配置文件中: * `cluster.name`:集群的名称。 * `node.name`:节点的名称。 * `network.host`:网络主机地址,设置为 `0.0.0.0` 允许所有地址。 * `http.port` 和 `transport.port`:分别是HTTP和TCP传输的端口。 * `discovery.seed_hosts`:用于发现其他节点的种子主机列表。 * `cluster.initial_master_nodes`:初始主节点的列表。 * `path.data` 和 `path.logs`:数据和日志的存储路径。 * `path.repo`:用于存储快照的路径(你可以根据需要创建此目录)。 * `xpack.security.enabled`:是否启用X-Pack安全功能。 这只是一个基本的配置,你可以根据你的需求添加更多的配置选项。在开始之前,请确保已经创建了 `/usr/share/elasticsearch/snapshots` 目录在每个节点的Docker容器中,或者更改 `path.repo` 配置为你想要的目录。 一旦配置文件准备好了,你就可以使用先前提供的`docker run`命令来启动你的Elasticsearch集群了。 这里需要注意:`transport.tcp.port`。在新版本的 Elasticsearch 中(7.x 以后),这个设置已被弃用。你应该使用 `transport.port` 来代替。 到这里,我们就已经创建好了一个集群名叫 `es_cluster` 节点名 `elasticsearch1~3` http端口和tcp端口分别是`9201~9203` 和 `9301~9303` 的一个集群,为了方便后续学习我们暂时关闭了 XPack安全功能。 ### 启动ES docker 启动es 设置插件映射,数据文件,日志文件目录,并设置端口,集群地址,设置内存限制等操作。 命令如下 ``` # 启动第一个节点 docker run -d \ --name elasticsearch1 \ --network host \ --restart always \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ -v /data/service/es_cluster/node1/data:/usr/share/elasticsearch/data \ -v /data/service/es_cluster/node1/logs:/usr/share/elasticsearch/logs \ -v /data/service/es_cluster/node1/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /data/service/es_cluster/node1/plugins:/usr/share/elasticsearch/plugins \ -p 9201:9200 \ elasticsearch:8.4.1 # 启动第二个节点 docker run -d \ --name elasticsearch2 \ --network host \ --restart always \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ -v /data/service/es_cluster/node2/data:/usr/share/elasticsearch/data \ -v /data/service/es_cluster/node2/logs:/usr/share/elasticsearch/logs \ -v /data/service/es_cluster/node2/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /data/service/es_cluster/node2/plugins:/usr/share/elasticsearch/plugins \ -p 9202:9200 \ elasticsearch:8.4.1 # 启动第三个节点 docker run -d \ --name elasticsearch3 \ --network host \ --restart always \ -e ES_JAVA_OPTS="-Xms512m -Xmx512m" \ -v /data/service/es_cluster/node3/data:/usr/share/elasticsearch/data \ -v /data/service/es_cluster/node3/logs:/usr/share/elasticsearch/logs \ -v /data/service/es_cluster/node3/config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml \ -v /data/service/es_cluster/node3/plugins:/usr/share/elasticsearch/plugins \ -p 9203:9200 \ elasticsearch:8.4.1 ``` 命令说明。 以上命令用于启动一个由三个Elasticsearch节点组成的集群。每个节点都运行在其自己的Docker容器中。以下是这些命令的逐条说明: #### 通用参数 1. `docker run -d`: 这个命令用于启动一个新的Docker容器,并以守护进程模式(后台运行)运行。 2. `--name`: 指定容器的名称。我们有`elasticsearch1`, `elasticsearch2`, 和 `elasticsearch3`这三个节点。 3. `--network host`: 使用主机的网络,这意味着容器将共享主机的网络命名空间,而不是使用其自己的隔离da络。 4. `--restart always`: 确保如果容器停止,它将自动重新启动。 5. `-e ES_JAVA_OPTS="-Xms512m -Xmx512m"`: 设置JVM的初始堆大小和最大堆大小为512MB。 6. `-v`: 这个选项用于绑定挂载卷。它用于将主机上的文件或目录映射到容器内的文件或目录。 7. `-p`: 此选项用于将容器的端口映射到主机的端口。 8. `elasticsearch:8.4.1`: 使用版本为8.4.1的Elasticsearch Docker镜像来运行容器。 #### 节点特定的参数 * 对于`elasticsearch1`节点: * 数据目录:`/data/service/es_cluster/node1/data` * 日志目录:`/data/service/es_cluster/node1/logs` * 配置文件:`/data/service/es_cluster/node1/config/elasticsearch.yml` * 插件目录:`/data/service/es_cluster/node1/plugins` * 端口映射:`9201:9200` * 对于`elasticsearch2`节点: * 数据目录:`/data/service/es_cluster/node2/data` * 日志目录:`/data/service/es_cluster/node2/logs` * 配置文件:`/data/service/es_cluster/node2/config/elasticsearch.yml` * 插件目录:`/data/service/es_cluster/node2/plugins` * 端口映射:`9202:9200` * 对于`elasticsearch3`节点: * 数据目录:`/data/service/es_cluster/node3/data` * 日志目录:`/data/service/es_cluster/node3/logs` * 配置文件:`/data/service/es_cluster/node3/config/elasticsearch.yml` * 插件目录:`/data/service/es_cluster/node3/plugins` * 端口映射:`9203:9200` 通过这种方式,你可以在一个主机上运行一个分布式的Elasticsearch集群,每个节点都有其自己的配置和数据存储。 当然,因为我们使用了配置文件进行es的设置,如果不希望使用es的配置文件进行设置的话可以使用如下命令-e指定环境变量进行启动。其他节点以此类推。 ``` # 启动第一个节点 docker run -d \ --name elasticsearch1 \ --network host \ -e "node.name=elasticsearch1" \ -e "cluster.name=es_cluster" \ -e "discovery.seed_hosts=192.168.31.36:9201,192.168.31.36:9202" \ -e "cluster.initial_master_nodes=elasticsearch1,elasticsearch2,elasticsearch3" \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -v /es_cluster/node1/data:/usr/share/elasticsearch/data \ -v /es_cluster/node1/logs:/usr/share/elasticsearch/logs \ -v /es_cluster/node1/config:/usr/share/elasticsearch/config \ -v /es_cluster/node1/plugins:/usr/share/elasticsearch/plugins \ -p 9200:9200 \ elasticsearch:8.0.0 ``` ### 验证是否成功 如果一切正常那么你就可以通过以下命令使用三个节点中任意一个节点来查看集群状态 > http://localhost:9200/_cluster/health?pretty 返回结果如下: ``` { "cluster_name" : "es_cluster", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 3, "active_primary_shards" : 9, "active_shards" : 18, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 } ``` ## ES启动报错处理 ### 目录没有授权操作权限 ``` [0.001s][error][logging] Error opening log file 'logs/gc.log': Permission denied [0.001s][error][logging] Initialization of output 'file=logs/gc.log' using options 'filecount=32,filesize=64m' failed. error: Invalid -Xlog option '-Xlog:gc*,gc+age=trace,safepoint:file=logs/gc.log:utctime,pid,tags:filecount=32,filesize=64m', see error log for details. Error: Could not create the Java Virtual Machine. Error: A fatal exception has occurred. Program will exit. at org.elasticsearch.server.cli.JvmOption.flagsFinal(JvmOption.java:113) at org.elasticsearch.server.cli.JvmOption.findFinalOptions(JvmOption.java:80) ``` Elasticsearch试图写入GC日志文件时权限被拒绝。你需要确保在你映射到的卷上有正确的权限。 ``` chmod -R 777 /data/service/es_cluster/node1/logs chmod -R 777 /data/service/es_cluster/node2/logs chmod -R 777 /data/service/es_cluster/node3/logs ``` ### 使用了过时的配置项 ``` {"@timestamp":"2023-09-07T05:36:54.790Z", "log.level":"ERROR", "message":"fatal exception while booting Elasticsearch", "ecs.version": "1.2.0","service.name":"ES_ECS","event.dataset":"elasticsearch.server","process.thread.name":"main","log.logger":"org.elasticsearch.bootstrap.Elasticsearch","elasticsearch.node.name":"elasticsearch1","elasticsearch.cluster.name":"es_cluster","error.type":"java.lang.IllegalArgumentException","error.message":"unknown setting [transport.tcp.port] did you mean any of [transport.port, transport.tcp.keep_count]?","error.stack_trace":"java.lang.IllegalArgumentException: unknown setting [transport.tcp.port] did you mean any of [transport.port, transport.tcp.keep_count]?\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:559)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:505)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:475)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.common.settings.AbstractScopedSettings.validate(AbstractScopedSettings.java:445)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.common.settings.SettingsModule.<init>(SettingsModule.java:151)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.common.settings.SettingsModule.<init>(SettingsModule.java:56)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.node.Node.<init>(Node.java:450)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.node.Node.<init>(Node.java:311)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.bootstrap.Elasticsearch$2.<init>(Elasticsearch.java:214)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.bootstrap.Elasticsearch.initPhase3(Elasticsearch.java:214)\n\tat org.elasticsearch.server@8.4.1/org.elasticsearch.bootstrap.Elasticsearch.main(Elasticsearch.java:67)\n"} ERROR: Elasticsearch did not exit normally - check the logs at /usr/share/elasticsearch/logs/es_cluster.log ERROR: Elasticsearch exited unexpectedly ``` 这个错误表示你在`elasticsearch.yml`文件中设置了一个未知的参数 `transport.tcp.port`。在新版本的 Elasticsearch 中(7.x 以后),这个设置已被弃用。你应该使用 `transport.port` 来代替。 ### 开启了XPACK 但是其他的ssl相关配置未配置。 ``` bootstrap check failure [3] of [3]: Transport SSL must be enabled if security is enabled. Please set [xpack.security.transport.ssl.enabled] to [true] or disable security by setting [xpack.security.enabled] to [false] ``` 因为我们目前只是学习使用所以暂时可以采取关闭的方式修改配置文件 ``` xpack.security.transport.ssl.enabled: true # 或者 xpack.security.enabled: false ``` ### 最大与最小堆内存不一致 ``` bootstrap check failure [1] of [3]: initial heap size [134217728] not equal to maximum heap size [536870912]; this can cause resize pauses ``` 我们在docker启动命令中添加制定了最大与最小内存,需要一致。 ``` -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ ``` ### 进程可以拥有的VMA(虚拟内存区域)的数量太小 ``` bootstrap check failure [1] of [1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] ``` 修改主机(不是docker容器哈) Elasticsearch启动时的引导检查失败问题。为了解决这个问题,你需要增加`vm.max_map_count`的值。这是一个Linux内核参数,用于限制一个进程可以拥有的VMA(虚拟内存区域)的数量。默认情况下,这个数字可能比Elasticsearch推荐的最小值262144小,这就是为什么你看到这个错误消息。 以下是如何更改这个参数的方法: **临时更改** 你可以临时更改此设置(它将在系统重启后重置)使用以下命令: ```shell sudo sysctl -w vm.max_map_count=262144 ``` **永久更改** 如果你想永久更改此设置,你可以编辑`/etc/sysctl.conf`文件并添加或更改以下行: ```shell vm.max_map_count=262144 ``` 之后,你可以运行以下命令来应用更改: ```shell sudo sysctl -p ```
中间件
软件安装
ES
文章分类
Nacos
SpringGateway
Nacos
Java
Spring
SpringBoot
SpringCloud
中间件
SpringGateway
Nacos
Redis
Mysql
算法
LeetCode
Apollo配置中心
ElasticSearch
Spring框架
文章标签
Redis基础知识
中间件
数据库
Mysql
算法题
面试题
软件安装
SpringFramework
ES