Elasticsearch 集群配置與容器部署
摘要:本文屬于原創(chuàng)怕磨,歡迎轉(zhuǎn)載,轉(zhuǎn)載請保留出處: https://github.com/jasonGeng88/blog
本文所有服務(wù)均采用docker容器化方式部署
當(dāng)前環(huán)境
Mac OS 10.11.x
Docker >= 1.12
elasticsearch 5.3
技術(shù)說明
Elasticsearch(ES) 是一個分布式可擴展的實時搜索和分析引擎胡嘿。底層基于的是 Apache Lucene 的搜索引擎按傅。
目錄
配置文件講解
容器化配置
總結(jié)
簡介
寫這篇文章的主要原因是之前部署 ES 集群的過程中遇到了一些問題含末,后來在看了官方文檔后,發(fā)現(xiàn)和網(wǎng)上類似的文章還是所有差別。網(wǎng)上基本都是版本比較早的羔飞,而且沒有用容器化來部署肺樟。尤其是在 版本5 之后引入了 Bootstrap Check 機制,下面來給大家講講我的理解逻淌。
配置文件
ES 有兩個配置文件么伯,分別是:
elasticsearch.yml :ES 的具體配置。
log4j2.properties :ES 日志文件卡儒。( 順便提一下田柔,ES 是由 JAVA 實現(xiàn)的,所以寫 JAVA 的同學(xué)看到這文件應(yīng)該很熟悉骨望,這里就不展開了 )硬爆。
elasticsearch.yml 配置
路徑
path.data: ES 數(shù)據(jù)的存儲地址;
path.logs: ES 日志地址擎鸠;
網(wǎng)絡(luò)
ES 在網(wǎng)絡(luò)方面主要提供兩種協(xié)議:
http: 用于 REST API 的使用缀磕;
tcp:用于節(jié)點間通信;
其對應(yīng)的模塊是 http 與 transport劣光,詳情可查看 模塊列表 袜蚕。
http.host:設(shè)置 HTTP 的服務(wù)地址;
http.port:設(shè)置 HTTP 端口赎线,默認(rèn)端口 9200-9300廷没;
transport.host:設(shè)置 TCP 的服務(wù)地址糊饱;
transport.tcp.port:設(shè)置 TCP 端口垂寥,默認(rèn)端口 9300-9400;
ES 還提供了一個 network.host 設(shè)置另锋,http 與 tcp 的 host 默認(rèn)是綁定在它上面的滞项,所以大多數(shù)情況下,上面參數(shù)可不進(jìn)行配置夭坪。
network.host:默認(rèn)為本地回環(huán)地址文判。 當(dāng)定義該屬性時,程序環(huán)境默認(rèn)切換至生產(chǎn)環(huán)境(即開啟 Bootstrap Checks) 室梅。
集群
ES 中的集群是根據(jù)集群名稱來關(guān)聯(lián)的戏仓,它會將集群名稱相同的節(jié)點自動關(guān)聯(lián)成一個集群,并通過節(jié)點名稱來做區(qū)分亡鼠。
節(jié)點常用的分為 集群管理節(jié)點(master) 與 數(shù)據(jù)操作節(jié)點(data)赏殃,默認(rèn)情況下是兩者都是。
cluster.name:集群名稱间涵,默認(rèn)名稱 elasticsearch仁热;
node.name:節(jié)點名稱,同一集群下勾哩,節(jié)點名稱不能重復(fù)抗蠢;
發(fā)現(xiàn)機制
上面講了集群的組成举哟,但是節(jié)點與節(jié)點之間是如何發(fā)現(xiàn)的呢?
這里采用的是 ES 自帶的 Zen Discovery 發(fā)現(xiàn)機制迅矛,
discovery.zen.ping.unicast.hosts:需要發(fā)現(xiàn)的節(jié)點地址妨猩,支持 IP 和 domain,在不指定端口的情況下诬乞,會默認(rèn)掃描端口 9300 - 9305册赛。
discovery.zen.ping.unicast.hosts: - 192.168.1.10:9300 - 192.168.1.11 - seeds.mydomain.com
discovery.zen.minimum_master_nodes:master 節(jié)點最少可用數(shù),當(dāng)節(jié)點數(shù)小于該值震嫉,服務(wù)將不可用森瘪。這也是為了避免集群中出現(xiàn)多個中心,導(dǎo)致數(shù)據(jù)不一致票堵;
計算公式:(master 節(jié)點數(shù) / 2) + 1# 例子:(3 / 2) + 1discovery.zen.minimum_master_nodes: 2
Bootstrap Checks(生產(chǎn)環(huán)境)
上面講到了 Bootstrap Checks扼睬,這也是它區(qū)別之前老版本的一個地方,在以前的版本中悴势,也有這些警告窗宇,但有時會被人忽視,造成了服務(wù)的不穩(wěn)定性特纤。在版本 5.0 之后军俊,對這些在啟動時做了強校驗,來保證在生產(chǎn)環(huán)境下的穩(wěn)定性捧存。
這些校驗主要涉及有內(nèi)存粪躬、線程數(shù)、文件句柄等昔穴,
JVM heap:
建議將最小堆與最大堆設(shè)置為一樣镰官,當(dāng)設(shè)置bootstrap.memory_lock時,在程序啟動就會對內(nèi)存進(jìn)行鎖定吗货。
ES_JAVA_OPTS=-Xms512m -Xmx512m
內(nèi)存鎖定泳唠,禁止內(nèi)存與磁盤的置換
bootstrap.memory_lock: true
取消文件數(shù)限制
ulimit -n unlimited
取消線程數(shù)限制
ulimit -l unlimited
容器化配置
關(guān)于容器化還是通過 docker 技術(shù)來實現(xiàn),這里為了簡單起見宙搬,以 Docker Cli 的方式進(jìn)行部署笨腥。
es1.yml
cluster.name: my-applicationnode.name: node-1# 可以選擇宿主機地址,網(wǎng)絡(luò)模式選擇 --net=hostnetwork.host: 172.17.0.2bootstrap.memory_lock: truediscovery.zen.ping.unicast.hosts: ["172.17.0.3"]discovery.zen.minimum_master_nodes: 2
es2.yml
cluster.name: my-applicationnode.name: node-2network.host: 172.17.0.3bootstrap.memory_lock: truediscovery.zen.ping.unicast.hosts: ["172.17.0.2"]discovery.zen.minimum_master_nodes: 2
docker cli
啟動 es1docker run -d --name=es1 -p 9200:9200 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 -v ${YOUR_PATH}/es1.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v ${YOUR_PATH}/data:/usr/share/elasticsearch/data -v ${YOUR_PATH}/logs:/usr/share/elasticsearch/logs \elasticsearch:5.3# 啟動 es2docker run -d --name=es2 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" --ulimit memlock=-1:-1 --ulimit nofile=65536:65536 -v ${YOUR_PATH}/es2.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v ${YOUR_PATH}/data:/usr/share/elasticsearch/data -v ${YOUR_PATH}/logs:/usr/share/elasticsearch/logs \elasticsearch:5.3
查看結(jié)果:
容器情況
集群情況(GET: /_cat/health?v)
內(nèi)存鎖定情況(GET: /_nodes?filter_path=**.mlockall)
坑:在容器化中勇垛,由于沒鎖定內(nèi)存脖母。每次在節(jié)點加入時,容器總是意外崩潰窥摄,查看容器相關(guān)日志也沒有任何說明镶奉。后來在系統(tǒng)日志中發(fā)現(xiàn)內(nèi)存溢出的問題。所以再次強調(diào),一定要設(shè)置 bootstrap.memory_lock: true哨苛,并且查看是否生效鸽凶。
總結(jié)
本文從 ES 的配置文件開頭,從 文件路徑建峭、網(wǎng)絡(luò)情況玻侥、集群配置以及生產(chǎn)環(huán)境的校驗等方面講述了配置文件的主要內(nèi)容,最后以 docker 容器化的方式進(jìn)行了集群的部署亿蒸。雖然文章寫的比較簡單凑兰,但涉及的面還是比較多的,包括節(jié)點間發(fā)現(xiàn)的網(wǎng)絡(luò)單播傳輸边锁、集群最小節(jié)點個數(shù)的算法姑食、jvm的內(nèi)存限制、內(nèi)存與磁盤的置換限制等茅坛。有興趣的同學(xué)音半,可以自行去研究下。