ES-elasticsearch

簡介

elasticsearch是一個分佈式的實時搜索和分析引擎,一個建立在全文搜索引擎Apache Lucene基礎上的搜索引擎,它不僅可以進行全文搜索,還可以進行以下工作:
分佈式實時文件存儲,並將每一個字段都編入索引,使其可以被搜索
實時分析的分佈式搜索引擎
可以擴展到上百臺服務器,可以PB級別的結構化或非結構化數據
提供了REST API的操作接口,開箱即用

存儲單位:1KB=1024B 1MB=1024KB 1GB=1024MB 1TB=1024GB 1PB=1024TB 1EB=1024PB 1ZB=1024EB 1YB=1024ZB

概念:

面向文檔型的數據庫,一條數據在這裏就是一個文檔
1.索引(分類)
索引是具有相似特性的文檔集合,例如,可以爲客戶數據提供索引,爲產品目錄建立另一個索引,以及爲訂單數據建立另一個索引。索引由名稱(必須爲小寫)標識,該名稱用於在對其中的文檔執行索引、搜索、更新和刪除操作時引用索引你。在單個集羣中,您可以定義儘可能多的索引
2.文檔(每個文檔都有一個類型和對應的ID)
Elasticsearch文檔是一個 存儲在索引中的SON文檔。每個文檔都有一個類型和對應的ID,這是唯一的
3.字段
文檔內的一個基本單位,鍵值對形式(book_name:”learning elk”)
4.類型(是索引下的一個個邏輯分類)
類型是index下的一個邏輯分類。比如weather這個index裏,可以按照城市分組,也可以按照氣候類型分組,這種分組就叫類型
5.映射(每個字段對應的數據類型)
映射用於映射文檔的每個field及其對應的數據類型,例如字符串、整數、浮點數、雙精度數、日期等等
6.分片
單臺機器無法存儲大量數據,es可以將一個索引中的數據切分爲多個shard,分佈在多臺服務器上存儲。有了shard就可以橫向擴展,存儲更多數據,讓搜索和分析等操作分佈到多臺服務器上去執行,提升吞吐量和性能
在這裏插入圖片描述
7.分詞
把一段文本中的詞按照一定規則進行切分
8.主分片
主分片(primary shard)與複製分片(replica shard)複製分片通常駐留在一個不同的節點上,而不是主碎片,在故障轉移和負載平衡的情況下,可以滿足多個請求
9.集羣
集羣是存儲索引數據的節點集合,elasticsearch提供了水平的可伸縮性,用以存儲集羣中的數據,每個集羣都由一個集羣名稱來表示,不同的節點指明集羣名稱連接在一起
10節點
節點是一個單獨運行的elasticsearch實例,它屬於一個集羣。默認情況下,elasticsearch中的每個節點都加入名爲”elasticsearch”的集羣,每個節點都可以在elasticsearch中使用自己的elasticsearch.yml,它們可以對內存和資源分配有不同的設置

primary shard主分片 shard
replica shard複製分片

ES集羣節點分類

1、數據節點(Data Node)數據節點索引文檔並對索引文檔執行搜索。建議添加更多的數據節點,以提高性能或擴展集羣。通過在elasticsearch中設置這些屬性,可以是節點成爲一個數據節點。elasticsearch.yul配置node.master=false node.data=true
2、管理節點(一般節點不存儲數據,只管理)
主節點負責集羣管理,對於大型集羣,建議有三個專用的主節點,(一個主節點和兩個備份節點),它們只作爲主節點,不存儲索引或執行搜索。在elasticsearch配置聲明節點爲主節點:node.master=true node.data=false
3、路由節點亦稱負載均節點(只執行負載均衡或爲搜索請求路由)

容錯

容錯步驟1、從新選舉master,es自動選舉另一個node成爲master,承擔起master的責任
容錯步驟2、新的master將丟失的主分片

實驗步驟

mkdir -p /es/{data,log}     #創建es的數據和日誌文件

創建組

groupadd es 

創建用戶

useradd es -g es

給文件夾給予權限

chown -R es:es /es

解壓軟件包

tar -zxf elasticsearch-6.3.2.tar.gz 
mv elasticsearch-6.3.2 /usr/local/es
chown -R es:es /usr/local/es

更改hosts文件

vim /etc/hosts
192.168.43.3 es1
192.168.43.57 es2
192.168.43.254 es3
添加配置

soft軟限制,hard硬限制

echo '* soft nofile 819200' >> /etc/security/limits.conf    #文件描述服務(系統能同時打開多少文件)
echo '* hard nofile 819200' >> /etc/security/limits.conf     
echo '* soft nproc 2048' >> /etc/security/limits.conf   #用戶可用的進程數量
echo '* hard nproc 4096' >> /etc/security/limits.conf #當你切換用戶的時候,這個配置文件會自動加載(綁定用戶的)
echo 'vm.max_map_count=655360' >> /etc/sysctl.conf     #JVM能開啓最大的線程數

更新一下

sysctl -p
vim   /usr/local/es/config/elasticsearch.yml

17行 取消註釋 集羣的名字 kgc
23行 取消註釋 修改主機名,當前節點的名字es1
node.master:true //是否有資格參加主(master)節點選舉
node.data:true
35行 取消註釋 修改成/es/data
39行 取消註釋 修改成/es/log
57行 改成本機ip
61行 取消註釋就可以 //默認監聽端口
62行 transport.tcp.port: 9300 //主機節點互相通訊的端口 不變顏色別忘記加空格
71行 取消註釋 把host換成你三臺主機的ip地址加上通訊的端口
75行 取消註釋 修改成2 //選舉的條件,當有達到有兩人都符合選舉master
discovery.zen.ping_timeout: 120s //將ping時間修改爲120秒,防止腦裂
client.transport.ping_timeout: 60s //客戶端與es服務進行通訊的超時時間60秒
85行 取消註釋 //如果節點有三個就開始複製
gateway.recover_after_time: 5m //在集羣形成5分鐘之後開啓數據複製
gateway.recover_after_data_nodes: 2 //如果有兩個數據節點也開始複製,其他情況不願

假如你報錯了,找不到問題你可以先試着看一下
第一種:先查看一下兩個目錄的屬組是不是es,/es /usr/local/es
第二種:rm -rf /es/data/* /es/log/*

繼續實驗

(以上三臺都操作)其他兩臺23行和57行就可以了

tedian:必須用普通用戶啓動
su es

/usr/local/es/bin/elasticsearch  #切換用戶執行  三臺都啓動
curl -XGET http://192.168.43.57:9200/_cat/master  #查看集羣的老大(管理節點)
curl -XGET 'http://192.168.43.3:9200/_cluster/health?pretty'  #查看集羣的狀態,是不是greed
分詞器
mkdir /usr/local/es/plugins/ik
unzip elasticsearch-analysis-ik-6.3.2.zip -d /usr/local/es/plugins/ik/ &> /dev/null 
chown -R es:es /usr/local/es/   #這個命令必須打不然ik的屬組和屬主是root 

重新啓動es集羣

curl -XPUT http://192.168.43.254:9200/kgc   #創建索引

在這個索引下添加一個映射(必須要等集羣形成):

curl -XPOST http://192.168.43.254:9200/kgc/fulltext/_mapping -H 'Content-Type: application/json' -d'
{
    "properties": {
        "content": {
             "type": "text",
             "analyzer": "ik_max_word",
             "search_analyzer": "ik_max_word"
             }
       }
 }'
{"acknowledged":true}  //成功就是這樣的

添加記錄:

curl  -XPOST  "http://192.168.43.254:9200/kgc/fulltext/1"  -H 'Content-Type: application/json' -d '{"conten":"卡路里呀,卡路里"}'
curl  -XPOST  "http://192.168.43.254:9200/kgc/fulltext/_search" -H 'Content-Type:  application/json' -d 
'{
	"query" : {"match": {"content": "卡里裏"}},
	"highlight" : {
		"pre_tags" : ["<tag1>","<tag2>"],
		"post_tags"  : ["</tag1>","</tag2>"],
		"fields": {
			"content" : {}
		}
	}
}'

2、head插件----->圖形界面的集羣操作和管理工具
node.js
解壓軟件

tar -zxf node-v10.6.0-linux-x64.tar.gz 
mv node-v10.6.0-linux-x64 /usr/local/node

添加配置文件

vim /etc/profile
export NODE_HOME=/usr/local/node
export PATH=$NODE_HOME/bin:$JAVA_HOME/bin:$JRE_HOME/bin:$PATH
source /etc/profile
[root@localhost ~]# node -v
v10.6.0
[root@localhost ~]# npm -v
6.1.0
unzip elasticsearch-head-master.zip
mv elasticsearch-head-master /usr/local/es-head
cd /usr/local/es-head/
npm install -g grunt --registry=https://registry.npm.taobao.org   #安裝grunt
npm install -g cnpm --registry=https://registry.npm.taobao.org  #對es-head代碼進行編譯,先安裝cnpm
cpnm install
vim Gruntfile.js

添加大概在92行:
‘0.0.0.0’,
在這裏插入圖片描述

vim /usr/local/es/config/elasticsearch.yml

在最後面添加: 開啓es的跨域訪問

http.cors.enabled: true
http.cors.allow-origin: "*"

當一個資源從與該服務器本身所在的服務器不同的域、協議或端口請求一個資源時,資源會發起一個http跨域請求

ES常用命令

1、查看所有可查看項

curl  http://192.168.43.3:9200/_cat
=^.^=
/_cat/allocation
/_cat/shards
/_cat/shards/{index}
/_cat/master
/_cat/nodes
/_cat/tasks
/_cat/indices
/_cat/indices/{index}
/_cat/segments
/_cat/segments/{index}
/_cat/count
/_cat/count/{index}
/_cat/recovery
/_cat/recovery/{index}
/_cat/health
/_cat/pending_tasks
/_cat/aliases
/_cat/aliases/{alias}
/_cat/thread_pool
/_cat/thread_pool/{thread_pools}
/_cat/plugins
/_cat/fielddata
/_cat/fielddata/{fields}
/_cat/nodeattrs
/_cat/repositories
/_cat/snapshots/{repository}
/_cat/templates

2、顯示詳細信息:?v

curl  http://192.168.43.3:9200/_cat/master?v

3、輸出可顯示的列:?help

[root@es1 ~]# curl  http://192.168.43.3:9200/_cat/master?help
id   |   | node id    
host | h | host name  
ip   |   | ip address 
node | n | node name  

4、指定輸出的列:?h
curl http://192.168.43.3:9200/_cat/master?h=ip,node
5、查看所有索引有哪一些:

curl  http://192.168.43.3:9200/_cat/indinces?v

6、創建索引

curl -XPUT  http://192.168.43.3:9200/kgc/test?pretty

7、關閉索引(但是索引還存在)

curl -XPOST  http://192.168.43.3:9200/kgctest/_close?pretty

8、開啓索引

curl -XPOST  http://192.168.43.3:9200/kgctest/_open?pretty

9、刪除索引

curl -XDELETE  http://192.168.43.3:9200/kgctest?pretty

10、插入數據

curl -XPUT  http://192.168.43.3:9200/kgctest/fulltext/1?pretty -H 'Content-Type: application/json' -d 
'{
	"name":  "tiechui"
}'
{
	"_index" : "kgctest",
	""
}

11、取出fulltext類型的id爲1的

curl -XPUT  'http://192.168.43.3:9200/kgctest/fulltext/1?pretty'

12、更新文檔(更新數據)

curl -XSTOP  'http://192.168.43.3:9200/kgctest/fulltext/1/_update?pretty' -H 'Content-Type:application/json' -d '{

}'

13、刪除文檔

curl -XDELETE  'http://192.168.43.3:9200/kgctest/fulltext/1?pretty'

14、查詢所有記錄

curl -XSTOP  'http://192.168.43.3:9200/kgctest/fulltext/_search?pretty' -H 'Content-Type:application/json' -d '{
	"query" : {"match_all":{}}
}'
{
	
}

15、flush和refresh(強制刷新數據到磁盤)
區別:

refresh 只是單純的刷新到磁盤裏
flush不僅單純的刷新到磁盤裏,而且(translog)數據的日誌也給刪除了
四種組合配置方式

(1)node.master: true node.data: true
這種組合表示這個節點即有成爲主節點的資格,又存儲數據。
如果某個節點被選舉成爲了真正的主節點,那麼他還要存儲數據,這樣對於這個節點的壓力就比較大了。ElasticSearch默認每個節點都是這樣的配置,在測試環境下這樣做沒問題。實際工作中建議不要這樣設置,因爲這樣相當於主節點和數據節點的角色混合到一塊了。
(2)node.master: false node.data: true
這種組合表示這個節點沒有成爲主節點的資格,也就不參與選舉,只會存儲數據。
這個節點我們稱爲data(數據)節點。在集羣中需要單獨設置幾個這樣的節點負責存儲數據,後期提供存儲和查詢服務。
(3)node.master: true node.data: false
這種組合表示這個節點不會存儲數據,有成爲主節點的資格,可以參與選舉,有可能成爲真正的主節點,這個節點我們稱爲master節點。
(4)node.master: false node.data: false
這種組合表示這個節點即不會成爲主節點,也不會存儲數據,這個節點的意義是作爲一個client(客戶端)節點,主要是針對海量請求的時候可以進行負載均衡。
四、其他小知識點
1、默認情況下,每個節點都有成爲主節點的資格,也會存儲數據,還會處理客戶端的請求。
2、在一個生產集羣中我們可以對這些節點的職責進行劃分。建議集羣中設置3臺以上的節點作爲master節點【node.master: true node.data: false】,這些節點只負責成爲主節點,維護整個集羣的狀態。
3、再根據數據量設置一批data節點【node.master: false node.data: true】,這些節點只負責存儲數據,後期提供建立索引和查詢索引的服務,這樣的話如果用戶請求比較頻繁,這些節點的壓力也會比較大。
4、在集羣中建議再設置一批client節點【node.master: false node.data: true】,這些節點只負責處理用戶請求,實現請求轉發,負載均衡等功能。
5、master節點:普通服務器即可(CPU 內存 消耗一般)。
data節點:主要消耗磁盤,內存。
client節點:普通服務器即可(如果要進行分組聚合操作的話,建議這個節點內存也分配多一點)。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章