目录
1.主机规划
主机名 | IP | 部署软件 | 备注 |
cong11 | 192.168.30.11 | ELK 7.3 | ELK软件版本要一致 |
cong12 | 192.168.30.12 | http+filebeat | 使用filebeat收集日志 |
cong13 | 192.168.30.13 | Kafka+zookeeper | 这里部署单节点 |
2.环境配置
1.软件版本
这里使用7.3.0版本,ELK所有的组件最好选择相同的版本
2.时间同步
所有节点都需要进行时间同步,确保时间一致
[root@cong11 ~]# ntpdate ntp1.aliyun.com
[root@cong12 ~]# ntpdate ntp1.aliyun.com
[root@cong13 ~]# ntpdate ntp1.aliyun.com
注:ntpdate命令由ntpdate软件包提供,若未安装,请安装该软件包。
防火墙和selinux关闭
确保时间同步可可以设置个计划任务
crontab -e
*/30 * * * * ntpdate ntp1.aliyun.com
3.ELK部署(cong11)
我们这里把ELK环境搭建好
官网:Elastic 产品:搜索、分析、日志和安全 | Elastic
1)上传软件包
2)安装jdk1.8
由于ELK 的3个软件都需要JDK支持,所以只要安装Elasticsearch + Logstash + Kibana的服务器都要装JDK,jdk版本至少1.8
解压jdk:
tar -zxvf jdk-8u171-linux-x64.tar.gz -C /usr/local/
配置 jdk 环境变量
[root@cong11 ~]# vim /etc/profile
JAVA_HOME=/usr/local/jdk1.8.0_171
PATH=$JAVA_HOME/bin:$PATH
CLASSPATH=$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar
export PATH JAVA_HOME CLASSPATH
source /etc/profile #使环境变量生效
查看 java 环境变量
[root@cong11 ~]# java -version
java version "1.8.0_171"
Java(TM) SE Runtime Environment (build 1.8.0_171-b11)
Java HotSpot(TM) 64-Bit Server VM (build 25.171-b11, mixed mode)
3.安装Elasticsearch
我们这里开始安装Elasticsearch,这里做实验配置用的是Elasticsearch单节点部署,生产环境中应该部署Elasticsearch集群,保证高可用
解压软件包
tar -zxvf elasticsearch-7.3.0-linux-x86_64.tar.gz -C /usr/local/
创建用户
源码包安装Elasticsearch不能用root启动,需要新建一个用户来启动ElasticSearch,这里创建普通用户elk
useradd elk
给文件授权
chown -R elk:elk /usr/local/elasticsearch-7.3.0/
设置内核参数
修改系统参数,确保系统有足够资源启动ES
vim /etc/sysctl.conf
vm.max_map_count=655360
是内核配置生效:
sysctl -p
vm.max_map_count = 655360
注:
vm.max_map_count这个参数就是允许一个进程在VMA(Virtual Memory Areas,虚拟内存区域)拥有最大数量,虚拟内存区域是一个连续的虚拟地址空间区域,在进程的生命周期中,每当程序尝试在内存中映射文件,链接到共享内存段,或者分配堆空间的时候,这些区域将被创建。调优这个值将限制进程可拥有VMA的数量,当达到vm.max_map_count了就是返回out of memory errors
这个数据通过下面的命令可以查看: cat /proc/sys/vm/max_map_count
可以通过命令cat /proc/{pids}/maps |wc -l来监控,当前进程使用到的vm映射量
设置资源参数
vim /etc/security/limits.conf
设置用户打开文件数的硬限制,软限制
* soft nofile 65536
* hard nofile 65536
设置用户可以打开最大进程数的软硬限制
* soft nproc 65536
* hard nproc 65536
切换到elk用户
使用普通用户去启动elasticsearch,这是软件强制规定的
su - elk
进到解压目录下
[elk@cong11 ~]$ cd /usr/local/elasticsearch-7.3.0/
Elasticsearch主配置文件
如果是集群修改如下配置,集群式通过cluster.name自动在9300端口上寻找节点信息的
9300是集群内部通信的端口
cluster.name: my-application #集群名称,同一个集群的标识
node.name: node-1 #节点名称path.data: /data/elk/data #数据存储位置
path.logs: /data/elk/logs #日志文件的路径
bootstrap.memory_lock: false #内存锁定
bootstrap.system_call_filter: false#如果系统为centos6.x操作系统,不支持SecComp,而elasticsearch默认bootstrap.system_call_filter为true进行检测,所以导致检测失败,失败后直接导致ES不能启动。
# 解决办法:在elasticsearch.yml中添加配置项:bootstrap.system_call_filter为falsenetwork.host: 0.0.0.0 # ES的监听地址,这样别的机器也可以访问
http.port: 9200 #监听端口,ES节点和外部通讯使用,默认的端口号是9200。
cluster.initial_master_nodes: ["node-1"] #设置一系列符合主节点条件的节点的主机名或IP地址来引导启动集群
[elk@cong11 elasticsearch-7.3.0]$ vim config/elasticsearch.yml
cluster.name: my-application
node.name: cong11
path.data: /data/elk/data
path.logs: /data/elk/logs
bootstrap.memory_lock: false
bootstrap.system_call_filter: false
network.host: 0.0.0.0
http.port: 9200
cluster.initial_master_nodes: ["cong11"]
退出 elk 用户,创建数据和日志目录
[elk@cong11 elasticsearch-7.3.0]$ exit
登出
[root@cong11 ~]# mkdir -p /data/elk/{data,logs}
chown -R elk:elk /data/elk/ #数组属组改为elk用户
su - elk
cd /usr/local/elasticsearch-7.3.0/
修改 jvm的内存分配 ,默认是1g,官方建议对jvm进行一些修改,不然很容易出现OOM,参考官网改参数配置,最好不要超过内存的50%
vim config/jvm.options
-Xms1g
-Xmx1g
启动Elasticsearch
前台运行查看启动过程状态
cd /usr/local/elasticsearch-7.3.0/
./bin/elasticsearch
后台启动
注:ES 启动一定是创建的 elk 普通用户启动
[elk@cong11 elasticsearch-7.3.0]$ nohup /usr/local/elasticsearch-7.3.0/bin/elasticsearch &
或者
/usr/local/elasticsearch-7.3.0/bin/elasticsearch -d
查看端口:
确认elasticsearch的9200端口已监听,说明elasticsearch已成功运行
netstat -anptl | grep java
或
netstat -anptl | grep 9200
查看进程
jps -m
或
ps -ef | grep elasticsearch
注:
单个节点可以作为一个运行中的 Elasticsearch的实例,而是一个集群是一组拥有相同cluster.name的节点,(单独的节点也可以组成一个集群)可以在elasticsearch.yml配置文件中修改cluster.name,该节点启动时加载(需要重启服务后才会生效)
Elasticsearch测试
或者
curl http://192.168.30.11:9200/
加入开启自启
编写一个启动脚本
su - root #切换到root配置
vim /etc/init.d/elasticsearch
#!/bin/sh
#chkconfig: 2345 80 05
#description: elasticsearch
export JAVA_BIN=/usr/local/jdk1.8.0_171/bin
export PATH=$PATH:$JAVA_HOME/bin
export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export JAVA_HOME JAVA_BIN PATH CLASSPATH
case "$1" in
start)
su elk<<!
cd /usr/local/elasticsearch-7.3.0/
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
stop)
es_pid=`jps | grep Elasticsearch | awk '{print $1}'`
kill -9 $es_pid
echo "elasticsearch stopped"
;;
restart)
es_pid=`jps | grep Elasticsearch | awk '{print $1}'`
kill -9 $es_pid
echo "elasticsearch stopped"
su elk<<!
cd /usr/local/elasticsearch-7.3.0/
./bin/elasticsearch -d
!
echo "elasticsearch startup"
;;
*)
echo "start|stop|restart"
;;
esac
exit $?
su elk<<! 切换为elk用户执行下面的命令,<<! 相当于<<EOF
注意:
以上脚本的用户为elk,如果你的用户不是,则需要替换
以上脚本的JAVA_BIN以及elasticsearch_home如果不同请替换
给脚本添加权限,添加开机自启
chmod +x /etc/init.d/elasticsearch
chkconfig --add /etc/init.d/elasticsearch
测试脚本
systemctl restart elasticsearch
ps -aux | grep elasticsearch
4.安装logstash
解压安装包
下载并安装Logstash,安装logstash只需将它解压的对应目录即可,例如:/usr/local下:
tar -zxvf logstash-7.3.0.tar.gz -C /usr/local/
Logstash管道有两个必需的元素,input和output,以及一个可选的元素,filter。输入插件从数据源那里消费数据,过滤器插件根据你的期望修改数据,输出插件将数据写入目的地。
首先,我们通过运行最基本的Logstash管道来测试Logstash安装
/usr/local/logstash-7.3.0/bin/logstash -e 'input {stdin{}} output {stdout{}}'
Thread.exclusive is deprecated, use Thread::Mutex
Sending Logstash logs to /usr/local/logstash-7.3.0/logs which is now configured via log4j2.properties
[2022-06-15T17:33:06,537][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.queue", :path=>"/usr/local/logstash-7.3.0/data/queue"}
[2022-06-15T17:33:06,553][INFO ][logstash.setting.writabledirectory] Creating directory {:setting=>"path.dead_letter_queue", :path=>"/usr/local/logstash-7.3.0/data/dead_letter_queue"}
[2022-06-15T17:33:06,803][WARN ][logstash.config.source.multilocal] Ignoring the 'pipelines.yml' file because modules or command line options are specified
[2022-06-15T17:33:06,812][INFO ][logstash.runner ] Starting Logstash {"logstash.version"=>"7.3.0"}
[2022-06-15T17:33:06,836][INFO ][logstash.agent ] No persistent UUID file found. Generating new UUID {:uuid=>"60035eff-d053-481c-9f9b-152f3466bd03", :path=>"/usr/local/logstash-7.3.0/data/uuid"}
[2022-06-15T17:33:07,990][INFO ][org.reflections.Reflections] Reflections took 28 ms to scan 1 urls, producing 19 keys and 39 values
[2022-06-15T17:33:08,885][WARN ][org.logstash.instrument.metrics.gauge.LazyDelegatingGauge] A gauge metric of an unknown type (org.jruby.RubyArray) has been create for key: cluster_uuids. This may result in invalid serialization. It is recommended to log an issue to the responsible developer/development team.
[2022-06-15T17:33:08,887][INFO ][logstash.javapipeline ] Starting pipeline {:pipeline_id=>"main", "pipeline.workers"=>4, "pipeline.batch.size"=>125, "pipeline.batch.delay"=>50, "pipeline.max_inflight"=>500, :thread=>"#<Thread:0x4a25ae0e run>"}
[2022-06-15T17:33:08,949][INFO ][logstash.javapipeline ] Pipeline started {"pipeline.id"=>"main"}
The stdin plugin is now waiting for input:
[2022-06-15T17:33:09,031][INFO ][logstash.agent ] Pipelines running {:count=>1, :running_pipelines=>[:main], :non_running_pipelines=>[]}
[2022-06-15T17:33:09,304][INFO ][logstash.agent ] Successfully started Logstash API endpoint {:port=>9600}
hello world #通过键盘输入的内容
/usr/local/logstash-7.3.0/vendor/bundle/jruby/2.5.0/gems/awesome_print-1.7.0/lib/awesome_print/formatters/base_formatter.rb:31: warning: constant ::Fixnum is deprecated
{
"@timestamp" => 2022-06-15T09:35:15.482Z,
"@version" => "1",
"host" => "cong11",
"message" => "hello world"
}
注: stdin 标准输入,stdout标准输出
,logstash按照某种格式输出,其中-e参数允许Logstash直接通过命令行接受设置。这点尤其快速的帮助我们反复的测试配置是否正确而不用写配置文件。使用CTRL-C命令可以退出之前运行的Logstash
生成配置文件
vim /usr/local/logstash-7.3.0/config/logstash.conf
input {
file {
path => "/var/log/messages"
type => "messages_log"
start_position => "beginning"
}
}
filter {
}
output {
elasticsearch {
hosts => ["192.168.30.11:9200"]
index => "var-massages-%{+yyyy.MM.dd}"
}
stdout { codec => rubydebug }
}
注:上述文件复制时必须除去多余空格, 保持yml文件规范。这个配置文件只是简单测试logstash收集日志功能
input { #input plugin让logstash可以读取特定的事件源。
file { #file 从文件读取数据
path => "/var/log/messages" #收集来源,这里从输入的文件路径收集系统日志。可以用/var/log/*.log,/var/log/**/*.log,如果是/var/log则是/var/log/*.log。
type => "messages_log" #通用选项. 用于激活过滤器。
start_position => "end" #start_position 选择logstash开始读取文件的位置,begining或者end。默认是end,end从文件的末尾开始读取,也就是说,仅仅读取新添加的内容。对于一些更新的日志类型的监听,通常直接使用end就可以了;相反,beginning就会从一个文件的头开始读取。但是如果记录过文件的读取信息,这个配置也就失去作用了。
}
}
filter { #过滤器插件,对事件执行中间处理、过滤,为空不过滤。
}
output { #输出插件,将事件发送到特定目标。
elasticsearch { #将事件发送到es,在es中存储日志
hosts => ["192.168.30.11:9200"]
index => "var-massages-%{+yyyy.MM.dd}" #index表示事件写入的索引。可以按照日志来创建索引,以便于删旧数据和按时间来搜索日志
}
stdout { codec => rubydebug } # stdout标准输出,输出到当前终端显示屏,此选项为了测试可省略
}
还有很多的input/filter/output插件类型,可以参考官方文档来配置
https://www.elastic.co/guide/en/logstash/current/index.html
做软连接
ln -s /usr/local/logstash-7.3.0/bin/* /usr/local/bin/
启动logstash
logstash -f /usr/local/logstash-7.3.0/config/logstash.conf
使用echo命令模拟写入日志,另外打开一个终端,执行下面的命令。
echo "$(date) hello world" >> /var/log/messages
可以使用curl命令发送请求来查看ES是否接收到了数据:
curl http://192.168.30.11:9200/_search?pretty
常用启动参数:
-e:立即执行,使用命令行里的配置参数启动实例
例如 logstash -e 'input {stdin{}} output {stdout{}}‘
-f:指定启动实例的配置文件
例如logstash -f /usr/local/logstash-7.3.0/config/logstash.conf
-t:测试配置文件的正确性
例如logstash -f /usr/local/logstash-7.3.0/config/logstash.conf -t
后台启动
nohup logstash -f /usr/local/logstash-7.3.0/config/logstash.conf &
开启自启
让开机加载jjava 环境
echo "source /etc/profile" >> /etc/rc.local
echo "nohup logstash -f /usr/local/logstash-7.3.0/config/logstash.conf &" >> /etc/rc.local
chmod +x /etc/rc.local
5.安装Kibana
解压软件包
下载kibana后,解压到对应的目录就完成kibana的安装
tar -zxvf kibana-7.3.0-linux-x86_64.tar.gz -C /usr/local/
修改配置文件
vim /usr/local/kibana-7.3.0-linux-x86_64/config/kibana.yml
#开启以下选项并修改
server.port: 5601
server.host: "192.168.1.11"
elasticsearch.hosts: ["http://192.168.1.11:9200"] #修改elasticsearch地址,多个服务器请用逗号隔开
注意:host:与IP地址中间有个空格不能删除,否则报错
启动服务
/usr/local/kibana-7.3.0-linux-x86_64/bin/kibana
Kibana should not be run as root. Use --allow-root to continue. 这个报错是限制root用户运行,如想用root账户运行 使用 --allow-root 。
/usr/local/kibana-7.3.0-linux-x86_64/bin/kibana --allow-root
kibana 设置后台启动,使用nohup 配合
nohup /usr/local/kibana-7.3.0-linux-x86_64/bin/kibana --allow-root &
添加开机自启
echo "nohup /usr/local/kibana-7.3.0-linux-x86_64/bin/kibana --allow-root &" >> /etc/rc.local
测试
访问kibana
6.Kibana测试
创建一个索引
登录后,首先,配置一个索引,打开发现,可以在仪表盘上看到我们在建logstash上创建的索引,添加索引,创建就可以
选择时间过滤器
索引参数配置
看到如下界面说明索引创建完成。使用默认就可以
查看收集来的日志
点击 “discover”,可以搜索和浏览 Elasticsearch中的数据
使用时间过滤器查看日志
默认搜索最近15分钟的数据,可以自定义选择时间
到此,说明你的ELK平台安装部署完成。