EBLK之1---Elasticsearch叢集
ELK之1---Elasticsearch叢集
目錄- ELK之1---Elasticsearch叢集
- EB/LK
- 第1章 Elasticsearch介紹
- 第2章 Elasticsearch部署
- 第3章 Elasticsearch自定義配置
- 第4章 Elasticsearch外掛安裝
- 第5章 kibana部署
- 第6章 Elasticsearch插⼊資料
- 第7章 Elasticsearch查詢命令
- 第8章 Elasticsearch更新命令
- 第9章 Elasticsearch叢集概念介紹
- 第10章 Elasticsearch叢集部署
- 第11章 Elasticsearch叢集擴容
- 第12章 Elasticsearch叢集維護
- 第13章 ES監控
- 第14章 中文分詞器
- 第15章 備份恢復
- 第16章 安全認證
- 第17章 ES優化
EB/LK
- EB/LK架構
- 阿里云云盾面板
- ELK面板
第1章 Elasticsearch介紹
Lucene
Lucene是一個高效能的java搜尋引擎庫,操作非常繁瑣,需要具備Java開發經驗。
Elasticsearch是基於Lucene之上包裝一層外殼,遮蔽了Lucene的複雜操作,即使不會java語 ⾔也可以快速上⼿。
索引
索引就好⽐書的目錄,如果我們想快速檢視某個章節,只需要找到目錄裡相應章節對應的頁數即
可。
通過目錄找到章節,通過章節找到頁碼這個過程就是索引的過程。
索引的目的就是加快資料搜尋的效率。
全文檢索
先建⽴索引,再對索引進⾏搜尋的過程就叫全文檢索(Full-text Search)。
倒排索引
索引是根據章節找到頁數,但是如果我並不知道我要找的內容屬於哪個章節,⽐如我只知道⼀個 關鍵詞,但是不知道這個關鍵詞屬於哪個章節。⼤家可以想⼀下,我們平時利用搜索引擎搜尋的 時候是不是也是這種場景呢? ⽐如我們想知道⼀個電影的名字,但是記不起來具體的名字,只知道部分關鍵詞或者劇情的內 容,那這種情景背後如何用技術解決呢? 這時候就不得不提到倒排索引了。 那麼什麼是倒排索引呢?還是拿書的目錄舉例⼦: 正常索引: 第1章 Elasticsearch介紹 第10頁 第2章 Elasticsearch安裝配置 第15頁 第3章 Elasticsearch自定義配置 第20頁 倒排索引: 關鍵詞 章節 Elasticsearch 第1章 第2章 第3章 安裝 第2章 配置 第2章 第3章 自定義 第3章
假設資料裡裡有以下新聞標題:
1.老男孩教育 1
2.老男孩教育linux學院 1 1
3.老男孩教育python學院 1 1
4.老男孩教育DBA學院 1 1
5.老男孩教育oldzhang 1 2
6.老男孩教育安全 1
Elasticsearch 內部分詞,倒排索引,評分:
老男孩 1 2 3 4 5 6
教育 1 2 3 4 5 6
linux 2
python 3
DBA 4
oldzhang 5
學院 2 3 4
安全 6
使用者輸入:
老男孩 學院 oldzhang
分詞:
老男孩
DBA
打分:
老男孩
DBA
返回給使用者:
4.老男孩教育DBA學院 1 1
Elasticsearch應用場景
-
搜尋: 電商,百科,app搜尋,搜尋結果⾼亮顯示
-
日誌分析和資料探勘,資料展示
Elasticsearch特點
- 高效能,天然分散式叢集
- 對運維友好,不需要會java語言,開箱即用,配置檔案精簡
- 功能豐富,社群活躍,版本更新特別的快2.6 -- 8.0
Elasticsearch在電商搜尋的實現
cat
skuid name
1 狗糧100kg
2 貓糧50kg
3 貓罐頭200g
select * from cat where name 1ike '%狗糧%'
Elasticsearch:
聚合運算之後得到SKUID:
1
2
拿到ID之後,mysq1就只需要簡單地where查詢即可
mysq1:
select xx from xxx where skuid = 1
第2章 Elasticsearch部署
環境準備
主機名 | IP | 配置 |
---|---|---|
node-1 | 10.0.0.51 | 1C4G |
node-2 | 10.0.0.52 | 1C2G |
node-3 | 10.0.0.53 | 1C2G |
-
關閉:
selinux
,firewalld
和NetworkManager
,postfix
(非必須) -
修改IP地址、主機名
hostnamectl set-hostname node-1
sed -i 's/200/51/g' /etc/sysconfig/network-scripts/ifcfg-eth[01]
- 關閉SWAP分割槽
swapoff -a
sed -i '11d' /etc/fstab
Elasticsearch部署
- 下載
mkdir -p /data/soft && cd /data/soft
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.1-x86_64.rpm
- 安裝jdk
對於Elasticsearch7.0之後的版本不需要再獨⽴的安裝JDK了,軟體包裡已經自帶了最新的JDK,所以直接啟動即可。
- 安裝
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
- 啟動並加入開機自啟
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
- 驗證:檢視埠,頁面,日誌
netstat -tupln | grep 9200
curl 127.0.0.1:9200
tail -f /var/log/elasticsearch/elasticsearch.log
第3章 Elasticsearch自定義配置
- 檢視ES配置檔案
[root@node-1 ~]# rpm -qc elasticsearch
/etc/elasticsearch/elasticsearch.yml # 主配置檔案
/etc/elasticsearch/jvm.options # JVM配置檔案
/etc/init.d/elasticsearch # init啟動指令碼
/etc/sysconfig/elasticsearch # 環境變數檔案
/usr/lib/sysctl.d/elasticsearch.conf # 核心引數檔案
/usr/lib/systemd/system/elasticsearch.service # systemd啟動檔案
- 自定義配置檔案
cp /etc/elasticsearch/elasticsearch.yml /opt/
cat > /etc/elasticsearch/elasticsearch.yml << 'EOF'
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.51
http.port: 9200
discovery.seed_hosts: ["10.0.0.51"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF
bootstrap.memory_lock: true # 記憶體鎖,最大堆記憶體=最小堆記憶體,啟動時鎖定記憶體 # /etc/elasticsearch/jvm.options -Xms1g -Xmx1g
- 重啟服務
systemctl restart elasticsearch.service
- 解決記憶體鎖定失敗
重啟後,檢視日誌,發現提示記憶體鎖定失敗
[root@node-1 ~]# tail -f /var/log/elasticsearch/elasticsearch.log
[2020-12-17T19:34:38,132][ERROR][o.e.b.Bootstrap ] [node-1]
node validation exception
[1] bootstrap checks failed
[1]: memory locking requested for elasticsearch process but memory is
not locked
官⽹解決方案,解決:
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
systemctl daemon-reload
systemctl restart elasticsearch.service
第4章 Elasticsearch外掛安裝
- elasticsearch-head 介紹
elasticsearch-head是⼀款用來管理Elasticsearch叢集的第三方外掛⼯具。
elasticsearch-Head外掛在5.0版本之前可以直接以外掛的形式直接安裝,但是5.0以後安裝方式發⽣了改變,需要nodejs環境⽀持,或者直接使用別⼈封裝好的docker映象,更推薦的是谷歌瀏覽器的外掛。
-
elasticsearch-head的三種安裝方式
- npm安裝方式
- docker安裝
- google瀏覽器外掛(推薦)
-
elasticsearch-head編譯安裝
使用docker部署elasticsearch-head
docker pull alivv/elasticsearch-head
docker run --name es-head -p 9100:9100 -dit elivv/elasticsearch-head
使用nodejs編譯安裝elasticsearch-head
cd /opt/
wget https://nodejs.org/dist/v12.13.0/node-v12.13.0-linux-x64.tar.xz
tar xf node-v12.13.0-linux-x64.tar.xz
mv node-v12.13.0-linux-x64 node
echo 'export PATH=$PATH:/opt/node/bin' >> /etc/profile
source /etc/profile
npm -v
node -v
git clone git://github.com/mobz/elasticsearch-head.git
unzip elasticsearch-head-master.zip
cd elasticsearch-head-master
npm install -g cnpm --registry=https://registry.npm.taobao.org
cnpm install
cnpm run start &
- es-head谷歌瀏覽器外掛安裝
更多工具 --> 擴充套件程式 --> 開發者模式 --> 選擇解壓縮後的外掛目錄
第5章 kibana部署
- 安裝kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.1-x86_64.rpm
rpm -ivh kibana-7.9.1-x86_64.rpm
- 配置kibana
cat <<EOF >> /etc/kibana/kibana.yml
server.port: 5601
server.host: "10.0.0.51"
elasticsearch.hosts: ["http://10.0.0.51:9200"]
kibana.index: ".kibana"
EOF
- 啟動kibana
systemctl enable kibana
systemctl start kibana
- 清除其他資料庫
- API操作
curl -XPUT 'http://10.0.0.51:9200/linux/_doc/1' -H 'Content-Type: application/json' -d '
{
"name": "zhang",
"age": "29"
}'
貼上API操作格式轉變:
第6章 Elasticsearch插⼊資料
Relational DB | Elasticsearch |
---|---|
database | Indices |
Tables | Types |
rows | Documents |
columns | Fields |
POST Indices/Types/
{
"Fields": "Documents",
}
- 使用自定義ID
PUT linux/_doc/1
{
"name": "zhang",
"age": "29"
}
- 使用隨機ID
POST linux/_doc/
{
"name": "zhang",
"age": "29",
"address": "BJ"
}
- 保證和mysql資料對應:使用POST隨機ID,指定單獨一列ID欄位
mysql
id name age address job
1 zhang 27 BJ it
2 ya 22 SZ it
POST linux/_doc/
{
"id": "1",
"name": "zhang",
"age": "29",
"address": "BJ",
"job": "it"
}
POST linux/_doc/
{
"id": "2",
"name": "ya",
"age": "22",
"address": "SZ",
"job": "it"
}
第7章 Elasticsearch查詢命令
- 建立測試語句
POST linux/_doc/
{
"name": "zhang3",
"age": "22",
"address": "SZ",
"job": "ops"
}
POST linux/_doc/
{
"name": "li4",
"age": "30",
"address": "BJ",
"job": "dev"
}
POST linux/_doc/
{
"name": "wang5",
"age": "24",
"address": "BJ",
"job": "dev"
}
POST linux/_doc/
{
"name": "zhao6",
"age": "35",
"address": "SZ",
"job": "devops"
}
POST linux/_doc/
{
"name": "sun7",
"age": "21",
"address": "BJ",
"job": "ops"
}
POST linux/_doc/
{
"name": "jack",
"age": "27",
"address": "BJ",
"job": "devops"
}
POST linux/_doc/
{
"name": "scott",
"age": "25",
"address": "SZ",
"job": "dev"
}
- 簡單查詢
GET linux/_search/
- 條件查詢
GET linux/_search
{
"query": {
"term": {
"name": {
"value": "zhang3"
}
}
}
}
GET linux/_search
{
"query": {
"term": {
"job": {
"value": "ops"
}
}
}
}
- 多條件查詢
GET /linux/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"address": "BJ"
}
},
{
"match": {
"job": "dev"
}
}
],
"filter": {
"range": {
"age": {
"gte": 27,
"lte": 30
}
}
}
}
}
}
第8章 Elasticsearch更新命令
- 自定義的ID更新
PUT linux/info/1
{
"name": "zhang",
"age": 30,
"job": "it",
"id": 1
}
- 隨機ID更新
建立測試資料
PUT linux/_doc/1
{
"name": "zhang",
"age": "30",
"job": "it",
"id": 2
}
先根據自定義的Id欄位查出資料的隨機ID
GET linux/_search/
{
"query": {
"term": {
"id": {
"value": "2"
}
}
}
}
取到隨機ID後更改資料
PUT linux/_doc/CVDdknIBq3aq7mPQaoWw
{
"name": "tony",
"age": 30,
"job": "it",
"id": 2
}
刪除:DELETE linux/_doc/Iz0UqHYBKb3_fEmINvjQ
建議先關閉,等一段時間後,備份,最後刪除
第9章 Elasticsearch叢集概念介紹
- Elasticsearch叢集特點
對運維友好:不需要太多java的知識也可以很方便的維護整個叢集。
搭建方便:搭建副本⾮常簡單,只需要將新節點加⼊已有叢集即可,會自動同步資料。
自動故障轉移:當節點出現故障時,會自動故障轉移,將有資料複製到其他正常的節點。
- 資料分片
主分片: 實際儲存的資料,負責讀寫,粗框的是主分片
副本分片: 主分片的副本,提供讀,同步主分片,細框的是副本分片
- 副本
主分⽚的備份,副本數量可以自定義
- 預設分⽚和副本規則
7.x版本之前預設規則:1副本,5分⽚
7.x版本之後預設規則:1副本,1分⽚
- 節點型別
主節點:負責排程資料分配到哪個節點
資料節點:實際負責處理資料的節點
預設:主節點也是⼯作節點
- 叢集健康狀態
綠色:所有資料都完整,且副本數滿⾜
黃色:所有資料都完整,但是副本數不滿⾜
紅色:⼀個或多個索引資料不完整
第10章 Elasticsearch叢集部署
- 部署叢集前注意
如果以前有單節點的資料,最好備份出來,然後再清空叢集資料。
- 新節點安裝java
7.x版本之後不需要單獨的安裝JDK,軟體包自帶了JDK
- 新節點安裝Elasticsearch
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
- 配置記憶體鎖定
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
systemctl daemon-reload
systemctl restart elasticsearch.service
- node1配置檔案
cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: oldboy_linux
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.51
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF
- node2配置檔案
cat> /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: oldboy_linux
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.52
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.52"]
cluster.initial_master_nodes: ["10.0.0.51"]
EOF
cluster.name: oldboy_linux # 叢集名稱 node.name: node-1 # 節點名稱 path.data: /var/lib/elasticsearch # 資料目錄 path.logs: /var/log/elasticsearch # 日誌目錄 bootstrap.memory_lock: true # 設定記憶體鎖定 network.host: 127.0.0.1,10.0.0.51 # 本地監聽地址 http.port: 9200 # 本地端⼝ discovery.seed_hosts: ["10.0.0.51","10.0.0.52"] # 叢集節點互相發現的地址,不需要把所有節點IP都寫上。 cluster.initial_master_nodes: ["10.0.0.51"] # 叢集初始化節點,只有建立叢集的第⼀次有用,叢集建立後引數失效。
- 以前單節點有資料,先停⽌運⾏,然後清空資料,再啟動
systemctl stop elasticsearch.service
rm -rf /var/lib/elasticsearch/*
systemctl start elasticsearch
- 檢視日誌
tail -f /var/log/elasticsearch/oldboy_linux.log
- 檢查叢集:ES-head檢視是否有2個節點
- 叢集注意事項
- 插⼊和讀取資料在任意節點都可以執⾏,效果⼀樣
- es-head可以連線叢集內任⼀臺服務
- 主節點負責讀寫
如果主分⽚所在的節點壞掉了,副本分⽚會升為主分⽚ - 主節點負責排程
如果主節點壞掉了,資料節點會自動升為主節點 - 預設會有2個通訊端⼝:9200和9300
但9300並沒有在配置檔案裡配置過
如果開啟了防⽕牆並且沒有放開9300端⼝,那麼叢集通訊就會失敗
第11章 Elasticsearch叢集擴容
-
安裝java
-
安裝ES
-
配置記憶體鎖定
-
node3叢集配置檔案
cat> /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: oldboy_linux
node.name: node-3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 127.0.0.1,10.0.0.53
http.port: 9200
discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
EOF
-
新增節點注意
- 對於新新增的節點來說:
只需要直到叢集內任意⼀個節點的IP和他自己本身的IP即可
discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
- 對於以前的節點來說:
什麼都不需要更改
- 對於新新增的節點來說:
-
資料分⽚顏⾊解釋
- 紫⾊: 正在遷移
- ⻩⾊: 正在複製
- 綠⾊: 正常
-
叢集故障轉移實驗
1.停掉主節點,觀察叢集是否正常
2.停掉主節點,是否還會選舉出新的主節點
3.停掉主節點,資料分片的分佈會不會發生變化,分片狀態會不會發生變化
4.停掉主節點,然後在持續的寫入資料,等節點恢復之後,會如何處理落後的資料
5.3個節點的Elasticsearch叢集,極限情況下最多允許壞幾臺?
6.主節點故障,叢集健康狀態發生什麼變化?
結論:
1.如果主節點壞掉了,會從活著的資料節點中選出一臺新的主節點
2.如果主分片壞掉了,副本分片會升級為主分片
3.如果副本數不滿足,會嘗試在其他的節點上重新複製一份資料
4.修復上線只需要正常啟動故障的節點即會自動加入到叢集裡,並且自動同步資料
5.7.x版本之前允許單個節點的叢集運⾏。
7.x版本之後則必須至少2個節點存活叢集才能正常工作
第12章 Elasticsearch叢集維護
- 自定義副本數和索引數引數注意事項
索引⼀旦建⽴完成,分⽚數就不可以修改了,但是副本數可以隨時修改
- 建立索引的時候就自定義副本和分⽚
PUT /linux2/
{
"settings": {
"number_of_shards": 3,
"number_of_replicas": 0
}
}
- 修改單個索引的副本數
PUT /linux2/_settings/
{
"settings": {
"number_of_replicas": 2
}
}
- 修改所有的索引的副本數
PUT /_all/_settings/
{
"settings": {
"number_of_replicas": 0
}
}
- ⼯作如何設定
2個節點: 預設就可以
3個節點: 重要的資料,2副本 不重要的預設
日誌收集: 1副本3分⽚
第13章 ES監控
- 監控注意
1.不能只監控叢集狀態
2.監控節點數
3.監控叢集狀態
4.兩者任意⼀個發⽣改變了都報警
- 監控命令
GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards
GET _cat/shards/linux
# zabbix監控:叢集健康狀態 OR 節點個數
# 檢視叢集健康狀態
curl -s 127.0.0.1:9200/_cat/health|grep "green"|wc -l
# 檢視節點個數
curl -s 127.0.0.1:9200/_cat/nodes|wc -l
- kibana開啟監控
點選kibana⾯板的監控按鈕
- kibana關閉監控
GET /_cluster/settings
PUT /_cluster/settings
{
"persistent": {
"xpack": {
"monitoring": {
"collection": {
"enabled": "false"
}
}
}
}
}
第14章 中文分詞器
未配置中文分詞
- 插⼊測試資料
POST /news/_doc/1
{"content":"美國留給伊拉克的是個爛攤⼦嗎"}
POST /news/_doc/2
{"content":"公安部:各地校⻋將享最⾼路權"}
POST /news/_doc/3
{"content":"中韓漁警衝突調查:韓警平均每天扣1艘中國漁船"}
POST /news/_doc/4
{"content":"中國駐洛杉磯領事館遭亞裔男⼦槍擊 嫌犯已自⾸"}
- 查詢測試
POST /news/_search
{
"query": { "match": { "content": "中國" }},
"highlight": {
"pre_tags": ["<tag1>", "<tag2>"],
"post_tags": ["</tag1>", "</tag2>"],
"fields": {
"content": {}
}
}
}
- 結論
未配置中文分詞器時,查詢中文會將詞拆分成⼀個⼀個的漢字。
配置中文分詞
- 前提條件
所有的ES節點都需要安裝
所有的ES都需要重啟才能⽣效
中文分詞器的版本號要和ES版本號對應
https://github.com/medcl/elasticsearch-analysis-ik
- 配置中文分詞器
- 線上安裝
/usr/share/elasticsearch/bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.9.1/elasticsearch-analysis-ik-7.9.1.zip
- 離線本地檔案安裝
/usr/share/elasticsearch/bin/elasticsearch-plugin install file:///opt/elasticsearch-analysis-ik-7.9.1.zip
- 重啟所有ES節點生效
systemctl restart elasticsearch.service
- 建立索引
PUT /news2
- 建立模板,指定:search_analyzer
POST /news2/_doc/_mapping?include_type_name=true
{
"properties": {
"content": {
"type": "text",
"analyzer": "ik_max_word",
"search_analyzer": "ik_smart"
}
}
}
- 插⼊測試資料
POST /news2/_doc/1
{"content":"美國留給伊拉克的是個爛攤⼦嗎"}
POST /news2/_doc/2
{"content":"公安部:各地校⻋將享最⾼路權"}
POST /news2/_doc/3
{"content":"中韓漁警衝突調查:韓警平均每天扣1艘中國漁船"}
POST /news2/_doc/4
{"content":"中國駐洛杉磯領事館遭亞裔男⼦槍擊 嫌犯已自⾸"}
- 再次查詢資料發現已經能識別中文了
POST /news2/_search
{
"query" : { "match" : { "content" : "中國" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
根據字典拆,沒有就拆到最小,因此需要更新中文分詞庫。
ll /etc/elasticsearch/analysis-ik/main.dic
熱更新中文分詞庫
- 安裝nginx
yum install nginx -y
- 編寫字典檔案
cat >>/usr/share/nginx/html/my_dic.txt<<EOF
北京
張亞
武漢
中國
深圳
EOF
- 啟動並測試
nginx -t
systemctl start nginx
curl 127.0.0.1/my_dic.txt
- 配置es啟用中文分詞器外掛
cat <<EOF >/etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE properties SYSTEM "http://java.sun.com/dtd/properties.dtd">
<properties>
<comment>IK Analyzer 擴充套件配置</comment>
<!--使用者可以在這裡配置自己的擴充套件字典 -->
<entry key="ext_dict"></entry>
<!--使用者可以在這裡配置自己的擴充套件停止詞字典-->
<entry key="ext_stopwords"></entry>
<!--使用者可以在這裡配置遠端擴充套件字典 -->
<entry key="remote_ext_dict">http://10.0.0.51/my_dic.txt</entry>
<!--使用者可以在這裡配置遠端擴充套件停止詞字典-->
<!-- <entry key="remote_ext_stopwords">words_location</entry> -->
</properties>
EOF
- 將修改好的IK配置檔案,複製到其他所有ES節點
scp -rp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 10.0.0.52:/etc/elasticsearch/analysis-ik/
scp -rp /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml 10.0.0.53:/etc/elasticsearch/analysis-ik/
- 重啟所有的ES節點
systemctl restart elasticsearch.service
- 檢視日誌裡字典的詞有沒有加載出來
tail -f /var/log/elasticsearch/oldboy_linux.log
[2020-12-18T10:27:08,126][INFO ][o.w.a.d.Dictionary ] [node-1]
start to reload ik dict.
[2020-12-18T10:27:08,127][INFO ][o.w.a.d.Dictionary ] [node-1] try
load config from /etc/elasticsearch/analysis-ik/IKAnalyzer.cfg.xml
[2020-12-18T10:27:08,538][INFO ][o.w.a.d.Dictionary ] [node-1]
[Dict Loading] http://10.0.0.51/my_dic.txt
[2020-12-18T10:27:08,540][INFO ][o.w.a.d.Dictionary ] [node-1] 北京
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 張亞
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 武漢
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 中國
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1] 深圳
[2020-12-18T10:27:08,541][INFO ][o.w.a.d.Dictionary ] [node-1]
reload ik dict finished.
- 更新字典內容,看日誌裡會不會自動載入
echo "老男孩教育" >> /usr/share/nginx/html/my_dic.txt
- 搜尋測試驗證結果
POST /news2/_doc/7
{
"content":"學Linux來老男孩教育"
POST /news2/_search
{
"query" : { "match" : { "content" : "老男孩教育" }},
"highlight" : {
"pre_tags" : ["<tag1>", "<tag2>"],
"post_tags" : ["</tag1>", "</tag2>"],
"fields" : {
"content" : {}
}
}
}
- 電商上架新產品流程
- 先把新上架的商品的關鍵詞更新到詞典裡
- 檢視ES日誌,確認新詞被動態更新了
- 自己編寫⼀個測試索引,插⼊測試資料,然後檢視搜尋結果
- 確認沒有問題之後,在讓開發插⼊新商品的資料
- 測試
第15章 備份恢復
使用官方的快照snap功能備份恢復
- 前提條件
如果是Elasticsearch叢集想使用快照功能,則儲存快照的目錄必須是共享儲存,並且所有節點都需要掛載這個目錄。
- 配置NFS服務端
yum install nfs-utils -y
cat > /etc/exports << 'EOF'
/data/backup 10.0.0.0/24(rw,sync,all_squash,anonuid=998,anongid=996)
EOF
mkdir /data/backup -p
systemctl start nfs
showmount -e 10.0.0.51
- 所有節點建立目錄,並授權
yum install nfs-utils -y
mkdir /data/backup -p
chown -R elasticsearch:elasticsearch /data/backup/
mount -t nfs 10.0.0.51:/data/backup /data/backup
df -h
- 所有節點修改Elasticsearch配置檔案,新增引數
cat <<EOF >>/etc/elasticsearch/elasticsearch.yml
path.repo: ["/data/backup"]
EOF
- 重啟ES生效
systemctl restart elasticsearch
- 註冊快照儲存庫
PUT /_snapshot/my_fs_backup
{
"type": "fs",
"settings": {
"location": "/data/backup/my_fs_backup_location",
"compress": true
}
}
- 檢視所有快照
GET /_snapshot/my_fs_backup
- 建立快照:全備
PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true
- 建立指定索引的快照
PUT /_snapshot/my_fs_backup/snapshot_2?wait_for_completion=true
{
"indices": "news1,news2",
"ignore_unavailable": true,
"include_global_state": false
}
- 查詢快照資訊
GET /_snapshot/my_fs_backup/snapshot_1
GET /_snapshot/my_fs_backup/snapshot_2
- 檢視正在執行的快照
GET /_snapshot/my_fs_backup/_current
- 刪除快照
DELETE /_snapshot/my_fs_backup/snapshot_2
- 刪除儲存庫
DELETE /_snapshot/my_fs_backup
- 全部還原
POST /_snapshot/my_fs_backup/snapshot_1/_restore
- 還原部分:包括全域性宣告和同名重新命名
POST /_snapshot/my_fs_backup/snapshot_1/_restore
{
"indices": "news1,news2",
"ignore_unavailable": true,
"include_global_state": true,
"rename_pattern": "news(.+)",
"rename_replacement": "restored_news_$1"
}
- 恢復的同時更改索引配置
POST /_snapshot/my_fs_backup/snapshot_1/_restore
{
"indices": "index_1",
"index_settings": {
"index.number_of_replicas": 0
},
"ignore_index_settings": [
"index.refresh_interval"
]
}
- 以日期命名快照
PUT /_snapshot/my_fs_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E
GET /_snapshot/my_fs_backup/_all
使用第三方工具elasticdump備份恢復
- 依賴node環境,安裝nodejs
wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz
tar xf node-v10.16.3-linux-x64.tar.xz -C /opt/
ln -s /opt/node-v10.16.3-linux-x64 /opt/node
echo 'export PATH=/opt/node/bin:$PATH' >> /etc/profile
. /etc/profile
npm -v
node -v
- 指定使用國內淘寶npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org
- 安裝es-dump
cnpm install elasticdump -g
- 備份成可讀的json格式
elasticdump \
--input=http://10.0.0.51:9200/news2 \
--output=/data/news2.json \
--type=data
- 備份成壓縮格式
elasticdump \
--input=http://10.0.0.51:9200/news2 \
--output=$|gzip > /data/news2.json.gz
- 備份分詞器/mapping/資料一條龍服務
elasticdump \
--input=http://10.0.0.51:9200/news2 \
--output=/data/news2_mapping.json \
--type=mapping
elasticdump \
--input=http://10.0.0.51:9200/news2 \
--output=/data/news2.json \
--type=data
- 只恢復資料
elasticdump \
--input=/data/news2.json \
--output=http://10.0.0.51:9200/news2
- 恢復所有資料包含分詞器/mapping一條龍服務
elasticdump \
--input=/data/news2_mapping.json \
--output=http://10.0.0.51:9200/news2 \
--type=mapping
elasticdump \
--input=/data/news2.json \
--output=http://10.0.0.51:9200/news2 \
--type=data
- 批量備份
curl -s 10.0.0.52:9200/_cat/indices|awk '{print $3}'|grep -v "^\."
-
注意
- 如果恢復的時候資料衝突了,會被覆蓋掉
- 如果已經存在備份檔案裡沒有的資料,會保留下來
-
帶密碼認證的匯出
--input=http://name:[email protected]:9200/my_index
第16章 安全認證
- node-1生成證書和金鑰
/usr/share/elasticsearch/bin/elasticsearch-certutil ca
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12
密碼可以不填,全部回車即可。
- 所有節點建立證書目錄
mkdir /etc/elasticsearch/certs
- node-1複製證書到合適的位置,並推送到叢集所有節點
cp /usr/share/elasticsearch/*.p12 /etc/elasticsearch/certs/
scp -r /etc/elasticsearch/certs 10.0.0.52:/etc/elasticsearch/
scp -r /etc/elasticsearch/certs 10.0.0.53:/etc/elasticsearch/
- 所有節點證書修改許可權
chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs/
- node-1修改ES配置檔案:開啟安全功能
cat <<EOF >>/etc/elasticsearch/elasticsearch.yml
xpack.security.enabled: true
xpack.security.transport.ssl.enabled: true
xpack.security.transport.ssl.verification_mode: certificate
xpack.security.transport.ssl.keystore.path: certs/elastic-stack-ca.p12
xpack.security.transport.ssl.truststore.path: certs/elastic-stack-ca.p12
EOF
- 所有節點重啟ES生效
systemctl restart elasticsearch
- node-1配置內建使用者(7個使用者)的密碼
/usr/share/elasticsearch/bin/elasticsearch-setup-passwords interactive
Initiating the setup of passwords for reserved users elastic,apm_system,kibana,kibana_system,logstash_system,beats_system,remote_monitoring_user. You will be prompted to enter passwords as the process progresses. Please confirm that you would like to continue [y/N]y Enter password for [elastic]: Reenter password for [elastic]: Enter password for [apm_system]: Reenter password for [apm_system]: Enter password for [kibana_system]: Reenter password for [kibana_system]: Enter password for [logstash_system]: Reenter password for [logstash_system]: Enter password for [beats_system]: Reenter password for [beats_system]: Enter password for [remote_monitoring_user]: Reenter password for [remote_monitoring_user]: Changed password for user [apm_system] Changed password for user [kibana_system] Changed password for user [kibana] Changed password for user [logstash_system] Changed password for user [beats_system] Changed password for user [remote_monitoring_user] Changed password for user [elastic]
- kibana配置密碼認證
cat <<EOF >>/etc/kibana/kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "elastic"
EOF
- 重啟kibana生效
systemctl restart kibana
- 訪問elasticsearch-head測試:管理員 elastic
- 訪問kibana測試:管理員 elastic
- 注意事項
1. 一定要先配置證書認證,再配置密碼,不然就會報錯。
2. 預設建立的證書是root只讀許可權,需要設定為elasticsearch只讀許可權。
3. 配置賬號密碼命令只需要在master節點配置即可。
4. 配置賬號密碼命令只能執行一次,再次執行就會報錯。
5. 初始化的賬號密碼僅僅是作為元件之間傳輸資訊使用,並不是給使用者使用的。
6. 給使用者分配許可權:需要在kibana裡以elastic使用者登入,建立新使用者和新角色。
第17章 ES優化
- 記憶體:
- 系統建議預留一半
- 每個ES節點不要超過32G
- 關閉swap分割槽
- 配置檔案開啟記憶體鎖定引數
- 升級SSD硬碟
- 升級大版本
- 加機器:官方參考文件