Docker Elasticsearch 集群配置
點(diǎn)擊上方藍(lán)色字體,選擇“標(biāo)星公眾號(hào)”
優(yōu)質(zhì)文章,第一時(shí)間送達(dá)
作者 | 讓我發(fā)會(huì)呆
來(lái)源 | urlify.cn/NNRvUv
76套java從入門(mén)到精通實(shí)戰(zhàn)課程分享
一:選用ES原因
公司項(xiàng)目有些mysql的表數(shù)據(jù)已經(jīng)超過(guò)5百萬(wàn)了,各種業(yè)務(wù)的查詢?nèi)霂?kù)壓力已經(jīng)凸顯出來(lái),初步打算將一個(gè)月前的數(shù)據(jù)遷移到ES中,mysql的老數(shù)據(jù)就物理刪除掉。
首先是ES使用起來(lái)比較方便,對(duì)于項(xiàng)目初期存儲(chǔ)一些不能刪除但又一般使用不到的數(shù)據(jù)比較合適,
還有就是ES的存儲(chǔ)采用索引分片式,使用數(shù)據(jù)的創(chuàng)建時(shí)間分片也很合適。
本文使用的ES版本:5.6.8,docker版本:18.06.3-ce。
本文的測(cè)試機(jī)器為兩臺(tái)百度云的2C4G的機(jī)器,每個(gè)機(jī)器分別部署三個(gè)節(jié)點(diǎn)(1個(gè)master,2個(gè)data),總共6個(gè)節(jié)點(diǎn),次配置僅為研究測(cè)試用,具體生產(chǎn)業(yè)務(wù)要看情況考慮。
二:Docker的安裝:
參考我之前的安裝文檔:《Docker-常用基建的安裝與部署》。
三:ES配置
1:創(chuàng)建es相關(guān)目錄
cd /home/data/docker
mkdir -p es/cluster/es-0/conf
mkdir -p es/cluster/es-1/conf
mkdir -p es/cluster/es-2/conf
cd es/cluster/es-0/conf
touch elasticsearch.yml
# 一個(gè)機(jī)器 三個(gè)節(jié)點(diǎn),復(fù)制兩份
cd /home/data/docker
cp es/cluster/es-0/conf/elasticsearch.yml es/cluster/es-1/conf
cp es/cluster/es-0/conf/elasticsearch.yml es/cluster/es-2/conf
2:編輯 服務(wù)器A的 elasticsearch.yml
#跨域支持
http.cors.enabled: true
http.cors.allow-origin: "*"
#集群名稱(chēng)(所有節(jié)點(diǎn)的集群名稱(chēng)必須一致)
cluster.name: es-nova
#節(jié)點(diǎn)名稱(chēng)(集群下每個(gè)節(jié)點(diǎn)都不相同)
node.name: node-0#ifconfig查看當(dāng)前系統(tǒng)的內(nèi)網(wǎng)ipnetwork.host: 172.16.0.4#對(duì)外服務(wù)的http端口,默認(rèn)為9200http.port: 9201
#設(shè)置可以訪問(wèn)的ip,默認(rèn)為0.0.0.0,這里全部設(shè)置通過(guò)network.bind_host: 0.0.0.0
#設(shè)置結(jié)點(diǎn)之間交互的ip地址network.publish_host: 當(dāng)前服務(wù)器的外網(wǎng)ip
#culster transport port
#節(jié)點(diǎn)之間交互的tcp端口transport.tcp.port: 9301
transport.tcp.compress: true
#至少存在一個(gè)主資格節(jié)點(diǎn)時(shí)才進(jìn)行主節(jié)點(diǎn)選舉,防止腦裂
discovery.zen.minimum_master_nodes: 1
#是否有master選舉資格:一個(gè)集群同時(shí)只有一個(gè)master存在,true代表有資格參與master選舉node.master: true
#是否作為數(shù)據(jù)節(jié)點(diǎn):參與數(shù)據(jù)存儲(chǔ)與查詢node.data: false
#等待集群至少存在多少節(jié)點(diǎn)數(shù)才進(jìn)行數(shù)據(jù)恢復(fù)
gateway.recover_after_nodes: 3
#等待 5 分鐘,或者3 個(gè)節(jié)點(diǎn)上線后,才進(jìn)行數(shù)據(jù)恢復(fù),這取決于哪個(gè)條件先達(dá)到
gateway.expected_nodes: 3
gateway.recover_after_time: 5m
#集群?jiǎn)尾グl(fā)現(xiàn)
discovery.zen.ping.unicast.hosts: ["外網(wǎng)ip:9301","另一臺(tái)服務(wù)器外網(wǎng)ip:9301"]# 連接集群超時(shí)時(shí)間
discovery.zen.ping_timeout: 120s
# discovery.zen.fd合理的設(shè)置可以避免正常機(jī)器重啟造成的數(shù)據(jù)遷移
# 單次心跳檢測(cè)ping超時(shí)時(shí)間
discovery.zen.fd.ping_timeout: 60s
# 多少次心跳檢測(cè)失敗才認(rèn)為節(jié)點(diǎn)丟失
discovery.zen.fd.ping_retries: 3
# 集群機(jī)器間機(jī)器定時(shí)心跳檢測(cè)時(shí)間
discovery.zen.fd.ping_interval: 30s
# 為保證ES性能,請(qǐng)同時(shí)關(guān)閉系統(tǒng)內(nèi)存交換 swapp
#bootstrap.memory_lock: true
上面這個(gè)當(dāng)前一個(gè)非數(shù)據(jù)節(jié)點(diǎn)的master節(jié)點(diǎn)的配置,然后再基于當(dāng)前的配置,簡(jiǎn)單修改下,分別在es-1/conf 和 es-2/conf 下創(chuàng)建兩個(gè)數(shù)據(jù)節(jié)點(diǎn),
只需要修改以下配置:
node.name: node-1
http.port: 9202
transport.tcp.port: 9302
node.master: false
node.data: true
node.name: node-2
http.port: 9203
transport.tcp.port: 9303
node.master: false
node.data: true
3:編輯 服務(wù)器B的 elasticsearch.yml
#跨域支持
http.cors.enabled: true
http.cors.allow-origin: "*"
#集群名稱(chēng)(所有節(jié)點(diǎn)的集群名稱(chēng)必須一致)
cluster.name: es-nova
#節(jié)點(diǎn)名稱(chēng)(集群下每個(gè)節(jié)點(diǎn)都不相同)
node.name: node-4
#ifconfig查看當(dāng)前系統(tǒng)的內(nèi)網(wǎng)ip
network.host: 172.16.0.4
#對(duì)外服務(wù)的http端口,默認(rèn)為9200
http.port: 9201
#設(shè)置可以訪問(wèn)的ip,默認(rèn)為0.0.0.0,這里全部設(shè)置通過(guò)
network.bind_host: 0.0.0.0
#設(shè)置結(jié)點(diǎn)之間交互的ip地址
network.publish_host: 當(dāng)前服務(wù)器的外網(wǎng)ip
#culster transport port
#節(jié)點(diǎn)之間交互的tcp端口
transport.tcp.port: 9301
transport.tcp.compress: true
#至少存在一個(gè)主資格節(jié)點(diǎn)時(shí)才進(jìn)行主節(jié)點(diǎn)選舉,防止腦裂
discovery.zen.minimum_master_nodes: 1
#是否有master選舉資格:一個(gè)集群同時(shí)只有一個(gè)master存在,true代表有資格參與master選舉
node.master: true
#是否作為數(shù)據(jù)節(jié)點(diǎn):參與數(shù)據(jù)存儲(chǔ)與查詢
node.data: false
#等待集群至少存在多少節(jié)點(diǎn)數(shù)才進(jìn)行數(shù)據(jù)恢復(fù)
gateway.recover_after_nodes: 3
#等待 5 分鐘,或者3 個(gè)節(jié)點(diǎn)上線后,才進(jìn)行數(shù)據(jù)恢復(fù),這取決于哪個(gè)條件先達(dá)到
gateway.expected_nodes: 3
gateway.recover_after_time: 5m
#集群?jiǎn)尾グl(fā)現(xiàn)
discovery.zen.ping.unicast.hosts: ["外網(wǎng)ip:9301","另一臺(tái)服務(wù)器外網(wǎng)ip:9301"]
# 連接集群超時(shí)時(shí)間
discovery.zen.ping_timeout: 120s
# discovery.zen.fd合理的設(shè)置可以避免正常機(jī)器重啟造成的數(shù)據(jù)遷移
# 單次心跳檢測(cè)ping超時(shí)時(shí)間
discovery.zen.fd.ping_timeout: 60s
# 多少次心跳檢測(cè)失敗才認(rèn)為節(jié)點(diǎn)丟失
discovery.zen.fd.ping_retries: 3
# 集群機(jī)器間機(jī)器定時(shí)心跳檢測(cè)時(shí)間
discovery.zen.fd.ping_interval: 30s
# 為保證ES性能,請(qǐng)同時(shí)關(guān)閉系統(tǒng)內(nèi)存交換 swapp
#bootstrap.memory_lock: true
和服務(wù)器A的不同配置僅僅 node.name和network.publish_host。
同樣在當(dāng)前服務(wù)器下也分別在es-1/conf 和 es-2/conf 下創(chuàng)建兩個(gè)數(shù)據(jù)節(jié)點(diǎn),
node.name: node-5
http.port: 9202
transport.tcp.port: 9302
node.master: false
node.data: true
node.name: node-6
http.port: 9203
transport.tcp.port: 9303
node.master: false
node.data: true
四:修改宿主機(jī)的配置
如果es集群?jiǎn)?dòng)報(bào)錯(cuò):max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144] vim /etc/sysctl.conf
# 配置里需要添加
vm.max_map_count=262144
# 執(zhí)行命令sysctl -p 生效
sysctl -p
如果es集群?jiǎn)?dòng)報(bào)錯(cuò):memory locking requested for elasticsearch process but memory is not locked# 修改limits.conf vim /etc/security/limits.conf# 添加 *表示所用用戶
* soft nofile 65536
* hard nofile 65536
* soft nproc 32000
* hard nproc 32000
* hard memlock unlimited
* soft memlock unlimited
# 關(guān)閉selinux
vim /etc/sysconfig/selinux
# 將 SELINUX=enforcing 改為 SELINUX=disabled
五:集群
1:開(kāi)啟集群
docker run -d --name es-0 -p 9201:9201 -p 9301:9301 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /home/data/docker/es/cluster/es-0/data:/usr/share/elasticsearch/data -v /home/data/docker/es/cluster/es-0/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/docker/es/cluster/es-0/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8
docker run -d --name es-1 -p 9202:9202 -p 9302:9302 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /home/data/docker/es/cluster/es-1/data:/usr/share/elasticsearch/data -v /home/data/docker/es/cluster/es-1/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/docker/es/cluster/es-1/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8
docker run -d --name es-2 -p 9203:9203 -p 9303:9303 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /home/data/docker/es/cluster/es-2/data:/usr/share/elasticsearch/data -v /home/data/docker/es/cluster/es-2/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /home/data/docker/es/cluster/es-2/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8
docker run -d --name es-0 -p 9201:9201 -p 9301:9301 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /root/data/docker/es/cluster/es-0/data:/usr/share/elasticsearch/data -v /root/data/docker/es/cluster/es-0/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /root/data/docker/es/cluster/es-0/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8
docker run -d --name es-1 -p 9202:9202 -p 9302:9302 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /root/data/docker/es/cluster/es-1/data:/usr/share/elasticsearch/data -v /root/data/docker/es/cluster/es-1/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /root/data/docker/es/cluster/es-1/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8
docker run -d --name es-2 -p 9203:9203 -p 9303:9303 -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" -v /root/data/docker/es/cluster/es-2/data:/usr/share/elasticsearch/data -v /root/data/docker/es/cluster/es-2/conf/elasticsearch.yml:/usr/share/elasticsearch/config/elasticsearch.yml -v /root/data/docker/es/cluster/es-2/logs:/user/share/elasticsearch/logs --restart=always elasticsearch:5.6.8
啟動(dòng)完成后,docker ps 以及docker logs es-0 去查看es是否啟動(dòng)成功。

2:常用的一些es命令
#集群健康
curl -XGET 127.0.0.1:9201/_cat/health?v

"status": 集群狀態(tài),重點(diǎn)關(guān)注項(xiàng)
* green正常
* yellow服務(wù)仍然可用但存在副本分片丟失,
* red 存在主分片丟失,集群不正常,存在數(shù)據(jù)丟失可能
shards :所有分片數(shù)(主分片+副本分片)
pri:主分片數(shù)
# 查詢集群節(jié)點(diǎn)
curl -XGET 127.0.0.1:9203/_cat/nodes?v

v替換為format=json可以使用json形式返回
| 表頭字段 | 含義 | 用途 |
| Ip | IP地址 | |
| heap.percent | heap使用百分比 | 內(nèi)存使用高時(shí)重點(diǎn)關(guān)注 |
| ram.percent | 系統(tǒng)內(nèi)存使用百分比 | 內(nèi)存使用高時(shí)重點(diǎn)關(guān)注 |
| cpu | 當(dāng)前cpu使用百分比 | CPU使用高時(shí)重點(diǎn)關(guān)注 |
| load_1m | 最近1分鐘cpu load | CPU使用高時(shí)重點(diǎn)關(guān)注 |
| load_5m | 最近5分鐘cpu load | CPU使用高時(shí)重點(diǎn)關(guān)注 |
| load_15m | 最近15分鐘cpu load | CPU使用高時(shí)重點(diǎn)關(guān)注 |
| node.role | 三字母縮寫(xiě) m: 主節(jié)點(diǎn) d: 數(shù)據(jù)節(jié)點(diǎn) i: 協(xié)調(diào)節(jié)點(diǎn) | |
| master | * 表示當(dāng)前節(jié)點(diǎn)為主節(jié)點(diǎn) |
# 分片信息查詢
curl -XGET 127.0.0.1:9201/_cat/shards?v
| 表頭字段 | 含義 | 用途 |
| index | 索引名 | |
| shard | 分片 | |
| prirep | p:主分片,r:副本分片 | |
| state | 節(jié)點(diǎn)狀態(tài) | |
| docs | 分片文檔數(shù) | |
| store | 分片數(shù)據(jù)大小 | |
| ip | 分片所在ip地址 | |
| node | 分片所在節(jié)點(diǎn)名稱(chēng) | 結(jié)合prirep,確定多個(gè)主分片是否分布在同一個(gè)節(jié)點(diǎn) |
分片移動(dòng)(當(dāng)多個(gè)主分片分配在同一節(jié)點(diǎn),造成單節(jié)點(diǎn)寫(xiě)入壓力較大,可將其中一個(gè)主分片移動(dòng)到空閑節(jié)點(diǎn))
POST _cluster/reroute
{
"commands": [
{
"move": {
"index": "poi-address", // 索引名
"shard": 2, // 分片號(hào)
"from_node": "node-1", // 源節(jié)點(diǎn)
"to_node": "node-5" // 目標(biāo)節(jié)點(diǎn)
}
}
]
}
commands為json數(shù)據(jù),支持多個(gè)遷移命令同時(shí)執(zhí)行,可通過(guò)GET /_cat/recovery?v 查看遷移進(jìn)度
粉絲福利:Java從入門(mén)到入土學(xué)習(xí)路線圖
??????

??長(zhǎng)按上方微信二維碼 2 秒
感謝點(diǎn)贊支持下哈 
