Docker Elasticsearch 叢集配置

讓我發會呆發表於2021-02-25

一:選用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

# 關閉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: 權威指南

 

相關文章