elastic search數據庫集羣部署

ES數據庫安裝

elastica search
elasticsearch的概念:
是一個實時的分佈式搜索和分析引擎,它可以用於全文搜索,結構化搜索以及分析。它是一個建立在全文搜索引擎 Apache Lucene 基礎上的搜索引擎,使用 Java 語言編寫。

1、elasticsearch和MongoDB/redis/memcache一樣,是非關係性數據庫
是一個接近實時的搜索平臺,從所索引這個文檔到能夠被搜索到只有一個輕微的延遲,企業應用定位:採用restfullapi標準的可擴展和高可用的實時數據分析的全文搜索工具
2、可擴展:支持一主多從且擴容容易,只要cluster.nam一致且在同一個網絡中就能自動加入當前集羣;本身就是開源軟件,也支持很多開源的第三方插件
3、高可用:在一個集羣的多個節點中進行分佈式存儲,索引支持shards和複製,即使部分節點down掉,也能自動進行數據恢復和主從切換
4、採用restfullapi標準:通過http接口和json格式進行操作數據
5、數據存儲的最小單位是文檔,本質上是一個json文本

node節點 :單個的裝有elasticsearch服務並且提供故障轉移和擴展的服務器
cluster集羣:一個集羣就是由一個或者多個node組織在一起,共同工作,共同分享整個數據具有負載均衡功能的集羣
index索引: 索引就是一個擁有幾分相似特徵的文檔的集合
type類型:索引可以爲擁有相同字段的文檔定義一個類型;一個索引中可以創建多個type
document文檔:一個文檔是一個可被索引的基礎信息單元
field 列:field是elasticsearch的最小單位,相當於數據的某一個列
shards分片:elastic search將索引分成若干份,每個部分就是一個shard
replicas複製:replicas 是索引裏每個shard的拷貝(一份或者多份)

elasticsearch 應用場景
1、搜索:電商、百科、App搜索
2、高亮顯示:GitHub
3、分析和數據挖掘:ELK

elasticsearch特點:
1、高性能,天然分佈式
2、對運維友好,不需要會java開發語言,開箱即用
3、功能豐富

elasticsearch安裝部署6.6版本

rpm -qc elasticsearch 查看配置文件有哪些

[root@localhost soft]# rpm -qc  elasticsearch
/etc/elasticsearch/elasticsearch.yml      主配置文件
/etc/elasticsearch/jvm.options       jvm虛擬機配置
/etc/elasticsearch/log4j2.properties  
/etc/elasticsearch/role_mapping.yml
/etc/elasticsearch/roles.yml
/etc/elasticsearch/users
/etc/elasticsearch/users_roles
/etc/init.d/elasticsearch     init啓動腳本
/etc/sysconfig/elasticsearch
/usr/lib/sysctl.d/elasticsearch.conf  配置參數,不需要改動
/usr/lib/systemd/system/elasticsearch.service  systemctl 啓動文件

1、關閉防火牆

iptables -nL
iptables -F
iptables -X
iptables -Z
iptables -nL

2、下載軟件
鏈接:https://pan.baidu.com/s/1PMpkPwAK03F_KYrZM-5hAw
提取碼:lrai

mkdir /data/soft
[root@db-01 /data/soft]# ll -h
total 268M
-rw-r--r-- 1 root root 109M Feb 25  2019 elasticsearch-6.6.0.rpm
-rw-r--r-- 1 root root 159M Sep  2 16:35 jdk-8u102-linux-x64.rpm

3、安裝jdk

rpm -ivh jdk-8u102-linux-x64.rpm 
[root@db-01 /data/soft]# java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (build 1.8.0_212-b04)
OpenJDK 64-Bit Server VM (build 25.212-b04, mixed mode)

4、安裝

rpm -ivh elasticsearch-6.6.0.rpm

5、啓動並檢查

systemctl daemon-reload
systemctl enable elasticsearch.service
systemctl start elasticsearch.service

netstat -lntup|grep 9200

[root@db01 /data/soft]# curl 127.0.0.1:9200
{
  "name" : "pRG0qLR",
  "cluster_name" : "elasticsearch",
  "cluster_uuid" : "mNuJSe07QM61IOxecnanZg",
  "version" : {
    "number" : "6.6.0",
    "build_flavor" : "default",
    "build_type" : "rpm",
    "build_hash" : "a9861f4",
    "build_date" : "2019-01-24T11:27:09.439740Z",
    "build_snapshot" : false,
    "lucene_version" : "7.6.0",
    "minimum_wire_compatibility_version" : "5.6.0",
    "minimum_index_compatibility_version" : "5.0.0"
  },
  "tagline" : "You Know, for Search"
}

端口說明:

9200作爲Http協議,主要用於外部通訊
9300作爲Tcp協議,jar之間就是通過tcp協議通訊
ES集羣之間是通過9300進行通訊

ES自定義配置
1、查看ES有哪些配置

[root@db01 ~]# rpm -qc elasticsearch 
/etc/elasticsearch/elasticsearch.yml		#ES的主配置文件
/etc/elasticsearch/jvm.options				#jvm虛擬機配置
/etc/sysconfig/elasticsearch				#默認一些系統配置參數
/usr/lib/sysctl.d/elasticsearch.conf		#配置參數,不需要改動
/usr/lib/systemd/system/elasticsearch.service	#system啓動文件

2、自定義配置文件

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: 10.0.0.51,127.0.0.1
http.port: 9200
EOF

3、重啓服務

systemctl restart elasticsearch.service

4、解決內存鎖定失敗
重啓後查看日誌發現提示內存鎖定失敗

[root@db01 ~]# tail -f /var/log/elasticsearch/elasticsearch.log 
[2019-11-14T09:42:29,513][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

安裝es-head插件安裝
鏈接:https://pan.baidu.com/s/1PMpkPwAK03F_KYrZM-5hAw
提取碼:lrai

注意:需要修改配置文件添加允許跨域參數

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

1.es-head 三種方式
1.npm安裝方式
2.docker安裝
3.google瀏覽器插件(推薦)

從google商店安裝es-head插件
將安裝好的插件導出到本地
修改插件文件名爲zip後綴
解壓目錄
拓展程序-開發者模式-打開已解壓的目錄
連接地址修改爲ES的IP地址

2.具體操作命令
Head插件在5.0以後安裝方式發生了改變,需要nodejs環境支持,或者直接使用別人封裝好的docker鏡像
插件官方地址

https://github.com/mobz/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
npm run start &

kibana與ES交互

鏈接:https://pan.baidu.com/s/1PMpkPwAK03F_KYrZM-5hAw
提取碼:lrai

1、安裝kibana

rpm -ivh kibana-6.6.0-x86_64.rpm

2、配置kubana

[root@localhost soft]# grep  -nEv  '#|^$'  /etc/kibana/kibana.yml
2:server.port: 5601
7:server.host: "10.0.0.51"
28:elasticsearch.hosts: ["http://10.0.0.51:9200"]
37:kibana.index: ".kibana"

3、啓動kibana

systemctl start kibana

端口:5601

4、測試命令

curl -XGET 'http://10.0.0.51:9200/_count?pretty' -H 'Content-Type: application/json' -d '   
 {
   "query": { "match_all": {}
   } 
 }
 '
mysql    es
庫           index 索引
表            type 
字段         json key 
行           doc文檔

使用HTTP的協議
GET 查看
PUT 提交
POST 提交
DELETE 刪除

方法 索引/類型/doc

PUT twitter/_doc/1
{
    "user" : "kimchy",
    "post_date" : "2009-11-15T14:12:12",
    "message" : "trying out Elasticsearch"
}

在這裏插入圖片描述

所有以下劃線開頭都是系統默認的

{
"_index": "oldzhang",
"_type": "info",
"_id": "1",
"_version": 1,
"_score": 1,
"_source": {
"name": "zhang",
"age": "29"
}
}

故障案例

一開始使用ES庫關聯mysql 一開始使用的指定id 後來發現數據庫的查詢變的慢,根據調研,採用post隨機id

elasticsearch 和數據庫怎麼進行關聯

根據id進行關聯,但是會進行id比較 不能出現id衝突
根據post 的隨機id 不會進行id比較 關聯mysql時增加一個字段 解決關聯問題

查詢命令

1、創建測試語句

POST oldzhang/info/
{
  "name": "zhang",
  "age": "29",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{
  "name": "xiao1",
  "age": "30",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{
  "name": "xiao2",
  "age": "26",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{
  "name": "xiao4",
  "age": "35",
  "pet": "xiaoqi",
  "job": "it"
}

POST oldzhang/info/
{
  "name": "ya",
  "age": "28",
  "pet": "xiaomin",
  "job": "it"
}

POST oldzhang/info/
{
  "name": "xiaomin",
  "age": "26",
  "pet": "xiaowang",
  "job": "SM"

}

POST oldzhang/info/
{
  "name": "hemengfei",
  "age": "38",
  "pet": "xiaohe",
  "job": "3P"
}

POST oldzhang/info/
{
  "name": "xiaoyu",
  "age": "28",
  "pet": "bijiben",
  "job": "fly"
}

2、簡單查詢

GET oldzhang/_search/

3、條件查詢

GET oldzhang/_search
{
  "query": {
    "term": {
      "name": {
        "value": "xiaomin"
      }
    }
  }
}

GET oldzhang/_search
{
  "query": {
    "term": {
      "job": {
        "value": "it"
      }
    }
  }
}

4、多條件查詢

GET /oldzhang/_search
{
    "query" : {
      "bool": {
        "must": [
          {"match": {"pet": "xiaoqi"}},
          {"match": {"name": "zhang"}}
        ],
        "filter": {
          "range": {
            "age": {
              "gte": 27,
              "lte": 30
            }
          }
          }
        }
      }
    }
}

增刪改查
1、自定義的ID更新

PUT oldzhang/info/1
{
  "name": "zhang",
  "age": 30,
  "job": "it",
  "id": 1
}

2.隨機ID更新
#先根據自定義的Id字段查出數據的隨機ID

GET oldzhang/_search/
{
  "query": {
    "term": {
      "id": {
        "value": "2"
      }
    }
  }
}

#取到隨機ID後更改數據

PUT oldzhang/info/CVDdknIBq3aq7mPQaoWw
{
  "name": "yayay",
  "age": 30,
  "job": "it",
  "id": 2
}

MongoDB ES etcd 都是使用jso格式
而Redis是使用

日誌的兩種格式:

多行匹配格式
json格式

集羣相關名詞
1、默認分片和副本規則

5分片
1副本

2、集羣健康狀態

綠色: 所有數據都完整,且副本數滿足
黃色: 所有數據都完整,但是副本數不滿足
紅色: 一個或多個索引數據不完整

3、節點類型

主節點:	 負責調度數據分配到哪個節點
數據節點:  實際負責處理數據的節點
默認: 		主節點也是工作節點

4、數據分片

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

5、副本

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

部署ES集羣
1、安裝java

rpm -ivh jdk-8u102-linux-x64.rpm

2、安裝ES

rpm -ivh elasticsearch-6.6.0.rpm

3、配置內存鎖定

systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

4、集羣配置文件

node-1

[root@localhost soft]# grep  -nEv '#|^$' /etc/elasticsearch/elasticsearch.yml
1:cluster.name: elk
2:node.name: node-1
3:path.data: /var/lib/elasticsearch
4:path.logs: /var/log/elasticsearch
5:bootstrap.memory_lock: true
6:network.host: 10.0.0.51,127.0.0.1
7:http.port: 9200
8:discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
9:discovery.zen.minimum_master_nodes: 1 

node-2

grep  -nEv '#|^$' /etc/elasticsearch/elasticsearch.yml
17:cluster.name: elk
23:node.name: node-2
33:path.data: /var/lib/elasticsearch
37:path.logs: /var/log/elasticsearch
43:bootstrap.memory_lock: true
55:network.host: 10.0.0.52,127.0.0.1
59:http.port: 9200
68:discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
72:discovery.zen.minimum_master_nodes: 1 
discovery.zen.minimum_master_nodes: 1  
這個參數的作用:如果集羣想正常工作,至少需要幾臺機器正常
集羣的節點個數的一半以上,也就是大多數
這兩臺機器能互相通訊

建議:
不要偶數個節點
解釋修改參數:儘量使得集羣節點數爲奇數個

total number of master-eligible nodes     / 2 + 1
所有可能會成爲master節點的個數 / 2 + 1

5、啓動

systemctl daemon-reload
systemctl restart elasticsearch

6、查看日誌

tail  -f /var/log/elasticsearch/elasticsearch.log 

7、查看集羣

ES-head查看是否有2個節點

在這裏插入圖片描述
集羣注意事項

1.插入和讀取數據在任意節點都可以執行,效果一樣
2.es-head可以連接集羣內任一臺服務

3.主節點負責讀寫
如果主分片所在的節點壞掉了,副本分片會升爲主分片

4.主節點負責調度
如果主節點壞掉了,數據節點會自動升爲主節點

5.通訊端口
默認會有2個通訊端口:9200和9300
9300並沒有在配置文件裏配置過
如果開啓了防火牆並且沒有放開9300端口,那麼集羣通訊就會失敗

查看集羣各種信息

GET _cat/nodes
GET _cat/health
GET _cat/master
GET _cat/fielddata
GET _cat/indices
GET _cat/shards
GET _cat/shards/oldzhang

在這裏插入圖片描述

擴容第三臺機器
1、安裝java

rpm -ivh jdk-8u102-linux-x64.rpm

2、安裝ES

rpm -ivh elasticsearch-6.6.0.rpm

3、配置內存鎖定

systemctl edit elasticsearch.service
[Service]
LimitMEMLOCK=infinity

4、db03集羣配置文件

cat > /etc/elasticsearch/elasticsearch.yml <<EOF
cluster.name: elk
node.name: node-3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
bootstrap.memory_lock: true
network.host: 10.0.0.53,127.0.0.1
http.port: 9200
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.53"]
discovery.zen.minimum_master_nodes: 1
EOF

解釋:

discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.53"]
能和集羣內任意一個節點ping通即可 通過51可以和集羣內所有的機器進行獲取(感覺和病毒感染一樣)

在這裏插入圖片描述
5、添加接點注意

1.對於新添加的節點來說:  
只需要直到集羣內任意一個節點的IP和他自己本身的IP即可

對於以前的節點來說:
什麼都不需要更改

2.最大master節點數設置
3個節點,設置爲2

3.默認創建索引爲1副本5分片

4.數據分配的時候會出現2中顏色
紫色: 正在遷移
黃色: 正在複製
綠色: 正常

5.3節點的時候
0副本一臺都不能壞 
1副本的極限情況下可以壞2臺: 1臺1臺的壞,不能同時壞2臺,在數據複製完成的情況下,可以壞2臺
2副本的情況可以同時壞2臺

當數據庫node2(假設爲主庫)down掉一個後 這時node1爲主庫,如果此時有數據寫入,等到node2修復好之後,自動同步數據。
磁盤不能寫的太滿,會導致複製數據出現問題,保證足夠的空間使用

動態修改最小發現節點數

GET _cluster/settings

PUT _cluster/settings
{
  "transient": {
    "discovery.zen.minimum_master_nodes": 2
  }
}

在這裏插入圖片描述

出現這種情況是因爲:主分片爲5,副本爲1 所以三個節點的情況下 一個爲主分片 一個爲副本,另外一個就是沒有主分片和副本

3個節點的ES集羣,極限情況下,最多允許壞幾臺?
如果選舉參數配置爲1的情況下,極限壞2臺,不能同時壞,壞一臺,等數據同步後,才能壞第二臺

紅色: 一個或多個索引數據不完整
如果集羣編程紅色了,只是說明索引數據不完整,

1、副本數和分片數都是可以調整的
2、分片數只有在創建索引的時候才能定義 索引一旦創建完成 分片數不能修改

複習:
ES集羣故障轉移和恢復注意事項

elasticsearch 是一款成熟的數據庫,不只是elk的數據庫

黃(副本數不滿足)----綠(正常)----紫(遷移)

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