很多問題也沒有考慮的很規范,對elastic產品也只停留的很淺的理解,不足之處望理解並指出,相互交流學習。
es7.1.1環境搭建
es7版本自帶jdk環境,不需要再重裝
-
創建es用戶
# 添加用戶組 groupadd es # 添加用戶 useradd -m -g es es #配置密碼 passwd es
-
時間同步
yum install -y ntp systemctl enable ntpd && systemctl start ntpd timedatectl set-timezone Asia/Shanghai timedatectl set-ntp yes ntpq -p
-
sudo權限
# 在最后增加 elsearch ALL=(ALL) NOPASSWD:ALL
-
下載 & 解壓
# 下載 wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.1.1-linux-x86_64.tar.gz #解壓 tar xvf elasticsearch-7.1.1-linux-x86_64.tar.gz
-
系統配置
swapoff -a cat >> /etc/sysctl.conf <<EOF fs.file-max=655360 vm.max_map_count = 262144 EOF vim /etc/security/limits.conf * soft nproc 20480 * hard nproc 20480 * soft nofile 65536 * hard nofile 65536 * soft memlock unlimited * hard memlock unlimited vim /etc/sysctl.conf 新增vm.max_map_count = 655360 執行sysctl –p vim /etc/security/limits.d/20-nproc.conf * soft nproc 20480
-
啟動服務 & 配置jvm
# vim jvm.options -Xms20g -Xmx20g # elasticsearch.yml基礎配置 cluster.name:es-test # 配置es集群名稱,相同名稱的集群會自動識別 node.name: node-1 # es7.0集群節點名稱會自動獲取本機hostname,如果不是多實例部署,可不配置該項 path.data: /data/es/data # 指定數據存放目錄,多目錄逗號分隔 path.logs: /data/es/logs # 指定日志存放目錄 network.host: 0.0.0.0 # 指定本機ip地址 http.port: 9200 # 指定http協議端口 ,多實例部署時需要修改 transport.tcp.port # 指定tcp協議端口,多實例部署時需要修改 cluster.initial_master_nodes: ["node-1"] # 指定主節點列表,需要在每個節點上配置該參數 discovery.zen.ping.unicast.hosts: [] # 廣播節點 #啟動服務(需要通過前面創建的普通用戶啟動,同時需要注意相關配置文件權限) ./bin/elasticsearch -d #放到后台啟動
es集群及參數優化
-
系統層面
# 系統層面的調優主要是內存的設定與避免交換內存。 swapoff -a #禁用swapping,開啟服務器虛擬內存交換功能會對es產生致命的打擊 # jvm內存配置 # jvm.options主要是進行內存相關配置,官方建議分配給es的內存不要超出系統內存的50%,預留一半給Lucene,因為Lucene會緩存segment數據提升檢索性能;內存配置不要超過32g,如果你的服務器內存沒有遠遠超過64g,那么不建議將es的jvm內存設置為32g,因為超過32g后每個jvm對象指針的長度會翻倍,導致內存與cpu的開銷增大。(機器配置32G內存服務器節點上也基本不跑其他服務,建議配置16G) -Xms16g -Xmx16g
-
分片和副本、索引
# 分片(shard)索引通常都會分解成不同部分, 分布在不同節點的部分數據就是分片。7版本以后es默認分片數為1,由於創建索引分片后不能更改,這里需要充分考慮后期數據量增漲情況合理規划分片數,分片數對性能會造成很大影響。 (建議:分片數確認需要根據業務量和機器節點分配) # 副本數可以動態調整,前期保障數據容災先設置1個副本數,后期可根據集群壓測實際業務量、存儲空間等原因調整 # 索引(index)7版本的es默認最大索引數1000個,合理的規划索引及保障了性能也方便后期的管理, (建議如果每天的數據量很大,則可以按天創建索引,如果是一個月積累起來導致數據量很大,則可以一個月創建一個索引。)
-
參數調優
bootstrap.memory_lock: true #設置為true鎖住內存,當服務混合部署了多個組件及服務時,應開啟此操作,允許es占用足夠多的內存。 index.merge.scheduler.max_thread_count: 1 # 索引 merge 最大線程數設置為 1 個,該參數可以有效調節寫入的性能,配置線程數越多對磁盤io消耗就越大(SSD忽略)。 index.translog.durability:async # 這個可以異步寫硬盤,增大寫的速度 discovery.zen.fd.ping_timeout:120s # ping 超時時間 discovery.zen.fd.ping_interval:120s # 節點檢測時間 index.refresh_interval:300s #index 刷新間隔 indices.requests.cache.size:2% #查詢request請求的DSL語句緩存,被緩存的DSL語句下次請求時不會被二次解析,可提升檢索性能,默認值是1%。 curl -XPUT 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{ "index.merge.scheduler.max_thread_count" : "1", "index.refresh_interval" : "300s", "index.translog.durability" : "async" }'
性能壓測數據對比
elasticsearch單節點 version:7.1.1
節點配置: 8core 32G
壓測工具: esrally1.3.0
部署配置參考文檔:https://www.jianshu.com/p/c89975b50447
官方: https://esrally.readthedocs.io/en/latest/install.html
調優參數:
1. swapoff -a
2. jvm 20g
3. bootstrap.memory_lock: true
index.merge.scheduler.max_thread_count: 1
-
壓測結果
官方使用兩台服務器進行壓測,一台運行 esrally ,一台運行 es,服務器的配置如下: CPU: Intel(R) Core(TM) i7-6700 CPU @ 3.40GHz RAM: 32 GB SSD: Crucial MX200 OS: Linux Kernel version 4.8.0-53 JVM: Oracle JDK 1.8.0_131-b11 壓測結果: 寫性能 平均12w.5 讀性能 match-all 122.61ms, term 23.07ms, range 543.2ms, aggs 2905.16ms, scroll 1111.57ms
-
寫性能,平均在9w
Min Throughput docs/s |分鍾的吞吐量
Median Throughput docs/s |平均吞吐量
Max Throughput docs/s |最大吞吐量
Min Throughput index-append 76453.2 docs/s Median Throughput index-append 90592.4 docs/s Max Throughput index-append 124138 docs/s -
讀性能
Min Throughput ops/s |每秒完成term操作次數
Median Throughput ops/s |平均完成term操作次數
Max Throughput ops/s |最大完成term操作次數
Min Throughput term 6.56 ops/s Median Throughput term 6.56 ops/s Max Throughput term 6.56 ops/s Min Throughput range 1 ops/s Median Throughput range 1 ops/s Max Throughput range 1 ops/s -
出錯率(主要在寫入數據方面存在數據丟失問題)
error rate index-append 0.07 %
-
-
添加優化參數后壓測(再上一次基礎上加如下參數),6以后無法通過es的yml文件直接添加參數,需要通過API添加
curl -H "Content-Type: application/json" -XPUT 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '{ "index.merge.scheduler.max_thread_count" : "1", "index.refresh_interval" : "300s", "index.translog.durability" : "async" }' discovery.zen.fd.ping_timeout:120s discovery.zen.fd.ping_timeout:120s
-
寫性能,平均也在9w,沒有明顯的變化
Min Throughput index-append 73367.9 docs/s Median Throughput index-append 89433.4 docs/s Max Throughput index-append 118648 docs/s -
讀性能,term操作有較為明顯增長
Min Throughput term 27 docs/s Median Throughput term 27 docs/s Max Throughput term 27 docs/s Min Throughput range 1 docs/s Median Throughput range 1 docs/s Max Throughput range 1 docs/s -
出錯率
error rate index-append 0.08 %
-
-
增加副本數為1
curl -H "Content-Type: application/json" -XPUT 'http://127.0.0.1:9200/_all/_settings' -d '{ "index": { "number_of_replicas": "1" } }'
-
寫性能,由於增加副本數,導致寫速度微量變慢,8.5w左右
Min Throughput index-append 73240.3 docs/s Median Throughput index-append 84554.1 docs/s Max Throughput index-append 121398 docs/s -
讀性能,相對速率下降一半
Min Throughput term 10.68 docs/s Median Throughput term 10.68 docs/s Max Throughput term 10.68 docs/s Min Throughput range 1 docs/s Median Throughput range 1 docs/s Max Throughput range 1 docs/s -
出錯率,出錯率下降
error rate index-append 0.05 %
-