寫在前邊
搞了兩三天了,一直有個問題困擾着我,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節點的節點名,這裏指定唯一的一個,防止腦裂
使用說明
- 若想將此腳本使用到生產上,需要修改每個節點下的
.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.
本文系原創文章,禁止轉載。
【精選推薦文章】
智慧手機時代的來臨,RWD網頁設計已成為網頁設計推薦首選
想知道網站建置、網站改版該如何進行嗎?將由專業工程師為您規劃客製化網頁設計及後台網頁設計
廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益