第一部分 集群配置
1 準(zhǔn)備環(huán)境
首先準(zhǔn)備3臺(tái)機(jī)器买置,例如預(yù)裝CentOS 7.6
粪糙,可以分別修改下hostname
,如下:
hostnamectl set-hostname es1
hostnamectl set-hostname es2
hostnamectl set-hostname es3
接下來配置互相免密訪問忿项,先去es1:
ssh-keygen
一路下來蓉冈,就產(chǎn)生了~/.ssh/id_rsa.pub
文件,將里面的內(nèi)容復(fù)制到新建的authorized_keys
文件里轩触。
cd ~/.ssh
touch authorized_keys
然后將es2和es3的key也都復(fù)制到authorized_keys
文件里寞酿,再將authorized_keys
復(fù)制到es2/es3對(duì)應(yīng)的位置,這樣3臺(tái)機(jī)器就可以互相免密訪問了脱柱。
接下來安裝jdk11伐弹,注意新的es都要求起碼是jdk11了。先把自帶的jdk刪掉榨为。
rpm -qa|grep jdk
rpm -e --nodeps java-1.8.0-openjdk-headless-1.8.0.181-7.b13.el7.x86_64
rpm -e --nodeps ......
然后將從oracle官網(wǎng)下載的jdk下載惨好、解壓、并配置環(huán)境随闺。
cd /usr/local
wget .../jdk-11.0.8_linux-x64_bin.tar.gz
tar -zxvf jdk-11.0.8_linux-x64_bin.tar.gz
vim ~/.bashrc
export JAVA_HOME=/usr/local/jdk-11.0.8
export ES_HOME=/usr/local/elasticsearch-7.8.1
export PATH=$PATH:$JAVA_HOME/bin:$ES_HOME/bin
source ~/.bashrc
3臺(tái)機(jī)器一樣操作日川。
2 配置ES集群
下載并解壓es安裝包:
cd /usr/local
wget .../elasticsearch-7.8.1-linux-x86_64.tar.gz
tar -zxvf elasticsearch-7.8.1-linux-x86_64.tar.gz
配置es,主要參考官網(wǎng)矩乐,只說重要的:
vim elasticsearch-7.8.1/config/elasticsearch.yml
首先是集群名和節(jié)點(diǎn)名龄句,最好各個(gè)機(jī)器自己改下,別用默認(rèn)的,不費(fèi)事:
cluster.name: logging-prod
node.name: prod-data-1
node.name: prod-data-2
node.name: prod-data-3
生產(chǎn)環(huán)境撒璧,最好自己選個(gè)主節(jié)點(diǎn):
node.master: true
接下來是主機(jī)地址透葛,集群配置必須改這個(gè),3個(gè)集群各改各的卿樱,端口可以不改,ip是示例:
network.host: 192.168.1.11
network.host: 192.168.1.12
network.host: 192.168.1.13
為了集群節(jié)點(diǎn)互相發(fā)現(xiàn)硫椰,接下來的配置比較重要(如果不配置繁调,只能在本地同一臺(tái)機(jī)器上互相發(fā)現(xiàn)),可以是ip地址靶草,也可以是主機(jī)名蹄胰,端口默認(rèn)是9300,可以省略奕翔。
discovery.seed_hosts:
- 192.168.1.11:9300
- 192.168.1.12:9300
- 192.168.1.13:9300
也可以寫成這種形式:
discovery.seed_hosts: ["192.168.1.11", "192.168.1.12", "192.168.1.13"]
接下來是集群初始化配置裕寨,官方說,用來引導(dǎo)集群派继,用來確定第一次選舉的候選主節(jié)點(diǎn)宾袜。在開發(fā)模式,如果不配置驾窟,該步驟會(huì)由節(jié)點(diǎn)自動(dòng)完成庆猫,但是不安全。生產(chǎn)模式绅络,第一次最好顯式列出候選主節(jié)點(diǎn)月培,后續(xù)重啟或者增加新節(jié)點(diǎn)的時(shí)候,這個(gè)配置就不起作用了恩急。
cluster.initial_master_nodes:
- prod-data-1
- prod-data-2
- prod-data-3
第一次運(yùn)行配置一下這個(gè)杉畜,不然老報(bào)warning。
還可以配置jvm內(nèi)存占用最大最小值:
vim jvm.options
-Xms1g
-Xmx1g
3 啟動(dòng)ES
直接運(yùn)行會(huì)報(bào)錯(cuò)衷恭,說無法用root用戶啟動(dòng)此叠,所以新建用戶和組:
groupadd es
useradd es -g esgroup
passwd es
cd /usr/local
chown -R es:esgroup elasticsearch-7.8.1
su es
./elasticsearch
啟動(dòng)后仍然報(bào)錯(cuò):
ERROR: [2] bootstrap checks failed
[1]: max file descriptors [4096] for elasticsearch process is too low, increase to at least [65535]
[2]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
這時(shí)候就切換回root,編輯如下:
vim /etc/sysctl.conf
添加vm.max_map_count=655360
匾荆,再執(zhí)行:
sysctl -p
還有:
vim /etc/security/limits.conf
在最后添加如下:
* hard nofile 65536
* soft nofile 65536
# End of file
切換回es的用戶拌蜘,重新啟動(dòng)ES。其它兩臺(tái)機(jī)器也都需要進(jìn)行這樣的配置牙丽。再運(yùn)行简卧,發(fā)現(xiàn)還是報(bào)錯(cuò),說找不到其它節(jié)點(diǎn)烤芦,這時(shí)候應(yīng)該是防火墻的問題举娩,把3個(gè)機(jī)器的防火墻都關(guān)掉。
systemctl stop firewalld
systemctl disable firewalld
終于不報(bào)錯(cuò)了,可以去瀏覽器看節(jié)點(diǎn)了铜涉。
http://192.168.1.11:9200/_cat/nodes?v
192.168.1.12 9 97 0 0.00 0.02 0.05 dilmrt - node-2
192.168.1.13 19 97 2 0.14 0.12 0.08 dilmrt - node-3
192.168.1.11 20 50 0 0.00 0.02 0.05 dilmrt * node-1
一切OK智玻!現(xiàn)在可以更改下ES的運(yùn)行方式,以守護(hù)進(jìn)程運(yùn)行芙代,會(huì)在ES目錄建立一個(gè)pid文件:
elasticsearch -d -p pid
pkill -F pid
如果想做成系統(tǒng)服務(wù)吊奢,也可以參考官網(wǎng)。
4 安全配置
首先kibana, ES都停掉纹烹,編輯elasticsearch.yml
页滚,開啟security:
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
也可以使用echo "xpack.security.transport.ssl.enabled: true" >> elasticsearch.yml
命令來。3臺(tái)機(jī)器都這么改铺呵,然后3臺(tái)啟動(dòng)裹驰,如果集群不啟動(dòng),修改密碼會(huì)失敗片挂。但是啟動(dòng)后幻林,報(bào)這個(gè)錯(cuò):
javax.net.ssl.SSLHandshakeException: No available authentication scheme
需要配置節(jié)點(diǎn)間的SSL證書。
elasticsearch-certutil ca
Please enter the desired output file [elastic-stack-ca.p12]: # 默認(rèn)
Enter password for elastic-stack-ca.p12 : # CA證書的密碼音念,直接回車
生成了一個(gè)elastic-stack-ca.p12
文件沪饺,繼續(xù):
elasticsearch-certutil cert --ca elastic-stack-ca.p12
Enter password for CA (elastic-stack-ca.p12) : # CA證書的密碼,直接回車
Please enter the desired output file [elastic-certificates.p12]: # 默認(rèn)
Enter password for elastic-certificates.p12 : # 證書密碼症昏,直接回車
把elastic-stack-ca.p12
復(fù)制到每個(gè)節(jié)點(diǎn)的config目錄随闽,然后編輯ES配置:
vim elasticsearch.yml
再添加一些:
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: elastic-certificates.p12
xpack.security.transport.ssl.truststore.path: elastic-certificates.p12
3個(gè)節(jié)點(diǎn)都要這樣。如果之前的證書設(shè)置了密碼肝谭,就稍微復(fù)雜些掘宪,需要配置elasticsearch-keystore
,這里略攘烛,ES Stack的產(chǎn)品都有類似的keystore魏滚,避免在配置文件中明文展示密碼。
可以啟動(dòng)3個(gè)節(jié)點(diǎn)了坟漱,這時(shí)候訪問網(wǎng)頁會(huì)要求密碼鼠次。然后給6個(gè)內(nèi)建用戶(官網(wǎng)說明)修改密碼,隨便哪個(gè)機(jī)器都行:
elasticsearch-setup-passwords interactive
也可以選擇auto來自動(dòng)生成芋齿,保存好了腥寇,然后可以密碼訪問ES了。更多加密安全設(shè)置可以參考官網(wǎng)觅捆。
5 Kibana
直接解壓安裝赦役,編輯配置vim kibana.yml
:
server.host: "0.0.0.0"
server.name: "my-kibana"
elasticsearch.hosts: ["http://192.168.1.11:9200"]
kibana.index: ".kibana"
elasticsearch.username: "kibana_system"
elasticsearch.password: "上一步自動(dòng)生成的密碼"
然后后臺(tái)運(yùn)行:
nohup ./bin/kibana --allow-root &
就可以訪問了。
http://192.168.1.11:5601
記住栅炒,由于ES設(shè)置了密碼掂摔,所以這里也需要輸入ES的密碼术羔,不是Kibana的密碼。
6 ES重啟
參考官網(wǎng)乙漓,為避免集群不必要的IO操作级历,先關(guān)閉副本分配:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": "primaries"
}
}
關(guān)閉索引:
POST _flush/synced
停止機(jī)器學(xué)習(xí)任務(wù)(可選),然后關(guān)閉所有節(jié)點(diǎn)叭披。做完變更后寥殖,重啟節(jié)點(diǎn)。最后恢復(fù)allocation:
PUT _cluster/settings
{
"persistent": {
"cluster.routing.allocation.enable": null
}
}
第二部分 REST指令
1 索引
創(chuàng)建索引
PUT students
{
"mappings": {
"properties": {
"name": {"type": "text", "fielddata": true},
"gender": {"type": "keyword"},
"age": {"type": "integer", "doc_values": false},
"location": {"type": "geo_point"},
"intro": {
"type": "text",
"analyzer": "standard",
"search_analyzer": "simple"
}
}
"_source": {
"enabled": false
}
}
"settings": {
"number_of_shards": 10,
"number_of_replicas": 2
}
"aliases": {
"girls": {
"filter": {
"term": {
"gender": "F"
}
}
}
}
}
對(duì)于非text類型字段涩蜘,默認(rèn)開啟文檔值機(jī)制扛禽,可以通過doc_values
關(guān)閉;對(duì)于text類型皱坛,可以開啟fielddata
機(jī)制,但不推薦豆巨,太消耗資源剩辟。
如果想要使用Kibana
的地圖,就必須有geo_point
類型往扔,用來做索引模式贩猎,有多種賦值方式,比如:"location": [151.12, -33.51]
萍膛。
_source
用于關(guān)閉文檔原始值吭服,只是用來節(jié)省空間,但不推薦關(guān)閉蝗罗!
另外還有范圍類型艇棕、日期、scaled_float
(適合貨幣)串塑、多數(shù)據(jù)類型fields沼琉。
索引創(chuàng)建完后無法修改,只能通過_split
桩匪、_shrink
打瘪、_reindex
接口創(chuàng)建新索引,并將之前的文檔存儲(chǔ)進(jìn)來傻昙,不過副本數(shù)量可以隨時(shí)更改闺骚。
修改索引
PUT students/_mapping
{
"properties": {
"weight": {"type": "integer"}
}
}
刷新索引
POST students/_refresh
開關(guān)索引
POST students/_close
POST students/_open
所有索引
GET _all/_search
_all
代表所有索引,也可以不寫妆档,不指明索引那就是全部索引僻爽。
2 文檔
創(chuàng)建、修改文檔
POST students/_doc
{
"name": "Tom",
"gender": "M",
"age": 20
}
POST students/_doc/1?refresh=true
更新文檔过吻,_version
值會(huì)自動(dòng)增加进泼,這是內(nèi)部版本號(hào)蔗衡,帶上這個(gè)版本號(hào),就啟用了樂觀鎖機(jī)制乳绕〗实耄可通過version_type
設(shè)置使用外部版本號(hào)。
PUT students/_doc/1?version=1
如果使用_create
接口洋措,就只能創(chuàng)建济蝉,無法更新:
POST students/_doc/1/_create
POST students/_create/1
PUT
會(huì)修改整個(gè)文檔,而不是部分參數(shù)字段菠发,除非使用_update
接口王滤,不過只能單個(gè)字段。如果希望不存在時(shí)創(chuàng)建滓鸠,就帶上一個(gè)參數(shù)雁乡。
POST students/_update/1
{
"doc": {
"age": 25
},
"doc_as_upsert": true
}
查看文檔
GET students/_doc/1
GET students/_doc/1?_source=false
GET students/_source/1
刪除文檔
DELETE students/_doc/1
POST students/_delete_by_query
{
"query": {
"match": {
"name": "Tom"
}
}
}
# 或者
{
"query": {
"bool": {"must_not": [{"exists": {"field": "name"}}] }
}
}
如果發(fā)生版本沖突version_conflict_engine_exception
,就加上如下:
POST students/_delete_by_query?conflicts=proceed&wait_for_completion=false
3 其它
文本分析
GET _analyze
{
"analyzer": "standard",
"text": "This is a sample text to be analyzed."
}
查看節(jié)點(diǎn)
GET _nodes
集群設(shè)置
GET _cluster/settings
PUT _cluster/settings
{
"persistent": {
"action.auto_create_index": "false"
}
}
可以用來關(guān)閉自動(dòng)創(chuàng)建索引(直接添加文檔)糜俗。
運(yùn)行Painless腳本
POST _scripts/painless/_execute
4 檢索
查找
使用查詢字符串傳遞DSL踱稍。
GET students/_search?q=name:tom jerry
GET students/_search?q=name:(tom jerry) AND smith
GET students/_search?q=name:tom~2
GET students/_search?q=age:[1 TO 10]
基于請(qǐng)求體,匹配查詢:
POST students/_search
{
"from": 10,
"size": 50,
"query": {
"term": {
"name": "tom"
}
}
}
POST students/_search
{
"query": {
"match": {
"tags": "tom jerry"
}
}
}
注意term
悠抹、keywords
不會(huì)分詞珠月,須完全匹配,而match
楔敌、text
是可以分詞的啤挎。此外還有terms
、terms_set
卵凑、multi_match
庆聘、match_phrase
、query_string
等氛谜,不贅述掏觉。
范圍查詢:
POST students/_search
{
"query": {
"range": {
"age": {
"gte": 10,
"lte": 20
}
}
}
}
存在性查詢:
POST students/_search
{
"query": {
"exists": {
"field": "name"
}
}
}
模糊查詢:
POST students/_search
{
"query": {
"fuzzy": {
"name": {
"value": "tim",
"fuzziness": 1
}
}
}
}
還有糾錯(cuò)提示查詢等。
分頁排序
分頁還有scroll
值漫,search after
等澳腹。
排序可以字段排序,也可以數(shù)組排序杨何。
POST students/_search
{
"sort" [
"age",
{"name": "desc"},
{"my_list": {
"order": "desc",
"mode": "max"
}}
]
}
分析器
可以在創(chuàng)建的時(shí)候指定分析器酱塔,直接使用內(nèi)置分析器,參考創(chuàng)建索引的小結(jié)危虱,一個(gè)是編入索引的分析器standard
羊娃,一個(gè)是檢索文檔時(shí)的分析器simple
。
也可以在檢索的時(shí)候指定覆蓋之埃跷,略蕊玷。
提取詞項(xiàng):
POST students/_termvectors/1
{
"fields": ["intro", "name"]
}
POST students/_termvectors
{
"doc": {
"intro": "This is my sample doc"
}
}
還可以創(chuàng)建自定義分析器邮利,略。中文分析器用ik_smart
垃帅、ik_max_word
延届,后者比較貪。
其它
聚集贸诚、分桶方庭、特殊數(shù)據(jù)類型、SQL等查詢略酱固。
參考:《Elastic Stack應(yīng)用寶典》這本書不錯(cuò)械念。
elasticsearch權(quán)限驗(yàn)證(Auth+Transport SSL)