【拆分版】Docker-compose構建Elasticsearch 7.1.0集群

寫在前邊

搞了兩三天了,一直有個問題困擾着我,ES集群中配置怎麼能正確映射到主機上,這邊經常報ClusterFormationFailureHelper master not discovered or elected yet.原因是容器中的ES節點沒有正確的映射到主機上,而且容器內ip是易變的,我該怎麼配置呢?

臨下班了,終於想到個法子,固定容器ip——使用network_mode: host

看到主機模式的我眼前一亮,容器就相當於一個主機服務,你占哪個端口就是哪個,沒有必要再去自己指定port去映射到主機。這樣只要主機ip不變,容器中ip不就沒問題了么!!!

本文內容架構圖

解釋:

Master節點作為Master節點與協調節點,為防止腦裂問題,降低負載,不存數據

Node1~Node3為數據節點,不參與Master競選

TribeNode節點不存數據,不參與Master競選

準備環境

  • GNU/Debain Stretch 9.9 linux-4.19
  • Docker 18.09.6
  • Docker-Compose 1.17.1
  • elasticsearch:7.1.0

配置腳本參見我的Github <https://github.com/hellxz/docker-es-cluster.git>

宿主機環境準備參考ELK集群搭建,基於7.1.1 文中開始搭建的前四步

目錄結構

.
├── 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

最終效果

各目錄代表節點與端口號

節點目錄 節點名稱 協調端口號 說明 查詢端口號
docker-es-data01 data01 9301 數據節點1,非master節點 9201
docker-es-data02 data02 9302 數據節點2,非master節點 9202
docker-es-data03 data03 9303 數據節點3,非master節點 9203
docker-es-master master 9300 master節點,非數據節點 9200
docker-es-tribe tribe 9304 協調節點,非master非數據節點 9204

想測試這些節點是否可用,只需要修改每個節點目錄下的es-config/elasticsearch.yml中的ip地址,全部換成你需要的ip即可。

各文件功用舉例說明

鑒於這裏邊有很多是重複操作,這裏僅拿其中的master節點進行舉例,其餘代碼參見Github

.env 這個文件為docker-compose.yml提供默認參數,方便修改

# the default environment for es-master
# set es node jvm args
ES_JVM_OPTS=-Xms256m -Xmx256m
# set master node data folder
MASTER_DATA_DIR=./master-data
# set master node logs folder
MASTER_LOGS_DIR=./master-logs

docker-compose.yml docker-compose的配置文件

version: "3"
services:
    es-master:
        image: elasticsearch:7.1.0
        container_name: es-master
        environment: # setting container env
            - ES_JAVA_OPTS=${ES_JVM_OPTS}   # set es bootstrap jvm args
        restart: always
        volumes:
            - ./es-config/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml
            - ${MASTER_DATA_DIR}:/usr/share/elasticsearch/data:rw
            - ${MASTER_LOGS_DIR}:/usr/share/elasticsearch/logs:rw
        network_mode: "host"

簡單來說,就是修改pull的鏡像,替換其中的變量與配置文件,掛載數據與日誌目錄,最後用的host主機模式,讓節點服務佔用到實體機端口

elaticsearch.yml elasticsearch的配置文件,搭建集群最關鍵的文件之一

# ======================== Elasticsearch Configuration =========================
cluster.name: es-cluster
node.name: master 
node.master: true
node.data: false
node.attr.rack: r1 
bootstrap.memory_lock: true 
http.port: 9200
network.host: 10.2.114.110
transport.tcp.port: 9300
discovery.seed_hosts: ["10.2.114.110:9301","10.2.114.110:9302","10.2.114.110:9303","10.2.114.110:9304"] 
cluster.initial_master_nodes: ["master"] 
gateway.recover_after_nodes: 2

按照前幾篇文章下來,大家對這些參數已經不是很陌生了,這裏簡單說下幾個比較重要的參數

  • transport.tcp.port 設置es多節點協調的端口號
  • discovery.seed_hosts 設置當前節點啟動后要發現的協調節點位置,當然自己不需要發現自己,推薦使用ip:port形式,集群形成快
  • cluster.initial_master_nodes 集群中可以成為master節點的節點名,這裏指定唯一的一個,防止腦裂

使用說明

  1. 若想將此腳本使用到生產上,需要修改每個節點下的.env文件,將掛載數據、日誌目錄修改為啟動es的集群的用戶可讀寫的位置,可以通過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.ymlhttp.porttransport.tcp.port,注意與此同時要更新其它節點的discovery.seed_hosts對應的port
  5. 如果在同一台主機上,可以參考使用文章後邊的簡單的shell腳本

各節點操作命令

後台啟動命令均為docker-compose up -d

關閉命令:

  • docker-compose down: 關閉同時移除容器與多餘虛擬網卡
  • docker stop contains_name: 根據容器名稱關閉容器,不移除容器

簡單的Shell腳本

docker-es-cluster-up.sh

#/bin/bash
# please put this shell script to the root of each node folder.
# this shell script for start up the docker-es-cluster designed in the one of linux server.
cd docker-es-master && docker-compose up -d && \
cd ../docker-es-data01 && docker-compose up -d && \
cd ../docker-es-data02 && docker-compose up -d && \
cd ../docker-es-data03 && docker-compose up -d && \
cd ../docker-es-tribe && docker-compose up -d && \
cd ..

docker-es-cluster-down.sh

#/bin/bash
# please put this shell script to the root of each node folder.
# this shell script for remove the docker-es-cluster's containers and networks designed in the one of linux server.
cd docker-es-tribe && docker-compose down && \
cd ../docker-es-data03 && docker-compose down && \
cd ../docker-es-data02 && docker-compose down && \
cd ../docker-es-data01 && docker-compose down && \
cd ../docker-es-master && docker-compose down && \
cd ..

docker-es-cluster-stop.sh

#/bin/bash
# please put this shell script to the root of each node folder.
# this shell script for stop the docker-es-cluster's containers designed in the one of linux server.
docker stop es-tribe es-data03 es-data02 es-data01 es-master

如果你想讓這些腳本有執行權限,不妨試試sudo chmod +x *.sh

這些腳本中沒有使用sudo,如需要使用sudo才能啟動docker,請添加當前用戶到docker組

Enjoy.

本文系原創文章,禁止轉載。

【精選推薦文章】

智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選

想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計

帶您來看台北網站建置台北網頁設計,各種案例分享

廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益