一、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