Elasticsearch集群、Kibana配置及常用REST指令

第一部分 集群配置

1 準備環境

首先準備3臺機器,例如預裝CentOS 7.6,可以分別修改下hostname,如下:

hostnamectl set-hostname es1
hostnamectl set-hostname es2
hostnamectl set-hostname es3

接下來配置互相免密訪問,先去es1:

ssh-keygen

一路下來,就產生了~/.ssh/id_rsa.pub文件,將里面的內容復制到新建的authorized_keys文件里。

cd ~/.ssh
touch authorized_keys

然后將es2和es3的key也都復制到authorized_keys文件里,再將authorized_keys復制到es2/es3對應的位置,這樣3臺機器就可以互相免密訪問了。
接下來安裝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官網下載的jdk下載、解壓、并配置環境。

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臺機器一樣操作。

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,主要參考官網,只說重要的:

vim elasticsearch-7.8.1/config/elasticsearch.yml

首先是集群名和節點名,最好各個機器自己改下,別用默認的,不費事:

cluster.name: logging-prod
node.name: prod-data-1
node.name: prod-data-2
node.name: prod-data-3

生產環境,最好自己選個主節點:

node.master: true

接下來是主機地址,集群配置必須改這個,3個集群各改各的,端口可以不改,ip是示例:

network.host: 192.168.1.11
network.host: 192.168.1.12
network.host: 192.168.1.13

為了集群節點互相發現,接下來的配置比較重要(如果不配置,只能在本地同一臺機器上互相發現),可以是ip地址,也可以是主機名,端口默認是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"]

接下來是集群初始化配置,官方說,用來引導集群,用來確定第一次選舉的候選主節點。在開發模式,如果不配置,該步驟會由節點自動完成,但是不安全。生產模式,第一次最好顯式列出候選主節點,后續重啟或者增加新節點的時候,這個配置就不起作用了。

cluster.initial_master_nodes: 
   - prod-data-1
   - prod-data-2
   - prod-data-3

第一次運行配置一下這個,不然老報warning。
還可以配置jvm內存占用最大最小值:

vim jvm.options
-Xms1g
-Xmx1g

3 啟動ES

直接運行會報錯,說無法用root用戶啟動,所以新建用戶和組:

groupadd es
useradd es -g esgroup
passwd es

cd /usr/local
chown -R es:esgroup  elasticsearch-7.8.1

su es 
./elasticsearch

啟動后仍然報錯:

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]

這時候就切換回root,編輯如下:

vim /etc/sysctl.conf

添加vm.max_map_count=655360,再執行:

sysctl -p

還有:

vim /etc/security/limits.conf

在最后添加如下:

*       hard    nofile  65536
*       soft    nofile  65536
# End of file

切換回es的用戶,重新啟動ES。其它兩臺機器也都需要進行這樣的配置。再運行,發現還是報錯,說找不到其它節點,這時候應該是防火墻的問題,把3個機器的防火墻都關掉。

systemctl stop firewalld
systemctl disable firewalld

終于不報錯了,可以去瀏覽器看節點了。

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!現在可以更改下ES的運行方式,以守護進程運行,會在ES目錄建立一個pid文件:

elasticsearch -d -p pid
pkill -F pid

如果想做成系統服務,也可以參考官網

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臺機器都這么改,然后3臺啟動,如果集群不啟動,修改密碼會失敗。但是啟動后,報這個錯:

javax.net.ssl.SSLHandshakeException: No available authentication scheme

需要配置節點間的SSL證書。

elasticsearch-certutil ca
Please enter the desired output file [elastic-stack-ca.p12]: # 默認
Enter password for elastic-stack-ca.p12 : # CA證書的密碼,直接回車

生成了一個elastic-stack-ca.p12文件,繼續:

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]: # 默認
Enter password for elastic-certificates.p12 : # 證書密碼,直接回車

elastic-stack-ca.p12復制到每個節點的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個節點都要這樣。如果之前的證書設置了密碼,就稍微復雜些,需要配置elasticsearch-keystore,這里略,ES Stack的產品都有類似的keystore,避免在配置文件中明文展示密碼。
可以啟動3個節點了,這時候訪問網頁會要求密碼。然后給6個內建用戶(官網說明)修改密碼,隨便哪個機器都行:

elasticsearch-setup-passwords interactive

也可以選擇auto來自動生成,保存好了,然后可以密碼訪問ES了。更多加密安全設置可以參考官網

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: "上一步自動生成的密碼"

然后后臺運行:

nohup ./bin/kibana --allow-root &

就可以訪問了。

http://192.168.1.11:5601

記住,由于ES設置了密碼,所以這里也需要輸入ES的密碼,不是Kibana的密碼。

6 ES重啟

參考官網,為避免集群不必要的IO操作,先關閉副本分配:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": "primaries"
  }
}

關閉索引:

POST _flush/synced

停止機器學習任務(可選),然后關閉所有節點。做完變更后,重啟節點。最后恢復allocation:

PUT _cluster/settings
{
  "persistent": {
    "cluster.routing.allocation.enable": null
  }
}

第二部分 REST指令

1 索引

創建索引

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"
            } 
          }
          
      }
  }
}

對于非text類型字段,默認開啟文檔值機制,可以通過doc_values關閉;對于text類型,可以開啟fielddata機制,但不推薦,太消耗資源。
如果想要使用Kibana的地圖,就必須有geo_point類型,用來做索引模式,有多種賦值方式,比如:"location": [151.12, -33.51]
_source用于關閉文檔原始值,只是用來節省空間,但不推薦關閉!
另外還有范圍類型、日期、scaled_float(適合貨幣)、多數據類型fields。
索引創建完后無法修改,只能通過_split_shrink_reindex接口創建新索引,并將之前的文檔存儲進來,不過副本數量可以隨時更改。

修改索引

PUT students/_mapping
{
  "properties": {
    "weight": {"type": "integer"}
  }
}

刷新索引

POST students/_refresh

開關索引

POST students/_close
POST students/_open

所有索引

GET _all/_search

_all代表所有索引,也可以不寫,不指明索引那就是全部索引。

2 文檔

創建、修改文檔

POST students/_doc
{
  "name": "Tom",
  "gender": "M",
  "age": 20
}
POST students/_doc/1?refresh=true

更新文檔,_version值會自動增加,這是內部版本號,帶上這個版本號,就啟用了樂觀鎖機制。可通過version_type設置使用外部版本號。

PUT students/_doc/1?version=1

如果使用_create接口,就只能創建,無法更新:

POST students/_doc/1/_create
POST students/_create/1

PUT會修改整個文檔,而不是部分參數字段,除非使用_update接口,不過只能單個字段。如果希望不存在時創建,就帶上一個參數。

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"}}] }
  }
}

如果發生版本沖突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."
}

查看節點

GET _nodes

集群設置

GET _cluster/settings
PUT _cluster/settings
{
    "persistent": {
        "action.auto_create_index": "false"
    }
}

可以用來關閉自動創建索引(直接添加文檔)。

運行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]

基于請求體,匹配查詢:

POST students/_search
{
    "from": 10,
    "size": 50,
    "query": {
        "term": {
            "name": "tom"
        }
    }
}
POST students/_search
{
    "query": {
        "match": {
            "tags": "tom jerry"
        }
    }
}

注意termkeywords不會分詞,須完全匹配,而matchtext是可以分詞的。此外還有termsterms_setmulti_matchmatch_phrasequery_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
            }
        }
    }
}

還有糾錯提示查詢等。

分頁排序

分頁還有scrollsearch after等。
排序可以字段排序,也可以數組排序。

POST students/_search
{
    "sort" [
        "age",
        {"name": "desc"},
        {"my_list": {
            "order": "desc",
            "mode": "max"
        }}
    ]
}

分析器

可以在創建的時候指定分析器,直接使用內置分析器,參考創建索引的小結,一個是編入索引的分析器standard,一個是檢索文檔時的分析器simple
也可以在檢索的時候指定覆蓋之,略。
提取詞項:

POST students/_termvectors/1
{
    "fields": ["intro", "name"]
}
POST students/_termvectors
{
    "doc": {
        "intro": "This is my sample doc"
    }
}

還可以創建自定義分析器,略。中文分析器用ik_smartik_max_word,后者比較貪。

其它

聚集、分桶、特殊數據類型、SQL等查詢略。


參考:《Elastic Stack應用寶典》這本書不錯。
elasticsearch權限驗證(Auth+Transport SSL)

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 230,247評論 6 543
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 99,520評論 3 429
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 178,362評論 0 383
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,805評論 1 317
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 72,541評論 6 412
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 55,896評論 1 328
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,887評論 3 447
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 43,062評論 0 290
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 49,608評論 1 336
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 41,356評論 3 358
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 43,555評論 1 374
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 39,077評論 5 364
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,769評論 3 349
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 35,175評論 0 28
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 36,489評論 1 295
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 52,289評論 3 400
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 48,516評論 2 379