资料: EFK日志收集系统概述.html


1.ELK诞生背景:
痛点:

  1. 出现故障,要排查的日志非常的多,没有办法很快定位;
  2. 统计TOP,PV,UV,IP信息;awk无法满足需求;| elkstack |[在线活跃用户,订单交易金额;]

金额:
l.app业务日志;
2.通过数据库统计;

  1. 其他;

    1.ELK介绍:

    其实 ELK 不是一个单独的技术,而是一套技术的组合,是由 elasticsearch、logstash、kibana 组合而成的。
    ELK 是一套开源免费、功能强大的日志分析管理系统。ELK 可以将我们的系统日志、网站日志、应用系统日志等各种__日志进行收集、过滤、清洗,然后进行集中存放并可用于实时检索、分析。
  • E: elasticsearch 数据存储;
  • L: logstash 数据采集、数据清洗、数据过滤;
  • K: kibana 数据分析、数据展示

- ELK架构
image.png
image.png
image.png

  1. ELK收集哪些;
  2. 系统日志; Nginx日志;DB日志; App日志;
  3. 一种格式 #搜集示例:
  4. 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 会自动生成。
image.png

1.3.2索引lndex

索引其实是一堆文档Document 的集合。(它类似数据库的中的一个表)
image.png

1.3.3字段Filed

在Es 中,Document 就是一个json Object,一个json object其实是由多个字段组成的,每个字段它有不同的数据类型。
image.png

  1. 1.—条记录,算一行数据,
  2. 2多行数据组织在一起,有表来统一管理,
  3. 3.一行记录会有多个不同的字段,
  4. 多个不同的字段,组成了一行记录,而多行记录组成了一张表';

1.4 ES术语总结 ✨

image.png

2.ES的安装

各个组件控制在相同版本

elasticsearch安装

  1. 下载: https://mirrors.huaweicloud.com/elasticsearch/
  2. 配置:#注意内存的大小,容易触发oom(2G以上) ----> 生产中32G,官方申明32G以上会影响性能
  3. yum install java -y
  4. [root@es-node1 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
  5. cluster.name: my-app
  6. node.name: node-1
  7. path.data: /var/lib/elasticsearch
  8. path.logs: /var/log/elasticsearch
  9. network.host: 10.0.0.161
  10. http.port: 9200

kibana安装

  1. [root@es-node1 ~]# rpm -ivh kibana-7.4.0-x86_64.rpm
  2. #配置kibana
  3. [root@kibana ~]# grep "^[a-Z]" /etc/kibana/kibana.yml
  4. server.port: 5601 #kibana默认监听端口
  5. server.host: "0.0.0.0" #kibana监听地址段
  6. elasticsearch.hosts: ["http://localhost:9200"] #kibanacoordinating节点获取数据
  7. i18n.locale: "zh-CN" #kibana汉化
  8. #通过IP+端口 连接多个节点的ES
  9. #Ps: elasticsearch.hosts: ["http://10.0.0.161:9200","http://10.0.0.162:9200","http://10.0.0.163:9200"]
  10. #启动kibana
  11. [root@kibana ~]# systemctl start kibana
  12. [root@kibana ~]# systemctl enable kibana

2.ES操作方式✨

图形界面操作:
使用kibana简单操作el的doc.png

  • 代码: ```javascript

    操作ES,索引API

    创建

    PUT /hsping_index

查看

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

  1. <a name="Z7476"></a>
  2. # 3.ES集群基本介绍
  3. <a name="EtK0v"></a>
  4. ## 3.1 ES集群的好处
  5. <a name="toc_29"></a>
  6. ### 1.1 ES集群的好处
  7. - es天然支持集群模式,其好处主要有两个:
  8. - 1.能够增大系统的容量,如内存、磁盘,使得 `es` 集群可以支持PB级的数据;
  9. - 2.能够提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务;
  10. <a name="qf2ty"></a>
  11. ## 3.2 ES如何组集群
  12. ELasticsearch集群是由多个节点组成的,通过cluster.name设置集群名称,并且用于区分其它的集群,每个节点通过node.name指定节点的名称。
  13. - 单节点:
  14. ![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)
  15. - 集群
  16. ![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)
  17. <a name="hGjcb"></a>
  18. ## 3.3.ES集群环境部著
  19. - 集群规划(elasticSearch )
  20. ```javascript
  21. ####ip地址规划:
  22. #ES:
  23. 10.0.0.161 <--Kibanna
  24. 10.0.0.162
  25. 10.0.0.163
  26. #Logstash:
  27. 10.0.0.151
  28. 10.0.0.152
  29. #Kakfa:
  30. 10.0.0.141
  31. 10.0.0.142
  32. 10.0.0.143
  33. #nginx tomcat mysql 集群:
  34. 一套业务环境:
  35. 1.监控
  36. 2.代码发布
  37. 3.日志
  38. 4.性能
  39. 5.安全
  40. e: 数据存储 --->
  41. f: filebeat
  42. l: 数据采集\数据过滤
  43. k: 分析\出图\
  44. redis\kafka:
  45. filebeat module
  • 所有集群节点都需要安装Es 软件
    # yum install java -y
    # rpm -ivh elasticsearch-7.4.0-x86_64.rpm
    
    2.3 node1集群节点配置
    [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"]
    
    Ps: 后续如何扩展节点?

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 索引的一个完整副本数据。

image.png

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个副本;

image.png
创建命令 ;



PUT /oldxu_index
{
    "settings": {
      "index": {
        "number_of_shards": 3,
        "number_of_replicas": 1
      }
  }
}
  • 效果展示:

image.png

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 如何获取集群状态

  1. 我们可以通过 GET _cluster/health?pretty=true 方式获取集群状态;
  2. 通过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

image.png

6.2 模拟节点故障

  • 假设:node1所在机器宕机导致服务终止,此时集群会如何处理;大体分为三个步骤:
    • 1.重新选举
    • 2.主分片调整
    • 3.副本分片调整

      6.2.1 重新选举

      node2node3 发现 node1 无法响应;一段时间后会发起 master 选举,比如这里选择 node2master 节点;此时集群状态变为 Red 状态;
      image.png

      6.2.2 主分片调整

      node2 发现主分片 P0 未分配,将 node3 上的 R0 提升为主分片;此时所有的主分片都正常分配,集群状态变为 Yellow状态;
      image.png

6.2.3 副本分片调整

node2P0P1 主分片重新生成新的副本分片 R0、R1,此时集群状态变为 Green
image.png


7. ES文档路由原理

实际上,在ES 中,通过如下的公式计算文档对应的分片存储到哪个节点,计算公式如下:
image.png

shard = hash(routing) % number_of_primary_shards
# hash                      算法保证将数据均匀分散在分片中
# routing                   是一个关键参数,默认是文档id,也可以自定义。
# number_of_primary_shards  主分片数

# 注意:该算法与主分片数相关,一但确定后便不能更改主分片。
# 因为一旦修改主分片修改后,Share的计算就完全不一样了。

7.1 文档的创建,读取

image.png
image.png

7.3 文档批量创建,读取

image.png
image.png

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
image.png

  • 如果没有索引数据,注意本地实践同步。