主要内容:
了解ELK分布式日志分析系统、Elasticsearch分布式集群搭建、Kibana搭建、使用kibana展示数据;
一、日志分析系统ELK概述
ELK 是 Elasticsearch、Logstash 和 Kibana 的缩写,是三款软件都是开源软件,通常是配合使用,而且又先后归于Elastic.co公司名下,故被简称为ELK,是一个流行的开源日志分析和管理系统。ELK 栈通常用于集中化日志收集、存储、搜索和可视化,广泛应用于各种规模的企业和组织。
1、ELK栈的开源软件
1)Elasticsearch(负责日志检索和存储)
- 分布式搜索引擎:Elasticsearch 是一个基于 Lucene 的分布式搜索引擎,用于存储和检索大量数据。
- 实时搜索:支持实时搜索和分析,能够快速处理和查询大量日志数据。
- 高可用性:通过分片和副本机制提供高可用性和容错能力。
2)Logstash(负责日志的收集和分析、处理)
- 数据收集和处理:Logstash 是一个数据收集引擎,可以从各种来源(如日志文件、数据库、消息队列等)收集数据,并进行处理和转换。
- 插件支持:Logstash 支持丰富的插件,可以处理各种数据格式和协议。
- 数据管道:Logstash 通过输入、过滤和输出插件构建数据管道,将数据从源传输到目标(如 Elasticsearch)。
3)Kibana(负责日志的可视化)
- 数据可视化:Kibana 是一个基于 Web 的界面,用于可视化和分析存储在 Elasticsearch 中的数据。
- 仪表盘:支持创建自定义仪表盘,用于监控和分析日志数据。
- 搜索和过滤:提供强大的搜索和过滤功能,帮助用户快速定位和分析特定日志。
2、ELK 栈的工作流程
① 数据收集:Logstash 从各种来源收集日志数据。数据可以是结构化的(如 JSON)或非结构化的(如文本日志)。
② 数据处理:Logstash 对收集到的数据进行处理和转换,如解析、过滤、格式化等。处理后的数据被发送到 Elasticsearch。
③ 数据存储:Elasticsearch 存储处理后的数据,并提供高效的搜索和分析功能。
④ 数据可视化:Kibana 从 Elasticsearch 中检索数据,并将其可视化为图表、仪表盘等。用户可以通过 Kibana 界面进行搜索、过滤和分析。
3、ELK 栈的应用场景
- 集中化日志管理:ELK 栈提供了一个集中化的平台,用于收集、存储和分析各种来源的日志数据。
- 实时分析:支持实时数据处理和分析,帮助用户快速发现和解决问题。
- 可扩展性:ELK 栈具有良好的可扩展性,可以处理从小型到大型企业的日志数据。
- 开源和社区支持:ELK 栈是开源的,拥有庞大的社区支持,提供了丰富的文档和插件。
ELK组件在海量日志系统的运维中,可用于解决:
① 日志管理:用于集中化管理和分析应用程序、服务器和网络设备的日志
② 监控和告警:通过 Kibana 创建仪表盘和告警规则,实时监控系统状态,包含系统硬件和应用各个组件的监控
③ 故障排除:通过分析告警日志,排查故障情况
④ 安全分析:用于分析安全日志,检测和响应潜在的安全威胁
⑤ 业务分析:通过分析业务日志,获取业务洞察和优化建议
相比Zabbix监控,ELK解决的是在运行过程中的日志分析处理
二、Elasticsearch 部署
Elasticsearch 是一个基于Apache Lucene构建的搜索服务器,它提供了一个分布式多用户能力的全文搜索引擎,基于RESTfulAPI的Web接口且用Java开发的,使用Apache许可条款的开源软件,是当前流行的企业级搜索引擎,广泛用于构建实时搜索和分析应用程序,提供了强大的全文搜索、结构化搜索、分析和可视化功能。在云计算中能够达到实时搜索、稳定、可靠、快速,安装使用方便(支持集群的数据库)
核心功能:
- 分布式存储和搜索:Elasticsearch 将数据分布在多个节点上,提供高可用性和容错能力。数据被分成多个分片(shards),每个分片可以有多个副本(replicas)
- 实时搜索和分析:支持实时数据索引和查询,能够快速响应搜索请求
- 全文搜索:提供强大的全文搜索功能,支持多种查询类型(如布尔查询、模糊查询、范围查询等)
- 结构化搜索:支持对结构化数据(如 JSON 文档)进行搜索和过滤
- 分析和聚合:提供丰富的聚合功能,用于数据分析和统计
关键概念:
① Node(节点)
定义:Node 是装有一个 Elasticsearch 服务器的节点。每个节点可以运行 Elasticsearch 实例,并参与集群中的数据存储和查询处理。
角色:节点可以承担不同的角色,如主节点(Master Node)、数据节点(Data Node)、协调节点(Coordinating Node)等。
② Cluster(集群)
定义:Cluster 是由多个 Node 组成的集群。集群中的节点协同工作,提供高可用性和容错能力。
特点:集群中的所有节点共享相同的集群名称,并通过内部通信协议协调工作。
③ Index(索引)
定义:Index 是拥有相似特征的文档的集合,相当于关系数据库中的“库”级别。每个索引由多个分片(Shards)组成。
用途:索引用于组织和存储文档,并提供高效的搜索和分析功能。
④ Type(类型)
定义:Type 是一个索引中可以定义的一种或多种类型,相当于关系数据库中的“表”级别。每个 Type 定义了文档的字段和映射。
注意:在 Elasticsearch 6.x 及之前的版本中,Type 是一个重要的概念。但从 Elasticsearch 7.x 开始,Type 被废弃,建议每个索引只包含一种 Type(通常是 _doc)。
⑤ Document(文档)
定义:Document 是一个可被搜索的基础信息单元,相当于关系数据库中的“行”级别。每个文档以 JSON 格式存储,并包含多个字段。
用途:文档是 Elasticsearch 中的基本数据单元,用于存储和检索数据。
⑥ Field(字段)
定义:Field 是 Elasticsearch 的最小单位,相当于关系数据库中的“列”级别。每个字段包含一个值,并具有特定的数据类型。
用途:字段用于定义文档的结构和内容,支持多种数据类型(如字符串、数字、日期等)。
⑦ Shard(分片)
定义:Shard 是索引的分片,每一个分片就是一个 Shard。分片是索引的物理存储单元,分为主要分片(Primary Shard)和副本分片(Replica Shard)。
用途:分片用于分布式存储和搜索,提供高可用性和可扩展性。
⑧ Replica(副本)
定义:Replica 是索引的拷贝(副本),用于提供冗余和高可用性。每个主要分片可以有多个副本分片。
用途:副本分片用于在节点故障时提供数据冗余和查询负载均衡。
- 配置文件:/etc/elasticsearch/elasticsearch.yml
- 默认监听端口:9200、9300
— 与关系型数据库对比:(数据组织存放方式)
部署Elasticsearch示例:
步骤1:准备环境
① 在跳板机上配置YUM仓库
# 拷贝云盘rpm-package/elk目录西的软件包到跳板机的YUM库
[root@ecs-proxy ~]# ls /root/elk/
[root@ecs-proxy ~]# cp -r /root/elk/ /var/ftp/localrepo/
[root@ecs-proxy ~]# cd /var/ftp/localrepo/
[root@ecs-proxy localrepo]# createrepo --update . //更新repodata索引
② 购买5台云主机
主机名称 |
IP地址 |
相关配置 |
es-0001 |
192.168.1.41 |
最低配置2核4G |
es-0002 |
192.168.1.42 |
最低配置2核4G |
es-0003 |
192.168.1.43 |
最低配置2核4G |
es-0004 |
192.168.1.44 |
最低配置2核4G |
es-0005 |
192.168.1.45 |
最低配置2核4G |
步骤2: Elasticsearch单台安装(es-0001操作)
① 配置主机名解析
[root@es-0001 ~]# vim /etc/hosts
192.168.1.41 es-0001
② 部署JAVA环境,并安装elasticsearch软件包
[root@es-0001 ~]# yum makecache
[root@es-0001 ~]# yum install -y java-1.8.0-openjdk elasticsearch
③ 修改配置文件(绑定监听地址),并启动服务
[root@es-0001 ~]# vim /etc/elasticsearch/elasticsearch.yml
55: network.host: 0.0.0.0 //监听所有地址
...
[root@es-0001 ~]# systemctl enable --now elasticsearch
[root@es-0001 ~]# ss -nlptu | grep java
tcp LISTEN 0 1024 [::]:9200 [::]:* users:(("java",pid=1415,fd=211))
tcp LISTEN 0 1024 [::]:9300 [::]:* users:(("java",pid=1415,fd=197))
④ 测试访问ES服务,返回Json数据
[root@es-0001 ~]# curl http://192.168.1.41:9200
{
"name" : "DfcPm5Z",
"cluster_name" : "elasticsearch",
"cluster_uuid" : "MiKERjndTxqpI1vWSJubxg",
"version" : {
"number" : "6.8.8",
"build_flavor" : "default",
"build_type" : "rpm",
"build_hash" : "2f4c224",
"build_date" : "2020-03-18T23:22:18.622755Z",
"build_snapshot" : false,
"lucene_version" : "7.7.2",
"minimum_wire_compatibility_version" : "5.6.0",
"minimum_index_compatibility_version" : "5.0.0"
},
"tagline" : "You Know, for Search"
}
Elasticsearch集群配置流程,需要在集群的所有节点上完成以下配置:
① 配置YUM源(安装java-openjdk、elasticsearch)
② 配置主机名解析,保证所有节点可以互相ping通
③ 安装JAVA环境和软件包
④ 修改配置文件 /etc/elasticsearch/elasticsearch.yml
- cluster.name: 集群名称 //集群名称
- node.name: 本机主机名 //在集群中识别不同主机名(需要能Ping通,且不能重名)
- network.host: 0.0.0.0 //监听地址
- discovery.zen.ping.unicast.hosts: ["host1", "host2"] //添加几个集群成员,用来引导集群,自动发现模块(Ping方式)
⑤ 开启并验证服务(http://任意节点IP:9200/_cluster/health?pertty)
- status: //表示集群状态,(绿色正常、黄色有问题、红色故障)
- number_of_nodes: //表示集群中节点的数量
- number_of_data_nodes: //表示存储数据节点的数量
步骤3:Elasticsearch集群安装(es-0001、es-0002、es-0003、es-0004、es-0005操作)
① 配置SSH免密登录
[root@es-0001 ~]# ssh-keygen -f /root/.ssh/id_rsa -N ''
[root@es-0001 ~]# for i in {41..45}
> do
> ssh-copy-id root@192.168.1.$i
> done
② 配置主机名解析文件
[root@es-0001 ~]# vim /etc/hosts
192.168.1.41 es-0001
192.168.1.42 es-0002
192.168.1.43 es-0003
192.168.1.44 es-0004
192.168.1.45 es-0005
[root@es-0001 ~]# for i in {42..45}
> do
> scp /etc/hosts root@192.168.1.$i:/etc/
> done
③ 为其它节点主机安装软件包
[root@es-0001 ~]# for i in {42..45}
> do
> ssh root@192.168.1.$i "yum makecache && yum install -y java-1.8.0-openjdk elasticsearch"
> done
④ 修改配置文件,设置为集群模式(以es-0001为例)
[root@es-0001 ~]# vim /etc/elasticsearch/elasticsearch.yml
17: cluster.name: my-es //集群名
23: node.name: es-0001 //本机主机名
55: network.host: 0.0.0.0 //监听地址
68: discovery.zen.ping.unicast.hosts: ["es-0001", "es-0002"] //集群成员,指定主机名
[root@es-0001 ~]# for i in {42..45}
> do
> rsync -av /etc/elasticsearch/elasticsearch.yml root@192.168.1.$i:/etc/elasticsearch/
> done
[root@es-0001 ~]# ssh 192.168.1.42
[root@es-0002 ~]# vim /etc/elasticsearch/elasticsearch.yml
23: node.name: es-0002 //本机主机名
[root@es-0001 ~]# ssh 192.168.1.43
[root@es-0003 ~]# vim /etc/elasticsearch/elasticsearch.yml
23: node.name: es-0003 //本机主机名
[root@es-0001 ~]# ssh 192.168.1.44
[root@es-0004 ~]# vim /etc/elasticsearch/elasticsearch.yml
23: node.name: es-0004 //本机主机名
[root@es-0001 ~]# ssh 192.168.1.45
[root@es-0005 ~]# vim /etc/elasticsearch/elasticsearch.yml
23: node.name: es-0005 //本机主机名
⑤ 开启并验证服务
[root@es-0001 ~]# for i in {42..45}
> do
> ssh root@192.168.1.$i "systemctl enable --now elasticsearch"
> done
[root@es-0001 ~]# systemctl restart elasticsearch //重启本机服务
[root@es-0001 ~]# 21. //查看集群状态
{
"cluster_name" : "my-es",
"status" : "green", //集群状态
"timed_out" : false,
"number_of_nodes" : 5, //集群中节点的数量
"number_of_data_nodes" : 5, //用于存储数据节点数量
"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
}
三、集群配置管理
1、Head插件简介
Head 插件是一个用于 Elasticsearch 的 Web 前端插件,它提供了一个用户友好的界面,用于查看和管理 Elasticsearch 集群的拓扑架构、索引、节点和集群状态。如图所示:
集群拓扑架构展示
- 节点和分片分布:Head 插件可以展示集群中各个节点的分布情况,以及每个索引的分片和副本的分布情况。
- 节点状态:显示每个节点的状态(如主节点、数据节点、协调节点等)和健康状况。
索引和节点级别的操作
- 索引管理:可以通过 Head 插件创建、删除、查看和修改索引的设置和映射。
- 节点操作:查看节点的详细信息,如内存使用情况、分片分配情况等。
查询API
- 查询接口:Head 插件提供了一组针对集群的查询 API,用户可以通过界面直接输入查询语句进行搜索和分析。
- 结果展示:查询结果以 JSON 和表格形式返回,方便用户查看和分析。
集群状态展示
- 集群健康状态:显示集群的整体健康状态,如绿色(健康)、黄色(部分分片不可用)、红色(部分分片丢失)。
- 快捷菜单:提供快捷菜单,用于查看集群的各种状态,如索引状态、节点状态、分片状态等。
其他功能
- 文档操作:支持对文档的增删改查操作,用户可以通过界面直接操作文档。
- 实时监控:提供实时的集群状态监控,帮助用户及时发现和解决问题。
HEAD 插件原理图:
第一步:用户请求WEB服务的Head插件获取页面;
第二部:用户通过Head获取的页面访问集群;
Head插件安装示例:
1)给云主机安装Apache,并用ELB将80端口发布到公网,可用浏览器访问;
2)将ES中的es-0001节点用ELB将9200端口发布到公网,可用浏览器访问;
3)给Apache拷贝Head插件页面,并给es-0001节点授权(重启生效),最后可实现Apache的Head页面连接ES集群;
步骤1:购买1台云主机,并配置Apache服务器
主机名称 |
IP地址 |
相关配置 |
web |
192.168.1.48 |
最低配置1核1G |
# 拷贝网盘package/elk/head.tar.gz插件压缩包到web服务器上
[root@ecs-proxy elk]# scp head.tar.gz 192.168.1.48:/root
① web主机上安装Apache服务
[root@web ~]# yum install -y httpd
[root@web ~]# tar -zxf head.tar.gz
[root@web ~]# mv elasticsearch-head /var/www/html/head //将Head解压目录拷贝到网页目录下
[root@web ~]# ls /var/www/html/head/
[root@web ~]# systemctl enable --now httpd //启动服务
步骤2:使用华为云ELB弹性负载均衡器绑定公网地址,并将web服务器的80端口,es-0001集群节点的9200端口发布到互联网,并通过浏览器访问;
① 配置监听器—配置后端服务器组—为后端服务器组添加:web服务器、端口80
② 配置监听器—配置后端服务器组—为后端服务器组添加:es-0001服务器、端口9200
步骤3:浏览器测试访问
# 使用ELB的公网IP,测试访问Apache的默认页面:http://121.37.211.232/
# 使用ELB的公网IP,测试访问Head插件页面:http://121.37.211.232/head/
# 使用ELB的公网IP,测试访问ES集群状态页面:http://121.37.211.232:9200/_cluster/health?pretty
注意:在WEB服务器的Head插件网页上连接ES,发现集群健康值显示未连接,因将9200端口发布公网,Elasticsearch为了安全需要设置访问授权才能连接服务;
步骤4:设置访问授权
# 修改配置文件,在最后追加授权信息,并重启服务
[root@es-0001 ~]# vim /etc/elasticsearch/elasticsearch.yml
http.cors.enabled : true
http.cors.allow-origin : "*"
http.cors.allow-methods : OPTIONS, HEAD, GET, POST, PUT, DELETE
http.cors.allow-headers : X-Requested-With,X-Auth-Token,Content-Type,Content-Length
[root@es-0001 ~]# systemctl restart elasticsearch.service
注意:在哪台ES节点上设置了访问授权,则只有该节点能够连接服务;
# 在Head插件页面,连接访问集群服务:http://121.37.211.232:9200/
补充:ES集群会为节点自动分配主从,Master主节点用五角星号表示,
四、集群API简单管理
1、HTTP 请求报文
Elasticsearch 使用 HTTP 协议进行通信,因此所有的请求都是基于 HTTP 协议的。HTTP 请求由三部分组成:请求行、消息包头、请求正文。
请求行:
①是请求方法,如GET和POST。
②为请求对应的URL地址,它和报文头的Host属性组成完整的请求URL。
③是协议名称及版本号。请求头:
④是HTTP的报文头,包含若干个属性,格式为“属性名:属性值”,服务端据此获取客户端的信息。与缓存相关的规则信息,均包含在header中请求体:
⑤是报文体,它将一个页面表单中的组件值通过param1=value1¶m2=value2的键值对形式编码成一个格式化串,它承载多个请求参数的数据。报文体可以传递请求参数,同样请求URL也可以通过类似于“/chapter15/user.html?param1=value1¶m2=value2”的方式传递参数。
1)请求方法
-
常用请求方法:
- GET:用于从服务器获取资源,通常用于查询操作(下载)。
- POST:用于向服务器提交数据,通常用于创建或更新操作(上传)。
- HEAD:类似于 GET,但只返回响应头,不返回响应体。
-
其它请求方法:
- OPTIONS:用于获取目标资源的通信选项。
- PUT:用于创建或更新资源。
- DELETE:用于删除资源。
- TRACE:用于回显服务器收到的请求,主要用于测试或诊断。
- CONNECT:用于将请求连接转换为透明的 TCP/IP 隧道。
Elasticsearch 使用的请求方法:
- PUT:用于创建或更新资源,例如创建索引或更新文档。
- DELETE:用于删除资源,例如删除索引或文档。
- POST:用于提交数据,例如创建或更新文档。
- GET:用于查询资源,例如查询文档或索引信息。
数据格式:
与 Elasticsearch 交互的数据通常使用 JSON 格式,因为 JSON 是一种轻量级的数据交换格式,易于阅读和编写。
2)请求报文头属性
Accept:告诉服务器客户端能够接受的响应类型
示例:
Accept: text/plain:客户端能够接受的响应类型仅为纯文本数据。
Accept: application/json:客户端能够接受的响应类型为 JSON 数据。
Referer:表示这个请求是从哪个 URL 过来的。通常用于分析用户来源或防止盗链
示例:
Referer: http://example.com/page1:表示请求是从 http://example.com/page1 页面发起的。
Accept-Language:告知服务器客户端能够处理的语言集(如中文、英文等),以及语言集的相对优先级
示例:
Accept-Language: en-US,en;q=0.9,zh-CN;q=0.8,zh;q=0.7:表示客户端优先接受美式英语,其次是其他英语变体,然后是简体中文。
User-Agent:用户代理,告知服务器客户端浏览器的类型、版本等信息,以便服务器更好地提供服务
示例:
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36:表示客户端使用的是 Windows 10 上的 Chrome 浏览器。
Content-Type:表明发送数据流的类型,服务器根据编码类型使用特定的解析方式获取数据。
示例:
Content-Type: application/json:表示请求体是 JSON 格式的数据。
Content-Type: application/x-www-form-urlencoded:表示请求体是表单数据。
Host:用于区分同一 IP 上的不同虚拟主机。
示例:
Host: example.com:表示请求的目标主机是 example.com。
Content-Length:标识 HTTP 消息实体的传输长度,单位字节。
示例:
Content-Length: 1234:表示请求体的长度为 1234 字节。
Connection:用于管理持久连接,HTTP/1.1 版本的默认连接都是持久连接,想明确断开连接时,则指定 Connection 的值为 Close。
示例:
Connection: keep-alive:表示保持连接。
Connection: close:表示请求完成后断开连接。
Cache-Control:缓存控制,比如是否需要缓存或要缓存多久等。
示例:
Cache-Control: no-cache:表示不使用缓存,每次请求都从服务器获取最新数据。
Cache-Control: max-age=3600:表示缓存有效期为 3600 秒。
Cookie:客户端 Cookie 通过这个报文头属性传给服务端。服务端如何确定客户端的多个请求隶属哪个 Session?通过请求报文头 Cookie 属性的 jsessionid 的值来确定。(也可以通过重写 URL 将 ID 附带在 URL 的后面)
示例:
Cookie: jsessionid=1234567890abcdef:表示客户端的 Session ID 为 1234567890abcdef。
2、HTTP响应报文
HTTP的响应报文也由三部分组成(响应行+响应头+响应体)
响应行:
①报文协议及版本;
②状态码及状态描述;响应头:
③响应报文头,也是由多个属性组成;
响应体:
④响应报文体,真正需要的数据。
常见的状态码:
- 301:永久重定向;
- 302:临时重定向;
- 401:发送的请求要有http的验证信息;
- 402:请求报文中有语法错误;
- 403:无权访问;
- 404:没有对应的资源;
- 500:服务器执行请求时发生错误;
- 503:服务器停机或正在维护。
3、Curl 命令行工具
Curl 是一个在命令行下工作的文件传输工具,支持多种协议(如 HTTP、HTTPS、FTP 等)。它是一款非常强大的 HTTP 命令行工具,支持多种请求模式,自定义请求头等强大功能。
基本格式
-
指定请求方法:
curl -X <请求方法> http://请求地址
例如,使用 GET 方法请求 Elasticsearch 的索引信息:
curl -X GET http://localhost:9200/my_index
-
自定义请求头:
curl -H <请求头> http://请求地址
例如,设置自定义的 Content-Type 请求头:
curl -H "Content-Type: application/json" http://localhost:9200/my_index
示例
-
创建索引:
curl -X PUT http://localhost:9200/my_index
-
删除索引:
curl -X DELETE http://localhost:9200/my_index
-
插入文档:
curl -X POST http://localhost:9200/my_index/_doc/1 -H "Content-Type: application/json" -d '{"name": "John Doe", "age": 30}'
-
查询文档:
curl -X GET http://localhost:9200/my_index/_doc/1
Elasticsearch基本操作示例:
① 关键字_cat(查询方法)
- _cat 关键字可用来查询集群,节点信息等
- 显示详细信息(?v),显示帮助信息(?help)
例如1:_cat查询关键字
[root@es-0001 ~]# curl -XGET http://es-0001:9200/_cat/
例如2:查询Mater节点的信息
[root@es-0001 ~]# curl -XGET http://es-0001:9200/_cat/master
4kDcvgYaSF-7aszRxns98A 192.168.1.42 192.168.1.42 es-0002
例如3:显示Master节点的详细信息
[root@es-0001 ~]# curl -XGET http://es-0001:9200/_cat/master?v
id host ip node
4kDcvgYaSF-7aszRxns98A 192.168.1.42 192.168.1.42 es-0002
例如4:显示Master节点的帮助信息
[root@es-0001 ~]# curl -XGET http://es-0001:9200/_cat/master?help
id | | node id //id为节点id
host | h | host name //host为主机名字
ip | | ip address //ip为IP地址
node | n | node name //node为节点名字
② 创建索引(类似库)
- 创建索引使用PUT请求方法,格式为JSON表达式,创建完成以后通过 head 插件验证
- 创建索引需要提交信息,用来标识提交的数据(application/json,表示JSON的固定格式)
- 指定索引的名称,指定分片数量,指定副本数量
[root@es-0001 ~]# curl -XPUT -H "Content-Type: application/json" http://es-0001:9200/tedu -d \
> '{
> "settings":{ //设置
> "index":{ //索引
> "number_of_shards": 5, //指定分片数量
> "number_of_replicas": 1 //指定副本数量(分片的副本)
> }
> }
> }'
{"acknowledged":true,"shards_acknowledged":true,"index":"tedu"}
解释:-XPUT请求方式,-H指定Content-Type自定义请求头,http://es-0001:9200/tedu 中tedu为新增加的索引名,-d为提交,{JOSN内容}
ES创建索引时,默认使用分片创建,指定副本数量为1,则原数据+副本=2,副本数量越多,数据更安全,但弊端是占用磁盘空间;副本数不能超过硬件节点数量;
# 通过HEAD插件,测试访问
说明:显示创建的tedu索引,绿色数字为分片情况(通过内部算法,每个节点存2份数据作为冗余,相同数据存在不同节点上,任意损坏一台节点的数据,数据也不会丢失;黑色边框加粗的为原数据,未加粗的为副本)
③ 插入数据(索引/类型/ID)
# 插入增加数据使用PUT请求方法,格式为JSON表达式
[root@es-0001 ~]# curl -XPUT -H "Content-Type: application/json" http://es-0001:9200/tedu/teacher/1 -d \
> '{
> "职业": "诗人",
> "名字": "李白",
> "称号": "诗仙",
> "年代": "唐"
> }'
{"_index":"tedu","_type":"teacher","_id":"1","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":0,"_primary_term":1}
解释:http://es-0001:9200/tedu/teacher/1,tedu为索引(库),teacher为类型(表),ID(Key)
# 通过HEAD插件,测试访问
[root@es-0001 ~]# curl -XPUT -H "Content-Type: application/json" http://es-0001:9200/tedu/teacher/2 -d \
> '{
> "职业": "诗人",
> "名字": "杜甫",
> "称号": "诗圣",
> "年代": "唐"
> }'
{"_index":"tedu","_type":"teacher","_id":"2","_version":1,"result":"created","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":0,"_primary_term":1}
# 通过HEAD插件,测试访问
④ 查询数据
# 查询数据使用GET请求方法
[root@es-0001 ~]# curl -XGET http://es-0001:9200/tedu/teacher/1
{"_index":"tedu","_type":"teacher","_id":"1","_version":3,"_seq_no":2,"_primary_term":1,"found":true,"_source":{
"职业": "诗人",
"名字": "李白",
"称号": "诗仙",
"年代": "唐"
[root@es-0001 ~]# curl -XGET http://es-0001:9200/tedu/teacher/1?pretty
{
"_index" : "tedu",
"_type" : "teacher",
"_id" : "1",
"_version" : 1,
"_seq_no" : 0,
"_primary_term" : 1,
"found" : true,
"_source" : {
"职业" : "诗人",
"名字" : "李白",
"称号" : "诗仙",
"年代" : "唐"
}
}
补充:?pretty可以以竖行显示;
⑤ 修改数据
- 修改数据使用POST请求方法;
- 修改数据使用_update关键字,格式使用JSON表达式;
[root@es-0001 ~]# curl -XPOST -H "Content-Type: application/json" \
> http://es-0001:9200/tedu/teacher/1/_update -d '{ "doc": {"年代":"公元701"}}'
{"_index":"tedu","_type":"teacher","_id":"1","_version":2,"result":"updated","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":1,"_primary_term":1}
解释:_update为修改数据关键字,“doc“表示文档的关键字,JSON内容{key:value}
# 通过HEAD插件,测试服务
⑥ 删除数据
# 删除数据使用DELETE请求方法;
注意:删除时可以是文档、可以是索引,但不能是类型
[root@es-0001 ~]# curl -XDELETE http://es-0001:9200/tedu/teacher/1
{"_index":"tedu","_type":"teacher","_id":"1","_version":3,"result":"deleted","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":2,"_primary_term":1}
[root@es-0001 ~]# curl -XDELETE http://es-0001:9200/tedu/teacher/2
{"_index":"tedu","_type":"teacher","_id":"2","_version":2,"result":"deleted","_shards":{"total":2,"successful":2,"failed":0},"_seq_no":1,"_primary_term":1}
# 通过HEAD插件,测试服务
[root@es-0001 ~]# curl -XDELETE http://es-0001:9200/tedu //删除库
{"acknowledged":true}
# 通过HEAD插件,测试服务
五、Kibana 部署
Kibana 是一个开源的数据可视化工具,主要用于与 Elasticsearch 配合使用。它提供了一个用户友好的界面,帮助用户搜索、查看和交互存储在 Elasticsearch 索引中的数据。Kibana 通常用于日志分析、实时监控、安全分析、业务分析等场景。
数据可视化:
- 仪表板:创建自定义仪表板,展示多个可视化图表和数据。
- 图表:支持多种图表类型,如折线图、柱状图、饼图、地图等。
- 时间序列分析:通过时间过滤器和时间序列图表,分析数据随时间的变化趋势。
搜索和查询:
- Discover:通过简单的搜索和过滤功能,快速查找和分析数据。
- Lucene 查询语法:支持复杂的查询语法,帮助用户精确查找数据。
数据探索:
- 聚合:使用 Elasticsearch 的聚合功能,对数据进行深入分析。
- 字段分析:查看字段的分布、统计信息等。
报警和监控:
- 监控:实时监控 Elasticsearch 集群的状态和性能。
- 报警:设置自定义报警规则,当满足条件时触发报警。
插件扩展:
- Canvas:创建动态的数据展示页面。
- Timelion:时间序列数据的可视化工具。
- Maps:地理空间数据的可视化工具。
- 默认安装路径:/etc/kibana
- 配置文件路径:/etc/kibana/kibana.yml
- 服务端口号:5601
Kibana安装配置示例:
步骤1:购买1台云主机
步骤2:安装Kibana
① 配置主机名解析
[root@kibana ~]# vim /etc/hosts
192.168.1.41 es-0001
192.168.1.42 es-0002
192.168.1.43 es-0003
192.168.1.44 es-0004
192.168.1.45 es-0005
192.168.1.46 kibana
② 安装软件包
[root@kibana ~]# yum install -y kibana
③ 修改kibana配置文件,并启动服务
[root@kibana ~]# vim /etc/kibana/kibana.yml
02 server.port: 5601 //服务端口号(默认5601)
07 server.host: "0.0.0.0" //监听地址
28 elasticsearch.hosts: ["http://es-0002:9200", "http://es-0003:9200"] //指定ES节点的地址,设置2个作为高可用
37 kibana.index: ".kibana" //kibana启动后默认在ES数据库创建索引并将运行配置信息存入索引中;
40 kibana.defaultAppId: "home" //默认首页,访问home标签
113 i18n.locale: "zh-CN" //kibana汉化语言
[root@kibana ~]# systemctl enable --now kibana
kibana启动后默认在ES数据库创建索引并将运行配置信息存入索引中(索引名:.kibana)
步骤3:绑定弹性公网IP,通过 WEB 浏览器验证
① 配置监听器—配置后端服务器组—为后端服务器组添加:kibana服务器、端口5601
# 使用浏览器访问kibana测试:http://121.37.211.232:5601/ (使用自己浏览的样例)
步骤4:导入的日志数据
- 导入数据使用POST请求方法
- 使用_bulk导入关键字
- URL编码格式:data-binary
[root@ecs-proxy ~]# cd /var/ftp/localrepo/elk/
[root@ecs-proxy elk]# gunzip logs.jsonl.gz
[root@ecs-proxy elk]# curl -XPOST -H "Content-Type: application/json" http://192.168.1.41:9200/_bulk --data-binary @logs.jsonl //@导入的文件
# 通过HEAD插件,查看导入的数据
如果使用Logstash,可以直接在配置文件使用files{}导入本地数据;
步骤5:使用Kibana绘制流量图
① 菜单栏【管理】—【创建索引模式】— 定义索引模式,添加索引(logstash-*),下一步
② 时间筛选字段名称,选择@timestamp(日志中记录的时间为标准),创建索引模式
# 添加索引模式的效果
③ 菜单栏【Discover】索引流量图表,一般显示“没有任何结果匹配您的搜索条件“,因Kibana默认查询过去15分钟内的数据(实验导入的日志数据为2015年5月18-20日)
# 设置时间范围,选择【绝对】,筛选包含日志数据时间段的范围即可
# 显示日志流量图表效果
④ 菜单栏【可视化】— 创建可视化,根据需求选择可视化类型,例如饼图
# 新建的可视化饼图效果
# 绿圈代表全部数据,可通过执行拆分切片来查询日志数据
# 根据需要拆分查询所需的日志数据(聚合:词,字段:geo.src.keyword)
# 根据需要,可添加子存储桶,再次拆分,查询所需的日志数据
扩展知识:PV、UV、VV
① UV(Unique visitor)
- 是指通过互联网访问,浏览这个网页的自然人。访问您网站的一台电脑客户端为一个访客。00:00-24:00内相同的客户端只被计算一次。(一天内同个访客多次访问仅计算一个UV)
② IP(Internet Protocol)
- 独立IP是指访问过某站点的IP总数,以用户的IP地址作为统计依据。00:00-24:00内相同IP地址之被计算一次。
UV与IP区别:
例如你和你的家人用各自的账号在同一台电脑上登录新浪微博,则IP数+1,UV数+2。由于使用的是同一台电脑,所以IP不变,但使用的不同账号,所以UV+2。
③ PV(Page View)
- 即页面浏览量或点击量,用户每1次对网站中的每个网页访问均被记录1个PV。用户对同一页面的多次访问,访问量累计,用以衡量网站用户访问的网页数量。
④ VV(Visit View)
- 用以统计所有访客1天内访问网站的次数。当访客完成所有浏览并最终关掉该网站的所有页面时便完成了一次访问,同一访客1天内可能有多次访问行为,访问次数累计。
PV与VV区别:(PV是指页面的浏览次数,VV是指你访问网站的次数)
例如:你今天10点钟打开了百度,访问了它的三个页面;11点钟又打开了百度,访问了它的两个页面,则PV数+5,VV数+2。
日志数据的增长:网站访问量+页面大小(页面没压缩)造成网站带宽流量增长。
小结:
本篇章节为【第五阶段】ARCHITECTURE-DAY1 的学习笔记,这篇笔记可以初步了解到 ELK分布式日志分析系统、Elasticsearch分布式集群搭建、Kibana搭建、使用kibana展示数据,除此之外推荐参考相关学习网址:
- lElastic — The Search AI Company | Elastic
- 两分钟了解HTTP请求报文和响应报文_请求报文怎么看-****博客
- 全文搜索引擎 Elasticsearch 入门教程 - 阮一峰的网络日志
Tip:毕竟两个人的智慧大于一个人的智慧,如果你不理解本章节的内容或需要相关笔记、视频,可私信小安,请不要害羞和回避,可以向他人请教,花点时间直到你真正的理解。