1. 程式人生 > 實用技巧 >EBLK之1---Elasticsearch叢集

EBLK之1---Elasticsearch叢集

ELK之1---Elasticsearch叢集

目錄

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應用場景

  1. 搜尋: 電商,百科,app搜尋,搜尋結果⾼亮顯示

  2. 日誌分析和資料探勘,資料展示

Elasticsearch特點

  1. 高效能,天然分散式叢集
  2. 對運維友好,不需要會java語言,開箱即用,配置檔案精簡
  3. 功能豐富,社群活躍,版本更新特別的快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
  • 關閉:selinuxfirewalldNetworkManagerpostfix(非必須)

  • 修改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部署

Elasticsearch官網下載

elastic中文社群下載中心

  1. 下載
mkdir -p /data/soft && cd /data/soft
wget https://artifacts.elastic.co/downloads/elasticsearch/elasticsearch-7.9.1-x86_64.rpm
  1. 安裝jdk
對於Elasticsearch7.0之後的版本不需要再獨⽴的安裝JDK了,軟體包裡已經自帶了最新的JDK,所以直接啟動即可。
  1. 安裝
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
  1. 啟動並加入開機自啟
systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service
  1. 驗證:檢視埠,頁面,日誌
netstat -tupln | grep 9200
curl 127.0.0.1:9200
tail -f /var/log/elasticsearch/elasticsearch.log

第3章 Elasticsearch自定義配置

  1. 檢視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啟動檔案
  1. 自定義配置檔案
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
  1. 重啟服務
systemctl restart elasticsearch.service
  1. 解決記憶體鎖定失敗

重啟後,檢視日誌,發現提示記憶體鎖定失敗

[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外掛安裝

  1. elasticsearch-head 介紹

elasticsearch-head是⼀款用來管理Elasticsearch叢集的第三方外掛⼯具。

elasticsearch-Head外掛在5.0版本之前可以直接以外掛的形式直接安裝,但是5.0以後安裝方式發⽣了改變,需要nodejs環境⽀持,或者直接使用別⼈封裝好的docker映象,更推薦的是谷歌瀏覽器的外掛。

  1. elasticsearch-head的三種安裝方式

    1. npm安裝方式
    2. docker安裝
    3. google瀏覽器外掛(推薦)
  2. 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 &
  1. es-head谷歌瀏覽器外掛安裝

更多工具 --> 擴充套件程式 --> 開發者模式 --> 選擇解壓縮後的外掛目錄

第5章 kibana部署

  1. 安裝kibana
wget https://artifacts.elastic.co/downloads/kibana/kibana-7.9.1-x86_64.rpm
rpm -ivh kibana-7.9.1-x86_64.rpm
  1. 配置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
  1. 啟動kibana
systemctl enable kibana
systemctl start kibana
  1. 驗證訪問http://10.0.0.51:5601/

  1. 清除其他資料庫

  1. 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",
}
  1. 使用自定義ID
PUT linux/_doc/1
{
 "name": "zhang",
 "age": "29"
}
  1. 使用隨機ID
POST linux/_doc/
{
 "name": "zhang",
 "age": "29",
 "address": "BJ"
}
  1. 保證和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查詢命令

  1. 建立測試語句
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"
}
  1. 簡單查詢
GET linux/_search/
  1. 條件查詢
GET linux/_search
{
  "query": {
    "term": {
      "name": {
        "value": "zhang3"
      }
    }
  }
}
GET linux/_search
{
  "query": {
    "term": {
      "job": {
        "value": "ops"
      }
    }
  }
}
  1. 多條件查詢
GET /linux/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "address": "BJ"
          }
        },
        {
          "match": {
            "job": "dev"
          }
        }
      ],
      "filter": {
        "range": {
          "age": {
            "gte": 27,
            "lte": 30
          }
        }
      }
    }
  }
}

第8章 Elasticsearch更新命令

  1. 自定義的ID更新
PUT linux/info/1
{
 "name": "zhang",
 "age": 30,
 "job": "it",
 "id": 1
}
  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叢集概念介紹

  1. Elasticsearch叢集特點

對運維友好:不需要太多java的知識也可以很方便的維護整個叢集。
搭建方便:搭建副本⾮常簡單,只需要將新節點加⼊已有叢集即可,會自動同步資料。
自動故障轉移:當節點出現故障時,會自動故障轉移,將有資料複製到其他正常的節點。

  1. 資料分片

主分片: 實際儲存的資料,負責讀寫,粗框的是主分片
副本分片: 主分片的副本,提供讀,同步主分片,細框的是副本分片

  1. 副本

主分⽚的備份,副本數量可以自定義

  1. 預設分⽚和副本規則

7.x版本之前預設規則:1副本,5分⽚
7.x版本之後預設規則:1副本,1分⽚

  1. 節點型別

主節點:負責排程資料分配到哪個節點
資料節點:實際負責處理資料的節點
預設:主節點也是⼯作節點

  1. 叢集健康狀態

綠色:所有資料都完整,且副本數滿⾜
黃色:所有資料都完整,但是副本數不滿⾜
紅色:⼀個或多個索引資料不完整

第10章 Elasticsearch叢集部署

  1. 部署叢集前注意

如果以前有單節點的資料,最好備份出來,然後再清空叢集資料。

  1. 新節點安裝java

7.x版本之後不需要單獨的安裝JDK,軟體包自帶了JDK

  1. 新節點安裝Elasticsearch
rpm -ivh elasticsearch-7.9.1-x86_64.rpm
  1. 配置記憶體鎖定
systemctl edit elasticsearch
[Service]
LimitMEMLOCK=infinity
systemctl daemon-reload
systemctl restart elasticsearch.service
  1. 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
  1. 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"]      # 叢集初始化節點,只有建立叢集的第⼀次有用,叢集建立後引數失效。
  1. 以前單節點有資料,先停⽌運⾏,然後清空資料,再啟動
systemctl stop elasticsearch.service
rm -rf /var/lib/elasticsearch/*
systemctl start elasticsearch
  1. 檢視日誌
tail -f /var/log/elasticsearch/oldboy_linux.log
  1. 檢查叢集:ES-head檢視是否有2個節點

  1. 叢集注意事項
    1. 插⼊和讀取資料在任意節點都可以執⾏,效果⼀樣
    2. es-head可以連線叢集內任⼀臺服務
    3. 主節點負責讀寫
      如果主分⽚所在的節點壞掉了,副本分⽚會升為主分⽚
    4. 主節點負責排程
      如果主節點壞掉了,資料節點會自動升為主節點
    5. 預設會有2個通訊端⼝:9200和9300
      但9300並沒有在配置檔案裡配置過
      如果開啟了防⽕牆並且沒有放開9300端⼝,那麼叢集通訊就會失敗

第11章 Elasticsearch叢集擴容

  1. 安裝java

  2. 安裝ES

  3. 配置記憶體鎖定

  4. 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
  1. 新增節點注意

    • 對於新新增的節點來說:
      只需要直到叢集內任意⼀個節點的IP和他自己本身的IP即可
      discovery.seed_hosts: ["10.0.0.51","10.0.0.53"]
    • 對於以前的節點來說:
      什麼都不需要更改
  2. 資料分⽚顏⾊解釋

    • 紫⾊: 正在遷移
    • ⻩⾊: 正在複製
    • 綠⾊: 正常
  3. 叢集故障轉移實驗

1.停掉主節點,觀察叢集是否正常
2.停掉主節點,是否還會選舉出新的主節點
3.停掉主節點,資料分片的分佈會不會發生變化,分片狀態會不會發生變化
4.停掉主節點,然後在持續的寫入資料,等節點恢復之後,會如何處理落後的資料
5.3個節點的Elasticsearch叢集,極限情況下最多允許壞幾臺? 
6.主節點故障,叢集健康狀態發生什麼變化?

結論:

1.如果主節點壞掉了,會從活著的資料節點中選出一臺新的主節點
2.如果主分片壞掉了,副本分片會升級為主分片
3.如果副本數不滿足,會嘗試在其他的節點上重新複製一份資料
4.修復上線只需要正常啟動故障的節點即會自動加入到叢集裡,並且自動同步資料
5.7.x版本之前允許單個節點的叢集運⾏。
  7.x版本之後則必須至少2個節點存活叢集才能正常工作

第12章 Elasticsearch叢集維護

  1. 自定義副本數和索引數引數注意事項

索引⼀旦建⽴完成,分⽚數就不可以修改了,但是副本數可以隨時修改

  1. 建立索引的時候就自定義副本和分⽚
PUT /linux2/
{
  "settings": {
    "number_of_shards": 3,
    "number_of_replicas": 0
  }
}
  1. 修改單個索引的副本數
PUT /linux2/_settings/
{
  "settings": {
    "number_of_replicas": 2
  }
}
  1. 修改所有的索引的副本數
PUT /_all/_settings/
{
  "settings": {
    "number_of_replicas": 0
  }
}
  1. ⼯作如何設定

2個節點: 預設就可以

3個節點: 重要的資料,2副本 不重要的預設

日誌收集: 1副本3分⽚

第13章 ES監控

  1. 監控注意

1.不能只監控叢集狀態
2.監控節點數
3.監控叢集狀態
4.兩者任意⼀個發⽣改變了都報警

  1. 監控命令
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
  1. kibana開啟監控

點選kibana⾯板的監控按鈕

  1. kibana關閉監控
GET /_cluster/settings
PUT /_cluster/settings
{
  "persistent": {
    "xpack": {
      "monitoring": {
        "collection": {
          "enabled": "false"
        }
      }
    }
  }
}

第14章 中文分詞器

未配置中文分詞

  1. 插⼊測試資料
POST /news/_doc/1
{"content":"美國留給伊拉克的是個爛攤⼦嗎"}

POST /news/_doc/2
{"content":"公安部:各地校⻋將享最⾼路權"}

POST /news/_doc/3
{"content":"中韓漁警衝突調查:韓警平均每天扣1艘中國漁船"}

POST /news/_doc/4
{"content":"中國駐洛杉磯領事館遭亞裔男⼦槍擊 嫌犯已自⾸"}
  1. 查詢測試
POST /news/_search
{
  "query": { "match": { "content": "中國" }},
  "highlight": {
    "pre_tags": ["<tag1>", "<tag2>"],
    "post_tags": ["</tag1>", "</tag2>"],
    "fields": {
      "content": {}
    }
  }
}
  1. 結論

未配置中文分詞器時,查詢中文會將詞拆分成⼀個⼀個的漢字。

配置中文分詞

  1. 前提條件
所有的ES節點都需要安裝
所有的ES都需要重啟才能⽣效
中文分詞器的版本號要和ES版本號對應
https://github.com/medcl/elasticsearch-analysis-ik
  1. 配置中文分詞器
  • 線上安裝
/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
  1. 重啟所有ES節點生效
systemctl restart elasticsearch.service
  1. 建立索引
PUT /news2
  1. 建立模板,指定:search_analyzer
POST /news2/_doc/_mapping?include_type_name=true
{
  "properties": {
    "content": {
      "type": "text",
      "analyzer": "ik_max_word",
      "search_analyzer": "ik_smart"
    }
  }
}
  1. 插⼊測試資料
POST /news2/_doc/1
{"content":"美國留給伊拉克的是個爛攤⼦嗎"}

POST /news2/_doc/2
{"content":"公安部:各地校⻋將享最⾼路權"}

POST /news2/_doc/3
{"content":"中韓漁警衝突調查:韓警平均每天扣1艘中國漁船"}

POST /news2/_doc/4
{"content":"中國駐洛杉磯領事館遭亞裔男⼦槍擊 嫌犯已自⾸"}
  1. 再次查詢資料發現已經能識別中文了
POST /news2/_search
{
  "query" : { "match" : { "content" : "中國" }},
  "highlight" : {
    "pre_tags" : ["<tag1>", "<tag2>"],
    "post_tags" : ["</tag1>", "</tag2>"],
    "fields" : {
      "content" : {}
    }
  }
}

根據字典拆,沒有就拆到最小,因此需要更新中文分詞庫。

ll /etc/elasticsearch/analysis-ik/main.dic

熱更新中文分詞庫

  1. 安裝nginx
yum install nginx -y
  1. 編寫字典檔案
cat >>/usr/share/nginx/html/my_dic.txt<<EOF
北京
張亞
武漢
中國
深圳
EOF
  1. 啟動並測試
nginx -t
systemctl start nginx
curl 127.0.0.1/my_dic.txt
  1. 配置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
  1. 將修改好的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/
  1. 重啟所有的ES節點
systemctl restart elasticsearch.service
  1. 檢視日誌裡字典的詞有沒有加載出來
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.
  1. 更新字典內容,看日誌裡會不會自動載入
echo "老男孩教育" >> /usr/share/nginx/html/my_dic.txt
  1. 搜尋測試驗證結果
POST /news2/_doc/7
{
 "content":"學Linux來老男孩教育"

POST /news2/_search
{
  "query" : { "match" : { "content" : "老男孩教育" }},
  "highlight" : {
    "pre_tags" : ["<tag1>", "<tag2>"],
    "post_tags" : ["</tag1>", "</tag2>"],
    "fields" : {
      "content" : {}
    }
  }
}
  1. 電商上架新產品流程
    1. 先把新上架的商品的關鍵詞更新到詞典裡
    2. 檢視ES日誌,確認新詞被動態更新了
    3. 自己編寫⼀個測試索引,插⼊測試資料,然後檢視搜尋結果
    4. 確認沒有問題之後,在讓開發插⼊新商品的資料
    5. 測試

第15章 備份恢復

使用官方的快照snap功能備份恢復

  1. 前提條件

官方文件

如果是Elasticsearch叢集想使用快照功能,則儲存快照的目錄必須是共享儲存,並且所有節點都需要掛載這個目錄。

  1. 配置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
  1. 所有節點建立目錄,並授權
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
  1. 所有節點修改Elasticsearch配置檔案,新增引數
cat <<EOF >>/etc/elasticsearch/elasticsearch.yml
path.repo: ["/data/backup"]
EOF
  1. 重啟ES生效
systemctl restart elasticsearch
  1. 註冊快照儲存庫
PUT /_snapshot/my_fs_backup
{
  "type": "fs",
  "settings": {
    "location": "/data/backup/my_fs_backup_location",
    "compress": true
  }
}
  1. 檢視所有快照
GET /_snapshot/my_fs_backup
  1. 建立快照:全備
PUT /_snapshot/my_fs_backup/snapshot_1?wait_for_completion=true
  1. 建立指定索引的快照
PUT /_snapshot/my_fs_backup/snapshot_2?wait_for_completion=true
{
  "indices": "news1,news2",
  "ignore_unavailable": true,
  "include_global_state": false
}
  1. 查詢快照資訊
GET /_snapshot/my_fs_backup/snapshot_1
GET /_snapshot/my_fs_backup/snapshot_2
  1. 檢視正在執行的快照
GET /_snapshot/my_fs_backup/_current
  1. 刪除快照
DELETE /_snapshot/my_fs_backup/snapshot_2
  1. 刪除儲存庫
DELETE /_snapshot/my_fs_backup
  1. 全部還原
POST /_snapshot/my_fs_backup/snapshot_1/_restore
  1. 還原部分:包括全域性宣告和同名重新命名
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"
}
  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"
  ]
}
  1. 以日期命名快照
PUT /_snapshot/my_fs_backup/%3Csnapshot-%7Bnow%2Fd%7D%3E
GET /_snapshot/my_fs_backup/_all

使用第三方工具elasticdump備份恢復

elasticdump Github

  1. 依賴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
  1. 指定使用國內淘寶npm源
npm install -g cnpm --registry=https://registry.npm.taobao.org
  1. 安裝es-dump
cnpm install elasticdump -g
  1. 備份成可讀的json格式
elasticdump \
  --input=http://10.0.0.51:9200/news2 \
  --output=/data/news2.json \
  --type=data
  1. 備份成壓縮格式
elasticdump \
  --input=http://10.0.0.51:9200/news2 \
  --output=$|gzip > /data/news2.json.gz 
  1. 備份分詞器/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
  1. 只恢復資料
elasticdump \
  --input=/data/news2.json \
  --output=http://10.0.0.51:9200/news2
  1. 恢復所有資料包含分詞器/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
  1. 批量備份
curl -s 10.0.0.52:9200/_cat/indices|awk '{print $3}'|grep -v "^\."
  1. 注意

    • 如果恢復的時候資料衝突了,會被覆蓋掉
    • 如果已經存在備份檔案裡沒有的資料,會保留下來
  2. 帶密碼認證的匯出

--input=http://name:[email protected]:9200/my_index

第16章 安全認證

官方文件

  1. node-1生成證書和金鑰
/usr/share/elasticsearch/bin/elasticsearch-certutil ca
/usr/share/elasticsearch/bin/elasticsearch-certutil cert --ca elastic-stack-ca.p12

密碼可以不填,全部回車即可。

  1. 所有節點建立證書目錄
mkdir /etc/elasticsearch/certs
  1. 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/
  1. 所有節點證書修改許可權
chown -R elasticsearch:elasticsearch /etc/elasticsearch/certs/
  1. 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
  1. 所有節點重啟ES生效
systemctl restart elasticsearch
  1. 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]
  1. kibana配置密碼認證
cat <<EOF >>/etc/kibana/kibana.yml
elasticsearch.username: "kibana_system"
elasticsearch.password: "elastic"
EOF
  1. 重啟kibana生效
systemctl restart kibana
  1. 訪問elasticsearch-head測試:管理員 elastic

  1. 訪問kibana測試:管理員 elastic

  1. 注意事項
    1. 一定要先配置證書認證,再配置密碼,不然就會報錯。
    2. 預設建立的證書是root只讀許可權,需要設定為elasticsearch只讀許可權。
    3. 配置賬號密碼命令只需要在master節點配置即可。
    4. 配置賬號密碼命令只能執行一次,再次執行就會報錯。
    5. 初始化的賬號密碼僅僅是作為元件之間傳輸資訊使用,並不是給使用者使用的。
    6. 給使用者分配許可權:需要在kibana裡以elastic使用者登入,建立新使用者和新角色。

第17章 ES優化

  1. 記憶體:
    1. 系統建議預留一半
    2. 每個ES節點不要超過32G
    3. 關閉swap分割槽
    4. 配置檔案開啟記憶體鎖定引數
  2. 升級SSD硬碟
  3. 升級大版本
  4. 加機器:官方參考文件