这里写自定义目录标题
- 一.ELK概述
- 1.1日志处理步骤
- 1.2ELK组成
- 二.Elasticsearch介绍
- 2.1Elasticsearch概述
- 2.2Elasticsearch的概念
- 2.3开启分片副本的主要原因
- 三.Logstash介绍
- 3.1Logstash概述
- 3.2Logstash主要组件
- 四.Kibana介绍
- 4.1Kibana概述
- 4.2Kibana主要功能
- 五.ELK集群部署
- 5.1Elasticsearch 集群部署
- 5.1.1安装Elasticsearch 软件
- 5.1.2安装 Elasticsearch-head 插件
- 5.2Logstash 部署(在client 节点上操作)
- 5.2.1安装Logstash
- 5.2.2配置logstash文件
- 5.3Kiabana部署
一.ELK概述
1.1日志处理步骤
- 将APP servers的日志进行集中化管理到Logstash agent。
- 将日志格式化(Logstash)并输出到Elasticsearch cluster
- 对格式化后的数据进行索引和存储(Elasticsearch)
- 前端数据的展示(Kibana)
- 可以在线查看界面化展示。
1.2ELK组成
- ELK是由Elasticsearch、Logstash、Kiban三个开源软件的组合。
- Logstash 收集APP server产生的log,然后存放到Elasticsearch集群节点中
- kibana从Elasticsearch集群节点中查询数据生成图表,再返回给Brower。
二.Elasticsearch介绍
2.1Elasticsearch概述
- 提供了一个分布式多用户能力的全文搜索引擎;
- 是一个基于Lucene的搜索服务器;(3)基于restful web接口;
- 使用java开发;
- 作为apache许可条款下的开放源码发布,是第二流行的企业搜索引擎;
- 被设计用于云计算中,能够达到实时搜索、稳定、可靠、快速、安装实用方便的需求。
2.2Elasticsearch的概念
- 接近实时(NRT)Elasticsearch是一个接近即时的搜索平台,从索引一个文档知道这个文档能够被搜索到的过程中有一个轻微的延迟(通常是1秒)
- 集群(cluster)由一个及其以上的节点组织在一起,它们共同持有整个数据,并一起提供索引和搜索功能,其中一个节点为主节点,这个节点是可以通过选举产生,并提供跨节点的联合索引和搜索的功能,集群有一个唯一标识的名字,默认是elaticsearch,集群名字很重要,每个节点是基于集群名字加入到其集群中。因此,要确保集群的唯一性,在不同环境中使用不同的集群名字,一个集群只可以有一个节点,建议在配置elasticsearch时,配置成集群模式。
- 节点(node)节点就是一台单一的服务器,是集群的一部分,存储数据并参与集群的索引和搜索功能,像集群一样,节点之间可是通过名字来标识区分,默认是在节点启动时随机分配的字符名。当然,你可以自己定义,该名字很重要,起到在集群中定位到对应的节点。节点可以通过指定集群名字来加入到集群中,默认情况下,每个节点被设置成加入到elasticsearch集群。如果启动了多个节点,假设能够自动发现对方,他们将会自动组建一个名为elastisearch的集群。
- 索引(index)一个索引就是一个拥有几分相似特征的文档的集合。比如说,你可以有一个客户数据的索引、一个产品目录的索引、还有一个订单数据的索引。一个索引用一个名字来标识(必须全部是小写字母组合),并且当我们要对相应的索引中的文档进行索引、收缩、更新和删除的时候,都要用到这个名字。在一个集群中,可以定义多个索引。(索引相对于关系型数据库的库)
- 类型(type)在一个索引中,你可以定义一种或多种类型。一个类型是你的索引的一个逻辑上的分类分区,其寓意完全由你来定义。通常,会为具有一组共同字段的文档定义一个类型。比如:我们假设运营一个博客平台并且将所有的数据存储到一个索引中,在这个索引中,你可以为用户数据定义一个类型,为博客数据定义一个类型,也可以为评论数据定义另一个类型。(类型相对于关系型数据库的表)
- 文档(Document)一个文档是一个可被索引的基础信息单元。比如:你可以拥有一个客户的文档,某一个产品的文档;文档以JSON(Javascript Object Notation)格式来表示,json是一个通用的互联网数据交互模式。在一个index/type内,你可以存储任意多的文档。注意:虽然一个文档在物理上位于一个索引内,但是实际上一个文档必须在一个索引内可以被索引和分配一个类型。(文档相对于关系型数据库的列)
- 分片和副本 (shards & replicas)在实际情况下,索引存储的数据可能超过单个节点的硬件设置。比如十亿个文档需要1TB空间存储,可能不适合存储在单个节点上,读写被限制在单个节点;从单个节点搜索请求也太慢了。为了解决这个问题,elasticsearch集群提供将索引分割开,进行分片的功能。当创建索引时,可以定义想要分片的数量。每一个分片就是一个全功能的独立的索引,可以位于集群中的任何节点上。
2.3开启分片副本的主要原因
Elasticsearch采用分片式,可以进行水平分割横向扩展,增大存储量;分布式并行跨分片操作,提高性能和吞吐量。
- 高可用性,以应对分片或者节点故障,处于这个原因,分片副本要在不同节点上;
- 提高I/O性能,增大吞吐量,搜索可以并行在所有副本执行。总之,每个索引可以被分成多个分片,一个索引也可以被复制0次或者多次。一旦复制了,每个索引就有了主分片(可以作为复制源的原始分片)和复制分片(主分片的拷贝)之分。分片和副本的数量可以在索引创建的时候指定,在索引创建之后,你可以在任何时候动态改变副本的数量,但是你事后无法改变分片的数量。默认情况下,Elasticsearch中的每个索引被分片为5个主分片和1个副本,这意味着,如果你的集群中至少有两个节点的情况下,你的索引将会有5个主分片和另外5个副本分片(1个完全拷贝),这样的话每个索引总共就有10个分片。
三.Logstash介绍
3.1Logstash概述
- 一款强大的数据处理工具,可以实现数据传输、格式处理、格式化输出;
- 工作思路:数据输入(collect)、数据加工(如过滤、改写等enrich)以及数据输出(transport);
- 由LRuby语言编写,基于消息(message-based)的简单架构,并运行在Java虚拟机(JVM)上;
- 不同于分离的代理端(agent)或主机端(server),Logstash可配置单一的代理端(agent)与其他开源软件结合,以实现不同的功能。
3.2Logstash主要组件
- Shipper:日志收集负责监控本地日志文件的变化,及时把日志文件的最新内容收集起来。通常,远程代理端(agent)只需要运行这个组件即可。
- Indexer:日志存储负责接受日志并写入到本地文件。
- Broker:日志hub负责链接多个shipper和对应数目的indexer。
- Search and Storage允许对事件进行搜索和存储。
- Web Interface基于web的展示界面。以上组件在Logstash架构中可以独立部署,因此提供了很好的集群扩展性
四.Kibana介绍
4.1Kibana概述
- 一个针对Elasticsearch的开源分析及可视化平台;
- 搜索、查看存储在Elasticsearch索引中的数据;
- 通过各种图标进行高级数据分析及展示;
- 让海量数据更容易理解;
- 操作简单,基于浏览器地用户界面就可以快速创建仪表板(dashboard)实时显示Elasticsearch查询动态;
- 设置安装Kibana非常简单,无需编写代码,几分钟内就可以完成Kibana安装并启动Elasticsearch监测。
4.2Kibana主要功能
- Elasticsearch无缝之集成。Kibana架构为Elasticsearch定制,可以将任何结构化和非结构化数据加入Elasticsearch索引。Kibana还充分利用了Elasticsearch强大的搜索和分析功能。
- 整合数据:Kibana能够更好地处理海量数据,并据此创建柱形图、折线图、散点图、直方图、饼图和地图。
- 复杂数据分析:Kibana提升了Elasticsearch分析能力,能够更加智能地分析数据,执行数学转换并且根据要求对数据切割分块。
- 让更多团队成员受益:强大的数据库可视化接口让各业务岗位都能够从数据集合受益。
- 接口灵活,分享更容易:使用Kibana可以更加方便地创建、保存、分享数据,并将可视化数据快速交流。
- 配置简单:Kibana的配置和启用非常简单,用户体验非常友好。Kibana自带Web服务器,可以快速启动运行。
- 可视化多数据源:Kibana可以非常方便地把来自Logstash、ES-Hadoop、Beats或第三方技术的数据整合到Elasticsearch,支持的第三方技术包括Apache Flume、Fluentd等。
- 简单数据导出:Kibana可以方便地导出感兴趣的数据,与其它数据集合并融合后快速建模分析,发现新结果。
五.ELK集群部署
服务器类型 | IP地址 | 安装的组件 | 硬件方面 |
Node1节点 | 192.168.48.3 | Elasticsearch 、 Kibana | 4核4G |
Node2节点 | 192.168.48.7 | Elasticsearch | 4核4G |
client节点 | 192.168.48.11 | Logstash Apache(测试用) | 2核4G |
5.1Elasticsearch 集群部署
在Node1、Node2节点上操作
#关闭防火墙
systemctl stop firewalld.service
setenforce 0
#更改主机名
Node1节点:hostnamectl set-hostname node1
Node2节点:hostnamectl set-hostname node2
#配置域名解析
echo "192.168.48.3" node1 >>/etc/hosts
echo "192.168.48.7" node2 >>/etc/hosts
#查看Java环境,如果没有安装,yum -y install java
java -version
5.1.1安装Elasticsearch 软件
1.上传elasticsearch-5.5.0.rpm到/opt目录下
cd /opt
rpm -ivh elasticsearch-5.5.0.rpm
2.加载系统服务
systemctl daemon-reload
systemctl enable elasticsearch.service
3.修改elasticsearch主配置文件
cp /etc/elasticsearch/elasticsearch.yml /etc/elasticsearch/elasticsearch.yml.bak
vim /etc/elasticsearch/elasticsearch.yml
--17--取消注释,指定集群名字
cluster.name: my-elk-cluster
--23--取消注释,指定节点名字:Node1节点为node1,Node2节点为node2
node.name: node1
--33--取消注释,指定数据存放路径
path.data: /data/elk_data
--37--取消注释,指定日志存放路径
path.logs: /var/log/elasticsearch/
--43--取消注释,改为在启动的时候不锁定内存
bootstrap.memory_lock: false
--55--取消注释,设置监听地址,0.0.0.0代表所有地址
network.host: 0.0.0.0
--59--取消注释,ES 服务的默认监听端口为9200
http.port: 9200
--68--取消注释,集群发现通过单播实现,指定要发现的节点 node1、node2
discovery.zen.ping.unicast.hosts: ["node1", "node2"]
#查看主配置文件
grep -v "^#" /etc/elasticsearch/elasticsearch.yml
#将node1的配置文件拷贝一份在node2上并去node2上修改
scp /etc/elasticsearch/elasticsearch.yml node2:/etc/elasticsearch/
vim /etc/elasticsearch/elasticsearch.yml
--23--取消注释,指定节点名字:Node1节点为node1,Node2节点为node2
node.name: node2
(4)#创建数据存放路径并授权
mkdir -p /data/elk_data
chown elasticsearch:elasticsearch /data/elk_data/
(5)#启动elasticsearch是否成功开启
systemctl start elasticsearch.service
netstat -antp | grep 9200
(6)#查看节点信息
浏览器访问 ,查看节点 Node1、Node2 的信息
http://192.168.48.3:9200 http://192.168.48.7:9200
#原谅色:green
http://192.168.48.3:9200/_cluster/health?pretty
http://192.168.48.7:9200/_cluster/health?pretty
####### 使用以上方式查看状态并不友好,可以通过 elasticsearch-head插件来直接管理 #####
上传并安装ES服务
修改配置文件
创建数据存在目录,并启动服务
5.1.2安装 Elasticsearch-head 插件
Elasticsearch 在 5.0 版本后,Elasticsearch-head 插件需要作为独立服务进行安装,需要使用npm工具(NodeJS的包管理工具)安装。 安装 Elasticsearch-head 需要提前安装好依赖软件 node 和 phantomjs。 node:是一个基于 Chrome V8 引擎的 JavaScript 运行环境。 phantomjs:是一个基于 webkit 的JavaScriptAPI,可以理解为一个隐形的浏览器,任何基于 webkit 浏览器做的事情,它都可以做到。
安装node软件
(1)#编译安装 node
#上传软件包 node-v8.2.1.tar.gz 到/opt
yum install gcc gcc-c++ make -y
cd /opt
tar zxf node-v8.2.1.tar.gz
cd node-v8.2.1/
./configure
make -j4 && make install #时间比较久,请耐心等待
(2)#安装 phantomjs
#上传软件包 phantomjs-2.1.1-linux-x86_64.tar.bz2 到
cd /opt
tar jxf phantomjs-2.1.1-linux-x86_64.tar.bz2 -C /usr/local/src/
cd /usr/local/src/phantomjs-2.1.1-linux-x86_64/bin
cp phantomjs /usr/local/bin
(3)#安装 Elasticsearch-head 数据可视化工具
#上传软件包 elasticsearch-head.tar.gz 到/opt
cd /opt
tar zxf elasticsearch-head.tar.gz -C /usr/local/src/
cd /usr/local/src/elasticsearch-head/
npm install
(4)#修改 Elasticsearch 主配置文件
vim /etc/elasticsearch/elasticsearch.yml
......
--末尾添加以下内容--
http.cors.enabled: true #开启跨域访问支持,默认为 false
http.cors.allow-origin: "*" #指定跨域访问允许的域名地址为所有
systemctl restart elasticsearch
(5)#启动 elasticsearch-head 服务
#必须在解压后的 elasticsearch-head 目录下启动服务,进程会读取该目录下的 gruntfile.js 文件,否则可能启动失败。
cd /usr/local/src/elasticsearch-head/
npm run start &
#elasticsearch-head 监听的端口是 9100
netstat -natp |grep 9100
(6)#通过 Elasticsearch-head 查看 Elasticsearch 信息通过浏览器访问 http://192.168.48.3:9100/ 地址并连接群集。如果看到群集健康值为 green 绿色,代表群集很健康。访问有问题 可以将localhost 改成ip地址
(7)#插入索引
##登录192.168.48.3 node1主机##### 索引为index-demo,类型为test,可以看到成功创建
curl -X PUT 'localhost:9200/index-demo/test/1?pretty&pretty' -H 'content-Type: application/json' -d '{"user":"xiayan","mesg":"hello world"}'
####刷新浏览器输入看索引信息###
node1信息动作 01234
node2信息动作 01234
●上面图可以看见索引默认被分片5个,并且有一个副本
点击数据浏览--会发现在node1上创建的索引为index-demo,类型为test, 相关的信息
安装phantomjs
安装 Elasticsearch-head 数据可视化工具
修改 Elasticsearch 主配置文件
启动服务ES与node
查看服务端口
插入索引测试
5.2Logstash 部署(在client 节点上操作)
5.2.1安装Logstash
(1)#修改主机名
hostnamectl set-hostname client
su
(2)#安装httpd并启动
yum -y install httpd
systemctl start httpd
(3)#查看java环境
java -version
(4)#安装logstash
cd /opt
rpm -ivh logstash-5.5.1.rpm
systemctl start logstash.service
systemctl enable logstash.service
#创建软连接
ln -s /usr/share/logstash/bin/logstash /usr/local/bin/
测试 Logstash与elasticsearch功能是否正常
Logstash这个命令测试
字段描述解释:
● -f 通过这个选项可以指定logstash的配置文件,根据配置文件配置logstash
● -e 后面跟着字符串 该字符串可以被当做logstash的配置(如果是“空”则默认使用stdin做为输入、stdout作为输出)
● -t 测试配置文件是否正确,然后退出
logstash -f 配置文件名字 去连接elasticsearch
(1)#输入采用标准输入 输出采用标准输出---登录192.168.48.11在client服务器上
logstash -e 'input { stdin{} } output { stdout{} }'
www.baidu.com #需要手动输入
2022-07-06T16:52:17.292Z client www.baidu.com
www.sina.com #需要手动输入
2022-07-06T16:52:30.530Z client www.sina.com
(2)#使用 rubydebug 输出详细格式显示,codec 为一种编解码器
logstash -e 'input { stdin{} } output { stdout{ codec=>rubydebug } }'
www.baidu.com ##需要手动输入
{
"@timestamp" => 2022-07-06T16:54:49.551Z,
"@version" => "1",
"host" => "apache",
"message" => "www.baidu.com"
}
(3)##使用logstash将信息写入elasticsearch中
logstash -e 'input { stdin{} } output { elasticsearch { hosts=>["192.168.48.3:9200"] } }'
- 输入采用标准输入 输出采用标准输出—登录192.168.48.11 在client服务器上
- 使用 rubydebug 输出详细格式显示,codec 为一种编解码器
- 使用logstash将信息写入elasticsearch中
5.2.2配置logstash文件
#给日志目录可读权限
chmod +r /var/log/messages #让 Logstash 可以读取日志
#修改 Logstash 配置文件,让其收集系统日志/var/log/messages,并将其输出到 elasticsearch 中。
vim /etc/logstash/conf.d/system.conf #文件必须以.conf格式结尾
input {
file{
path =>"/var/log/messages" #指定要收集的日志的位置
type =>"system" #自定义日志类型标识
start_position =>"beginning" #表示从开始处收集
}
}
output {
elasticsearch { #输出到 elasticsearch
hosts => ["192.168.48.3:9200"] #指定 elasticsearch 服务器的地址和端口
index =>"system-%{+YYYY.MM.dd}" #指定输出到 elasticsearch 的索引格式
}
}
#重启服务
systemctl restart logstash
#打开浏览器 输入http://192.168.48.3:9100/ 查看
访问ES
5.3Kiabana部署
此服务只需在ES集群中的一台服务器上部署即可
#安装 Kiabana
#上传软件包 kibana-5.5.1-x86_64.rpm 到/opt目录
cd /opt
rpm -ivh kibana-5.5.1-x86_64.rpm
#设置 Kibana 的主配置文件
vim /etc/kibana/kibana.yml
--2--取消注释,Kiabana 服务的默认监听端口为5601
server.port: 5601
--7--取消注释,设置 Kiabana 的监听地址,0.0.0.0代表所有地址
server.host: "0.0.0.0"
--21--取消注释,设置和 Elasticsearch 建立连接的地址和端口
elasticsearch.url: "http://192.168.59.115:9200"
--30--取消注释,设置在 elasticsearch 中添加.kibana索引
kibana.index: ".kibana"
#启动 Kibana 服务
systemctl start kibana.service
systemctl enable kibana.service
netstat -natp | grep 5601
#验证 Kibana
浏览器访问 http://192.168.48.3:5601
第一次登录需要添加一个 Elasticsearch 索引:
Index name or pattern
//输入:system-* #在索引名中输入之前配置的 Output 前缀“system”
单击 “create” 按钮创建,单击 “Discover” 按钮可查看图表信息及日志信息。
数据展示可以分类显示,在“Available Fields”中的“host”,然后单击 “add”按钮,可以看到按照“host”筛选后的结果
#将client服务器的日志(访问的、错误的)添加到 Elasticsearch 并通过 Kibana 显示
vim /etc/logstash/conf.d/apache_log.conf
input {
file{
path => "/etc/httpd/logs/access_log"
type => "access"
start_position => "beginning"
}
file{
path => "/etc/httpd/logs/error_log"
type => "error"
start_position => "beginning"
}
}
output {
if [type] == "access" {
elasticsearch {
hosts => ["192.168.48.3:9200"]
index => "apache_access-%{+YYYY.MM.dd}"
}
}
if [type] == "error" {
elasticsearch {
hosts => ["192.168.48.3:9200"]
index => "apache_error-%{+YYYY.MM.dd}"
}
}
}
#加载配置文件
/usr/share/logstash/bin/logstash -f /etc/logstash/conf.d/apache_log.conf
#浏览器访问http://192.168.48.11/测试刷新日志文件,否则可能没有日志同步到ES
#浏览器访问http://192.168.48.3:5601
点击左下角有个management选项---index patterns---create index pattern
----分别创建apache_error-* 和 apache_access-* 的索引
安装kibana
更改配置
- 将client服务器的日志(访问的、错误的)添加到 Elasticsearch 并通过 Kibana 显示
在client添加配置文件
加载配置文件
测试
- 浏览器访问http://192.168.48.3:9100/测试,查看索引信息
- 浏览器访问http://192.168.48.3:5601
添加索引apache_error-*
同理,若想查看access的日志,一样添加创建索引