今天開始酪术,和大家一學(xué)習(xí)搜素引擎Elasticsearch相關(guān)的技術(shù)點(diǎn)感论。后續(xù)會(huì)和大家持續(xù)更新有關(guān)Elasticsearch相關(guān)的技術(shù)點(diǎn)表箭,歡迎大家關(guān)注求橄!
Elasticsearch是什么
Elasticsearch是一個(gè)高度可擴(kuò)展的開源全文本搜索和分析引擎娘锁。它可以快速牙寞,近實(shí)時(shí)地存儲,搜索和分析大量數(shù)據(jù)莫秆。它通常用作支持具有復(fù)雜搜索功能和要求的應(yīng)用程序的基礎(chǔ)引擎间雀。
Elasticsearch的場景
1.電商網(wǎng)站悔详。允許客戶搜索產(chǎn)品±柞澹可以使用ES存儲整個(gè)產(chǎn)品目錄和庫存伟端,并為其提供搜索和自動(dòng)完成功能。
2.日志或交易數(shù)據(jù)收集匪煌。并且要對數(shù)據(jù)進(jìn)行分析和挖掘以查找趨勢责蝠,統(tǒng)計(jì)信息,摘要或異常等萎庭。
3.價(jià)格警報(bào)平臺霜医。平臺允許客戶指定如“如果某商品的價(jià)格在下個(gè)月內(nèi)降到X以下,就通知我” 驳规。
4.業(yè)務(wù)智能分析肴敛。想要快速調(diào)查,分析吗购,可視化并針對大量數(shù)據(jù)提出特別問題医男。
Elasticsearch特點(diǎn)
Elasticsearch封裝了Lucene,開箱即用捻勉,使用起來更加簡單镀梭。Elasticsearch支持集群,也支持集群節(jié)點(diǎn)動(dòng)態(tài)擴(kuò)展踱启,在高可用上做了很多工作报账,是一個(gè)搜索引擎,而不是一個(gè)索引類庫埠偿。
1.Elasticsearch基于Lucene構(gòu)建透罢,Elasticsearch利用Lucene做實(shí)際的工作
2.ELasticsearch中的每個(gè)分片都是一個(gè)分離的Lucene實(shí)例.
3.Elasticsearch在Lucene基礎(chǔ)上(即利用Lucene的功能)提供了一個(gè)分布式的、基于JSON的REST API 來更方便地使用 Lucene的功能冠蒋。
4.Elasticsearch提供其他支持功能羽圃,如:線程池,隊(duì)列抖剿,節(jié)點(diǎn)/集群監(jiān)控API统屈,數(shù)據(jù)監(jiān)控API,集群管理等
Elasticsearch基本概念
集群(Cluster)
集群是一個(gè)或多個(gè)節(jié)點(diǎn)(服務(wù)器)的集合牙躺,這些節(jié)點(diǎn)一起保存全部數(shù)據(jù)愁憔,并在所有節(jié)點(diǎn)之間提供索引和搜索功能。集群由唯一名稱標(biāo)識孽拷,默認(rèn)情況下為“ elasticsearch”吨掌。此名稱很重要,因?yàn)槿绻?jié)點(diǎn)被設(shè)置為通過名稱加入群集,則該節(jié)點(diǎn)只能是群集的一部分膜宋。
節(jié)點(diǎn)(Node)
節(jié)點(diǎn)是單個(gè)服務(wù)器是群集的一部分窿侈,用于存儲數(shù)據(jù)并參與群集的索引和搜索。像群集一樣秋茫,節(jié)點(diǎn)由名稱標(biāo)識史简,該名稱默認(rèn)為在啟動(dòng)時(shí)分配給該節(jié)點(diǎn)的隨機(jī)唯一標(biāo)識符(UUID)。如果不想使用默認(rèn)的節(jié)點(diǎn)名稱肛著,可以自定義節(jié)點(diǎn)名稱圆兵。該名稱對于管理集群非常重要,命名時(shí)盡可能可以通過名稱來判別在集群中對應(yīng)哪個(gè)節(jié)點(diǎn)枢贿。
索引(Index)
索引是具有相似特征的文檔的集合殉农。如:可以以客戶數(shù)據(jù)創(chuàng)建索引,以產(chǎn)品目錄創(chuàng)建一個(gè)索引局荚,以訂單數(shù)據(jù)創(chuàng)建一個(gè)索引超凳。
類型(Type)
在索引中,您可以定義一個(gè)或多個(gè)類型耀态。類型是索引的邏輯類別或分區(qū)轮傍。通常,為具有一組公共字段的文檔定義一種類型
文檔(Document)
文件是可以索引的基本信息單位首装。
Elastic Search | 關(guān)系型數(shù)據(jù)庫 |
---|---|
索引(Indices) | 數(shù)據(jù)庫(Databases) |
類型(Types) | 表(Table) |
文檔(Document) | 行(Row) |
字段(Field) | 列(Column) |
Mapping | Schema |
結(jié)構(gòu)化查詢語言(query DSL) | SQL |
字段(Field) | 列(Column) |
GET http:9200/index... | SELECT * FROM table... where ... |
分片(Shard)
實(shí)際項(xiàng)目中金麸,索引數(shù)據(jù)可能會(huì)非常龐大,而這些數(shù)據(jù)可能超過了單個(gè)節(jié)點(diǎn)的硬件條件簿盅。如:十億個(gè)文檔的單個(gè)索引占用了1TB的磁盤空間,這時(shí)無法使用單個(gè)節(jié)點(diǎn)的磁盤存儲揍魂,或者因?yàn)闄z索過程太慢而無法滿足搜索請求桨醋。
為了解決此問題,Elasticsearch提供了將索引細(xì)分為多個(gè)碎片(分片)的功能现斋。創(chuàng)建索引時(shí)喜最,只需定義所需的分片數(shù)量即可。每個(gè)分片本身就是一個(gè)功能齊全且獨(dú)立的“索引”庄蹋,它們可以托管在群集中的任何節(jié)點(diǎn)上瞬内。
副本(Replicas)
為了以防分片/節(jié)點(diǎn)因?yàn)槟承┰蛎摍C(jī)或消失(提供高可用機(jī)制),強(qiáng)烈建議使用故障轉(zhuǎn)移機(jī)制限书。為此虫蝶,Elasticsearch允許將索引分片的一個(gè)或多個(gè)副本制作為所謂的副本分片(簡稱副本)。
近實(shí)時(shí)搜索
隨著按段(per-segment)搜索的發(fā)展倦西,一個(gè)新的文檔從索引到可被搜索的延遲顯著降低了能真。新文檔在幾分鐘之內(nèi)即可被檢索,但這樣還是不夠快。
磁盤在這里成為了瓶頸粉铐。提交(Commiting)一個(gè)新的段到磁盤需要一個(gè) fsyn 操作來確保段被物理性地寫入磁盤疼约,這樣在斷電的時(shí)候就不會(huì)丟失數(shù)據(jù)。 但是 fsyn 操作代價(jià)很大蝙泼;如果每次索引一個(gè)文檔都去執(zhí)行一次的話會(huì)造成很大的性能問題程剥。
我們需要的是一個(gè)更輕量的方式來使一個(gè)文檔可被搜索,這意味著** fsyn** 要從整個(gè)過程中被移除汤踏。
在Elasticsearch和磁盤之間是文件系統(tǒng)緩存织鲸。像之前描述的一樣, 在內(nèi)存索引緩沖區(qū)中的文檔會(huì)被寫入到一個(gè)新的段中茎活。但是這里新段會(huì)被先寫入到文件系統(tǒng)緩存——這一步代價(jià)會(huì)比較低昙沦,稍后再被刷新到磁盤——這一步代價(jià)比較高。不過只要文件已經(jīng)在緩存中载荔, 就可以像其它文件一樣被打開和讀取了盾饮。
Lucene 允許新段被寫入和打開—使其包含的文檔在未進(jìn)行一次完整提交時(shí)便對搜索可見。 這種方式比進(jìn)行一次提交代價(jià)要小得多懒熙,并且在不影響性能的前提下可以被頻繁地執(zhí)行丘损。
持久化更新
即使通過每秒刷新(refresh)實(shí)現(xiàn)了近實(shí)時(shí)搜索,我們?nèi)匀恍枰?jīng)常進(jìn)行完整提交來確保能從失敗中恢復(fù)工扎。但在兩次提交之間發(fā)生變化的文檔怎么辦徘钥?我們也不希望丟失掉這些數(shù)據(jù)。
Elasticsearch 增加了一個(gè) translog 肢娘,或者叫事務(wù)日志醉鳖,在每一次對 Elasticsearch 進(jìn)行操作時(shí)均進(jìn)行了日志記錄。通過 translog 瞬铸,整個(gè)流程看起來是下面這樣:
- 一個(gè)文檔被索引之后台妆,就會(huì)被添加到內(nèi)存緩沖區(qū),并且追加到了 translog 拘荡。
- 刷新(refresh)使分片處于“刷新(refresh)完成后, 緩存被清空但是事務(wù)日志不會(huì)” 的狀態(tài)臼节,分片每秒被刷新(refresh)一次:
①這些在內(nèi)存緩沖區(qū)的文檔被寫入到一個(gè)新的段中,且沒有進(jìn)行 fsyn 操作珊皿。
②這個(gè)段被打開网缝,使其可被搜索。
③內(nèi)存緩沖區(qū)被清空蟋定。 - 這個(gè)進(jìn)程繼續(xù)工作粉臊,更多的文檔被添加到內(nèi)存緩沖區(qū)和追加到事務(wù)日志
- 每隔一段時(shí)間—例如 translog 變得越來越大—索引被刷新(flush);一個(gè)新的 translog 被創(chuàng)建驶兜,并且一個(gè)全量提交被執(zhí)行(“在刷新(flush)之后维费,段被全量提交果元,并且事務(wù)日志被清空”):
①所有在內(nèi)存緩沖區(qū)的文檔都被寫入一個(gè)新的段。
②緩沖區(qū)被清空犀盟。
③一個(gè)提交點(diǎn)被寫入硬盤而晒。
④文件系統(tǒng)緩存通過 fsyn 被刷新(flush)。
⑤老的 translog 被刪除阅畴。
Elasticsearch安裝配置
版本選擇
Elasticsearch 5.6.15
JDK 版本最少 JDK 1.8.0_133
下載并解壓
# 下載elasticsearch-5.6.16
$ wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-5.6.16.tar.gz
# 解壓文件
$ tar xvzf elasticsearch-5.6.16.tar.gz
# 移動(dòng)到指定目錄
$ mv ./elasticsearch-5.6.16 /usr/path/to
配置
配置文件詳解
配置項(xiàng) | 配置項(xiàng)說明 |
---|---|
cluster.name | Elasticsearch集群名稱倡怎。默認(rèn)名稱為elasticsearch |
node.name | 節(jié)點(diǎn)名稱。默認(rèn)情況下贱枣,Elasticsearch使用隨機(jī)生成UUID的前七個(gè)字符作為節(jié)點(diǎn)ID监署。節(jié)點(diǎn)ID是持久的在重新啟動(dòng)時(shí)也不會(huì)更改,因此默認(rèn)節(jié)點(diǎn)名稱也不會(huì)更改纽哥。 |
node.attr.rack | 節(jié)點(diǎn)服務(wù)器所在的機(jī)架信息 |
path.data | 設(shè)置索引數(shù)據(jù)的存儲路徑钠乏,默認(rèn)是Elasticsearch根目錄下data文件夾〈核可以設(shè)置多個(gè)存儲路徑晓避,用逗號隔開 |
path.log | 設(shè)置日志文件的存儲路徑,默認(rèn)是Elasticsearch根目錄下logs文件夾 |
bootstrap.memory_lock | 設(shè)置為true代表任何JVM內(nèi)存都不會(huì)交換到磁盤上只壳,防止Elasticsearch內(nèi)存被交換出去影響性能俏拱。 |
network.host | 指定Elasticsearch節(jié)點(diǎn)的IP地址 |
http.port | 設(shè)置Elasticsearch對外服務(wù)的http端口號。默認(rèn)9200 |
discovery.zen.ping.unicast.hosts | 設(shè)置集群中master節(jié)點(diǎn)的初始列表吼句,可以通過這些節(jié)點(diǎn)來自動(dòng)發(fā)現(xiàn)新加入集群的節(jié)點(diǎn) |
discovery.zen.minimum_master_nodes | 該參數(shù)是為了防止”腦裂”的產(chǎn)生锅必,定義了為形成群集而必須可見的符合主機(jī)要求的最小數(shù)量。默認(rèn)為1惕艳。 |
gateway.recover_after_nodes | 只要預(yù)期的節(jié)點(diǎn)數(shù)已加入集群搞隐,就會(huì)啟動(dòng)本地分片的恢復(fù)。默認(rèn)為0 |
action.destructive_requires_name | 只能刪除指定了名稱的數(shù)據(jù)远搪,而不允許通過 _all 或通配符來刪除匹配的索引庫劣纲。可以Rest API 動(dòng)態(tài)的更新這個(gè)設(shè)置终娃。 |
系統(tǒng)配置文件
memory_lock配置
如果memory_lock設(shè)置為true,出現(xiàn)報(bào)錯(cuò)蒸甜,則需要修改下面2個(gè)Linux系統(tǒng)文件:
修改 /etc/security/limits.conf
soft nofile 65536
hard nofile 65536
soft nproc 32000
hard nproc 32000
hard memlock unlimited
soft memlock unlimited
修改/etc/systemd/system.conf
DefaultLimitNOFILE=65536
DefaultLimitNPROC=32000
DefaultLimitMEMLOCK=infinity
max_map_count警告
臨時(shí)設(shè)置棠耕,當(dāng)Linux重新啟動(dòng)會(huì)恢復(fù)到設(shè)置之前的值。
$ sysctl -w vm.max_map_count=262144
# 查看結(jié)果:
$ sysctl -a|grep vm.max_map_count
# 顯示:
$ vm.max_map_count = 262144
永久設(shè)置
在 /etc/sysctl.conf文件最后添加一行
vm.max_map_count=262144
啟動(dòng)
$ cd $ES_HOME/bin
# 啟動(dòng)elasticsearch
$ ./elasticsearch
# 帶參數(shù)覆蓋配置啟動(dòng)(通過自定義名稱覆蓋集群默認(rèn)的名稱或節(jié)點(diǎn)名稱)
$ ./elasticsearch -Ecluster.name=my_cluster_name -Enode.name=my_node_name
至此柠新,有關(guān)于Elasticsearch簡介和安裝和大家分享完了窍荧,后續(xù)陸續(xù)為大家分享有關(guān)Elasticsearch先關(guān)的知識點(diǎn),歡迎大家持續(xù)關(guān)注恨憎,相互探討學(xué)習(xí)蕊退!