本文主要內容:
一、elasticsearch的認識(是個啥,能幹啥)
二、安裝啓動、簡單集羣及關鍵配置
三、名詞解釋
四、存取數據,中文分詞
---------------------------------------------------------------------------------------------------
一、elasticsearch的認識
elasticsearch是一個開源的實時分佈式搜索分析引擎,底層使用lucene實現。lucene使用較爲複雜,es將其作成一個單獨的服務,方便開發人員使用。這麼說不太方便理解,通俗的講,能夠把它理解成一個分佈式的海量數據庫,並且使用方便。
比較詳細的介紹能夠參考官網的文檔以及權威指南:
二、安裝啓動、簡單集羣及關鍵配置
該部分就是一個安裝過程,附帶了配置說明
a、單機版
單節點的es比較簡單,直接下載啓動便可;
啓動:解壓後,bin目錄,./elasticsearch 回車便可。
注意:不可用root帳號啓動,由於es爲了防止危險腳本的注入,禁止root啓動;內存不要太小,默認內存配置是1G,若是當前內存小於1G,會報錯,考慮加大內存或者修改es默認內存配置,es默認佔用的jvm堆內存大小設置路徑:config/jvm.options中的-Xms跟-Xmx。
b、集羣搭建
通常是3點集羣或者5點集羣,理由固然是儘可能防止腦裂問題。本地只有一臺虛擬機,比較懶,就雙機集羣吧。
a
|
172.20.10.2
|
9200
|
物理機
|
b
|
172.20.10.3
|
9200
|
虛擬機
|
使用的es版本爲6.4.3,要修改的配置文件爲conf/elasticsearch.yml,主要修改如下選項:
#集羣名稱
cluster.name: my-application
#節點名稱
node.name: node-1
# 是否能夠做爲master節點,默認true
node.master: true
#本機地址
network.host: 172.20.10.2
#本機es端口
http.port: 9200
#單播模式下,具備master資格的節點列表,新加入的節點向這個列表中的節點發送請求來加入集羣
discovery.zen.ping.unicast.hosts: ["172.20.10.2", "172.20.10.3"]
#一個節點須要看到的具備master資格的節點的最小數量
discovery.zen.minimum_master_nodes: 1
以上,集羣名稱用於區分網絡環境中的不一樣es集羣。集羣中,不是全部節點都會參與master選舉,這樣的話會由於節點太多而過於複雜,故通常es集羣中只設置幾個節點用於master,其它節點只做爲數據節點,不參與主節點競爭;有master資格的節點須要儘可能讓其它節點看到本身;一個節點須要看到必定數量的具備master資格節點才能加入集羣並在其中執行操做,官方推薦的數字是(N/2)+1,其中N爲具備master資格的節點數量;
固然,生產環境的話,通常數據跟程序是不在同一目錄的,主要目的是方便es的版本升級,避免數據覆蓋。所以咱們把數據跟日誌目錄移動到別的目錄:
#es的數據存儲目錄
path.data: /var/elasticsearch/data
#es日誌存儲目錄
path.logs: /var/elasticsearch/logs
相應的,es的配置文件在每次升級以後也會被覆蓋,這不是咱們想要的,故而也應該提取出來。好比本次是將config移動到了/opt/elasticsearch/目錄下,同目錄下有elasticsearch-6.4.3目錄,也就是咱們es的home目錄。修改後,相應的啓動有兩種方式:
a、參數啓動
在es的home目錄/bin下執行 ES_PATH_CONF=/opt/elasticsearch/config ./elasticsearch
b、設置環境變量
在~/.bash_profile添加
ES_PATH_CONF=/opt/elasticsearch/config
export ES_PATH_CONF
兩行,而後能夠正常啓動。
分別啓動,結束後執行:curl -X GET "http://172.20.10.2:9200/_cat/health?v",查看集羣運行狀態:
node.total是全部節點數量,能夠看到有兩個節點。
本次啓動過程當中碰到兩個問題:
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65536]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
第一個問題,是說當前es用戶擁有的可建立文件描述的權限過低,解決辦法:
切換到root用戶進行修改:
vi /etc/security/limits.conf
在最後添加:
*** hard nofile 65536
*** soft nofile 65536
其中,*** 是啓動ES的用戶
第二個問題,是單個jvm能開啓的最大線程數過小,
切換root用戶,執行:sysctl -w vm.max_map_count=655360進行修改便可。
三、名詞解釋
雖然es已經啓動起來了,可咱們貌似對它並無什麼瞭解,那就從名詞解釋開始吧!
近實時:es是一個近乎實時的搜索平臺,所謂近實時就是說從索引文檔到返回結果仍是須要一點時間的,但不太長,一般是1秒。
索引:(名詞)es存儲數據的地方,是具備某些相似特徵的文檔的集合。相似於關係數據庫中的「數據庫」或者「表」。
(動詞)將數據存到es的索引的過程,叫作索引。
文檔:文檔是es中的一個json文件,至關於關係數據庫中的一行記錄。文檔存儲在索引中,有類型跟id。一個索引能夠保存多種類型的文檔,至關於一個student表中能夠放teacher跟student,不太貼切,但暫且這麼理解吧。es7中類型將被刪除,至關於與student表只能存student數據了。
類型:就是orm中的那個o的類型吧,es7中將被移除。
分片:數據存儲在索引中,索引的存儲量可能會超過單個節點的硬件限制條件。好比1TB大小的索引,若是放在單節點,會由於太大而致使搜索太慢或者乾脆硬盤沒有這麼大,而沒法進行存儲。爲了解決這個問題,es提供了分片機制,在建立索引時指定分片數量,指定後不可更改。每一個分片都是一個功能齊全且獨立的「索引」。
分片副本:顧名思義,就是分片的一個拷貝,在發生網絡故障時能夠保證損壞的節點數據正常使用。
四、存取數據,中文分詞
對es數據的操做能夠經過es提供的rest api來完成,curl命令不方便使用,以前有chrome插件sense能夠方便使用,但最新的chrome商店中刪掉了該插件,網絡上的改版也會被瀏覽器提示安全問題或者編碼問題,咱們此處使用kibana。
kibana默認鏈接localhost,須要在es的配置文件中添加 network.host: [localhost, 172.20.10.2],不然會致使沒法鏈接到es。啓動後訪問localhost:5601 --> Dev Tools 打開es 的rest api訪問工具。
a、增
添加一條數據到megacorp索引的employee類型下,id是1:
右邊,_version表示該記錄的版本號,3表示被修改過3次,我本地是增長後刪除了一次,第二次新增,故而版本是3。
批量增長:
批量處理有一些格式上要注意的地方:
一、操做命令跟內容交替出現,每一個獨佔一行;
即便文檔內容有不少,都是json格式,必須在一行,不然會報錯:"type": "illegal_argument_exception", "reason": "Malformed action/metadata line [3], expected START_OBJECT but found [VALUE_STRING]"
二、更新操做要有doc或者script,不然報錯:Validation Failed: 1: script or doc is missing
三、操做有4種,index、create、update跟delete,index跟create的區別是若是存在,是否替換,index會替換,create不會。
b、刪
單條刪除比較簡單,就是delete /索引名/類別/id ,比較經常使用的是經過查詢api來刪除
刪掉年齡爲32的員工:
c、改
update在上文增操做中有涉及;
經過腳本,將id爲3的員工年齡加5
d、查
查詢單個: get /索引/類型/id,條件查詢的api比較複雜;
能夠看到,把王者跟榮耀分別做爲了一個單詞,雖不是咱們指望的,但也還能夠理解。經過分詞器,咱們還能夠自定義詞語,近義詞等。
---------------------------------------------------------------------------------------------------
大概就先這樣吧,稍後分析es的內部數據存儲邏輯以及分詞器的一些經常使用操做。