ElasticSearch入門
- 2020 年 8 月 17 日
- 筆記
- ElasctiSearch, elasticsearch
ES介紹
- elasticsearch是一款面向文檔的nosql資料庫,使用json數據格式作為文檔序列號格式。
- 使用Lucene作為核心來實現所有索引和搜索的功能,使得每個文檔的內容都可以被索引、搜索、排序、過濾。
- 提供了豐富的聚合功能,可以對數據進行多維度分析
- 對外統一使用REST API介面進行溝通,即Client與Server之間使用HTTP協議通訊。
- ElasticSearch和mysql對比 (6.0之後會有變化,後續會說)
index(索引,名詞)----> database
doc type(文檔類型)---> table
document(文檔)-------> row
field(欄位)----------> column
mapping(映射)--------> schema
query DSL(查詢語言)--> SQL
cluster :
代表一個集群,集群中有多個節點,其中有一個會被選為主節點,這個主節點是可以通過選舉產生的。
shards:代表索引分片,es可以把一個完整的索引分成多個分片,一個大的索引拆分成多個,分布到不同的節點上,構成分散式搜索。分片的數量只能在索引創建前指定,並且索引創建後不能更改。
replicas: 代表索引副本,es可以設置多個索引的副本,當個某個節點某個分片損壞或丟失時可以從副本中恢復。二是提高es的查詢效率,es會自動對搜索請求進行負載均衡。
ElasticSearch安裝
- 安裝JDK,至少1.8或以上版本,java -version
- 下載和解壓縮Elasticsearch安裝包,目錄結構
- 啟動Elasticsearch:bin\elasticsearch (後台啟動nohup ./bin/elasticsearch )直接啟動就可以用了,注意使用非root用戶啟動
- 檢查ES是否啟動成功:
//localhost:9200/?pretty //如果網頁中顯示如下資訊就說明已經安裝成功了。
Lucene與ES關係
- Lucene只是一個庫,要使用它必須用Java來作為開發語言並將其直接集成到你的應用中。
- Elasticsearch使用Java開發並使用Lucene作為其核心來實現所有索引和搜索的功能。它通過簡單的RESTful API來隱藏Lucene的複雜性,讓全文搜索變得簡單。
ElasticSearch head總結
集群健康值顏色
green:每個索引的primary shard和replica shard都是active狀態的
yellow:每個索引的primary shard都是active狀態的,但是部分replica shard不是active狀態,處於不可用的狀態
red:不是所有索引的primary shard都是active狀態的,部分索引有數據丟失了
head頁面訪問: (可以直接安裝elasticsearch-head的chrome的插件)或者服務中安裝head插件
//localhost:9200/_plugin/head/
elasticsearch常用命令
查看集群狀態 curl -XGET 『//localhost:9200/_cluster/health?pretty』
列出節點資訊 curl -XGET 『//localhost:9200/_cat/nodes?v』
列出索引資訊 curl -XGET 『//localhost:9200/_cat/indices?v』
列出分片資訊 curl -XGET 『//localhost:9200/_cat/shards?v』
查看進程資訊 curl -XGET 『//localhost:9200/_nodes/process?pretty』
獲取統計資訊 curl -XGET 『//localhost:9200/_stats?pretty』
獲取統計資訊-執行索引 curl -XGET 『//localhost:9200/productindex/_stats?pretty』
熱點執行緒 curl -XGET 『//localhost:9200/_nodes/hot_threads?pretty』
每10sdump熱點執行緒 curl -XGET 『//localhost:9200/_nodes/hot_threads?type=cpu&interval=10s』
獲取索引資訊 curl -XGET 『//localhost:9200/productindex/_mapping?pretty』
獲取JVM資訊 curl -XGET 「//localhost:9200/_nodes/stats/jvm?pretty」
獲取JVM資訊-指定節點 curl -XGET 「//localhost:9200/_nodes/Perry01/stats/jvm?pretty」
刪除全部索引 curl -XDELETE 『//localhost:9200/*?pretty』
刪除指定索引 curl -XDELETE 『//localhost:9200/loancase?pretty』
查看段資訊 curl -XGET 『//localhost:9200/loancase/_segments』
執行段合併 curl -XPOST 『//localhost:9200/loancase/_forcemerge?max_num_segments=1』
查看執行緒池配置 curl -XGET 「//localhost:9200/_nodes/thread_pool/」
elasticsearch.yml詳解
cluster.name: elasticsearch
配置es的集群名稱,默認是elasticsearch,es會自動發現在同一網段下的es,如果在同一網段下有多個集群,就可以用這個屬性來區分不同的集群。
node.name: "node"
節點名,默認隨機指定一個name列表中名字,該列表在es的jar包中config文件夾里name.txt文件中,其中有很多作者添加的有趣名字。
node.master: true
指定該節點是否有資格被選舉成為node,默認是true,es是默認集群中的第一台機器為master,如果這台機掛了就會重新選舉master。
node.data: true
指定該節點是否存儲索引數據,默認為true。
index.number_of_shards: 5
設置默認索引分片個數,默認為5片。
index.number_of_replicas: 1
設置默認索引副本個數,默認為1個副本。
path.conf: /path/to/conf
設置配置文件的存儲路徑,默認是es根目錄下的config文件夾。
path.data: /path/to/data
設置索引數據的存儲路徑,默認是es根目錄下的data文件夾,可以設置多個存儲路徑,用逗號隔開,例: path.data: /path/to/data1,/path/to/data2
path.work: /path/to/work
設置臨時文件的存儲路徑,默認是es根目錄下的work文件夾。
path.logs: /path/to/logs
設置日誌文件的存儲路徑,默認是es根目錄下的logs文件夾
path.plugins: /path/to/plugins
設置插件的存放路徑,默認是es根目錄下的plugins文件夾
bootstrap.mlockall: true
設置為true來鎖住記憶體。因為當jvm開始swapping時es的效率會降低,所以要保證它不swap,可以把ES_MIN_MEM和ES_MAX_MEM兩個環境變數設置成同一個值,並且保證機器有足夠的記憶體分配給es。同時也要允許elasticsearch的進程可以鎖住記憶體,linux下可以通過`ulimit -l unlimited`命令。
network.bind_host: 192.168.0.1
設置綁定的ip地址,可以是ipv4或ipv6的,默認為0.0.0.0。
network.publish_host: 192.168.0.1
設置其它節點和該節點交互的ip地址,如果不設置它會自動判斷,值必須是個真實的ip地址。
network.host: 192.168.0.1
這個參數是用來同時設置bind_host和publish_host上面兩個參數。
transport.tcp.port: 9300
設置節點間交互的tcp埠,默認是9300。
transport.tcp.compress: true
設置是否壓縮tcp傳輸時的數據,默認為false,不壓縮。
http.port: 9200
設置對外服務的http埠,默認為9200。
http.max_content_length: 100mb
設置內容的最大容量,默認100mb
http.enabled: false
是否使用http協議對外提供服務,默認為true,開啟。
gateway.type: local
gateway的類型,默認為local即為本地文件系統,可以設置為本地文件系統,分散式文件系統,hadoop的HDFS,和amazon的s3伺服器,其它文件系統的設置方法下次再詳細說。
gateway.recover_after_nodes: 1
設置集群中N個節點啟動時進行數據恢復,默認為1。
gateway.recover_after_time: 5m
設置初始化數據恢復進程的超時時間,默認是5分鐘。
gateway.expected_nodes: 2
設置這個集群中節點的數量,默認為2,一旦這N個節點啟動,就會立即進行數據恢復。
cluster.routing.allocation.node_initial_primaries_recoveries: 4
初始化數據恢復時,並發恢復執行緒的個數,默認為4。
cluster.routing.allocation.node_concurrent_recoveries: 2
添加刪除節點或負載均衡時並發恢復執行緒的個數,默認為4。
indices.recovery.max_size_per_sec: 0
設置數據恢復時限制的頻寬,如入100mb,默認為0,即無限制。
indices.recovery.concurrent_streams: 5
設置這個參數來限制從其它分片恢複數據時最大同時打開並發流的個數,默認為5。
discovery.zen.minimum_master_nodes: 1
設置這個參數來保證集群中的節點可以知道其它N個有master資格的節點。默認為1,對於大的集群來說,可以設置大一點的值(2-4)
discovery.zen.ping.timeout: 3s
設置集群中自動發現其它節點時ping連接超時時間,默認為3秒,對於比較差的網路環境可以高點的值來防止自動發現時出錯。
discovery.zen.ping.multicast.enabled: false
設置是否打開多播發現節點,默認是true。
discovery.zen.ping.unicast.hosts: ["host1", "host2:port", "...."]
設置集群中master節點的初始列表,可以通過這些節點來自動發現新加入集群的節點。
ES RestFull API post、put、head、delete
- PUT是冪等方法,POST不是。所以PUT用於更新、POST用於新增比較合適。
- PUT,DELETE操作是冪等的。所謂冪等是指不管進行多少次操作,結果都一樣。
- 創建操作可以使用POST,也可以使用PUT,區別在於POST是作用在一個集合資源之上的/articles),
而PUT操作是作用在一個具體資源之上的(/articles/123) - HEAD使用: 如果只想檢查一下文檔是否存在,你可以使用HEAD來替代GET方法,這樣就只會返回HTTP頭文件
eg:curl -i -XHEAD //localhost:9200/hello/1
ES疑問解答
Elasticsearch是如何實現Master選舉的
1、Elasticsearch的選主是ZenDiscovery模組負責的,主要包含Ping(節點之間通過這個RPC來發現彼此)和Unicast(單播模組包含一個主機列表以控制哪些節點需要ping通)這兩部分
2、對所有可以成為master的節點(node.master:true)根據nodeId字典排序,每次選舉每個節點都把自己所知道節點排一次序,然後選出第一個(第0位)節點,暫且認為它是master節點。
3、如果對某個節點的投票數達到一定的值(可以成為master節點數n/2+1)並且該節點自己也選舉自己,那這個節點就是master。否則重新選舉一直到滿足上述條件。
Elasticsearch是如何避免腦裂現象的
1、當集群中master候選的個數不小於3個(node.master:true)。可以通過discovery.zen.minimum_master_nodes這個參數的設置來避免腦裂,設置為(N/2)+1
2、假如集群master候選節點為2的時候,這種情況是不合理的,最好把另外一個node.master改成false。如果我們不改節點設置,還是套上面的(N/2)+1公式,此時discovery.zen.minimum_master_nodes應該設置為2。這就出現一個問題,兩個master備選節點,只要有一個掛,就選不出master了
客戶端在和集群連接時,如何選擇特定的節點執行請求的
TransportClient利用transport模組遠程連接一個elasticsearch集群。它並不加入到集群中,只是簡單的獲得一個或者多個初始化的transport地址,並以 輪詢 的方式與這些地址進行通訊。
並發情況下Elasticsearch如何保證讀寫一致
1、可以通過版本號使用樂觀並發控制,以確保新版本不會被舊版本覆蓋,由應用層來處理具體的衝突;
2、另外對於寫操作,一致性級別支援quorum/one/all,默認為quorum,即只有當大多數分片可用時才允許寫操作。但即使大多數可用,也可能存在因為網路等原因導致寫入副本失敗,這樣該副本被認為故障,分片將會在一個不同的節點上重建。
3、對於讀操作,可以設置replication為sync(默認),這使得操作在主分片和副本分片都完成後才會返回;如果設置replication為async時,也可以通過設置搜索請求參數_preference為primary來查詢主分片,確保文檔是最新版本。
Elasticsearch更新和刪除文檔的過程
1、刪除和更新也都是寫操作,但是Elasticsearch中的文檔是不可變的,因此不能被刪除或者改動以展示其變更;
2、磁碟上的每個段都有一個相應的.del文件。當刪除請求發送後,文檔並沒有真的被刪除,而是在.del文件中被標記為刪除。 該文檔依然能匹配查詢,但是會在結果中被過濾掉。當段合併時,在.del文件中被標記為刪除的文檔將不會被寫入新段。
3、在新的文檔被創建時,Elasticsearch會為該文檔指定一個版本號,當執行更新時,舊版本的文檔在.del文件中被標記為刪除,新版本的文檔被索引到一個新段。舊版本的文檔依然能匹配查詢,但是會在結果中被過濾掉。
bulk一次最大處理多少數據量
1、bulk會把將要處理的數據載入記憶體中,所以數據量是有限制的
2、最佳的數據量不是一個確定的數值,它取決於你的硬體,你的文檔大小以及複雜性,你的索引以及搜索的負載
3、一般建議是1000-5000個文檔,如果你的文檔很大,可以適當減少隊列,大小建議是5-15MB,默認不能超過100M
4、可以在es的配置文件中修改這個值http.max_content_length: 100mb
create和index的區別
如果數據存在,使用create操作失敗,會提示文檔已經存在,使用index則可以成功執行
ES的兩個web訪問工具
kibana: 找到對應的版本下載解壓到plugins目錄下
還有幾個是之前使用過的,之前從2.x開始使用,2.x的kibana還不是很好用
BigDesk Plugin : 監控es狀態的插件,推薦!主要提供的是節點的實時狀態監控,包括jvm的情況,
linux的情況,elasticsearch的情況
Elasticsearch Head Plugin : 很方便對es進行各種操作的客戶端,
建議安裝chrom插件方便使用不佔用服務資源
ElasticSearch-Kopf : Kopf是一個ElasticSearch的管理工具,它也提供了對ES集群操作的API
ES Cluster總結
- 集群當中任何一個節點的通訊和與整個es集群通訊是等價的
- 主節點的職責是負責管理集群狀態,包括管理分片的狀態和副本的狀態,以及節點的發現和刪除。
- 只需要在同一個網段之內啟動多個es節點,就可以自動組成一個集群。
- 默認情況下es會自動發現同一網段內的節點,自動組成集群。
ps:希望有時間繼續連載一下ES,加油!希望關注,哈哈哈