【拆分版】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>
目錄結構
. ├── 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
各檔案功用舉例說明
鑑於這裡邊有很多是重複操作,這裡僅拿其中的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節點的節點名,這裡指定唯一的一個,防止腦裂
使用說明
- 若想將此指令碼使用到生產上,需要修改每個節點下的
.env
檔案,將掛載資料、日誌目錄修改為啟動es的叢集的使用者可讀寫的位置,可以通過sudo chmod 777 -R 目錄
或sudo chown -R 當前使用者名稱:使用者組 目錄
來修改被掛載的目錄許可權 - 修改.
env
下的JVM引數,擴大堆記憶體,啟動與最大值最好相等,以減少gc次數,提高效率 - 修改所有節點下的
docker-compose.yml
中的network.host
地址 為當前所放置的主機的ip,discovery.seed_hosts
需要填寫具體各待發現節點的實體機ip,以確保可以組成叢集 - 確保各埠在其宿主機上沒有被佔用,如有佔用需確認是否有用,無用kill,有用則更新
docker-compose.yml
的http.port
或transport.tcp.port
,注意與此同時要更新其它節點的discovery.seed_hosts
對應的port - 如果在同一臺主機上,可以參考使用文章後邊的簡單的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.
本文系原創文章,禁止轉載