1. 没有日志分析工具之前,运维工作存在哪些痛点?
痛点1: 生产出现故障后,运维需要不停的查看各种不同的日志进行分析?
痛点2: 项目上线出现错误,如何快速定位问题?如果后端节点过多,日志分散怎么办?
痛点3: 开发人员需要实时查看日志但又不想给服务器的登陆权限,怎么办?难道每天帮开发取日志?
痛点4: 如何在海量的日志中快速的提取我们想要的数据?比如:PV, UV, TOP10的URL?如果分析的日志数据量大,那么势必会导致速度慢,难度增大,最终则会导致我们无法快速的获取到想要的指标
痛点5: cdn公司需要不停的分析,那分析说明?主要分析命中率,为什么?因为我们给用户承诺的命中率是90%上,如果没有达到90%,我们就要分析数据为什么没有被命中,为什么没有被缓存下来
2. 使用ELK日志分析系统之后
如上所有的痛点都可以使用日志分析系统ELK解决,通过ELK,将运维所有服务器日志,业务系统日志都收集到一个平台下,然后提取想要的内容,比如错误信息,警告信息等,当过滤到这种信息,就马上告警,告警后,运维人员就能马上定位是那台机器,哪个业务系统出现了问题,出现了什么问题。
3. ELK基础架构
E:elastcisearch 数据搜索 数据存储 java
L: Logstash 数据收集 ( 数据解析 数据转换 ) 数据输出 java
K: Kibana 数据分析 数据展示
4. EFK基础架构
E:elastcisearch 数据搜索 数据存储 java
L: Logstash 数据收集 ( 数据解析 数据转换 ) 数据输出 java
F: Filebeat 数据采集 (简单的数据处理 ) <--go
K: Kibana 数据分析 数据展示
5. 使用EFK收集那些日志?
容器: docker
代理: Haproxy, nginx
web: nginx , tomcat,httpd,php
db: mysql ,redis,mongo,elasticsesarch
存储: nfs,glusterfs,fastdfs
系统: message,security
业务: app
6. ES基本介绍
6.1 什么是Elasticsearch?
Elasticsearch 是一个分布式,RESTful(curl命令操作系统) 风格的搜索和数据分析引擎
6.2 Elasticsearch 主要功能
数据存储,数据搜索,数据分析
6.3 Elasticsearch 术语:文档Document
Document 文档就是用户存在es中的一些数据,他是es 存储的最小单元(类似与Table中的一行数据)**
注意:每个文档都有一个唯一的id表示,可以自行指定,如果不指定es会自动生成
6.4 Elasticsearch 术语:索引index
索引其实是一堆文档Document的集合(他类似于数据库中的一个table)
6.5 Elasticsearch 术语:索引 字段filed
在ES中,Document就是一个Json object,一个Json object其实是由多个字段组成的,每个字段它有不同的数据类型
字符串:text(不分词),keyword(分词)
数值型:long,intrger,short,byte,double,float
布尔:boolean
日期:date
二进制:binary
范围类型:integer_range,float_range,long_range,double_range,date_range
6.6 ES索引,文档,字段关系小结
一个索引里面存储了很多的Document文档,一个文档就是json object,一个json object是由多个不同或相同的filied字段组成
6.7 ES操作方式
ES的操作和我们传统的数据库操作不太一样,它是通过RestfulAPI方式进行对ES进行操作,其实本质上就是通过httpd的方式去变更我们的资源状态
通过URL的方式指定要操作的资源,比如 index,Document等。
通过http Method 指明资源操作方法,如GET,POST,PUT,DELETE 等
常见的ES的两种方式:curl 命令行,kibna,DEVTools
6.8 ES单机安装
1. 安装java环境
[root@es-node1 ~]# yum install java -y
[root@es-node1 ~]# rpm -qa java*
javapackages-tools-3.4.1-11.el7.noarch
java-1.8.0-openjdk-headless-1.8.0.232.b09-0.el7_7.x86_64
java-1.8.0-openjdk-1.8.0.232.b09-0.el7_7.x86_64
2. 安装elasticsearch-7.4
[root@es-node1 ~]# rpm -ivh elasticsearch-7.4.0-x86_64.rpm kibana-7.4.0-x86_64.rpm
3. 修改jvm配置
[root@es-node1 ~]# vim /etc/elasticsearch/jvm.options
-Xms512m
-Xmx512m #实验环境 生产环境最少内存一半以上 官方建议最高32Gb
4. 启动elasticsearch并设置开机自启
[root@es-node1 ~]# systemctl start elasticsearch.service
[root@es-node1 ~]# systemctl enable elasticsearch.service
5. 检查端口
[root@es-node1 ~]# netstat -lntup
tcp6 0 0 :::9200 :::*
6. 使用curl测试
[root@exs-node1 ~]# curl 127.0.0.1:9200
{
"name" : "es-node1",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "ssdT5FrjQzGYOWCJLFRZ7w",
"version" : {
"number" : "7.4.0",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "22e1767283e61a198cb4db791ea66e3f11ab9910",
"build_date" : "2019-09-27T08:36:48.569419Z",
"build_snapshot" : false,
"lucene_version" : "8.2.0",
"minimum_wire_compatibility_version" : "6.8.0",
"minimum_index_compatibility_version" : "6.0.0-beta1"
},
"tagline" : "You Know, for Search"
}
7. 修改kibana的配置
[root@es-node1 ~]# vim /etc/kibana/kibana.yml
server.host: "0.0.0.0"
i18n.locale: "zh-CN"
8. 启动kibana
[root@es-node1 ~]# systemctl start kibana.service
[root@es-node1 ~]# systemctl enable kibana.service
9. 通过http://10.0.0.161:5601 访问kibana
6.9 ES 索引API
es 有专门的index api,用于创建,更新,删除所有配置等
1. 创建一个索引
PUT /chengyinwu_es
2. 查看所有的索引
GET _cat/indices
3. 删除索引
DELETE /chengyinwu_es
4.给chengyinwu_es索引录入一个文档
POST /tt/_doc/2
{
"name": "chengyinwu",
"age": 18,
"salary": 1000000000
}
POST /chengyinwu_es/_doc/2
{
"name": "cheng",
"age": 35,
"salary": 100
}
5.获取所有的文档 默认前10个
GET /chengyinwu_es/_search
6.获取指定的id数据
GET /chengyinwu_es/_doc/1
7.模糊查询
GET /chengyinwu_es/_search
{
"query": {
"term": {
"name": "chengyinwu"
}
}
}
8.删除指定id的文档
DELETE /chengyinwu_es/_doc/1
9.批量创建文档(es 容许通过_bulk一次创建多个文档,从而减少网络传输开销,提升写入速率)
POST _bulk
{"index":{"_index":"tt","_id":"1"}}
{"name":"chengyinwu","age":"18"}
{"create":{"_index":"tt","_id":"2"}}
{"name":"baozexu","age":"30"}
{"delete":{"_index":"tt","_id":"2"}}
{"update":{"_id":"1","_index":"tt"}}
{"doc":{"age":"20"}}
10.一次查询多个文档
GET _mget
{
"docs": [
{
"_index": "tt",
"_id": "1"
},
{
"_index": "tt",
"_id": "2"
}
]
}
7. ES集群基本介绍
7.1 es 支持集群模式,是一个分布式系统,其好处有
1.增大系统的容量,如内存,磁盘,使得es集群可以支持PB级的数据
2.提高系统可用性,即使部分节点停止服务,整个集群依然可以正常服务
7.2 es集群如何组成
ELasticsearch 集群是由多个节点组成的,通过clueter.name 设置集群名称,用于区分其他集群,每个节点通过node.name 指定节点的名称
7.3 ES集群环境部署
1. 环境规划:
主机名 | IP地址 | 配置 |
---|---|---|
es-node1 | 10.0.0.161 | 2C4G |
es-node2 | 10.0.0.162 | 2C4G |
es-node3 | 10.0.0.163 | 2C4G |
2. 集群部署:
1. 所有节点操作:
yum install java
rpm -ivh elasticsearch-7.4.0-x86_64.rpm
2. 删除所有的es相关的数据 (不然会出现集群无法组件的情况)
[root@es-node1 ~]# rm -rf /var/lib/elasticsearch/*
[root@es-node1 ~]# systemctl stop elasticsearch.service
[root@es-node1 ~]# systemctl stop kibana
3. 配置node1
[root@es-node1 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-chengyinwu
node.name: node1
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
cluster.initial_master_nodes: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
4. 拷贝文件至另外两台机器
scp -rp /etc/elasticsearch/elasticsearch.yml root@172.16.1.162:/etc/elasticsearch/elasticsearch.yml
scp -rp /etc/elasticsearch/elasticsearch.yml root@172.16.1.163:/etc/elasticsearch/elasticsearch.yml
5. 同时拷贝jvm文件至另外两台机器
scp /etc/elasticsearch/jvm.options root@172.16.1.162:/etc/elasticsearch/jvm.options
scp /etc/elasticsearch/jvm.options root@172.16.1.163:/etc/elasticsearch/jvm.options
6. 配置node2
[root@es-node2 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-chengyinwu
node.name: node2
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
cluster.initial_master_nodes: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
7. 配置node3
[root@es-node3 ~]# grep "^[a-Z]" /etc/elasticsearch/elasticsearch.yml
cluster.name: my-chengyinwu
node.name: node3
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
cluster.initial_master_nodes: ["172.16.1.161", "172.16.1.162", "172.16.1.163"]
8. 启动所有节点
systemctl start elasticsearch
9. 通过 curl 检查集群环境是否正常
curl http://172.16.1.163:9200/_cluster/health?pretty
10. kibana 检查集群环境是否正常
GET /_cluster_health
11. cerebro 插件来检查整个集群的环境;默认监听9000端口
安装:
[root@es-node1 ~]# rpm -ivh cerebro-0.8.5-1.noarch.rpm
修改配置文件:
[root@es-node1 ~]# vim /etc/cerebro/application.conf
data.path = "/tmp/cerebro.db"
启动cerebro
[root@es-node1 ~]# systemctl start cerebro
[root@es-node1 ~]# systemctl enable cerebro
8. ES节点类型
8.1 es集群中节点类型介绍
cluster state
master
Date
coordinating
8.2 cluster state :ES 集群相关的数据称为cluster state,主要记录如下信息:
1.节点信息,比如节点名称、节点连接地址等
2.索引信息,比如索引名称、索引配置信息等
8.3 master 节点
1.es集群中只能有一个master书点, master节点用于控制整个集群的操作。
2.我们的cluster state存储在每个节点上,但只能由master维护最新版本并同步给其他节点。
3.master节点是通过集群中所有节点选举产生的,(10.0.0.161,10.0.0.162,10.0.0.163)可以通node.master: true (默认为true)
8.4 Data节点----(所有都默认为true)---->是用来存储数据的
1.存储数据的书点即为data节点,默认节点都是data类型,相关配置node .data: true (默认为true )
2.当创建索引后,索引创建的数据会存储至某个节点,能够存储数据的书点,称为data节点。
8.5 Coordinating节点
1.处理请求的节点即为coordinating节点,该节点为所有节点的默认角色,不能取消。
2.coordinating节点主要将请求路由到正确的节点处理,比如创建索引的请求路由到master节点.
8.6 es 节点类型总结
master角色: 负责控制整个集群的操作, 通过cluter_status状态维护集群.
选举: cluster.initial_master_nodes master-eligible
可以不参与选举: node.master: false cluster_state: 节点信息 索引信息
data角色: 存储数据 (默认都是data节点) 关闭data: node.data: false
coordinating角色 : 负责路由 不能取消
9. ES集群分片副本
9.1 如何提高es集群系统的可用性?
1.服务可用性:
(1) 2个节点的情况下,允许其中1个节点停止服务
(2)多个节点的情况下,坏节点不能超过一半以上
2.数据可用性:
(1)副本(replication)解决,这样每个节点上都有完备的数据。
(2) 服务可用性如下图所示, node2_上是chengyinwu_ index索引的一个完整副本数据。
9.2 如何增大es集群系统的容量
1.如何将数据分布所有节点上?
(1)引入分片(shard )解决问题
2.什么是分片,分片是es.支持Pb级数据的基石
(2)分片存储了索引的部分数据,可以分布在任意节点上
(3)分片存在主分片和副本分片之分,副本分片主要用来实现数据的高可用
(4)副本分片的数据由主分片同步,可以有多个,从而提高读取数据的吞吐量
(5)注意:主分片数在索引创建时指定且后续不允许在更改,默认ES7分片数为1个
3.如下图所示:在3个节点的集群中创建chengyinwu_index 索引,指定3个分片,和1个副本。(cerebro创建测试)
9.3 目前一共有3 ES节点,如果此时增加一个新节点是否能提高chengyinwu_ index 索引数据容量
不能,因为chengyinwu_ index 只有3个分片,已经分布在3台节点上,那么新增的第四个节点对于
oldxu_index而言是无法使用到的。所以也无法带来数据容量的提升。
9.4 目前- -共有3个ES节点,如果增加副本数是否能提高chengyinwu_ index 的读吞量?
不能,因为新增的副本还是会分布在这node1、node2、 node3、 这三个节点上的,还是使用了相
同的资源,也就意味着有读请求来时,这些请求还是会分配到hode1、node2、 node3. 上进行处
理也就意味着,还是利用了相同的硬件资源,所以不会提升读取的吞吐量。
9.5 如果要需要增加读吞吐量,怎么办?
增加读吞吐量还是需要添加书点,比如在增加三个节点node4、node5、 node6 ,那么将原来
的R0、R1、 R2分别迁移至新增的三个节点上,当有读请求来时会被分配node4、node5、
node6 ,也就意味着有新的CPU、内存、I0 ,这样就不会在占用hode1、node2、 node3的硬件资源,那么这个时候读吞吐量才会得到真正的提升。
总结:分片数和副本的设定很重要,需要提前规划好
1.过小会导致后续无法通过增加节点实现水平打容
2.设置分片过大会导致一 个节点上分布过多的分片,造成资源浪费。分片过多也会影响查询性能。
10 .ES集群健康检查
Cluster Health获取集群的健康状态,整个集群状态包括以下三种:
1 ) green健康状态,指所有主副分片都正常分配
2 ) yellow指所有主分片都正常分配,但是有副本分片未正常分配
3 )red有主分片未分配,表示索引不完备,写也可能有问题。 (但不代表不能存储数据和读取数据)
4 )可以通过GET_cluster/health?pretty=true 方式获取集群状态
实战1 : 通过Shell脚本获取集群状态信息
curl http://172.16.1.163:9200/_cluster/health? pretty=true
{
"cluster_name" : "my-chengyinwu",
"status" : "green",
"timed_out" : false,
"number_of_nodes" : 3,
"number_of_data_nodes" : 3,
"active_primary_shards" : 4,
"active_shards" : 8,
"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
}
11 .ES集群故障转移
所谓故障转移指的是,当集群中有节点发生故障时,这个集群是如何进行自动修复的。
ES集群是由3个节点组成,如下图所示,此时集群状态是green
11.1 假设: node1所在机器宕机导致服务终止,此时集群会如何处理?
1.node2和node3发现node 1无法响应一段时间后会发起master选举 ,比如这里选择node2为
master节点。此时集群状态变为Red。
2.node2发现主分片P0未分配,将node3_上的R0提升为主分片。此时由于所有的主分片都正常分
配,集群状态变为Yellow。
3.Node2将P0和P1生成新的副本R0、R1 ,此时集群状态变为Gree
12. ES文档路由原理(重要)
ES文档分布式存储,当-一个文档存储至ES集群时,存储的原理是什么样的?
如图所示,当我们想一个集群保存文档时, Document1是如何存储到分片P1的?选择P1的依据是什么?
其实是有一个文档到分片的映射算法,其目是使所有文档均匀分布在所有的分片上,那么是什么
算法呢?随机还是轮询呢?这种是不可取的,因为数据存储后,还需要读取,那这样的话如何读
取呢?
实际上,在ES中,通过如下的公式计算文档对应的分片存储到哪个书点,计算公式如下
shard = hash(routing) % number_ of_ primary_ _shards
# hash 算法保证将数据均匀分散在分片中
# routing 是一个关键参数,默认是文档id,也可以自定义。
# number_ of_ primary_ shards 主分片数
#注意:该算法与主分片数相关,一但确定后便不能更改主分片。
#因为一旦修改主分片修改后,Share的计算就完全不一样了。
13 .文档的创建读取原理
13.1文档创建流程
13.2 文档的读取流程
13.3 文档批量创建的流程?
13.4.文档批量读取的流程?
14.添加(扩展集群)节点
环境:web01: 10.0.0.7 web02: 10.0.0.8 内存2G 内核1G
将elasticsearch-7.4.0-x86_64.rpm上传至家目录
两台服务器均执行:
[root@web02 ~]# yum install java -y
[root@web02 ~]# rpm -ivh elasticsearch-7.4.0-x86_64.rpm
[root@web01 ~]# vim /etc/elasticsearch/elasticsearch.yml
[root@web01 ~]# grep '^[a-Z]' /etc/elasticsearch/elasticsearch.yml
cluster.name: my-oldxu
node.name: node4
node.master: false
node.data: true
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
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-oldxu
node.name: node5
node.master: false
node.data: false
path.data: /var/lib/elasticsearch
path.logs: /var/log/elasticsearch
network.host: 0.0.0.0
http.port: 9200
discovery.seed_hosts: ["10.0.0.161", "10.0.0.162"]
[root@web01 ~]# vim /etc/elasticsearch/jvm.options
......
# Xmx represents the maximum size of total heap space
-Xms512m
-Xmx512m
......
[root@web01 ~]# tail -f /var/log/elasticsearch/my-oldxu.log
systemctl stop elasticsearch.service
systemctl start elasticsearch.service