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的數據庫
黃(副本數不滿足)----綠(正常)----紫(遷移)