本文所有內(nèi)容皆關(guān)于 ES和 kibana
一人弓、簡(jiǎn)介
???????? ELKB即elasticsearch稍途、logstash、kibana倘潜、Beats的簡(jiǎn)稱(chēng)绷柒,elasticsearch接收Beats或logstash的數(shù)據(jù)提供數(shù)據(jù)存儲(chǔ)及搜索功能;kibana為elasticsearch的頁(yè)面展示工具涮因。
二废睦、優(yōu)缺點(diǎn)
I. 優(yōu)點(diǎn)
????1)? ?強(qiáng)大的搜索功能,elasticsearch可以以分布式搜索的方式快速檢索养泡,而且支持DSL的語(yǔ)法來(lái)進(jìn)行搜索郊楣,簡(jiǎn)單的說(shuō),就是通過(guò)類(lèi)似配置的語(yǔ)言瓤荔,快速篩選數(shù)據(jù)净蚤。
????2)? 完美的展示功能,可以展示非常詳細(xì)的圖表信息输硝,而且可以定制展示內(nèi)容今瀑,將數(shù)據(jù)可視化發(fā)揮的淋漓盡致。
????3)? 分布式功能点把,能夠解決大型集群運(yùn)維工作很多問(wèn)題橘荠,包括監(jiān)控、預(yù)警郎逃、日志收集解析等哥童。
????4)? 完整的自監(jiān)控功能,elastic組件能滿(mǎn)足常用的監(jiān)控功能褒翰,包括服務(wù)器metric贮懈,elkb自身性能監(jiān)控等。
II. 缺點(diǎn)
????1)? 告警优训。目前官方告警插件alert需要收費(fèi)朵你。
????2)? 關(guān)聯(lián)分析。Es對(duì)于index的關(guān)聯(lián)查詢(xún)非常復(fù)雜揣非。
三抡医、應(yīng)用場(chǎng)景
????1)? 站內(nèi)搜索:主要和Solr競(jìng)爭(zhēng),屬于后起之秀早敬。
????2)? NoSQL Json文檔數(shù)據(jù)庫(kù):主要搶占Mongo的市場(chǎng)忌傻,它在讀寫(xiě)性能上優(yōu)于Mongo大脉,同時(shí)也支持地理位置查詢(xún),還方便地理位置和文本混合查詢(xún)水孩。
????3)? 監(jiān)控:統(tǒng)計(jì)镰矿、日志類(lèi)時(shí)間序的數(shù)據(jù)存儲(chǔ)和分析、可視化荷愕,這方面是引領(lǐng)者。
????4)? 國(guó)外:Wikipedia(維基百科)使用ES提供全文搜索并高亮關(guān)鍵字棍矛、StackOverflow(IT問(wèn)答網(wǎng)站)結(jié)合全文搜索與地理位置查詢(xún)安疗、Github使用Elasticsearch檢索1300億行的代碼。
????5)? 國(guó)內(nèi):百度(在云分析够委、網(wǎng)盟荐类、預(yù)測(cè)、文庫(kù)茁帽、錢(qián)包玉罐、風(fēng)控等業(yè)務(wù)上都應(yīng)用了ES,單集群每天導(dǎo)入30TB+數(shù)據(jù)潘拨,總共每天60TB+)吊输、新浪 、阿里巴巴铁追、騰訊等公司均有對(duì)ES的使用季蚂。
????6)? 使用比較廣泛的平臺(tái)ELK(ElasticSearch, Logstash, Kibana)。
四琅束、ES集群部署
官網(wǎng)下載6.3.2:https://www.elastic.co/downloads
4.1 集群規(guī)劃
4.2 安裝ES
Elasticsearch-6依賴(lài)于jdk-1.8扭屁,官網(wǎng)建議jdk版本不低于1.8.0_131
查看:java -version
下載java-1.8:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html
Elasticsearch解壓后主要修改配置文件config/elasticsearch.yml,嚴(yán)格按照原來(lái)的格式修改,否則不識(shí)別,修改下面幾項(xiàng):
#cluster.name: es_cluster #集群名,依此識(shí)別并組成集群
#node.name: node-1 #節(jié)點(diǎn)名涩禀,集群內(nèi)每個(gè)節(jié)點(diǎn)名不同
#network.host: 192.168.0.1 #配置本機(jī)ip料滥,以便外網(wǎng)訪問(wèn)
我的data節(jié)點(diǎn)配置(.yml的文件冒號(hào)后面必須加空格)
cluster.name: es_cluster
node.name: es-data1
network.host: es-data1
path.data: /elk/data
path.logs: /elk/logs
http.port: 9200
transport.tcp.port: 9300
node.master: false
#設(shè)置不充當(dāng)master節(jié)點(diǎn),默認(rèn)為true
node.data: true #設(shè)置充當(dāng)data節(jié)點(diǎn)艾船,默認(rèn)為true
#添加防腦裂配置(因?yàn)閑s默認(rèn)是一個(gè)局域網(wǎng)內(nèi)能搜索到的就是一個(gè)集群,一些原因會(huì)導(dǎo)致分成幾個(gè)集群)
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["es-master1:9300"," es-master2:9300","es-master3:9300"]
bootstrap.memory_lock: true
elasticsearch配置的cluster.name相同葵腹,都啟動(dòng)可以自動(dòng)組成集群,這里如果不改cluster.name則默認(rèn)是cluster.name=elasticsearch屿岂,nodename隨意取但是集群內(nèi)的各節(jié)點(diǎn)不能相同,host設(shè)置自己的ip/hostname
另一個(gè)master節(jié)點(diǎn)的配置如下:
cluster.name: es_cluster
node.name: es-master1
path.data: /elk/data
path.logs: /elk/logs
http.port: 9200
transport.tcp.port: 9300
node.master: true#設(shè)置充當(dāng)master節(jié)點(diǎn)礁蔗,默認(rèn)為true
node.data: false #設(shè)置不充當(dāng)data節(jié)點(diǎn),默認(rèn)為true
network.host: es-master1
discovery.zen.minimum_master_nodes: 2
discovery.zen.ping.unicast.hosts: ["es-master1:9300"," es-master2:9300","es-master3:9300"]
bootstrap.memory_lock: true
注: discovery設(shè)置自動(dòng)發(fā)現(xiàn)集群雁社,discovery.zen.ping.unicast.hosts設(shè)置具有master權(quán)限的es節(jié)點(diǎn)ip浴井,防止es的master節(jié)點(diǎn)因某些原因腦裂。不設(shè)置node.master和node.data則默認(rèn)每個(gè)節(jié)點(diǎn)都有master和data權(quán)限霉撵。
更多配置詳解請(qǐng)查看文章4.6
4.3 啟動(dòng)
后臺(tái)啟動(dòng),要裝插件,前臺(tái)啟動(dòng)全部./bin/elasticsearch,如果想在后臺(tái)以守護(hù)進(jìn)程模式運(yùn)行磺浙,添加-d參數(shù): ./bin/elasticsearch -d洪囤。
注:ES不能用root用戶(hù)啟動(dòng),先更改elasticsearch文件夾的所有者
關(guān)閉防火墻
成功頁(yè)面訪問(wèn):http://es-data1:9200
4.4 單機(jī)多實(shí)例配置
???????? 由于官方并不建議部署ES時(shí)為實(shí)例指定超過(guò)32GB的內(nèi)存撕氧,但是現(xiàn)在一臺(tái)實(shí)體機(jī)服務(wù)器內(nèi)存遠(yuǎn)遠(yuǎn)不止32G瘤缩,僅用32G內(nèi)存顯然是非常浪費(fèi)的。所以我們要在一個(gè)服務(wù)器上開(kāi)多個(gè)ES實(shí)例伦泥,以便達(dá)到充分利用資源的目的剥啤。
???????? 配置要點(diǎn):
node.max_local_storage_nodes
這個(gè)配置限制了單節(jié)點(diǎn)上可以開(kāi)啟的ES存儲(chǔ)實(shí)例的個(gè)數(shù),我們需要開(kāi)多個(gè)實(shí)例不脯,因此需要把這個(gè)配置寫(xiě)到配置文件中府怯,并為這個(gè)配置賦值為2或者更高。
這個(gè)配置是elasticsearch對(duì)外提供服務(wù)的http端口配置防楷,默認(rèn)情況下ES會(huì)取用9200~9299之間的端口牺丙,如果9200被占用就會(huì)自動(dòng)使用9201,在單機(jī)多實(shí)例的配置中這個(gè)配置實(shí)際是不需要修改的复局。
但是為了更好地進(jìn)行配置管理冲簿,以及和老的配置兼容,我們還是手動(dòng)將第一個(gè)實(shí)例的http端口配置為9200亿昏,第二個(gè)實(shí)例配置為9201峦剔。
transport.tcp.port
這個(gè)配置指定了elasticsearch集群內(nèi)數(shù)據(jù)通訊使用的端口,默認(rèn)情況下為9300角钩,與上面的http.port配置類(lèi)似羊异,ES也會(huì)自動(dòng)為已占用的端口選擇下一個(gè)端口號(hào)。我們可以將第一個(gè)實(shí)例的tcp傳輸端口配置為9300彤断,第二實(shí)例配置為9301野舶。
discovery.zen.ping.unicast.hosts
由于到了2.x版本之后,ES取消了默認(rèn)的廣播模式來(lái)發(fā)現(xiàn)master節(jié)點(diǎn)宰衙,需要使用該配置來(lái)指定發(fā)現(xiàn)master節(jié)點(diǎn)平道。這個(gè)配置在單機(jī)雙實(shí)例的配置中需要特別注意下,因?yàn)榱?xí)慣上我們配置時(shí)并未指定master節(jié)點(diǎn)的tcp端口供炼,如果實(shí)例的transport.tcp.port配置為9301一屋,那么實(shí)例啟動(dòng)后會(huì)認(rèn)為discovery.zen.ping.unicast.hosts中指定的主機(jī)tcp端口也是9301,可能導(dǎo)致這些節(jié)點(diǎn)無(wú)法找到master節(jié)點(diǎn)袋哼。因此在該配置中需要指定master節(jié)點(diǎn)提供服務(wù)的tcp端口冀墨。
discovery.zen.ping.unicast.hosts: ["es-master1:9300","es-master2:9300","es-master3:9300"]
在config子目錄下創(chuàng)建instance1和instance2兩個(gè)目錄,分別放置兩個(gè)實(shí)例需要的elasticsearch.yml涛贯、log4j2.property和jvm.options配置文件诽嘉。
啟動(dòng)實(shí)例
bin/elasticsearch -Des.path.conf=config/instance1 -d -p /tmp/elasticsearch_1.pid
4.5 ES安裝問(wèn)題集錦
elasticsearch安裝過(guò)程中遇到了一些問(wèn)題,這里提供解決的方法。
問(wèn)題一:警告提示
[WARN][o.e.b.JNANatives ] unable to install syscall filter:
java.lang.UnsupportedOperationException:seccomp unavailable: requires kernel 3.5+ with CONFIG_SECCOMP and CONFIG_SECCOMP_FILTERcompiled in
at org.elasticsearch.bootstrap.Seccomp.linuxImpl(Seccomp.java:349)~[elasticsearch-5.0.0.jar:5.0.0]
at org.elasticsearch.bootstrap.Seccomp.init(Seccomp.java:630)~[elasticsearch-5.0.0.jar:5.0.0]
報(bào)了一大串錯(cuò)誤虫腋,其實(shí)只是一個(gè)警告骄酗。
解決:使用新的linux版本,就不會(huì)出現(xiàn)此類(lèi)問(wèn)題了悦冀。
問(wèn)題二:ERROR: bootstrap checks failed
max filedescriptors [4096] for elasticsearch process likely too low, increase to atleast [65536]
max number of threads [1024] for user [lishang] likely too low, increase to atleast [2048]
解決:切換到root用戶(hù)趋翻,編輯limits.conf 添加類(lèi)似如下內(nèi)容
vi /etc/security/limits.conf?
添加如下內(nèi)容:
*
soft nofile 65536
* hard nofile 131072
* soft nproc 2048
* hard nproc 4096
問(wèn)題三:max number of threads [1024] for user[lish] likely too low, increase to at least [2048]
解決:切換到root用戶(hù),進(jìn)入limits.d目錄下修改配置文件盒蟆。
vi
/etc/security/limits.d/90-nproc.conf?
修改如下內(nèi)容:
* soft nproc 1024
#修改為
* soft nproc 2048
問(wèn)題四:max virtual memory areas vm.max_map_count[65530] likely too low, increase to at least [262144]
解決:切換到root用戶(hù)修改配置sysctl.conf
vi /etc/sysctl.conf
添加下面配置:
vm.max_map_count=655360
并執(zhí)行命令:
sysctl -p
然后踏烙,重新啟動(dòng)elasticsearch,即可啟動(dòng)成功历等。
4.6 ES配置
2.6.1 集群配置
elasticsearch集群搭建讨惩,可以把索引進(jìn)行分片存儲(chǔ),一個(gè)索引可以分成若干個(gè)片募闲,分別存儲(chǔ)到集群里面步脓,而對(duì)于集群里面的負(fù)載均衡愿待,副本分配浩螺,索引動(dòng)態(tài)均衡(根據(jù)節(jié)點(diǎn)的增加或者減少)都是elasticsearch自己內(nèi)部完成的,一有情況就會(huì)重新進(jìn)行分配仍侥。
下面先是介紹幾個(gè)關(guān)于elasticsearch的幾個(gè)名詞
1.cluster
代表一個(gè)集群要出,集群中有多個(gè)節(jié)點(diǎn),其中有一個(gè)為主節(jié)點(diǎn)农渊,這個(gè)主節(jié)點(diǎn)是可以通過(guò)選舉產(chǎn)生的患蹂,主從節(jié)點(diǎn)是對(duì)于集群內(nèi)部來(lái)說(shuō)的。es的一個(gè)概念就是去中心化砸紊,字面上理解就是無(wú)中心節(jié)點(diǎn)传于,這是對(duì)于集群外部來(lái)說(shuō)的,因?yàn)閺耐獠縼?lái)看es集群醉顽,在邏輯上是個(gè)整體沼溜,你與任何一個(gè)節(jié)點(diǎn)的通信和與整個(gè)es集群通信是等價(jià)的。
2.shards
代表索引分片游添,es可以把一個(gè)完整的索引分成多個(gè)分片系草,這樣的好處是可以把一個(gè)大的索引拆分成多個(gè),分布到不同的節(jié)點(diǎn)上唆涝。構(gòu)成分布式搜索找都。分片的數(shù)量只能在索引創(chuàng)建前指定,并且索引創(chuàng)建后不能更改廊酣。
3.replicas
代表索引副本能耻,es可以設(shè)置多個(gè)索引的副本,副本的作用一是提高系統(tǒng)的容錯(cuò)性,當(dāng)個(gè)某個(gè)節(jié)點(diǎn)某個(gè)分片損壞或丟失時(shí)可以從副本中恢復(fù)嚎京。二是提高es的查詢(xún)效率嗡贺,es會(huì)自動(dòng)對(duì)搜索請(qǐng)求進(jìn)行負(fù)載均衡。
4.recovery
代表數(shù)據(jù)恢復(fù)或叫數(shù)據(jù)重新分布鞍帝,es在有節(jié)點(diǎn)加入或退出時(shí)會(huì)根據(jù)機(jī)器的負(fù)載對(duì)索引分片進(jìn)行重新分配诫睬,掛掉的節(jié)點(diǎn)重新啟動(dòng)時(shí)也會(huì)進(jìn)行數(shù)據(jù)恢復(fù)。
5.river
代表es的一個(gè)數(shù)據(jù)源帕涌,也是其它存儲(chǔ)方式(如:數(shù)據(jù)庫(kù))同步數(shù)據(jù)到es的一個(gè)方法摄凡。它是以插件方式存在的一個(gè)es服務(wù),通過(guò)讀取river中的數(shù)據(jù)并把它索引到es中蚓曼,官方的river有couchDB的亲澡,RabbitMQ的,Twitter的纫版,Wikipedia的床绪,river這個(gè)功能將會(huì)在后面的文件中重點(diǎn)說(shuō)到。
6.gateway
代表es索引的持久化存儲(chǔ)方式其弊,es默認(rèn)是先把索引存放到內(nèi)存中癞己,當(dāng)內(nèi)存滿(mǎn)了時(shí)再持久化到硬盤(pán)。當(dāng)這個(gè)es集群關(guān)閉再重新啟動(dòng)時(shí)就會(huì)從gateway中讀取索引數(shù)據(jù)梭伐。es支持多種類(lèi)型的gateway痹雅,有本地文件系統(tǒng)(默認(rèn)),分布式文件系統(tǒng)糊识,Hadoop的HDFS和amazon的s3云存儲(chǔ)服務(wù)绩社。
7.discovery.zen
代表es的自動(dòng)發(fā)現(xiàn)節(jié)點(diǎn)機(jī)制,es是一個(gè)基于p2p的系統(tǒng)赂苗,它先通過(guò)廣播尋找存在的節(jié)點(diǎn)愉耙,再通過(guò)多播協(xié)議來(lái)進(jìn)行節(jié)點(diǎn)之間的通信,同時(shí)也支持點(diǎn)對(duì)點(diǎn)的交互拌滋。
8.Transport
代表es內(nèi)部節(jié)點(diǎn)或集群與客戶(hù)端的交互方式朴沿,默認(rèn)內(nèi)部是使用tcp協(xié)議進(jìn)行交互,同時(shí)它支持http協(xié)議(json格式)鸠真、thrift悯仙、servlet、memcached吠卷、zeroMQ等的傳輸協(xié)議(通過(guò)插件方式集成)锡垄。
修改配置:
ela可以指定一個(gè)集群名,集群里可以配置一個(gè)Master祭隔,多個(gè)node货岭,可以手動(dòng)配置也可以選舉產(chǎn)生路操。按照下面的配置,選擇一臺(tái)機(jī)器是Master千贯,主要修改config下面的elasticsearch.yml
a.集群名稱(chēng)屯仗,默認(rèn)為elasticsearch:
cluster.name: elasticsearch
b.節(jié)點(diǎn)名稱(chēng),es啟動(dòng)時(shí)會(huì)自動(dòng)創(chuàng)建節(jié)點(diǎn)名稱(chēng)搔谴,但你也可進(jìn)行配置:
node.name: “node0”
c.是否作為主節(jié)點(diǎn)魁袜,每個(gè)節(jié)點(diǎn)都可以被配置成為主節(jié)點(diǎn),默認(rèn)值為true:
node.master: true
d.是否存儲(chǔ)數(shù)據(jù)敦第,即存儲(chǔ)索引片段峰弹,默認(rèn)值為true:
node.data: true
master和data同時(shí)配置會(huì)產(chǎn)生一些奇異的效果:
1)當(dāng)master為false,而data為true時(shí)芜果,會(huì)對(duì)該節(jié)點(diǎn)產(chǎn)生嚴(yán)重負(fù)荷鞠呈;
2)當(dāng)master為true,而data為false時(shí)右钾,該節(jié)點(diǎn)作為一個(gè)協(xié)調(diào)者蚁吝;
3)當(dāng)master為false,data也為false時(shí)舀射,該節(jié)點(diǎn)就變成了一個(gè)負(fù)載均衡器窘茁。你可以通過(guò)連接http://localhost:9200/_cluster/health或者http://localhost:9200/_cluster/nodes
e.每個(gè)節(jié)點(diǎn)都可以定義一些與之關(guān)聯(lián)的通用屬性,用于后期集群進(jìn)行碎片分配時(shí)的過(guò)濾:
node.rack: rack314
f.默認(rèn)情況下后控,多個(gè)節(jié)點(diǎn)可以在同一個(gè)安裝路徑啟動(dòng)庙曙,如果你想讓你的es只啟動(dòng)多個(gè)節(jié)點(diǎn)空镜,可以進(jìn)行如下設(shè)置:
node.max_local_storage_nodes: 3
j.設(shè)置一個(gè)索引的碎片數(shù)量浩淘,默認(rèn)值為5(5.x+版本需在創(chuàng)建索引時(shí)設(shè)置):
index.number_of_shards: 5
k.設(shè)置一個(gè)索引可被復(fù)制的數(shù)量,默認(rèn)值為1(5.x+版本需在創(chuàng)建索引時(shí)設(shè)置):
index.number_of_replicas: 1
2.6.2 內(nèi)存配置
Elasticsearch-5.0+默認(rèn)安裝后設(shè)置的內(nèi)存是2GB吴攒,對(duì)于任何一個(gè)現(xiàn)實(shí)業(yè)務(wù)來(lái)說(shuō)张抄,這個(gè)設(shè)置都太小了。如果你正在使用這個(gè)默認(rèn)堆內(nèi)存配置洼怔,你的集群配置可能會(huì)很快發(fā)生問(wèn)題署惯。
修改Elasticsearch的堆內(nèi)存(下面就說(shuō)內(nèi)存好了),最簡(jiǎn)單的
Elasticsearch5.0+提供了config/jvm.options來(lái)配置jvm镣隶,如下
另一個(gè)方法就是指定ES_HEAP_SIZE環(huán)境變量极谊。服務(wù)進(jìn)程在啟動(dòng)時(shí)候會(huì)讀取這個(gè)變量,并相應(yīng)的設(shè)置堆的大小安岂。設(shè)置命令如下:
export ES_HEAP_SIZE=10g
此外轻猖,你也可以通過(guò)命令行參數(shù)的形式,在程序啟動(dòng)的時(shí)候把內(nèi)存大小傳遞給它:
./bin/elasticsearch -Xmx10g -Xms10g
備注:確保Xmx和Xms的大小是相同的域那,其目的是為了能夠在java垃圾回收機(jī)制清理完堆區(qū)后不需要重新分隔計(jì)算堆區(qū)的大小而浪費(fèi)資源咙边,可以減輕伸縮堆大小帶來(lái)的壓力。一般來(lái)說(shuō)設(shè)置ES_HEAP_SIZE環(huán)境變量,比直接寫(xiě)-Xmx10g ?-Xms10g更好一點(diǎn)败许。
把內(nèi)存的一半給Lucene
一個(gè)常見(jiàn)的問(wèn)題是配置一個(gè)大內(nèi)存王带,假設(shè)你有一個(gè)64G內(nèi)存的機(jī)器,按照正常思維思考市殷,你可能會(huì)認(rèn)為把64G內(nèi)存都給Elasticsearch比較好愕撰,但現(xiàn)實(shí)是這樣嗎,?越大越好醋寝?
當(dāng)然盟戏,內(nèi)存對(duì)于Elasticsearch來(lái)說(shuō)絕對(duì)是重要的,用于更多的內(nèi)存數(shù)據(jù)提供更快的操作甥桂,而且還有一個(gè)內(nèi)存消耗大戶(hù)-Lucene柿究。
Lucene
的設(shè)計(jì)目的是把底層OS里的數(shù)據(jù)緩存到內(nèi)存中。Lucene的段是分別存儲(chǔ)到單個(gè)文件中的黄选,這些文件都是不會(huì)變化的蝇摸,所以很利于緩存,同時(shí)操作系統(tǒng)也會(huì)把這些段文件緩存起來(lái)办陷,以便更快的訪問(wèn)貌夕。
Lucene
的性能取決于和OS的交互,如果你把所有的內(nèi)存都分配給Elasticsearch民镜,不留一點(diǎn)給Lucene啡专,那你的全文檢索性能會(huì)很差的。
最后標(biāo)準(zhǔn)的建議是把50%的內(nèi)存給elasticsearch制圈,剩下的50%也不會(huì)沒(méi)有用處的们童,Lucene會(huì)很快吞噬剩下的這部分內(nèi)存用于文件緩存。
不要超過(guò)32G
這里有另外一個(gè)原因不分配大內(nèi)存給Elasticsearch鲸鹦,事實(shí)上jvm在內(nèi)存小于32G的時(shí)候會(huì)采用一個(gè)內(nèi)存對(duì)象指針壓縮技術(shù)慧库。
在java中,所有的對(duì)象都分配在堆上馋嗜,然后有一個(gè)指針引用它齐板。指向這些對(duì)象的指針大小通常是CPU的字長(zhǎng)的大小,不是32bit就是64bit葛菇,這取決于你的處理器甘磨,指針指向了你的值的精確位置。
對(duì)于32位系統(tǒng)眯停,你的內(nèi)存最大可使用4G济舆。對(duì)于64位系統(tǒng)可以使用更大的內(nèi)存。但是64位的指針意味著更大的浪費(fèi)庵朝,因?yàn)槟愕闹羔槺旧泶罅寺鹪@速M(fèi)內(nèi)存不算又厉,更糟糕的是,更大的指針在主內(nèi)存和緩存器(例如LLC, L1等)之間移動(dòng)數(shù)據(jù)的時(shí)候椎瘟,會(huì)占用更多的帶寬覆致。
Java
使用一個(gè)叫內(nèi)存指針壓縮的技術(shù)來(lái)解決這個(gè)問(wèn)題。它的指針不再表示對(duì)象在內(nèi)存中的精確位置肺蔚,而是表示偏移量煌妈。這意味著32位的指針可以引用40億個(gè)對(duì)象,而不是40億個(gè)字節(jié)宣羊。最終璧诵,也就是說(shuō)堆內(nèi)存長(zhǎng)到32G的物理內(nèi)存,也可以用32bit的指針表示仇冯。
一旦你越過(guò)那個(gè)神奇的26-30G邊界之宿,指針就會(huì)切回普通對(duì)象的指針,每個(gè)對(duì)象的指針都變長(zhǎng)了苛坚,就會(huì)使用更多的CPU內(nèi)存帶寬比被,也就是說(shuō)你實(shí)際上失去了更多的內(nèi)存。事實(shí)上當(dāng)內(nèi)存到達(dá)40-50GB的時(shí)候泼舱,有效內(nèi)存才相當(dāng)于使用內(nèi)存對(duì)象指針壓縮技術(shù)時(shí)候的32G內(nèi)存等缀。
這段描述的意思就是說(shuō):即便你有足夠的內(nèi)存,也盡量不要超過(guò)32G娇昙,因?yàn)樗速M(fèi)了內(nèi)存尺迂,降低了CPU的性能,還要讓GC應(yīng)對(duì)大內(nèi)存冒掌。
1TB內(nèi)存的機(jī)器
32GB
是ES一個(gè)內(nèi)存設(shè)置限制噪裕,那如果你的機(jī)器有很大的內(nèi)存怎么辦呢?現(xiàn)在的機(jī)器內(nèi)存普遍增長(zhǎng)宋渔,你現(xiàn)在都可以看到有300-500GB內(nèi)存的機(jī)器州疾。
首先辜限,我們建議編碼使用這樣的大型機(jī)其次皇拣,如果你已經(jīng)有了這樣的機(jī)器,你有兩個(gè)可選項(xiàng):
????a. 你主要做全文檢索嗎薄嫡?考慮給Elasticsearch 32G內(nèi)存氧急,剩下的交給Lucene用作操作系統(tǒng)的文件系統(tǒng)緩存,所有的segment都緩存起來(lái)毫深,會(huì)加快全文檢索吩坝。
? ? b. 你需要更多的排序和聚合?你希望更大的堆內(nèi)存哑蔫。你可以考慮一臺(tái)機(jī)器上創(chuàng)建兩個(gè)或者更多ES節(jié)點(diǎn)钉寝,而不要部署一個(gè)使用32+GB內(nèi)存的節(jié)點(diǎn)弧呐。仍然要 堅(jiān)持50%原則,假設(shè) 你有個(gè)機(jī)器有128G內(nèi)存嵌纲,你可以創(chuàng)建兩個(gè)node俘枫,使用32G內(nèi)存。也就是說(shuō)64G內(nèi)存給ES的堆內(nèi)存逮走,剩下的64G給Lucene鸠蚪。
如果你選擇第二種,你需要配置cluster.routing.allocation.same_shard.host:true师溅。這會(huì)防止同一個(gè)shard的主副本存在同一個(gè)物理機(jī)上(因?yàn)槿绻嬖谝粋€(gè)機(jī)器上茅信,副本的高可用性就沒(méi)有了)。
2.6.3 禁用Swapping
swapping是性能的墳?zāi)?/b>
一個(gè)內(nèi)存的操作必須是快速的墓臭,而內(nèi)存交換到磁盤(pán)對(duì)服務(wù)器性能來(lái)說(shuō)是致命的蘸鲸。?如果內(nèi)存交換到磁盤(pán)上,一個(gè)100微秒的操作可能變成10毫秒窿锉,再想想那么多10微秒的操作時(shí)延累加起來(lái)棚贾。不難看出swapping對(duì)于性能是多么可怕。
最好的辦法就是在你的操作系統(tǒng)中完全禁用swapping榆综。這樣可以暫時(shí)禁用:
swapoff -a
為了永久禁用它妙痹,你可能需要修改/etc/fstab文件,這要參考你的操作系統(tǒng)相關(guān)文檔鼻疮。
如果完全禁用swap怯伊,對(duì)你來(lái)說(shuō)是不可行的。你可以降低swappiness 的值判沟,這個(gè)值決定操作系統(tǒng)交換內(nèi)存的頻率耿芹。這可以預(yù)防正常情況下發(fā)生交換。但仍允許os在緊急情況下發(fā)生交換挪哄。
對(duì)于大部分Linux操作系統(tǒng)吧秕,可以在sysctl中這樣配置:
vm.swappiness = 1
備注:swappiness設(shè)置為1比設(shè)置為0要好,因?yàn)樵谝恍﹥?nèi)核版本迹炼,swappness=0會(huì)引發(fā)OOM(內(nèi)存溢出)
最后砸彬,如果上面的方法都不能做到,你需要打開(kāi)配置文件中的mlockall開(kāi)關(guān)斯入,它的作用就是運(yùn)行JVM鎖住內(nèi)存砂碉,禁止OS交換出去。在elasticsearch.yml配置如下:
bootstrap.memory_lock: true
查看:curl -XGET 'http://es-master1:9200/_nodes?filter_path=**.mlockall'
五刻两、安裝Kibana
解壓安裝增蹭,修改配置文件vi config/kibana.yml
Server.host? 默認(rèn)localhost,只能本機(jī)訪問(wèn)kibana
Server.name 此kibana服務(wù)的名稱(chēng)
Elasticsearch.url? es地址
啟動(dòng)kibana? bin/kibana
后臺(tái)啟動(dòng):nohup bin/kibana &
停止kibana:netstat-lntp | grep 5601?????? kill -9端口