- 1.ELK介绍:
- 2 Elasticsearch基础
- 操作ES,索引API
- 创建
- 查看
- 删除
- 操作ES,文档DOC
- 自定义ID编号:
- 自动编号
- 获取指定的缩影数据
- 获取所有doc
- 批量创建
- 创建多条记录POST _bulk
- 4.ES集群 分片 | 副本
- 5.ES集群健康检查
- shell检测脚本
- http://172.16.1.162:9200/_cluster/health?pretty=true | grep “status” |awk -F ‘“‘ ‘{print $4}’">curl -s http://172.16.1.162:9200/_cluster/health?pretty=true | grep “status” |awk -F ‘“‘ ‘{print $4}’
- 7. ES文档路由原理
- 8.ES扩展集群节点
资料: EFK日志收集系统概述.html
1.ELK诞生背景:
痛点:
- 出现故障,要排查的日志非常的多,没有办法很快定位;
- 统计TOP,PV,UV,IP信息;awk无法满足需求;| elkstack |[在线活跃用户,订单交易金额;]
金额:
l.app业务日志;
2.通过数据库统计;
- 其他;
1.ELK介绍:
其实 ELK 不是一个单独的技术,而是一套技术的组合,是由 elasticsearch、logstash、kibana 组合而成的。
ELK 是一套开源免费、功能强大的日志分析管理系统。ELK 可以将我们的系统日志、网站日志、应用系统日志等各种__日志进行收集、过滤、清洗,然后进行集中存放并可用于实时检索、分析。
E: elasticsearch
数据存储;L: logstash
数据采集、数据清洗、数据过滤;K: kibana
数据分析、数据展示
- ELK架构
ELK收集哪些;
系统日志; Nginx日志;DB日志; App日志;
一种格式 #搜集示例:
match => [ "message”=>"%(IP:client} %/KORD:method) %(URIPATHPARAM.request)& (NMABER:bytes] 6 (20NBBR.duration)" )
_ELK—>不在使用;
EFK + Logstash;
- **EFK收集哪些日志
- 代理: Haproxy、Nginx
- web:Nginx、Tomcat、Httpd、PHP
- db:mysql、redis、mongo、elasticsearch
- 存储:nfs、glusterfs、fastdfs
- 系统:message、security
- 业务:app
2 Elasticsearch基础
1.ES基本介绍
2.1ES是什么
Elasticsearch是一个分布式、RESTful风格的搜索和数据分析引擎。2.2 ES主要功能
数据存储、数据搜索、数据分析。
2.3 ES相关术语
2.3.1文档Document
Document文档就是用户存在es 中的一些数据,它是es 中存储的最小单元。
(类似于数据库中表中的一行数据。)注意:每个文档都有一个唯一的ID表示,可以自行指定,如果不指定es 会自动生成。
1.3.2索引lndex
索引其实是一堆文档Document 的集合。(它类似数据库的中的一个表)
1.3.3字段Filed
在Es 中,Document 就是一个json Object,一个json object其实是由多个字段组成的,每个字段它有不同的数据类型。
1.—条记录,算一行数据,
2多行数据组织在一起,有表来统一管理,
3.一行记录会有多个不同的字段,
多个不同的字段,组成了一行记录,而多行记录组成了一张表';
1.4 ES术语总结 ✨
2.ES的安装
elasticsearch安装
下载: https://mirrors.huaweicloud.com/elasticsearch/
配置:#注意内存的大小,容易触发oom(2G以上) ----> 生产中32G,官方申明32G以上会影响性能
yum install java -y
[root@es-node1 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-app
node.name: node-1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.0.0.161
http.port: 9200
kibana安装
[root@es-node1 ~]# rpm -ivh kibana-7.4.0-x86_64.rpm
#配置kibana
[root@kibana ~]# grep "^[a-Z]" /etc/kibana/kibana.yml
server.port: 5601 #kibana默认监听端口
server.host: "0.0.0.0" #kibana监听地址段
elasticsearch.hosts: ["http://localhost:9200"] #kibana丛coordinating节点获取数据
i18n.locale: "zh-CN" #kibana汉化
#通过IP+端口 连接多个节点的ES
#Ps: elasticsearch.hosts: ["http://10.0.0.161:9200","http://10.0.0.162:9200","http://10.0.0.163:9200"]
#启动kibana
[root@kibana ~]# systemctl start kibana
[root@kibana ~]# systemctl enable kibana
2.ES操作方式✨
图形界面操作:
查看
GET _cat/indices
删除
DELETE /hsping_index
操作ES,文档DOC
自定义ID编号:
PUT /hsping_index/_doc/1 { “name”:”hsping”, “age”:”18”, “salary”:”10000” }
自动编号
POST /hsping_index/_doc { “name”: “gougou”, “age”: “30”, “salary”: “10000” }
获取指定的缩影数据
GET /hsping_index/_doc/2
获取所有doc
GET /hsping_index/_search
高级使用
批量创建
创建多条记录POST _bulk
POST _bulk {“index”:{“_index”:”tt”,”_id”:”1”}} {“name”:”hsping”,”age”:”18”} {“create”:{“_index”:”tt”,”_id”:”2”}} {“name”:”zhuhzu”,”age”:”30”} {“update”:{“_id”:”1”,”_index”:”tt”}} {“doc”:{“age”:”20”}}
GET /tt/_search
<a name="Z7476"></a>
# 3.ES集群基本介绍
<a name="EtK0v"></a>
## 3.1 ES集群的好处
<a name="toc_29"></a>
### 1.1 ES集群的好处
- es天然支持集群模式,其好处主要有两个:
- 1.能够增大系统的容量,如内存、磁盘,使得 `es` 集群可以支持PB级的数据;
- 2.能够提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务;
<a name="qf2ty"></a>
## 3.2 ES如何组集群
ELasticsearch集群是由多个节点组成的,通过cluster.name设置集群名称,并且用于区分其它的集群,每个节点通过node.name指定节点的名称。
- 单节点:
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1581532/1610939585677-53bd4b6e-db71-4b37-9bae-b7b45674de22.png#align=left&display=inline&height=152&margin=%5Bobject%20Object%5D&name=image.png&originHeight=202&originWidth=824&size=17577&status=done&style=none&width=618)
- 集群
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1581532/1610939650296-c8bf0a50-209c-42b8-84a0-823ff7d6dbad.png#align=left&display=inline&height=141&margin=%5Bobject%20Object%5D&name=image.png&originHeight=188&originWidth=811&size=32830&status=done&style=none&width=608)
<a name="hGjcb"></a>
## 3.3.ES集群环境部著
- 集群规划(elasticSearch )
```javascript
####ip地址规划:
#ES:
10.0.0.161 <--Kibanna
10.0.0.162
10.0.0.163
#Logstash:
10.0.0.151
10.0.0.152
#Kakfa:
10.0.0.141
10.0.0.142
10.0.0.143
#nginx tomcat mysql 集群:
略
一套业务环境:
1.监控
2.代码发布
3.日志
4.性能
5.安全
e: 数据存储 --->
f: filebeat
l: 数据采集\数据过滤
k: 分析\出图\
redis\kafka:
filebeat module
- 所有集群节点都需要安装Es 软件
2.3 node1集群节点配置# yum install java -y # rpm -ivh elasticsearch-7.4.0-x86_64.rpm
Ps: 后续如何扩展节点?[root@es-node1 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml cluster.name: my-app node.name: node-1 path.data: /var/lib/elasticsearch path.logs: /var/log/elasticsearch network.host: 10.0.0.161 http.port: 9200 discovery.seed_hosts: ["10.0.0.161", "10.0.0.162","10.0.0.163"] cluster.initial_master_nodes: ["10.0.0.161", "10.0.0.162","10.0.0.163"]
2.4 node2集群节点配置
[root@es-node2 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-app
node.name: node-2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.0.0.162
http.port: 9200
discovery.seed_hosts: ["10.0.0.161", "10.0.0.162","10.0.0.163"]
cluster.initial_master_nodes: ["10.0.0.161", "10.0.0.162","10.0.0.163"]
2.5 node3集群节点配置
[root@es-node3 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-app
node.name: node-3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.0.0.163
http.port: 9200
discovery.seed_hosts: ["10.0.0.161", "10.0.0.162","10.0.0.163"]
cluster.initial_master_nodes: ["10.0.0.161", "10.0.0.162","10.0.0.163"]
最后启动所有节点:
systemctl enable elasticsearch
systemctl start elasticsearch
如何验证集群是正常:[root@es-node2 ~]# curl http://10.0.0.161:9200/_cluster/health?pretty=true { "cluster_name" : "my-app", "status" : "green", "timed_out" : false, "number_of_nodes" : 3, "number_of_data_nodes" : 3, "active_primary_shards" : 0, "active_shards" : 0, "relocating_shards" : 0, "initializing_shards" : 0, "unassigned_shards" : 0, "delayed_unassigned_shards" : 0, "number_of_pending_tasks" : 0, "number_of_in_flight_fetch" : 0, "task_max_waiting_in_queue_millis" : 0, "active_shards_percent_as_number" : 100.0 }
cerebro验证集群:
如何通过可视化方式检查 ES 集群状态;可以通过 cerebro 可视化工具检测;
——》 cerebro 传送门 ```javascript 安装 root@es-node1 ~]# yum localinstall cerebro-0.8.5-1.noarch.rpm -y
配置 [root@es-node1 ~]# grep “^[a-Z]” /etc/cerebro/application.conf data.path = “/tmp/cerebro.db”
启动 [root@es-node1 ~]# systemctl start cerebro #9000端口
![image.png](https://cdn.nlark.com/yuque/0/2021/png/1581532/1610976912901-2e3630e7-6cf7-48d1-99d0-e3df23465122.png#align=left&display=inline&height=508&margin=%5Bobject%20Object%5D&name=image.png&originHeight=508&originWidth=1607&size=134938&status=done&style=none&width=1607)
```javascript
#ES集群节点类型
#Master: 控制整个集群,同步 Cluster State 整个集群的信息给其他的节点;
#Data: 存储数据的; node.master: false, node.data: true
#Coordinating: 路由节点; 是所有节点的默认角色; node.master: false node.data: false
#master-eligible:
3.1 Cluster State
Cluster State:集群相关的数据称为 cluster state;会存储在每个节点中,主要有如下信息:
1)节点信息,比如节点名称、节点连接地址等
2)索引信息,比如索引名称、索引配置信息等
3.2 Master
1.ES集群中只能有一个 master 节点,master节点用于控制整个集群的操作;
2.master 主要维护 Cluster State,当有新数据产生后,Master 会将最新的数据同步给其他 Node 节点;
3.master节点是通过选举产生的,可以通过 node.master: true 指定为Master节点。( 默认true )
当我们通过API创建索引 PUT /oldxu_index,Cluster State 则会发生变化,由 Master 同步至其他 Node 节点;
3.3 Data
1.存储数据的节点即为 data 节点,默认节点都是 data 类型,相关配置node.data: true( 默认为 true )
2.当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的节点,称为data节点;
3.4 Coordinating
1.处理请求的节点即为 coordinating 节点,该节点为所有节点的默认角色,不能取消
2. coordinating 节点主要将请求路由到正确的节点处理。比如创建索引的请求会由 coordinating 路由到 master 节点处理;当配置 node.master: false、node.data:false 则为 coordinating 节点
4.ES集群 分片 | 副本
###ES副本:
容错;保证数据的高可用; 实现读负载;
###ES分片:
保证数据均匀分布到各个节点;其依赖于某种特定的算法(hash取模);
shard = hash (routing) % number_of primary_shard
- 4.1 提高ES集群可用性
如何提高 ES 集群系统的可用性;有如下两个方面;
###1.服务可用性:
1)2个节点的情况下,允许其中1个节点停止服务;
2)多个节点的情况下,坏的节点不能超过集群一半以上;
####2.数据可用性:
1)通过副本 replication 解决,这样每个节点上都有完备的数据。
2)如下图所示,node2上是 oldxu_index 索引的一个完整副本数据。
4.2 增大ES集群的容量
###1.如何增大 ES 集群系统的容量;我们需要想办法将数据均匀分布在所有节点上;
引入分片 shard 解决;
###2.什么是分片,将一份完整数据分散为多个分片存储;
2.1 分片是 es 支持 Pb 级数据的基石
2.2 分片存储了索引的部分数据,可以分布在任意节点上
2.3 分片存在主分片和副本分片之分,副本分片主要用来实现数据的高可用
2.4 副本分片的数据由主分片同步,可以有多个,从而提高读取数据的吞吐量
注意:主分片数在索引创建时指定且后续不允许在更改;默认ES7分片数为1个
###3.如下图所示:在3个节点的集群中创建 oldxu_index 索引,指定3个分片,和1个副本;
创建命令 ;
PUT /oldxu_index
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
}
- 效果展示:
4.3 增加节点能否提高容量
#问题:目前一共有3个ES节点,如果此时增加一个新节点是否能提高 oldxu_index 索引数据容量?
Ps: 增加副本,增加容量????
答案︰不能,因为 oldxu_index只有3个分片,已经分布在3台节点上,那么新增的第四个节点对于oldxu_index而言是无法使用到的。所以也无法带来数据容量的提升;
4.4增加副本能否提高读性能
#问题︰目前一共有3个ES节点,如果增加副本数是否能提高oldxu_index的读吞吐量;
答案∶不能,因为新增的副本还是会分布在这node1、node2、node3这三个节点上的,还是使用了相同的资源,也就意味着有读请求来时,这些请求还是会分配到node1、node2、node3上进行处理、也就意味着,还是利用了相同的硬件资源,所以不会提升读取的吞吐量;
#问题∶如果需要增加读吞吐量性能,应该怎么来做;
答案︰增加读吞吐量还是需要添加节点,比如在增加三个节点node4、node5、node6
那么将原来的RO、R1、
R2分别迁移至新增的三个节点上,当有读请求来时会被分配node4、node5、node6,也就意味着有新的CPU、内存、o,这样就不会在占用node1、node2、node3的硬件资源,那么这个时候读吞吐量才会得到真正的提升;
4.5 副本与分片总结
分片数和副本的设定很重要,需要提前规划妊
- 过小会导致后续无法通过增加节点实现水平扩容﹔
- 设置分片过大会导致一个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能;
5.ES集群健康检查
5.1 如何判断集群状态
Cluster Health 获取集群的健康状态,整个集群状态包括以下三种:
1.green 健康状态,指所有主副分片都正常分配
2.yellow 指所有主分片都正常分配,但是有副本分片未正常分配
3.red 有主分片未分配,表示索引不完备,写可能有问题。(但不代表不能存储数据和读取数据)
5.2 如何获取集群状态
- 我们可以通过
GET _cluster/health?pretty=true
方式获取集群状态; - 通过cerebro开源软件图形化显示 ```javascript [root@es-node1-172 ~]# curl http://172.16.1.162:9200/_cluster/health?pretty=true { “cluster_name” : “my-oldxu”, “status” : “green”, # 重点关注status一栏,脚本处理 “timed_out” : false, “number_of_nodes” : 3, “number_of_data_nodes” : 3, “active_primary_shards” : 33, “active_shards” : 66, “relocating_shards” : 0, “initializing_shards” : 0, “unassigned_shards” : 0, “delayed_unassigned_shards” : 0, “number_of_pending_tasks” : 0, “number_of_in_flight_fetch” : 0, “task_max_waiting_in_queue_millis” : 0, “active_shards_percent_as_number” : 100.0
shell检测脚本
curl -s http://172.16.1.162:9200/_cluster/health?pretty=true | grep “status” |awk -F ‘“‘ ‘{print $4}’
<a name="S8fwP"></a>
# 6.ES集群故障转移
<a name="toc_54"></a>
### 6.1 什么是故障转移
```javascript
#所谓故障转移指的是,当集群中有节点发生故障时,这个集群是如何进行自动修复的。
ES集群目前是由3个节点组成,如下图所示,此时集群状态是 green
6.2 模拟节点故障
- 假设:node1所在机器宕机导致服务终止,此时集群会如何处理;大体分为三个步骤:
6.2.3 副本分片调整
node2
将 P0
和 P1
主分片重新生成新的副本分片 R0、R1
,此时集群状态变为 Green
;
7. ES文档路由原理
实际上,在ES 中,通过如下的公式计算文档对应的分片存储到哪个节点,计算公式如下:
shard = hash(routing) % number_of_primary_shards
# hash 算法保证将数据均匀分散在分片中
# routing 是一个关键参数,默认是文档id,也可以自定义。
# number_of_primary_shards 主分片数
# 注意:该算法与主分片数相关,一但确定后便不能更改主分片。
# 因为一旦修改主分片修改后,Share的计算就完全不一样了。
7.1 文档的创建,读取
7.3 文档批量创建,读取
8.ES扩展集群节点
8.1 节点扩展环境准备
主机名称 | IP地址 |
---|---|
es-node4 | 172.16.1.164 |
es-node5 | 172.16.1.165 |
ES节点扩展:
1.安装环境: java
2.安装ES组件:
3.配置ES组件:
8.2 节点扩展1配置
加入一个data节点:
[root@web01 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-app
node.name: node-4
node.master: false
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.0.0.7
http.port: 9200
discovery.seed_hosts: ["10.0.0.161", "10.0.0.162"]
加入一个路由节点:
[root@web02 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-app
node.name: node-5
node.master: false
node.data: false
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 10.0.0.8
http.port: 9200
discovery.seed_hosts: ["10.0.0.161"]
8.3 故障排除
- 如果第一次由于内存原因造成启动失败:
清除数据 : rm -rf /var/lib/elastciserach/*
- 如果配置希望将节点,设置为路由节点; 但之前是data节点,需要清理数据; 否则无法启动: ```javascript [root@web02 ~]# /usr/share/elasticsearch/bin/elasticsearch-node repurpose
WARNING: Elasticsearch MUST be stopped before running this tool.
Found 1 indices (1 shards and 1 index meta data) to clean up Use -v to see list of paths and indices affected Node is being re-purposed as no-master and no-data. Clean-up of index data will be performed. Do you want to proceed? Confirm [y/N] y Node successfully repurposed to no-master and no-data.
- 关于ES启动不起来的问题:
```javascript
#查看日志的方法,排除错误。
[root@web03 ~]# systemctl start elasticsearch.service; tailf /var/log/messages
8.4 节点扩展检查
通过 cerebor
检查集群扩展后的状态;如果出现集群无法加入、或者加入集群被拒绝,尝试删除 /var/lib/elasticsearch
下的文件,然后重启 es
;
- 如果没有索引数据,注意本地实践同步。