一、什么是ELK?
- elasticsearch:日志的存储和分析
- logstash:收集日志
- kibana:日志的展示
二、为什么要用ELK
- 开发人员不能登录生产服务器查看日志
- 很多服务都是分布式,有多节点,查询日志非常不方便
- 可以会产生大量的io,可能会占用大量的io
- 查询速度慢,不支持日志分析
三、ELK架构
- filebeat用于手机和监控日志,将日志输出至logstash
- logstash用于将收集来的日志进行过滤创建索引并输出至elasticsearch
- elasticsearch用于将logstash输入的日志进行存储
- kibana将从elasticsearch中取出数据,并展示
四、部署准备
1.下载地址与版本:
2.部署环境
系统:centos7.6
软件:
elasticsearch ip:172.18.97.30 2核4G
logstash+kibana ip:172.18.97.29 4核8G
filebeat 应用服务器
3.配置java环境
在官网找到要下载的jdk包
解压 tar fx jdk-8u151-linux-x64.tar.gz
修改环境变量:vim /etc/profile
- export JAVA_HOME=/data/soft/jdk
- export PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH
- export CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar
让配置生效:source /etc/profile
注:elasticsearch+kibana均是java编写,需要java环境,两台均需要配置
五:部署elasticsearch
1.创建一个系统普通用户,启动时需要使用普通用户
useradd elsearch
echo "123456" | passwd --stdin elsearch
chown -R elsearch:elsearch /data/soft/elsearch
2.进入下载包的路径执行、
#解压
tar fx elasticsearch-7.9.1-linux-x86_64.tar.gz -C /data/soft/elsearch
#备份配置
cd /data/soft/elsearch/config
cp -a elasticsearch.yml elasticsearch.yml.bak
vim elasticsearch.yml
更改一下配置
- # 集群的名称,各节点相同,否则找不到集群
- cluster.name: test-elk
- # 节点名称
- node.name: node-30
- # 数据存放的路径,普通用户需要有权限
- path.data: /data/soft/elsearch/data
- # 日志存放路径,普通用户需要有权限
- path.logs: /data/soft/elsearch/logs
- # 禁用swap,快速反应
- bootstrap.memory_lock: false
- # 绑定节点ip
- network.host: 0.0.0.0
- # 提供服务的端口
- http.port: 9200
- # 集群通信端口,一般为9300-9400
- transport.port: 9300
- # 集群中master的候选节点地址数组,可以配置ip+端口,或者节点名称node.name
- # 如discovery.seed_hosts: ["172.16.10.184:9300", "172.16.10.185:9300"]
- discovery.seed_hosts: ["172.18.97.30"]
- # 集群中可工作的具有Master节点资格的最小数量,官方的推荐值是(N/2)+1,其中N是具有master资格的节点的数量
- discovery.zen.minimum_master_nodes: 1
- # 集群初始master节点
- cluster.initial_master_nodes: ["node-30"]
- # 是否允许跨域
- http.cors.enabled: true
- # 允许的源地址
- http.cors.allow-origin: "*"
- # 当前节点是master的候选节点,主节点cpu高一点,存储磁盘空间大一点
- node.master: true # 本次搭建未用到,es只使用唯一节点
- # 当前节点不是数据节点 ,false代表数据将不存在本节点
- node.data: false
- discovery.type=single-node 单节点会有引导检查,此配置会绕过检查
3.实例优化
jvm堆大小优化,一般设置为内存的一半
sed -i 's/-Xms1g/-Xms2g/g' /data/soft/elsearch/config/jvm.options
sed -i 's/-Xmx1g/-Xmx2g/g' /data/soft/elsearch/config/jvm.options
4.系统优化
4.1vim /etc/security/limits.conf
# 在文件最后添加内容如下
* soft nofile 65536 * hard nofile 131072 * soft nproc 2048 * hard nproc 4096
解释:
soft xxx : 代表警告的设定,可以超过这个设定值,但是超过后会有警告。 hard xxx : 代表严格的设定,不允许超过这个设定的值。 nofile : 是每个进程可以打开的文件数的限制 nproc : 是操作系统级别对每个用户创建的进程数的限制
4.2 vim /etc/sysctl.conf
#添加如下 vm.max_map_count=262144 #elasticsearch用户拥有的内存权限太小,至少需要262144; vm.swappiness=0 #表示最大限度使用物理内存,在内存不足的情况下,然后才是swap空间
5.启动elasticsearch
su - elasticsearch
cd /data/soft/elastic/bin/
./elasticsearch -d
访问试试ip+9200
看到这个说明成功了。
五、logstash部署
1.基于java使用,先搭建java环境,同elasticsearch
(略)
2.tar fx logstash-7.9.1.tar.gz -C /data/soft/logstash/
3.配置
在config下建一个conf.d的文件
cd /data/soft/logstash/config
mkdir conf.d
vim logstash.yml
++++++++++++++++++++++++++++++++++++++++++++++++++
# 接收filebeat传过来的日志数据
input {
beats {
port => "5044"
}
}
# 输出数据,先输出到控制台
output {
stdout{codec => rubydebug}
}
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
等安装filebeat后测试
六、filebeat部署
filebeat需要部署在应用服务器上,是一个轻量级的插件,监控日志的动态,并收集发送给logstash,也可以直接发送给elasticsearch,当然可以发送至kafka、redis中,然后logstash去其中取数据,此次不涉及,主要安装将数据传给logstash。
将filebeat放入应用服务器中,此次使用tomcat演示
1.解压
tar fx filebeat-7.9.1-linux-x86_64.tar.gz -C /data/soft/filebeat/
2.备份配置文件
cd /data/soft/filebeat/
cp -a filebeat.yml filebeat.yml.bak
3.修改配置
vim /etc/filebeat.yml
- # 类型为log类型,低版本是可以自定义的现在只能使用定义好的类型
- - type: log
- # 设置为启动,否则不会向外输出日志
- enabled: true
- # 日志的路径 ,可以正则匹配多个日志文件
- paths:
- - /usr/local/tomcat/logs/catalina.out
- # 添加一个tags,用于区分服务来创建响应的索引
- tags: ["usersystem"]
- # 多行匹配,正则表示的是每行日志是以什么开头的,如以时间开头,写以下正则,后面以其他格式开头的,会并入到上一个匹配上的行中,日志报错时经常会打印好多at ……,就会并入一行中显示
- multiline.pattern: '^[0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}\.[0-9]{3}'
- # 这个值如果为true 匹配上了,就代表新的一行,为false匹配上代表不是新的一行,具体看下官网,更难懂
- multiline.negate: true
- # 表示未匹配的行并入匹配的下一行前,或者是上一行行后
- multiline.match: after
- output.logstash
- # 输出目标是logstash,可以写多个,可以部署多个logstash,以实际情况定
- hosts: ["172.18.97.29:5044"]
注:当服务器上部署了不止一个服务,就主要重复写-type上面的配置
4. 启动logstash
找到logstash服务,进入logstash目录
cd /data/soft/logstash/bin
./logstash -f ../config/conf.d/logstash.yml
启动较慢等一会,
5.启动filebeat
cd /data/soft/filebeat
./filebeat -c filebeat.yml -e
6.查看logstash输出
控制台输出这个就对了
7.修改logstash配置
input {
beats {
port => "5044"
}
}
output {
if "usersystem" in [tags] {
elasticsearch{
hosts => ["172.18.97.30:9200"]
index => "usersystem-%{+YYYY.MM.dd}"
}
}
stdout{codec => rubydebug}
}
if 是判断标签中的信息来区分服务,elasticsearch是为了将日志输入到es中,index是定义索引名称
8.重启并后台启动
ps -ef | grep logstash
kill -9 ***
nohup ./logstash -f /data/soft/logstash/config/conf.d/logstash.yml &
七.kibana的安装
1.安装和配置 [root@head-kib ~]# tar zvxf kibana-7.9.1-linux-x86_64.tar.gz -C /data/soft/ [root@head-kib ~]# cd /data/soft/kibana/kibana-7.9.1-linux-x86_64/config/ [root@head-kib config]# vim kibana.yml #在末尾添加以下内容 server.port: 5601
server.host: "0.0.0.0"
server.name: "kibana-29"
elasticsearch.hosts: ["http://172.18.97.30:9200"]
i18n.locale: "zh-CN" kibana.index: ".kibana" ==================================================================================== server.port # kibana 服务端口,默认5601 server.host # kibana 主机IP地址,默认localhost elasticsearch.url # 用来做查询的ES节点的URL,默认http://localhost:9200 kibana.index # kibana在Elasticsearch中使用索引来存储保存的searches, visualizations和dashboards,默认.kibana
i18n.locale: "zh-CN" # 使用中文
2.访问kibana 地址
ip:5601如下图
索引管理等由此入口进入
创建索引模式
根据logstash中定义的索引名称进行创建
在discover中寻找创建的索引
就可以看到日志了
注:还有很多细节没有写出,可自行研究下,可在dashboard中添加图表来进行日志分析等操作
采坑指南:
1.es启动报错:
org.elasticsearch.discovery.MasterNotDiscoveredException异常解决
#记得写这条
cluster.initial_master_nodes: ["node-30"]
2.logstash中不要有大写索引名称会报错,也就是说我们定义tags的时候尽量用小写