ES数据操作

一、ES安装

1.时间同步

[root@db02 ~]# ntpdate time1.aliyun.com

2.安装Java环境

#上传java包
[root@db02 ~]# rz jdk-8u181-linux-x64.rpm

#安装
[root@db02 ~]# rpm -ivh jdk-8u181-linux-x64.rpm

3.上传或下载ES的包

[root@db02 ~]# rz elasticsearch-6.6.0.rpm

4.安装ES

[root@db02 ~]# rpm -ivh elasticsearch-6.6.0.rpm
 sudo systemctl daemon-reload
 sudo systemctl enable elasticsearch.service

5.配置

[root@db02 ~]# grep "^[a-z]" /etc/elasticsearch/elasticsearch.yml 
node.name: es02
path.data: /server/es/data
path.logs: /server/es/logs
bootstrap.memory_lock: true
network.host: 10.0.0.52,127.0.0.1
http.port: 9200

6.根据配置创建目录

[root@db02 ~]# mkdir /server/es/data -p
[root@db02 ~]# mkdir /server/es/logs -p
[root@db02 ~]# chown -R elasticsearch.elasticsearch /server/es/

7.启动ES

#启动内存锁
[root@db02 ~]# vim /usr/lib/systemd/system/elasticsearch.service 
[Service]
LimitMEMLOCK=infinity

#开启ES
[root@db02 ~]# systemctl daemon-reload
[root@db02 ~]# systemctl start elasticsearch.service

8.验证启动

[root@db02 ~]# netstat -lntp          
tcp6       0      0 10.0.0.52:9200          :::*                    LISTEN      12627/java
tcp6       0      0 127.0.0.1:9200          :::*                    LISTEN      12627/java
tcp6       0      0 10.0.0.52:9300          :::*                    LISTEN      12627/java
tcp6       0      0 127.0.0.1:9300          :::*                    LISTEN      12627/java  

二、与ES交互的方式

1.使用curl命令

1.不需要安装任何服务,只需要curl命令
2.命令复杂,容易出错
curl -XPUT 'localhost:9200/student?pretty'

curl -XPUT 'localhost:9200/student/user/1?pretty' -H 'Content-Type: application/json' -d '{"name": "lhd","sex":"man","age":"18","about":"good good study","interests":["chinese","english"]}'

curl -GET 'localhost:9200/student/user/1?pretty'

2.使用head插件进行交互

1.操作简单,数据展示明显
2.需要安装nodejs,安装复杂
3.可以直接使用插件

3.kibana的方式

1)特点

1.数据展示更好看
2.查询更方便
3.需要安装kibana

2)安装kibana

#1.上穿代码包
[root@db01 ~]# rz kibana-6.6.0-x86_64.rpm

#2.安装
[root@db01 ~]# rpm -ivh kibana-6.6.0-x86_64.rpm

3)配置kibana

[root@db01 ~]# grep "^[a-z]" /etc/kibana/kibana.yml 
#监听端口
server.port: 5601
#监听地址
server.host: "10.0.0.51"
#ES的地址和端口
elasticsearch.hosts: ["http://localhost:9200"]
#kibana生成索引名称
kibana.index: ".kibana"

4)启动kibana

[root@db01 ~]# systemctl start kibana.service 
[root@db01 ~]# netstat -lntp      
tcp        0      0 10.0.0.51:5601

5)访问kibana

三、ES数据的操作

1.创建索引

#语法:
PUT /<index>

#curl执行
[root@db01 ~]# curl -XPUT 'localhost:9200/suoyin'
#kibana执行
PUT /suoyin
PUT suoyin2

2.插入数据

#语法
POST /<index>/_type/
PUT /<index>/_type/<_id>

<index>   #索引名称
_type	  #类型
<_id>	  #唯一识别符

1)自定义ID插入数据

PUT /suoyin3/_doc/1
{
  "name":"qiudao",
  "age":"38"
}

#当时使用相同ID时,程序会拿着ID去库里对比,如果没有相同id的数据,再插入数据,浪费时间

2)使用随机ID插入数据(企业使用的方式)

POST /suoyin3/_doc/
{
  "name":"qiudao",
  "age":"38"
}

3)使用自定义字段定义id

POST /suoyin5/_doc/
{
  "id":"1",
  "name":"qiudao",
  "age":"38",
  "sex":"nan"
}

3.查询数据

1)简单查询

#1.查询所有的索引信息
GET /_all

#2.查询所有的索引信息和数据
GET /_all/_search

#3.查询指定索引信息
GET /student

#4.查询指定索引信息和数据
GET /student/_search

#5.查询指定索引下面的指定ID的数据
GET /suoyin3/_doc/1

2)条件查询

#方法一:
GET /suoyin3/_search
{
  "query": {
    "term": {
      "age": {
        "value": "38"
      }
    }
  }
}

#方法二:
GET /suoyin3/_search
{
  "query": {
    "term": {
      "age": "38"
    }
  }
}

#方法三:
GET /suoyin3/_search
{
  "query": {
    "match": {
      "age": "38"
    }
  }
}

#term和match,term查询时不进行分词,用于精确查找,match查询时会进行分词,用于全文检索

3)多条件查询

#must查询:插叙条件必须全部匹配
GET /suoyin3/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "term": {
            "age": {
              "value": "48"
            }
          }
        },
        {
          "term": {
            "name": {
              "value": "guolaoshi"
            }
          }
        }
      ]
    }
  }
}

#filter查询:跟must一样条件必须多条件完全匹配
GET /suoyin3/_search
{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "age": {
              "value": "48"
            }
          }
        },
        {
          "term": {
            "name": {
              "value": "guolaoshi"
            }
          }
        }
      ]
    }
  }
}

#should查询:多条件满足其中一个即可
GET /suoyin3/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "age": {
              "value": "18"
            }
          }
        },
        {
          "term": {
            "name": {
              "value": "qiudao"
            }
          }
        }
      ]
    }
  }
}

#must_not查询:根据条件反向查询
GET /suoyin3/_search
{
  "query": {
    "bool": {
      "must_not": [
        {
          "term": {
            "age": {
              "value": "18"
            }
          }
        },
        {
          "term": {
            "name": {
              "value": "qiudao"
            }
          }
        }
      ]
    }
  }
}
#结合should和must做复合查询
GET /suoyin3/_search
{
  "query": {
    "bool": {
      "should": [
        {
          "bool": {
            "must": [
              {
                "term": {
                  "name": {
                    "value": "qiudao"
                  }
                }
              },
              {
                "term": {
                  "age": {
                    "value": "38"
                  }
                }
              }
            ]
          }
        },
        {
          "bool": {
            "must": [
              {
                "term": {
                  "name": {
                    "value": "guolaoshi"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  }
}

4.修改数据

#注意,修改数据时,不修改的值也要重新写一遍
PUT /suoyin4/_doc/Gy57THMBH5itxDSR1k9x
{
  "id":"1",
  "name":"qiudao",
  "age":"48"
}

POST /suoyin4/_doc/Gy57THMBH5itxDSR1k9x
{
  "id":"1",
  "name":"qiudao",
  "age":"48"
}

5.删除数据

#1.指定ID删除数据
DELETE /suoyin4/_doc/Gy57THMBH5itxDSR1k9x

#2.删除索引
DELETE /suoyin3
#生产中一般不会轻易删除索引,只会将不用的索引关掉,直到确实没人用后再删除

#3.按条件删除
POST suoyin5/_delete_by_query
{
  "query": {
    "match": {
      "name": "qiudao"
    }
  }
}

四、集群

1594797853718

1.集群名词

1)集群状态

1.绿色:所有数据都完整,并且副本数正常
2.黄色:数据完整,但是有索引的副本有问题
3.红色:数据都不完整

2)节点类型

1.主节点:调度分配数据(主节点也是数据节点)
2.数据节点:负责分配自己的数据

3)数据分片

1.主分片:存储数据,负责读写数据
2.副本分片:主分片的备份(类似于从库)

2.搭建集群

1.时间同步
2.安装java环境
3.安装ES
4.配置ES
5.配置启动文件
6.启动ES

1)配置ES

[root@db03 ~]# grep "^[a-z]" /etc/elasticsearch/elasticsearch.yml 
cluster.name: es-cluster
node.name: es03
path.data: /server/es/data
path.logs: /server/es/logs
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.52","10.0.0.53"]
discovery.zen.minimum_master_nodes: 2

2)创建目录

[root@db03 ~]# mkdir /server/es/{data,logs} -p

[root@db03 ~]# chown -R elasticsearch.elasticsearch /server/es/

3)配置启动文件

[root@db03 ~]# vim /usr/lib/systemd/system/elasticsearch.service
[Service]
LimitMEMLOCK=infinity

[root@db03 ~]# systemctl daemon-reload

4)启动ES

[root@db03 ~]# systemctl start elasticsearch.service

5)到head插件页面查看集群

2.集群特点

1.集群中的数据,不论在哪一台操作,都可以使用插件查看所有数据
2.es-head插件不论连接到哪一台机器都能看到集群中所有节点
3.数据会自动平均调度到所有节点
4.如果主分片一但坏掉,副本分片会自动提升为主分片
5.如果主节点坏了,数据节点会自动升为主节点

3.ES集群注意事项

1.集群配置IP的时候,不需要填写全部IP,只需要填写本机IP和集群中任意一台机器的IP即可
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.52"]
discovery.zen.ping.unicast.hosts: ["10.0.0.51", "10.0.0.53"]

2.配置集群选主节点投票数量 (total number of master-eligible nodes / 2 + 1):
discovery.zen.minimum_master_nodes: 2

3.ES默认五个分片,一个副本

4.三个节点,出现故障
	1)没有副本,坏一台都不行
	2)有一个副本,最多可以坏一台
	3)有两个副本,剩一台也可以提供服务

5.创建索引
	1)创建索引时可以指定分片,但是分片一旦创建就不能修改了
	2)副本数量可以根据需求修改

4.集群中使用的命令

#1.查看集群状态
GET _cluster/health
curl -XGET 'http://localhost:9200/_cluster/health?pretty'

#2.查看所有节点
GET _cat/nodes
curl -XGET 'http://localhost:9200/_cat/nodes?pretty'

#3.查看所有索引
GET _cat/indices

#4.查看集群状态
GET _cat/health

#5.查看主节点
GET _cat/master

#7.查看所有分片
GET _cat/shards

#8.查看指定索引的分片
GET _cat/shards/suoyin

4.集群内修改内容

1)修改指定索引的副本数

#kibana中执行
PUT /teacher/_settings
{
  "number_of_replicas": 1
}

2)修改所有索引的副本数

PUT _all/_settings
{
  "number_of_replicas": 2
}

3)配置文件修改默认的分片数和副本数

#设置默认分片数量
index.number_of_shards: 5

#设置默认副本数量
index.number_of_replicas:1

4)创建索引时指定分片数量

#指定3个分片,2个副本
PUT /fenpian
{
  "settings": {
    "number_of_replicas": 2,
    "number_of_shards": 3
  }
}

5)企业中一般怎么设置

1.跟开发沟通
2.看一共要几个节点
    2个节点,默认就可以了
    3个节点,重要的数据,2副本5分片,不重要的数据,1副本5分片
3.在开始阶段, 一个好的方案是根据你的节点数量按照1.5~3倍的原则来创建分片. 
    例如:如果你有3个节点, 则推荐你创建的分片数最多不超过9(3x3)个.
4.存储数据量多的可以设置分片多一些,存储数据量少的,可以少分写分片

五、集群监控

1.监控的项目

1.监控节点数量
	GET _cat/nodes
2.监控集群状态
	GET _cat/health
#以上两者哪一个产生变化都要处理

2.监控的脚本

[root@elkstack01 ~]# vim es_cluster_status.py
#!/usr/bin/env python
#coding:utf-8
#Author:_DriverZeng_
#Date:2017.02.12

import smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
import subprocess
body = ""
false = "false"
clusterip = "10.0.0.51"
obj = subprocess.Popen(("curl -sXGET http://"+clusterip+":9200/_cluster/health?pretty=true"),shell=True, stdout=subprocess.PIPE)
data =  obj.stdout.read()
data1 = eval(data)
status = data1.get("status")
if status == "green":
    print "\033[1;32m 集群运行正常 \033[0m"
elif status == "yellow":
    print "\033[1;33m 副本分片丢失 \033[0m"
else:
    print "\033[1;31m 主分片丢失 \033[0m"
    
#执行结果如下
[root@elkstack01 ~]# python es_cluster_status.py
集群运行正常

3.ES监控 X-pack

六、ES优化

1.限制内存

1.ES内存最大不超过32G
2.一般给ES运行内存为服务器内存的一半
	[root@db02 ~]# vim /etc/elasticsearch/jvm.options 
	-Xms1g
	-Xmx1g
3.设置的时候先给小一点,不足时慢慢加
4.内存不足的时候,先让开发删除没用的数据,实在没有可以删除的再加内存
5.关闭swap空间

2.优化文件句柄数

[root@db02 ~]# vim /etc/security/limits.conf
* - nofile 65535
#文件句柄数是单个进程最大可以打开的文件数量,文件句柄数可以设置大于65535

3.语句优化

1.查询的时候尽量用term
2.建立索引的时候尽量建立容易匹配的词

七、ES数据备份

1.安装npm

2.安装备份工具

[root@db01 ~]# npm install elasticdump -g

3.备份类型

settings		#设置
analyzer		#分析器
data			#数据
mapping			#识别数据类型的索引
alias			#别名
template		#模板

4.备份命令

#从一个集群备份到另一个集群
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=http://11.0.0.51:9200/my_index \
  --type=analyzer
  
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=http://11.0.0.51:9200/my_index \
  --type=mapping
  
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=http://11.0.0.51:9200/my_index \
  --type=data
 
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=http://11.0.0.51:9200/my_index \
  --type=alias

elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=http://11.0.0.51:9200/my_index \
  --type=template
#从集群备份到文件
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=/data/es_analyzer.json \
  --type=analyzer
  
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=/data/es_mapping.json \
  --type=mapping
  
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=/data/es_data.json \
  --type=data
  
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=/data/es_alias.json \
  --type=alias
  
elasticdump \
  --input=http://10.0.0.51:9200/my_index \
  --output=/data/es_template.json \
  --type=template
#所有备份方式
https://github.com/elasticsearch-dump/elasticsearch-dump

5.导入命令

#从文件导入到ES集群
elasticdump \
  --input=/data/es_analyzer.json \
  --output=http://10.0.0.51:9200/my_index \
  --type=analyzer
  
elasticdump \
  --input=/data/es_mapping.json \
  --output=http://10.0.0.51:9200/my_index \
  --type=mapping
  
elasticdump \
  --input=/data/es_data.json \
  --output=http://10.0.0.51:9200/my_index \
  --type=data
  
elasticdump \
  --input=/data/es_alias.json \
  --output=http://10.0.0.51:9200/my_index \
  --type=alias
  
elasticdump \
  --input=/data/es_alias.json \
  --output=http://10.0.0.51:9200/my_index \
  --type=template
posted @   zbzSH  阅读(187)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现
点击右上角即可分享
微信分享提示