一:選用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.name和network.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 檢視遷移進度
六:參考文獻