Docker Elasticsearch 集羣配置 Docker-常用基建的安裝與部署

一:選用ES原因

公司項目有些mysql的表數據已經超過5百萬了,各種業務的查詢入庫壓力已經凸顯出來,初步打算將一個月前的數據遷移到ES中,mysql的老數據就物理刪除掉。

首先是ES使用起來比較方便,對於項目初期存儲一些不能刪除但又一般使用不到的數據比較合適,

還有就是ES的存儲採用索引分片式,使用數據的創建時間分片也很合適。

本文使用的ES版本:5.6.8,docker版本:18.06.3-ce

本文的測試機器爲兩臺百度雲的2C4G的機器,每個機器分別部署三個節點(1個master,2個data),總共6個節點,次配置僅爲研究測試用,具體生產業務要看情況考慮。

二:Docker的安裝:

  參考我之前的安裝文檔:《Docker-常用基建的安裝與部署》。

三:ES配置

1:創建es相關目錄

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
# 一個機器 三個節點,複製兩份
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:編輯 服務器A的 elasticsearch.yml

#跨域支持
http.cors.enabled: true
http.cors.allow-origin: "*"
#集羣名稱(所有節點的集羣名稱必須一致)
cluster.name: es-nova
#節點名稱(集羣下每個節點都不相同)
node.name: node-0
#ifconfig查看當前系統的內網ip
network.host: 172.16.0.4
#對外服務的http端口,默認爲9200
http.port: 9201 #設置可以訪問的ip,默認爲0.0.0.0,這裏全部設置通過
network.bind_host:
0.0.0.0 #設置結點之間交互的ip地址
network.publish_host: 當前服務器
的外網ip #culster transport port #節點之間交互的tcp端口
transport.tcp.port:
9301 transport.tcp.compress: true #至少存在一個主資格節點時才進行主節點選舉,防止腦裂 discovery.zen.minimum_master_nodes: 1 #是否有master選舉資格:一個集羣同時只有一個master存在,true代表有資格參與master選舉
node.master:
true #是否作爲數據節點:參與數據存儲與查詢
node.data:
false #等待集羣至少存在多少節點數才進行數據恢復 gateway.recover_after_nodes: 3 #等待 5 分鐘,或者3 個節點上線後,才進行數據恢復,這取決於哪個條件先達到 gateway.expected_nodes: 3 gateway.recover_after_time: 5m #集羣單播發現 discovery.zen.ping.unicast.hosts: ["外網ip:9301","另一臺服務器外網ip:9301"]
# 連接集羣超時時間 discovery.zen.ping_timeout: 120s # discovery.zen.fd合理的設置可以避免正常機器重啓造成的數據遷移 # 單次心跳檢測ping超時時間 discovery.zen.fd.ping_timeout: 60s # 多少次心跳檢測失敗才認爲節點丟失 discovery.zen.fd.ping_retries: 3 # 集羣機器間機器定時心跳檢測時間 discovery.zen.fd.ping_interval: 30s # 爲保證ES性能,請同時關閉系統內存交換 swapp #bootstrap.memory_lock: true

上面這個當前一個非數據節點的master節點的配置,然後再基於當前的配置,簡單修改下,分別在es-1/conf 和 es-2/conf 下創建兩個數據節點,

只需要修改以下配置:

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:編輯 服務器B的 elasticsearch.yml

#跨域支持
http.cors.enabled: true
http.cors.allow-origin: "*"
#集羣名稱(所有節點的集羣名稱必須一致)
cluster.name: es-nova
#節點名稱(集羣下每個節點都不相同)
node.name: node-4
#ifconfig查看當前系統的內網ip
network.host: 172.16.0.4
#對外服務的http端口,默認爲9200
http.port: 9201
#設置可以訪問的ip,默認爲0.0.0.0,這裏全部設置通過
network.bind_host: 0.0.0.0
#設置結點之間交互的ip地址
network.publish_host: 當前服務器的外網ip
#culster transport port
#節點之間交互的tcp端口
transport.tcp.port: 9301
transport.tcp.compress: true
#至少存在一個主資格節點時才進行主節點選舉,防止腦裂
discovery.zen.minimum_master_nodes: 1
#是否有master選舉資格:一個集羣同時只有一個master存在,true代表有資格參與master選舉
node.master: true
#是否作爲數據節點:參與數據存儲與查詢
node.data: false
#等待集羣至少存在多少節點數才進行數據恢復
gateway.recover_after_nodes: 3
#等待 5 分鐘,或者3 個節點上線後,才進行數據恢復,這取決於哪個條件先達到
gateway.expected_nodes: 3
gateway.recover_after_time: 5m
#集羣單播發現
discovery.zen.ping.unicast.hosts: ["外網ip:9301","另一臺服務器外網ip:9301"]
# 連接集羣超時時間
discovery.zen.ping_timeout: 120s
# discovery.zen.fd合理的設置可以避免正常機器重啓造成的數據遷移
# 單次心跳檢測ping超時時間
discovery.zen.fd.ping_timeout: 60s
# 多少次心跳檢測失敗才認爲節點丟失
discovery.zen.fd.ping_retries: 3
# 集羣機器間機器定時心跳檢測時間
discovery.zen.fd.ping_interval: 30s
# 爲保證ES性能,請同時關閉系統內存交換 swapp 
#bootstrap.memory_lock: true

和服務器A的不同配置僅僅 node.namenetwork.publish_host。

同樣在當前服務器下也分別在es-1/conf 和 es-2/conf 下創建兩個數據節點,

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

 

四:修改宿主機的配置

如果es集羣啓動報錯: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
# 執行命令sysctl -p 生效
sysctl -p
如果es集羣啓動報錯: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

 

然後再修改 /etc/systemd/system.conf

DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity

 

最後重啓系統即可解決

# 關閉selinux
vim /etc/sysconfig/selinux
# 將 SELINUX=enforcing 改爲 SELINUX=disabled

 

五:集羣

1:開啓集羣

分別啓動服務器A的三個es節點、服務器B的三個es節點 (啓動命令中僅docker的路徑不同)

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

啓動完成後,docker ps  以及docker logs es-0  去查看es是否啓動成功。

 

2:常用的一些es命令

#集羣健康
curl -XGET 127.0.0.1:9201/_cat/health?v

"status": 集羣狀態,重點關注項

* green正常
* yellow服務仍然可用但存在副本分片丟失,
* red 存在主分片丟失,集羣不正常,存在數據丟失可能

shards :所有分片數(主分片+副本分片)

pri:主分片數

 

# 查詢集羣節點
curl -XGET 127.0.0.1:9203/_cat/nodes?v

 v替換爲format=json可以使用json形式返回

表頭字段 含義 用途
Ip IP地址  
heap.percent heap使用百分比 內存使用高時重點關注
ram.percent 系統內存使用百分比 內存使用高時重點關注
cpu  當前cpu使用百分比 CPU使用高時重點關注
load_1m 最近1分鐘cpu load CPU使用高時重點關注
load_5m 最近5分鐘cpu load CPU使用高時重點關注
load_15m 最近15分鐘cpu load CPU使用高時重點關注
node.role 三字母縮寫 m: 主節點  d: 數據節點  i: 協調節點  
master * 表示當前節點爲主節點  

 

 

 

 

 

 

 

 

 

 

 

 

 

# 分片信息查詢
curl -XGET 127.0.0.1:9201/_cat/shards?v

 

表頭字段 含義 用途
index 索引名  
shard 分片  
prirep p:主分片,r:副本分片  
state 節點狀態  
docs 分片文檔數  
store 分片數據大小  
ip 分片所在ip地址  
node 分片所在節點名稱 結合prirep,確定多個主分片是否分佈在同一個節點

 

 

 

 

 

 

 

 

 

 

 

 

 

分片移動(當多個主分片分配在同一節點,造成單節點寫入壓力較大,可將其中一個主分片移動到空閒節點)

POST _cluster/reroute
{
   "commands": [
     {
       "move": {
         "index": "poi-address",            // 索引名
         "shard": 2,                        // 分片號
         "from_node": "node-1",            // 源節點
         "to_node": "node-5"            // 目標節點
       }
     }
   ]
}
commands爲json數據,支持多個遷移命令同時執行,可通過GET /_cat/recovery?v 查看遷移進度

 

六:參考文獻

1:Elasticsearch: 權威指南

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章