# ES_DockerCompose_Mac_Cluster **Repository Path**: RobetLxx/ES_DockerCompose_Mac_Cluster ## Basic Information - **Project Name**: ES_DockerCompose_Mac_Cluster - **Description**: Mac使用 docker-compose 及 shell 编排部署单机多节点 ElasticSearch7.17.27环境。 当然多机器部署以此仓库内容做基础只需要简单修改各自 elasticSarch.yml 及 docker-compose.yml 等文件中的部分内容也可以进行部署。Readme文件中做了详细部署说明。 - **Primary Language**: Docker - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-03-04 - **Last Updated**: 2025-03-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: shell, Docker, docker-compose, ElasticSearch, cluster ## README ## 一、前言 `Docker Compose`是 `docker` 提供的一个命令行工具,用来定义和运行由多个容器组成的应用。使用 `compose`,我们可以通过 `YAML`或者`YML` 文件声明式的定义应用程序的各个服务,并由单个命令完成应用的创建和启动。 `ElasticSearch`版本为7.17.27。分词器也为7.17.27,分词器可以去官网下载,本文用的ik中文分词。 ## 二、Mac docker 和docker-compose安装 ### 2.1 Docker官网安装 Docker Desktop Mac安装很简单,只需要到[Docker Desktop 官网](https://www.docker.com/products/docker-desktop/)去下载对应 OS版本的就行,下载安装完会自动帮你加载 docker 和 docker-compose,不过当你需要使用时需要把这个 desktop 打开。否则 docker 就无法使用。 image-20250304092837863 ### 2.2 查看版本 ```bash docker version docker-compose version ``` image-20250304093105654 之后需要更改 docker 的国内源,由于 hub.docker 官网国内限制挺大的,一般我们如果直接用pull 镜像下来会非常慢。所以尽量采用国内源。推荐去[这个网站](https://www.coderjia.cn/archives/dba3f94c-a021-468a-8ac6-e840f85867ea)去找最新的 docker 国内源地址。之后在 Desktop 里设置里找到 Docker Engine 然后将国内源替换进去。 image-20250304093500884 ### **2.3 修改 docker desktop 中允许连接本地网络** 由于 Mac 原生不支持本地连接,所以Mac需要在 docker-hub 里打开设置,找到 Resources,其中有一个 NetWork,勾选里面的Enable host networking image-20250304114055580 ## 三、集群架构 ### 3.1 结构图及解释 image-20250304122813671 - `Master`节点作为`Master`节点与协调节点,为防止脑裂问题,降低负载,不存数据 - `Node1~Node3`为数据节点,不参与`Master`竞选 - `TribeNode`节点不存数据,不参与`Master`竞选 ### 3.2 集群划分 | 节点目录 | 节点名称 | 协调端口号 | 说明 | 查询端口号 | 节点IP | | ---------------- | -------- | ---------- | ---------------------------- | ---------- | ---------- | | docker-es-master | master | 9300 | master节点,非数据节点 | 9200 | 本机 ip | | docker-es-data01 | data01 | 9301 | 数据节点1,非master节点 | 9201 | 本机 ip | | docker-es-data02 | data02 | 9302 | 数据节点2,非master节点 | 9202 | 本机 ip | | docker-es-data03 | data03 | 9303 | 数据节点3,非master节点 | 9203 | 本机 ip | | docker-es-tribe | tribe | 9304 | 协调节点,非master非数据节点 | 9204 | 本机 ip | ## 四、集群配置 ### 4.1 目录结构 下载地址:https://github.com/RobetLxx/ES_DockerCompose_Mac_Cluster ```bash . ├── docker-es-cluster-down.sh ├── docker-es-cluster-stop.sh ├── docker-es-cluster-up.sh ├── docker-es-data01 │ ├── data01 │ ├── data01-logs │ ├── docker-compose.yml │ ├── .env │ └── es-config │ └── elasticsearch.yml ├── docker-es-data02 │ ├── data02 │ ├── data02-logs │ ├── docker-compose.yml │ ├── .env │ └── es-config │ └── elasticsearch.yml ├── docker-es-data03 │ ├── data03 │ ├── data03-logs │ ├── docker-compose.yml │ ├── .env │ └── es-config │ └── elasticsearch.yml ├── docker-es-master │ ├── docker-compose.yml │ ├── .env │ ├── es-config │ │ └── elasticsearch.yml │ ├── master-data │ └── master-logs ├── docker-es-tribe │ ├── docker-compose.yml │ ├── .env │ ├── es-config │ │ └── elasticsearch.yml │ ├── tribe-data │ └── tribe-logs ├── kibana │   └── docker-compose.yml └── plugins └── elasticsearch-analysis-ik-7.17.27 ``` ### 4.2 集群配置说明 #### 4.2.1 master节点docker-compose.yml配置说明 `docker-compose.yml` 是`docker-compose`的配置文件 ```bash services: es-master: image: elasticsearch:7.17.27 container_name: es-master environment: # setting container env - ES_JAVA_OPTS=${ES_JVM_OPTS} # set es bootstrap jvm args ulimits: memlock: soft: -1 hard: -1 nofile: soft: 65536 hard: 65536 restart: always volumes: - ./es-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml # es data路径 - ${MASTER_DATA_DIR}:/usr/share/elasticsearch/data:rw # es log路径 - ${MASTER_LOGS_DIR}:/usr/share/elasticsearch/logs:rw # 集成分词插件 - ${MASTER_PLUGINS_DIR}:/usr/share/elasticsearch/plugins/elasticsearch-analysis-ik-7.17.27 #由于 Mac 原生不支持本地连接,所以Mac需要在 docker-hub 里打开设置,找到 Resources,其中有一个 NetWork,勾选里面的Enable host networking network_mode: "host" ``` > 修改`pull`的镜像,替换其中的变量与配置文件,挂载数据与日志目录,最后用的`host`主机模式,让节点服务占用到实体机端口 >启动`ElasticSearch` 时如果提示无法访问日志或数据目录的问题可以通过,在`docker-compose.yml`的`environment`节点下添加`- TAKE_FILE_OWNERSHIP=true` #### 4.2.2 master节点elaticsearch.yml配置说明 `elaticsearch.yml` 是`ElasticSearch`的配置文件,搭建集群最关键的文件之一 ```bash # ======================== Elasticsearch Configuration ========================= cluster.name: es-cluster node.name: master node.attr.rack: r1 # node.master: true # node.data: false node.roles: [master] path.data: /usr/share/elasticsearch/data path.logs: /usr/share/elasticsearch/logs bootstrap.memory_lock: true network.host: 0.0.0.0 http.port: 9200 transport.tcp.port: 9300 discovery.seed_hosts: ["192.168.2.101:9301","192.168.2.101:9302","192.168.2.101:9303","192.168.2.101:9304"] cluster.initial_master_nodes: ["master"] #gateway.recover_after_data_nodes: 2 http.cors.enabled: true http.cors.allow-origin: "*" http.cors.allow-methods: OPTIONS, HEAD, GET, POST, PUT, DELETE http.cors.allow-headers: "X-Requested-With, Content-Type, Content-Length, X-User, Authorization" ingest.geoip.downloader.enabled: false #最好还是开开,只不过开开后需要设置一下账户密码比较麻烦,我本地用就不开了 xpack.ml.enabled: false ``` > - `transport.tcp.port` 设置`Elaticsearch`多节点协调的端口号 >- `discovery.seed_hosts` 设置当前节点启动后要发现的协调节点位置,当然自己不需要发现自己,推荐使用`ip:port`形式,集群形成快 >- `cluster.initial_master_nodes` 集群中可以成为`master`节点的节点名,这里指定唯一的一个,防止脑裂 #### 4.2.4 master节点.env配置说明 `.env` 这个文件为`docker-compose.yml`提供默认参数,方便修改 ```bash # the default environment for es-master # set es node jvm args ES_JVM_OPTS=-Xms2048m -Xmx2048m # set master node data folder MASTER_DATA_DIR=./master-data # set master node logs folder MASTER_LOGS_DIR=./master-logs # 插件目录 MASTER_PLUGINS_DIR=../plugins/elasticsearch-analysis-ik-7.17.27 ``` ## 五、使用说明 ### 5.1 多服务器环境使用说明 1. 若想将此脚本使用到生产上,需要修改每个节点下的`.env文件`,`将挂载数据`、`日志目录`修改为启动`Elaticsearch`的集群的用户可读写的位置,可以通过`sudo chmod 777 -R 目录` 或 `sudo chown -R 当前用户名:用户组 目录` 来修改被挂载的目录权限。 2. 修改`.env`下的`JVM`参数,扩大堆内存,启动与最大值最好相等,以减少`gc`次数,提高效率。 3. 修改所有节点下的`docker-compose.yml` 中的`network.host`地址 为当前所放置的主机的`ip`,`discovery.seed_hosts`需要填写具体各待发现节点的实体机`ip`,以确保可以组成集群。 4. 确保各端口在其宿主机上没有被占用,如有占用需确认是否有用,无用`kill`,有用则更新`docker-compose.yml`的`http.port`或`transport.tcp.port`,注意与此同时要更新其它节点的`discovery.seed_hosts`对应的`port`。 5. `docker-compose up -d`后台启动命令。 6. `docker-compose down`关闭同时移除容器与多余虚拟网卡。 7. `docker stop contains_name`根据容器名称关闭容器,不移除容器。 ### 5.2 单服务环境使用说明 1. `sudo sh docker-es-cluster-up.sh`创建并启动集群 2. `sudo sh docker-es-cluster-stop.sh`停止集群 3. `sudo sh docker-es-cluster-down.sh`停止并移除集群 >- 如果你想让这些脚本有执行权限,不妨试试sudo chmod +x *.sh >- 这些脚本中没有使用sudo,如需要使用sudo才能启动docker,请添加当前用户到docker组 4. **建议把所有节点的 数据文件夹和日志文件删除再启动** data和 log 文件夹。 ## 六、启动服务的常见问题 ### 6.1 `max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]` 问题翻译过来就是:`Elasticsearch`用户拥有的内存权限太小,至少需要`262144`; 解决办法: 执行命令: ```bash sudo sysctl -w vm.max_map_count=262144 ``` 查看结果: ```bash sudo sysctl -a|grep vm.max_map_count ``` 显示: ```bash vm.max_map_count = 262144 ``` 上述方法修改之后,如果重启虚拟机将失效,所以: 在 `/etc/sysctl.conf`文件最后添加一行,`vm.max_map_count=262144`,即可永久修改 ### 6.2 `memory locking requested for elasticsearch process but memory is not locked` 解决方法一,关闭`bootstrap.memory_lock`,会影响性能 ```bash vim elasticsearch.yml // 设置成false就正常运行了。 bootstrap.memory_lock: false ``` 解决方法二,开启`bootstrap.memory_lock` 1. 修改文件`elasticsearch.yml`,上面那个报错就是开启后产生的,如果开启还要修改其它系统配置文件 ```bash vim elasticsearch.yml bootstrap.memory_lock: true ``` 2. 修改文件`/etc/security/limits.conf`,最后添加以下内容。 ```bash * soft nofile 65536 * hard nofile 65536 * soft nproc 32000 * hard nproc 32000 * hard memlock unlimited * soft memlock unlimited ``` 3. 修改文件 `/etc/systemd/system.conf` ,分别修改以下内容。 ```bash DefaultLimitNOFILE=65536 DefaultLimitNPROC=32000 DefaultLimitMEMLOCK=infinity ``` 改好后**重启系统**。再启动`Elasticsearch`就没报错了 。 ## 七、效果验证 ```bash docker ps ``` image-20250304120049835 命令行输入`curl http://localhost:9200/_cat/health`或者浏览器打开http://localhost:9200/_cat/health?v 查看集群状态,出现如下信息则集群搭建成功 image-20250304115928407