ElasticSearch 從零到入門


 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

  

  1. 啟動es服務
開啟自啟
[root@ES-100 init.d]# systemctl enable elasticsearch.service 

開啟es
[root@ES-100 init.d]# service elasticsearch start

  

  1. 測試是否安裝成功
[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 格式的請求體 (如果請求需要的話)

 

    1. 插入索引數據 
      每個雇員索引一個文檔,包含該雇員的所有信息。 
      每個文檔都將是 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" ]
}'

  

  1. 查詢索引中一行數據:
[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"
    ]
  }
}

  

  1. 查詢索引中的所有信息
[root@ES-100 ~]# curl -XGET 'localhost:9200/megacorp/employee/_search?pretty'

  

 

    1. 查詢索引中符合條件的數據 
      搜索姓氏為 Smith 的雇員

 

[root@ES-100 ~]# curl -XGET 'localhost:9200/megacorp/employee/_search?q=last_name:Smith&pretty'

 

 

 

    1. 使用查詢表達式查詢想要的數據 
      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)

    1. 全文檢索 
      搜索下所有喜歡攀岩(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 表示未分配分片

 

 

 

  1. 查看節點列表
[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 下面的*號表示管理節點

 

 

  1. 查看所有索引信息
[root@ES-100 ~]# curl 'localhost:9200/_cat/indices?v'

  

 

 index :表示es 集群有哪些索引, 例如megacorp 這個索引, 一共在5個主分片(pri),一個副本 ,索引里的文檔一共是24.9KB大小

 

 

  1. 計算集群中文檔的數量
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

  

出現以下界面

 

訪問:http://10.0.0.100:9100

有點問題,不能連接到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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM