1 ElasticSearch 介紹
Elasticsearch 是一個實時的分布式搜索分析引擎, 它能讓你以一個之前從未有過的速度和規模,去探索你的數據。 它被用作全文檢索、結構化搜索、分析以及這三個功能的組合
Elasticsearch是一個基於Apache Lucene(TM)的開源搜索引擎。無論在開源還是專有領域,Lucene可以被認為是迄今為止最先進、性能最好的、功能最全的搜索引擎庫。
但是,Lucene只是一個庫。想要使用它,你必須使用Java來作為開發語言並將其直接集成到你的應用中
,更糟糕的是,Lucene非常復雜,你需要深入了解檢索的相關知識來理
解它是如何工作的
Elasticsearch也使用Java開發並使用Lucene作為其核心來實現所有索引和搜索的功能,但是它的目的是通過簡單的RESTful API來隱藏Lucene的復雜性,從而讓全文搜索變得簡單。
Elasticsearch 使用 JavaScript Object Notation 或者 JSON 作為文檔的序列化格式。 JSON 序列化被大多數編程語言所支持,並且已經成為 NoSQL 領域的標准格式。 它簡單、簡潔、易於閱讀。
考慮下面這個 JSON 文檔,它代表了一個 user 對象:
{ "email": "john@smith.com", "first_name": "John", "last_name": "Smith", "info": { "bio": "Eco-warrior and defender of the weak", "age": 25, "interests": [ "dolphins", "whales" ] }, "join_date": "2018/05/20" }
2 ElasticSearch 安裝
必須要有 java 環境
[root@ES-100 ~]# java -version openjdk version "1.8.0_65" OpenJDK Runtime Environment (build 1.8.0_65-b17) OpenJDK 64-Bit Server VM (build 25.65-b01, mixed mode)
1. 下載elasticsearch
下載地址: 下載的rpm包
https://www.elastic.co/cn/downloads/elasticsearch
我的版本是:
elasticsearch-6.5.1
安裝:
[root@ES-100 software]# rpm -ivh elasticsearch-6.5.1.rpm
目錄說明
配置文件目錄在/etc/elasticsearch [root@ES-100 elasticsearch]# pwd /etc/elasticsearch [root@ES-100 elasticsearch]# tree . ├── elasticsearch.keystore ├── elasticsearch.yml #es 配置文件 ├── jvm.options # java 的配置文件 ├── log4j2.properties ├── role_mapping.yml ├── roles.yml ├── users └── users_roles 服務啟動目錄: [root@ES-100 init.d]# /etc/init.d/elasticsearch 插件所在目錄 [root@ES-100 plugins]# pwd /usr/share/elasticsearch/plugins
- 啟動es服務
開啟自啟 [root@ES-100 init.d]# systemctl enable elasticsearch.service 開啟es [root@ES-100 init.d]# service elasticsearch start
- 測試是否安裝成功
[root@ES-100 init.d]# curl 'http://localhost:9200/?pretty'; { "name" : "VeXx8SO", "cluster_name" : "elasticsearch", "cluster_uuid" : "RPk51B7bRUuVHHFAkns6Sw", "version" : { "number" : "6.5.1", "build_flavor" : "default", "build_type" : "rpm", "build_hash" : "8c58350", "build_date" : "2018-11-16T02:22:42.182257Z", "build_snapshot" : false, "lucene_version" : "7.5.0", "minimum_wire_compatibility_version" : "5.6.0", "minimum_index_compatibility_version" : "5.0.0" }, "tagline" : "You Know, for Search" }
3 ElasticSearch 配置文件介紹
Elasticsearch 已經有了 很好 的默認值, 特別是涉及到性能相關的配置或者選項,其它數據庫可能需要調優,但總得來說,Elasticsearch 不需要。 如果你遇到了性能問題,解決方法通常是更好的數據布局或者更多的節點。
3.1 elasticsearch.yml重要文件
Elasticsearch 默認啟動的集群名字叫 elasticsearch
可以在你的/etc/elasticsearch/elasticsearch.yml 中修改
cluster.name: elasticsearch_production
給每個節點設置一個有意義的、清楚的、描述性的名字,同樣你可以在elasticsearch.yml 中配置:
node.name: elasticsearch_005_data
默認情況下, Elasticsearch 會把插件、日志以及你最重要的數據放在安裝目錄下
。這會帶來不幸的事故,如果你重新安裝 Elasticsearch
的時候不小心把安裝目錄覆蓋了。如果你不小心,你就可能把你的全部數據刪掉
了。
最好的選擇就是把你的數據目錄配置到安裝目錄以外的地方,同樣你也可以選擇轉移你的插件和日志目錄。
默認的插件目錄在/usr/share/elasticsearch/plugins
可以自定義更改如下:
path.data: /path/to/data1,/path/to/data2 # Path to log files: path.logs: /path/to/logs # Path to where plugins are installed: path.plugins: /path/to/plugins
最小主節點數 minimum_master_nodes
設定對你的集群的穩定 極其 重要,當你的集群中有兩個 masters
(注:主節點)的時候,這個配置有助於防止 腦裂 ,一種兩個主節點同時存在於一個集群的現象
。
如果你的集群發生了腦裂
,那么你的集群就會處在丟失數據
的危險中,因為主節點被認為是這個集群的最高統治者,它決定了什么時候新的索引可以創建,分片是如何移動的等等。
如果你有 兩個 masters 節點
,你的數據的完整性將得不到保證,因為你有兩個節點認為他們有集群的控制權
這個配置就是告訴 Elasticsearch 當沒有足夠 master 候選節點
的時候,就不要進行 master 節點選舉
,等master 候選節點足夠了才進行選舉。
此設置應該始終被配置為 master 候選節點的法定個數(大多數個)。法定個數就是 ( master 候選節點個數 / 2) + 1
。
可以在你的 elasticsearch.yml 文件中這樣配置:
discovery.zen.minimum_master_nodes: 2
Elasticsearch 默認被配置為使用單播發現
使用單播,你可以為 Elasticsearch 提供一些它應該去嘗試連接的節點列表。 當一個節點聯系到單播列表中的成員時,它就會得到整個集群所有節點的狀態,然后它會聯系 master 節點,並加入集群。
這個配置在 elasticsearch.yml 文件中
discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
內存交換
到磁盤對服務器性能來說是 致命 的
需要打開配置文件中的 mlockall 開關。 它的作用就是允許 JVM 鎖住內存,禁止操作系統交換出去。在你的 elasticsearch.yml 文件中,設置如下:
bootstrap.mlockall: true
綁定IP
默認elasticsearch 只能訪問自己127.0.0.1 ,如果需要讓其他的機器的訪問則需要在加上
network.host: 192.168.0.1
3.2 jvm.options 配置文件
Elasticsearch 默認安裝后設置的堆內存是 1 GB
你也可以通過命令行參數的形式,在程序啟動的時候把內存小傳遞給它,如果你覺得這樣更簡單的話:
[root@ES-100 bin]# /usr/share/elasticsearch/bin/elasticsearch -Xmx10g -Xms10g
確保堆內存最小值( Xms )與最大值( Xmx )的大小是相同的,防止程序在運行時改變堆內存大小, 這是一個很耗系統資源的過程。
標准的建議是把 50% 的可用內存作為 Elasticsearch 的堆內存,保留剩下的 50%。當然它也不會被浪費,Lucene 會利用起余下的內存.
但堆內存大小設置不要超過 32 GB
3.3 做實驗用的配置文件
這只是我做實驗用的配置文件, 具體環境,根據生產而定
elasticsearch.yml
[root@ES-100 ~]# egrep -v "^#|^$" /etc/elasticsearch/elasticsearch.yml path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 127.0.0.1,10.0.0.100
4 ElsaticSearch交互
所有其他語言可以使用 RESTful API 通過端口 9200 和Elasticsearch 進行通信
,你可以用你最喜愛的 web客戶端訪問 Elasticsearch 。 事實上,正如你所看到的,你甚至可以使用 curl 命令來和 Elasticsearch 交互。
一個 Elasticsearch 請求和任何 HTTP 請求一樣由若干相同的部件組成:
curl -X<VERB> '<PROTOCOL>://<HOST>:<PORT>/<PATH>?<QUERY_STRING>' -d '<BODY>'
VERB 適當的 HTTP 方法 或 謂詞 :GET
、 POST
、 PUT
、 HEAD
或者 DELETE
。
PROTOCOL http 或者 https(如果你在 Elasticsearch 前面有一個 https 代理)
HOST Elasticsearch 集群中任意節點的主機名,或者用 localhost 代表本地機器上的節點
PORT 運行 Elasticsearch HTTP 服務的端口號,默認是 9200 。
PATH API 的終端路徑(例如 _count 將返回集群中文檔數量)。 Path 可能包含多個組件,
例如:_cluster/stats 和 _nodes/stats/jvm 。
QUERY_STRING 任意可選的查詢字符串參數 (例如 ?pretty 將格式化地輸出 JSON 返回值,使其更容易閱讀)
BODY 一個 JSON 格式的請求體 (如果請求需要的話)
- 插入索引數據
每個雇員索引一個文檔,包含該雇員的所有信息。
每個文檔都將是 employee 類型 。
該類型位於 索引 megacorp 內。
該索引保存在我們的 Elasticsearch 集群中。
#插入3條數據 curl -XPUT 'localhost:9200/megacorp/employee/1?pretty' -H 'Content-Type: application/json' -d' { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests": [ "sports", "music" ] }' curl -XPUT 'localhost:9200/megacorp/employee/2?pretty' -H 'Content-Type: application/json' -d' { "first_name" : "Jane", "last_name" : "Smith", "age" : 32, "about" : "I like to collect rock albums", "interests": [ "music" ] }' curl -XPUT 'localhost:9200/megacorp/employee/3?pretty' -H 'Content-Type: application/json' -d' { "first_name" : "Douglas", "last_name" : "Fir", "age" : 35, "about": "I like to build cabinets", "interests": [ "forestry" ] }'
- 查詢索引中一行數據:
[root@ES-100 ~]# curl -XGET 'localhost:9200/megacorp/employee/1?pretty' { "_index" : "megacorp", "_type" : "employee", "_id" : "1", "_version" : 1, "found" : true, "_source" : { "first_name" : "John", "last_name" : "Smith", "age" : 25, "about" : "I love to go rock climbing", "interests" : [ "sports", "music" ] } }
- 查詢索引中的所有信息
[root@ES-100 ~]# curl -XGET 'localhost:9200/megacorp/employee/_search?pretty'
- 查詢索引中符合條件的數據
搜索姓氏為Smith
的雇員
[root@ES-100 ~]# curl -XGET 'localhost:9200/megacorp/employee/_search?q=last_name:Smith&pretty'
- 使用查詢表達式查詢想要的數據
Query-string 搜索通過命令非常方便地進行臨時性的即席搜索 ,但它有自身的局限性
Elasticsearch 提供一個豐富靈活的查詢語言叫做 查詢表達式 ,它支持構建更加復雜和健壯的查詢。
領域特定語言 (DSL), 指定了使用一個 JSON 請求。我們可以像這樣重寫之前的查詢所有 Smith 的搜索 :
curl -XGET 'localhost:9200/megacorp/employee/_search?pretty' -H 'Content-Type: application/json' -d' { "query" : { "match" : { "last_name" : "Smith" } } } '
返回結果與之前的查詢一樣,但還是可以看到有一些變化。其中之一是,不再使用 query-string 參數,而是一個請求體替代。這個請求使用 JSON 構造,並使用了一個 match 查詢
搜索姓氏為 Smith 的雇員,但這次我們只需要年齡大於 30 的。查詢需要稍作調整,使用過濾器 filter
,它支持高效地執行一個結構化查詢
curl -XGET 'localhost:9200/megacorp/employee/_search?pretty' -H 'Content-Type: application/json' -d' { "query" : { "bool": { "must": { "match" : { "last_name" : "smith" } }, "filter": { "range" : { "age" : { "gt" : 30 } } } } } } '
range 過濾器 , 它能找到年齡大於 30 的文檔,其中 gt 表示_大於(_great than)
- 全文檢索
搜索下所有喜歡攀岩(rock climbing)的雇員:
curl -XGET 'localhost:9200/megacorp/employee/_search?pretty' -H 'Content-Type: application/json' -d' { "query" : { "match_phrase" : { "about" : "rock climbing" } } }'
5 ElasticSearch集群
Elasticsearch 可以橫向擴展至數百(甚至數千)的服務器節點,同時可以處理PB級數據
Elasticsearch 天生就是分布式的,並且在設計時屏蔽了分布式的復雜性。
Elasticsearch 盡可能地屏蔽了分布式系統的復雜性。這里列舉了一些在后台自動執行的操作:
分配文檔到不同的容器 或 分片 中,文檔可以儲存在一個或多個節點中
按集群節點來均衡分配這些分片,從而對索引和搜索過程進行負載均衡
復制每個分片以支持數據冗余,從而防止硬件故障導致的數據丟失
將集群中任一節點的請求路由到存有相關數據的節點
集群擴容時無縫整合新節點,重新分配分片以便從離群節點恢復
一個運行中的 Elasticsearch 實例稱為一個 節點,而集群是由一個或者多個擁有相同 cluster.name 配置的節點組成, 它們共同承擔數據和負載的壓力。當有節點加入集群中或者從集群中移除節點時,集群將會重新平均分布所有的數據。
當一個節點被選舉成為 主 節點時, 它將負責管理集群范圍內的所有變更,例如增加、刪除索引,或者增加、刪除節點等。
而主節點並不需要涉及到文檔級別的變更和搜索等操作,所以當集群只擁有一個主節點的情況下,即使流量的增加它也不會成為瓶頸。 任何節點都可以成為主節點。我們的示例集群就只有一個節點,所以它同時也成為了主節點。
作為用戶,我們可以將請求發送到 集群中的任何節點 ,包括主節點。 每個節點都知道任意文檔所處的位置,並且能夠將我們的請求直接轉發到存儲我們所需文檔的節點。無論我們將請求發送到哪個節點,它都能負責從各個包含我們所需文檔的節點收集回數據,並將最終結果返回給客戶端。 Elasticsearch 對這一切的管理都是透明的。
Elasticsearch 的集群監控信息中包含了許多的統計數據,其中最為重要的一項就是 集群健康 , 它在 status 字段中展示為 green 、 yellow 或者 red
[root@ES-100 ~]# curl -XGET 'localhost:9200/_cluster/health?pretty' { "cluster_name" : "elasticsearch", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 5, "active_shards" : 5, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 5, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 50.0 }
status 字段是要關注的
status 字段指示着當前集群在總體上是否工作正常。它的三種顏色含義如下:
green:
所有的主分片和副本分片都正常運行
yellow:
所有的主分片都正常運行,但不是所有的副本分片都正常運行。
red:
有主分片沒能正常運行。
往 Elasticsearch 添加數據時需要用到 索引 —— 保存相關數據的地方。 索引實際上是指向一個或者多個物理 分片 的 邏輯命名空間
一個 分片 是一個底層的 工作單元 ,它僅保存了 全部數據中的一部分
文檔被存儲和索引到分片內,但是應用程序是直接與索引而不是與分片進行交互。
Elasticsearch 是利用分片將數據分發到集群內各處的。分片是數據的容器,文檔保存在分片內,分片又被分配到集群內的各個節點里。 當你的集群規模擴大或者縮小時, Elasticsearch 會自動的在各節點中遷移分片,使得數據仍然均勻分布在集群里。
一個分片可以是 主 分片或者 副本 分片。 索引內任意一個文檔都歸屬於一個主分片,所以主分片的數目決定着索引能夠保存的最大數據量
一個副本分片只是一個主分片的拷貝。 副本分片作為硬件故障時保護數據不丟失的冗余備份,並為搜索和返回文檔等讀操作提供服務。
在索引建立的時候就已經確定了主分片數,但是副本分片數可以隨時修改。 索引在默認情況下會被分配5個主分片
, 但可以在創建索引時指定分配3個主分片和一份副本(每個主分片擁有一個副本分片)
例如下面建立了一個索引名叫: blogs ,設置了3個主分片,1個副本分片
curl -XPUT 'localhost:9200/blogs?pretty' -H 'Content-Type: application/json' -d' { "settings" : { "number_of_shards" : 3, "number_of_replicas" : 1 } } '
[root@ES-100 ~]# curl -XGET 'localhost:9200/_cluster/health?pretty' { "cluster_name" : "elasticsearch", "status" : "yellow", "timed_out" : false, "number_of_nodes" : 1, "number_of_data_nodes" : 1, "active_primary_shards" : 8, "active_shards" : 8, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 8, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 50.0 }
megacorp 有 5個 主分片, blogs 有3個主分片 ,
現在集群有8個主分片 , 8個副本分片,現在集群只有一個節點。
所有集群中8個副本分片都是 unassigned —— 它們都沒有被分配到任何節點。 在同一個節點上既保存原始數據又保存副本是沒有意義的,因為一旦失去了那個節點,我們也將丟失該節點上的所有副本數據。
當前我們的集群是正常運行的,但是在硬件故障時有丟失數據的風險
當第二個節點加入到集群后,3個 副本分片 將會分配到這個節點上——每個主分片對應一個副本分片。 這意味着當集群內任何一個節點出現問題時,我們的數據都完好無損。
所有新近被索引的文檔都將會保存在主分片上,然后被並行的復制到對應的副本分片上。這就保證了我們既可以從主分片又可以從副本分片上獲得文檔。
5.1 搭建ES集群
host | IP | linux version | es version |
ES-100 | 10.0.0.100 | centos-7.2 | es-6.5.1 |
ES-101 | 10.0.0.101 | centos-7.2 | es-6.5.1 |
在兩台機器分別安裝好elasticsearch
在兩個節點的elasticsearch.yml上設置相同的cluster_name,但不同的node_name
在兩個節點上設置相互發現的配置:discovery.zen.ping.unicast.hosts
ES-100的機器配置: [root@ES-100 ~]# egrep -v '^#|^$' /etc/elasticsearch/elasticsearch.yml cluster.name: es-test node.name: es-test01 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 127.0.0.1,10.0.0.100 discovery.zen.ping.unicast.hosts: ["10.0.0.100", "10.0.0.101"] discovery.zen.minimum_master_nodes: 2 ES-101的機器配置: [root@ES-101 ~]# egrep -v '^#|^$' /etc/elasticsearch/elasticsearch.yml cluster.name: es-test node.name: es-test02 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 127.0.0.1,10.0.0.101 discovery.zen.ping.unicast.hosts: ["10.0.0.100", "10.0.0.101"] discovery.zen.minimum_master_nodes: 2 兩台機器重啟ES: service elasticsearch restart
重啟之后查看集群整體節點數量:
5.2 查看集群的狀態信息
1. 查看集群狀態
[root@ES-100 ~]# curl 'localhost:9200/_cat/health?v' 或者 [root@ES-101 ~]# curl 'localhost:9200/_cluster/health?pretty'
重要參數解釋:
cluster_name: 表示集群名稱,所有節點的集群名稱必須一致
status:表示集群狀態
green:
所有的主分片和副本分片都正常運行
yellow:
所有的主分片都正常運行,但不是所有的副本分片都正常運行。
red:
有主分片沒能正常運行。
number_of_nodes: 表示es集群有幾個節點
active_primary_shards: 8 表示有8個主分片
active_shards: 16 表示一共有16個分片
unassigned_shards: 0 表示未分配分片
- 查看節點列表
[root@ES-100 ~]# curl 'localhost:9200/_cat/nodes?v' ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name 10.0.0.101 13 97 0 0.00 0.01 0.05 mdi * es-test02 10.0.0.100 12 95 0 0.00 0.01 0.05 mdi - es-test01
master 下面的*
號表示管理節點
- 查看所有索引信息
[root@ES-100 ~]# curl 'localhost:9200/_cat/indices?v'
index :表示es 集群有哪些索引, 例如megacorp 這個索引, 一共在5個主分片(pri),一個副本 ,索引里的文檔一共是24.9KB大小
- 計算集群中文檔的數量
curl -H "Content-Type: application/json" -XGET 'http://localhost:9200/_count?pretty' -d ' { "query": { "match_all": {} } } '
6 ElasticSearch 插件
ElasticSearch的圖形化界面插件很多,
現在最常用的elasticsearch-head
, 早期版本用marvel-agent。
上面全是用的curl 方式查看es 相應的一些信息, 命令太多很繁瑣。 這個時候就可以用elasticsearch-head插件 ,使用web界面的來查看es集群的狀態,節點信息, 創建索引, 設置分片等等功能。
6.1 安裝elasticsearch-head插件
有若干種安裝方式,比如壓縮包安裝,docker安裝,但最簡單的方式還是直接使用瀏覽器插件確保服務器上的es運行,使用chrome瀏覽器,安裝專門的瀏覽器插件。
https://github.com/mobz/elasticsearch-head
安裝方法如下:
git clone git://github.com/mobz/elasticsearch-head.git cd elasticsearch-head npm install #這時候可能會報錯需要升級openssl,如果沒報錯則不用安裝 yum update openssl -y #再安裝 npm install npm run start
出現以下界面
有點問題,不能連接到es
配置一下允許跨域請求設置:
在es集群的所有es節點
給加上/etc/elasticsearch/elasticsearch.yml
http.cors.enabled: true http.cors.allow-origin: "*"
重啟ES服務,查看web界面
ok,這個時候就可以同web界面來操作es
粗黑線框是 主分片
docs: 表示這個索引有多少數據
星號表示管理節點,
1 查看集群狀態
2 查看索引數據
7 ES集群分片一些常見問題
准備3個es 節點 , 上面已近有兩個es 節點, 把新的es 節點 ,加入es集群,好看看問題。
host | IP |
ES-100 | 10.0.0.100 |
ES-101 | 10.0.0.101 |
ES-102 | 10.0.0.102 |
各機器配置文件如下
ES-100:的機器配置 [root@ES-100 ~]# egrep -v '^#|^$' /etc/elasticsearch/elasticsearch.yml cluster.name: es-test node.name: es-test01 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 127.0.0.1,10.0.0.100 discovery.zen.ping.unicast.hosts: ["10.0.0.100", "10.0.0.101","10.0.0.102"] discovery.zen.minimum_master_nodes: 2 http.cors.enabled: true http.cors.allow-origin: "*" ES-101:的機器配置 [root@ES-101 ~]# egrep -v '^#|^$' /etc/elasticsearch/elasticsearch.yml cluster.name: es-test node.name: es-test02 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 127.0.0.1,10.0.0.101 discovery.zen.ping.unicast.hosts: ["10.0.0.100", "10.0.0.101","10.0.0.102"] http.cors.enabled: true http.cors.allow-origin: "*" [root@ES-102 ~]# egrep -v '^#|^$' /etc/elasticsearch/elasticsearch.yml cluster.name: es-test node.name: es-test03 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 127.0.0.1,10.0.0.102 discovery.zen.ping.unicast.hosts: ["10.0.0.0.100", "10.0.0.101","10.0.0.102"] discovery.zen.minimum_master_nodes: 2 http.cors.enabled: true http.cors.allow-origin: "*" 記得都重啟es
當啟動了第三個節點,我們的集群將會看起來如下
以blogs
索引為例:
es-test01節點和 es-test02 的節點 上各有一個分片被遷移到了新的es-test03節點,現在每個節點上都擁有2個分片,而不是之前的3個。 這表示每個節點的硬件資源(CPU, RAM, I/O)將被更少的分片所共享,每個分片的性能將會得到提升。分片是一個功能完整的搜索引擎,它擁有使用一個節點上的所有資源的能力。 我們這個擁有6個分片(3個主分片和3個副本分片)的索引可以最大擴容到6個節點,每個節點上存在一個分片,並且每個分片擁有所在節點的全部資源。主分片的數目在索引創建時 就已經確定了下來。讀操作——搜索和返回數據——可以同時被主分片 或 副本分片所處理,所以當你擁有越多的副本分片時,也將擁有越高的吞吐量。
在運行中的集群上是可以動態調整副本分片數目的 ,我們可以按需伸縮集群。讓我們把blogs副本數從默認的 1 增加到 2 :
[root@ES-100 ~]# curl -XPUT 'localhost:9200/blogs/_settings?pretty' -H 'Content-Type: application/json' -d' { "number_of_replicas" : 2 }' { "acknowledged" : true }
看一下效果
7.1 模擬ES節點故障
如果我們關閉第一個節點,這時集群的狀態為
[root@ES-100 ~]# service elasticsearch stop
集群狀態變為yellow了,這個提示主分片的過程是瞬間發生的,如同按下一個開關一般。
為什么集群狀態是yellow 了,而不是green 了, 這里我設置了3個主分片,2個副本分片, 我在上面設置了blogs每個主分片需要對應2分副本分片, 正常這樣設置的情況下, 應該有3個主分片6個副本分片, 但是現在有3個主分片, 3個副本分片,現在缺失副本分片了,所以此時的集群的狀態會為yellow。
在重新啟動es-test01 ,集群可以將缺失的副本分片再次進行分配。
8 文檔元數據
一個文檔不僅僅包含它的數據 ,也包含 元數據 —— 有關 文檔的信息。 三個必須的元數據元素如下:
_index 文檔在哪存放
_type 文檔表示的對象類別
_id 文檔唯一標識
_index
_index 一個 索引 應該是因共同的特性被分組到一起的文檔集合。 例如,你可能存儲所有的產品在索引 products中,而存儲所有銷售的交易到索引 sales 中
_type
數據可能在索引中只是松散的組合在一起,但是通常明確定義一些數據中的子分區是很有用的。 例如,所有的產品都放在一個索引中,但是你有許多不同的產品類別,比如 “electronics” 、”kitchen” 和 “lawncare”。
這些文檔共享一種相同的(或非常相似)的模式:他們有一個標題、描述、產品代碼和價格。他們只是正好屬於“產品”下的一些子類
Elasticsearch 公開了一個稱為 types (類型)的特性,它允許您在索引中對數據進行邏輯分區。
不同types 的文檔可能有不同的字段,但最好能夠非常相似。
_id
ID 是一個字符串, 當它和 _index 以及 _type 組合就可以唯一確定 Elasticsearch 中的一個文檔。 當你創建一個新的文檔,要么提供自己的 _id ,要么讓 Elasticsearch 幫你生成。
9 文檔
1. 查詢文檔
例如
[root@ES-100 ~]# curl -XGET http://10.0.0.100:9200/megacorp/employee/1?pretty
2. 返回文檔一部分
默認情況下, GET 請求 會返回整個文檔,這個文檔正如存儲在 _source 字段中的一樣。但是也許你只對其中的 title 字段感興趣。單個字段能用 _source 參數請求得到,多個字段也能使用逗號分隔的列表來指定
[root@ES-100 ~]# curl -XGET 'http://10.0.0.100:9200/megacorp/employee/1?_source=title,text&pretty'
3. 檢查文檔是否存在
如果只想檢查一個文檔是否存在 –根本不想關心內容–那么用 HEAD 方法來代替 GET 方法。 HEAD 請求沒有返回體,只返回一個 HTTP 請求報頭:
[root@ES-100 ~]# curl -i -XHEAD http://localhost:9200/website/blog/123 [root@ES-100 ~]# curl -i -XHEAD http://localhost:9200/megacorp/employee/1
如果文檔存在, Elasticsearch 將返回一個 200 ok 的狀態碼
若文檔不存在, Elasticsearch 將返回一個 404 Not Found 的狀態碼:
4. 刪除文檔
刪除文檔 的語法和我們所知道的規則相同,只是 使用 DELETE 方法:
[root@ES-100 ~]# curl -i -XDELETE 'http://localhost:9200/megacorp/employee/1?pretty'
與上面與elasticsearch 交互那一塊 可以看看
10 索引的CRUD
1 . 刪除一個索引編輯
也是用curl 方式
用以下的請求來 刪除索引:
DELETE /my_index
也可以這樣刪除多個索引
DELETE /index_one,index_two DELETE /index_*
甚至可以這樣刪除 全部 索引:
DELETE /_all DELETE /*
對一些人來說,能夠用單個命令來刪除所有數據可能會導致可怕的后果。如果你想要避免意外的大量刪除, 你可以在你的elasticsearch.yml 做如下配置:
action.destructive_requires_name: true
這個設置使刪除只限於特定名稱指向的數據, 而不允許通過指定 _all 或通配符來刪除指定索引庫。
2. 索引設置編輯
你可以通過修改配置來自定義索引行為
下面是兩個 最重要的設置: number_of_shards 每個索引的主分片數,默認值是 5 。這個配置在索引創建后不能修改。
number_of_replicas 每個主分片的副本數,默認值是 1 。對於活動的索引庫,這個配置可以隨時修改。
例如剛剛blogs 索引,設置的是每個主分片有兩個副本分片
現在修改:
curl -XPUT 'localhost:9200/blogs/_settings?pretty' -H 'Content-Type: application/json' -d' { "number_of_replicas": 1 }'
表示修改成功了,web驗證
11 規定shards的個數設置
現在有索引了, 怎么規定索引的shard ,怎么樣才能達到最優。
默認建立的索引是有5個主分片一個副本分片
例如blogs的shards
"number_of_shards": "3", "number_of_replicas": "1",
是每個主分片都有一個副本分片
具體怎么設置是看每個shard的數據量:
每個shad的數據量最好不要超過50G,一般20G-30G 之間比較合理的大小。
例如
整個索引大小是100G,shard 分成是5是合理的
整個索引大小是500G,用默認的shard 5 是不合理的
參考手冊:
https://www.elastic.co/guide/en/elasticsearch/reference/current/index.html