系統(tǒng)參數(shù)
- 修改系統(tǒng)最大打開文件描述符數(shù)
-
vi /etc/security/limits.conf
钞它,增加配置,用戶退出后重新登錄生效
-
* soft nofile 65535
* hard nofile 65535
- ? 修改用戶可以打開的最大線程數(shù)
-
vi /etc/security/limits.conf
梳码, 增加配置编振,用戶退出后重新登錄生效
-
* soft nproc 4096
* hard nproc 4096
- 單個jvm能開啟的最大線程數(shù)
vi /etc/sysctl.conf
- 添加如下配置
sysctl -p
vm.max_map_count=262144
- 鎖定物理內(nèi)存
vi /etc/security/limits.conf
es soft memlock unlimited
es hard memlock unlimited
es soft memlock unlimited
es hard memlock unlimited
- 關(guān)閉swap,鎖定進程地址空間势告,防止內(nèi)存swap
vi /etc/sysctl.conf
vm.swappiness=0
- 重啟機器,使配置生效
reboot
elasticsearch.yml
# 集群的名稱岸啡,同一個集群該值必須設(shè)置成相同的
cluster.name: demo-application
# 該節(jié)點的名字
node.name: node-1
# 內(nèi)存鎖定
bootstrap.memory_lock: true
#該節(jié)點有機會成為master節(jié)點
node.master: true
# 該節(jié)點可以存儲數(shù)據(jù)
node.data: true
# 設(shè)置綁定的IP地址原叮,可以是IPV4或者IPV6
network.bind_host: 0.0.0.0
# 設(shè)置其他節(jié)點與該節(jié)點交互的IP地址
network.publish_host: 191.168.1.100
# 該參數(shù)用于同時設(shè)置bind_host和publish_host
network.host: 191.168.1.100
# 設(shè)置節(jié)點之間交互的端口號
transport.tcp.port: 9300
# 設(shè)置是否壓縮tcp上交互傳輸?shù)臄?shù)據(jù)
transport.tcp.compress: true
# 設(shè)置對外服務(wù)的http端口號
http.port: 9200
# 設(shè)置http內(nèi)容的最大大小
http.max_content_length: 100mb
# 是否開啟http服務(wù)對外提供服務(wù)
http.enabled: true
# 設(shè)置這個參數(shù)來保證集群中的節(jié)點可以知道其它N個有master資格的節(jié)點,建議設(shè)置(n/2)+1, 防止腦裂問題
discovery.zen.minimum_master_nodes: 2
# 設(shè)置集群中自動發(fā)現(xiàn)其他節(jié)點時ping連接的超時時間
discovery.zen.ping_timeout: 30s
# 設(shè)置是否打開多播發(fā)現(xiàn)節(jié)點
#discovery.zen.ping.multicast.enabled: false
# 置集群中的Master節(jié)點的初始列表巡蘸,可以通過這些節(jié)點來自動發(fā)現(xiàn)其他新加入集群的節(jié)點
discovery.zen.ping.unicast.hosts: ["191.168.1.100:9300","191.168.1.101:9300","191.168.1.102:9300"]
# 是否支持跨域
http.cors.enabled: true
http.cors.allow-origin: "*"
jvm.options
- Heap Size不超過物理內(nèi)存的一半奋隶,且小于32G
- 如果Heap Size大于6g,建議使用G1垃圾回收
# 初始的Heap的大小悦荒,與Xmx的值保持一致
-Xms8g
# 最大Heap的大小唯欣,與Xms的值保持一致
-Xmx8g
# 修改默認的垃圾回收機制CMS為G1
#-XX:+UseConcMarkSweepGC
#-XX:CMSInitiatingOccupancyFraction=75
#-XX:+UseCMSInitiatingOccupancyOnly
-XX:+UseG1GC
-XX:MaxGCPauseMillis=200
全量導(dǎo)入數(shù)據(jù)準備操作
- 開始導(dǎo)入前將副本分片數(shù)量設(shè)置為0
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/cmas/_settings' -d '{"index": {"number_of_replicas":0}}'
- 導(dǎo)入完成后設(shè)置副本分片數(shù)量為1
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/cmas/_settings' -d '{"index": {"number_of_replicas":1}}'
索引優(yōu)化
合理設(shè)置分片
- 適當增大分片,可以提升建立索引的能力搬味,5~20個比較合適
- 如果分片數(shù)過多或過少境氢,都會導(dǎo)致檢索比較慢
- 分片數(shù)過多蟀拷,會導(dǎo)致檢索時打開文件較多,另外也會導(dǎo)致多臺服務(wù)器之間通訊萍聊,影響效率
- 分片數(shù)過少會導(dǎo)致至單個分片索引過大问芬,所以檢索速度慢
- 建議單個分片最多存儲20G左右的索引數(shù)據(jù),通用計算公司:分片數(shù)量=數(shù)據(jù)總量/20G
合理設(shè)置副本數(shù)
- 增加副本寿桨,可以提升搜索的能力
- 如果副本設(shè)置過多此衅,會對服務(wù)器造成額外的壓力,因為主分片需要給所有的副本分片同步數(shù)據(jù)牛隅。另外炕柔,副本過多也會占用磁盤空間
- 一般建議最多設(shè)置2~3個即可
合并索引
-
定時對索引進行合并優(yōu)化酌泰,segment越多媒佣,占用的segment memory越多,查詢的性能也越差
- 索引量不大的情況下陵刹,可以將segment設(shè)置為1
- 在es1.2.0以前調(diào)用_optimize接口默伍,后期改為_forcemerge接口
curl -u elastic:123456 -XPOST 'http://master:9200/test/_forcemerge?max_num_segments=1'
關(guān)閉索引
- 針對不使用的index,建議close衰琐,減少內(nèi)存占用
- 只要索引處于open狀態(tài)也糊,索引庫中的segment就會占用內(nèi)存,close之后就只會占用磁盤空間羡宙,不會占用內(nèi)存空間
curl -u elastic:123456 -XPOST 'master:9200/test/_close'
清除刪除文檔
- 在Lucene中刪除文檔狸剃,數(shù)據(jù)不會馬上在磁盤上清除,而是在Lucene索引中產(chǎn)生一個.del文件狗热。然而在檢索過程中钞馁,這部分數(shù)據(jù)也會參與檢索,Lucene在檢索過程中會判斷是否刪除匿刮,如果已經(jīng)刪除僧凰,再過濾掉,這樣也會降低檢索效率
- 可以執(zhí)行清除刪除文檔命令
curl -u elastic:123456 -XPOST 'http://master:9200/test/_optimize?only_expunge_deletes=true
合理數(shù)據(jù)導(dǎo)入
- 如果在項目開始階段熟丸,需要批量入庫大量的數(shù)據(jù)训措,建議將副本數(shù)量設(shè)置為0.因為es在索引數(shù)據(jù)的時候,如果副本已經(jīng)存在光羞,數(shù)據(jù)會立即同步到副本中绩鸣,這樣會對es增加壓力
- 等到索引完成之后,再恢復(fù)副本數(shù)即可纱兑,可以提高索引效率
curl -XGET http://master:9200/test/_settings?pretty
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/test/_settings' -d '{"index": {"number_of_replicas":0}}'
curl -H "Content-Type:application/json" -XPUT 'http://master:9200/test/_settings' -d '{"index": {"number_of_replicas":1}}'
設(shè)置索引_all
- 去掉mapping中_all域呀闻,index中默認會有__all域,雖然會給查詢帶來方便萍启,但是會增加索引時間和索引尺寸
PUT /my_index
{
"mapping": {
"user": {
"_all": {
"enable": false
}
}
}
}
設(shè)置索引_source
- _source字段在我們檢索時相當重要
- ES默認檢索只會返回ID总珠,如果在{"enable":false}情況下屏鳍,你需要通過根據(jù)這個ID去倒排索引中去取每個Field數(shù)據(jù),效率不高局服。反之钓瞭,在{"enable":true}情況下可以根據(jù)ID直接檢索對應(yīng)source JSON的字段,不用去倒排索引去按FIeld取數(shù)據(jù)
版本一致
- 使用Java代碼操作ES集群淫奔,要保證本地es的版本和集群上es的版本保持一致
- 保證集群中的每個節(jié)點的JDK版本和es配置一致
問題處理
集群腦裂問題
-
原因
- 網(wǎng)絡(luò)原因
- 節(jié)點負載
- 回收內(nèi)存
-
解決方案
- 將master節(jié)點與data節(jié)點分離
node.master:true node.data:false
- 為了使新加入的節(jié)點快速確定master位置山涡,可以將data節(jié)點的默認master發(fā)現(xiàn)方式由multicast修改為unicast
discovery.zen.ping.multicast.enable:false discovery.zen.ping.unicast.hosts:["master1","master2","master3"]
- discovery.zen.ping.timeout: 默認三秒,如果master節(jié)點在3秒內(nèi)沒有應(yīng)答唆迁,那么這個節(jié)點就是掛掉了鸭丛。增加這個值,會增加節(jié)點等待響應(yīng)的時間唐责,從一定程度上會減少誤判
- discovery.zen.minimum_master_node:默認是1鳞溉,這個參數(shù)控制的是一個節(jié)點需要看到的具有master節(jié)點資質(zhì)的最小數(shù)量,然后才能在集群中做操作鼠哥。官方推薦的是(n/2)+1熟菲,其中n是具有master資格的節(jié)點的數(shù)量
翻頁問題
- 盡量不要使用淺分頁
- 如果業(yè)務(wù)需要必須使用淺分頁,需要考慮最大翻頁數(shù)
PUT /my_index/_settings
{
"index": {
"max_result_window": 50000
}
}