场景
一般常见我们需要进行日志分析场最是:直接在日志文件中grep. awk就可以获得自己想要的信息。但在规模较大的场景中,此方法效率低下,面临问题包括日志量太大如何归档、文本搜索太慢怎么办,如何多维度查询。需要集中化的日志管理,所有服务器上的日志收集汇总。常见解决思路是建立集中式日志收集系统,将所有节点上的日志统收集,管理,访问。
大型系统是个分布式部署的架构,不同的服务模块部署在不同的服务器上,问题出现时,大部分情况需要根据问题暴露的关键统,定位到具体的服务器和服务模块,构建一套集中式日志系统,可以提高定位问题的效率。
对大量的目志业务数据进行分析 如平台PV,UV.,IP,PageTOP等维度进行分析直询等。另外安全审计、数据挖掘、行为分析等都少不了日志对其作为支撑
作用
信息查询,通过检索日志信息,定位相应的bug,找出解决方案。
服务诊断:通过日志信息进行统计,分析,了解服务器的负荷和服务器运行状态,,找出耗时请求进行优化等等
数据分析:如果是格式化的log,可以进行做进一步的数据分析,统计,聚合出有意义的信息,比如根据请求中的商品id,找出TOP10用户感兴趣商品
架构
日志系统三个基本组件:
采集端:agent(采集日志源数据,封装数据源,将数据源中的数据发送给collector)
聚合端:collector(按一定规则进行数据处理,接收多个agent的数据,并且进行汇总后导入后端的store中)
存储端:store(日志存储系统,应具有可扩展性和可靠性,如果HDFS ES等)
组件
Esiciach日志存储和搜索引擎,它的特点有:分布式,零配置,自动发现,索自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是个完全开源的工具,他可以对你的日志进行收集,过滤,并将其存储供以后使用(支持动态的从各种数据源搜集数据,并对数据进行过滤分析、丰富、统格式等操作。)
Kibana 也是个开源和免费的工具, Kibana可以为Logstash和ElasticSearch提供的日志分析友好的Web界面,可以帮助您汇总,分析和搜索重要数据日志。
Filebeat: 和Logstash一样属于日志收集处理工具,基于原先Logstash-fowarder的源码改造出来的。与Logstash相比, filebeat更加轻量,占用资源更少
应用程序(AppSever)->Logstash->ElasticSearch->Kibana->浏览器(Browser) logstash收集AppServer产生的log,并且放在ElasticSearch群集中而kibana则从ElasticSearch集群中查询数据生成图表,再返回给Browser.考虑到聚合端(日志处理、清洗等)负载问题和采集端传输效率,一般在日志量比较大的时候在采集端和聚合端增加队列,以用来实现日志消峰。
ELK日志流程可以有多种方案(不同组件可自由组合,根据自身业务配置) , 常见有以下:
?Logstash(采集、处理)–>ElasticSearch(存储)—>Kibana(展示)
logstash(采集)–>logstash(聚合、处理)–>ElasticSearch(存储)–>Kibana(展示)
Filebeat(采集、处理)–>ElasticSearch(存储)–>Kibana(展示)
Filebeat(采集)–>logstash(聚合、处理)–>ElasticSearch(存储)–>Kibana(展示)
Filebeat(采集)–>kafka/redis(消峰)–>logstash(聚合、处理)–>ElasticSearch(存储)–>Kibana(展示)
Logstash部署
工作原理
Logstash部署 有两个必要元素:input和output,一个可选元素:filter。这三个元素,分别代表logstash事件处理的三个阶段:输入>过滤器>输出
1 负责从数据源采集数据
2 filter将数据修改为你指定的格式或内容
3 output 将数据传输到目的地
在实际应用场景中,通常输入、输出、过滤器不止一个、logstash的这三个元素都使用插件式管理方式,可以根据应用需要,灵活的选用各阶段需要的插件,并组合使用
配置文件
Logstash.yml:logstash的默认配置文件,配置如node.name、path.data、pipeline.workers、
Queue.type等,这其中的配置可以被命令行参数中的相关参数覆盖
Jvm.options:logstash 的jvm配置文件
Startup.options(linux):包含系统安装脚本在/usr/share/logstash/bin中使用的选项为您的系统构建适当的启动脚本。安装logstash软件包时,系统安装脚本将在安装过程结束时执行,并使用startup.options中指定的设置来设置用户,组,服务名称和服务描述等选项。
Pipelines.yml:定义数据处理流程的文件
Input常用模块
Logstash支持各种输入选择,可以在同一时间从众多常用来源捕捉事件。能够以连续的流式传输方式,可从日志、指标、web应用、数据存储以及各种AWS服务采集数据。
File:从文件系统上的文件读取
Syslog:在众所周知的端口514上侦听系统日志消息,并根据RFC3164格式进行解析
Redis:从redis服务器读取,使用redis通道和redis列表。Redis经常用作集中式logstash安装中的“代理”,它将接受来自远程logstash“托运人”的logstash事件排队
Beats:处理由filebeat发送的事件
常用的filter模块
过滤器是logstash管道中的中间处理设备。可以将条件过滤器组合在一起,对事件执行操作。
Grok:解析和结构任意文本。Grok目前是logstash中将非结构化日志数据解析为结构化和可查询的最佳方法。
Mutate:对事件字段执行一般转换。您可以重命名,删除,替换和修改事件中的字段。
Drop:完全放弃一个事件,例如调试事件
Clone:制作一个事件的副本,可能会添加或删除字段
Geoip:添加有关ip地址的地理位置的信息
常用output:
Elasticsearch:将时间数据发送给elasticsearch(推荐模式)
File:将事件数据写入文件或磁盘
Graphite:将时间数据发送给graphite(一个流行的开源工具,存储和绘制指标)。
Statsd:将事件数据发送到statsd(这是一种侦听统计数据的服务,如计算器和定时器,通过UDP发送并将聚合发送到一个或多个可插入的后端服务)
编码插件codes:
在此之前,logstash 只支持纯文本形式输入,然后以过滤器处理它。
但现在,我们可以在输入 期处理不同类型的数据,这全是因为有了 codec 设置。所以,这里需要纠正之前的一个概念。Logstash 不只是一个 input | filter | output 的数据流,而是一个 input | decode |filter | encode | output 的数据流!codec 就是用来 decode、encode 事件的。codec 的引入,使得 logstash 可以更好更方便的与其他有自定义数据格式的运维产品共存,比如
graphite、fluent、netflow、collectd,以及使用 msgpack、json、edn 等通用数据格式的其他产品等。事实上,我们在第一个 “hello world” 用例中就已经用过 codec 了 —— rubydebug 就是一种 codec!虽然它一般只会用在stdout 插件中,作为配置测试或者调试的工具。
Filebeat部署
工作原理
在任何环境下,应用程序本有停机的可能性。Filebeat读取并转发日志行,如果中断.则会记住所有事件恢复联机状态时所在位置。Filebeat带有内部模块(auditd,Apache,Nginx,System和MySQL),可通过一个指定命令来简化通用日志格式的收集。解析和可视化
FileBeat不会让你的管道超负荷。FileBeat 如果是向Logstash传输数据,当Logstash 忙于处理数据,会通知FileBeat放慢读取速度。一旦拥塞得到解决 , FileBeat将恢复到原来的速度并继续传插。
Filebeat保持每个文件的状态.并经常刷新注册表文件中的磁盘状态。状态用于记住harvester正在读取的最后偏移量,并确保发送所有日志行。Flebeat将每个事件的传递状态存储在注册表文件中,所以它能保证事件至少传递一次到配的输出,没有数据丢失。
首先在第一台配置elasticsearch,因为老师说开多虚拟机会卡所以就不搭建集群只使这台角色即充当服务器处理角色也充当data:
需要jdk环境支持
[root@computer1 ~]# tar -zxvf jdk-8u201-linux-x64.tar.gz -C /usr/local/
[root@computer1 ~]# vi /etc/profile
export MAVEN_HOME=/usr/local/apache-maven-3.6.0/
export PATH=PATH export JAVA_HOME=/usr/local/jdk1.8.0_201/ #以下这四行是java的变量
export JRE_HOME=/usr/local/jdk1.8.0_201/
export CLASSPATH=JAVA_HOME/lib/dt.jar export PATH=JRE_HOME/bin:$PATH [root@computer1 ~]# source /etc/profile
[root@computer1 ~]# tar -zxf elasticsearch-6.3.2.tar.gz -C /usr/local/
[root@computer1 ~]# ln -s /usr/local/elasticsearch-6.3.2/ /usr/local/es
[root@computer1 ~]# groupadd es
[root@computer1 ~]# useradd es -g es
[root@computer1 ~]# chown -R es:es /usr/local/es/
[root@computer1 ~]# mkdir -p /es/{data,log}
[root@computer1 ~]# chown -R es:es /es
[root@computer1 ~]# echo ‘* soft nofile 819200’ >> /etc/security/limits.conf
[root@computer1 ~]# echo ‘* hard nofile 819200’ >> /etc/security/limits.conf
[root@computer1 ~]# echo ‘* soft nproc 2048’ >> /etc/security/limits.conf
[root@computer1 ~]# echo ‘* hard nproc 4096’ >> /etc/security/limits.conf
[root@computer1 ~]# echo ‘* soft memlock ulimited’ >> /etc/security/limits.conf
[root@computer1 ~]# echo ‘* hard memlock ulimited’ >> /etc/security/limits.conf
[root@computer1 ~]# echo ‘vm.max_map_count=655360’ >> /etc/sysctl.conf
[root@computer1 ~]# sysctl -p
vm.max_map_count = 655360
设置参数:
[root@computer1 ~]# vi /usr/local/es/config/elasticsearch.yml
cluster.name: bdqn
node.name: es
node.master: true
node.data: true
path.data: /es/data
path.logs: /es/log
network.host: 0.0.0.0
http.port: 9200
discovery.zen.minimum_master_nodes: 1
bootstrap.memory_lock: false
bootstrap.system_call_filter: false 是否对系统资源进行调用 true表示限制 false表示不限制
[root@computer1 ~]# vi /usr/local/es/config/jvm.options
-Xms1g 查看一下给java分配的内存是多大,不要太大,这里就是看一下默认就行-Xmx1g
[root@computer1 ~]# su es
[es@computer1 root]$ /usr/local/es/bin/elasticsearch
[root@computer1 ~]# curl 192.168.133.50:9200
搭建kibana:
[root@controller ~]# tar -zxf kibana-6.3.2-linux-x86_64.tar.gz -C /usr/local/
[root@controller ~]# ln -s /usr/local/kibana-6.3.2-linux-x86_64/ /usr/local/kibana
[root@controller ~]# vi /usr/local/kibana/config/kibana.yml
server.port: 5601
server.host: “0.0.0.0”
elasticsearch.url: “http://192.168.133.50:9200”
Kafka集群 依赖于zookeeper集群,然后zookeeper依赖于java和jdk环境
[root@controller ~]# tar -zxf zookeeper-3.4.12.tar.gz -C /usr/local/
[root@controller ~]# cd /usr/local/zookeeper-3.4.12/
[root@controller zookeeper-3.4.12]# cp conf/zoo_sample.cfg conf/zoo.cfg
tickTime= zookeeper集群与其他节点心跳的时间间隔
initLimit= 表示zookeeper集群初始化连接的时候最大忍耐的心跳次数
syncLimit= 表示zookeeper集群之间通讯能忍耐的最大的心跳数
dataDir=/data/zookeeper/zkdata 数据存放目录的位置
dataLogDir=/data/zookeeper/zkdatalog 存放zookeeper日志位置
[root@localhost zookeeper-3.4.12]# vi conf/zoo.cfg
[root@controller zookeeper-3.4.12]# mkdir -p /data/zookeeper/{zkdata,zkdatalog}
[root@controller zookeeper-3.4.12]# echo 1 > /data/zookeeper/zkdata/myid
[root@localhost zookeeper-3.4.12]# /usr/local/zookeeper-3.4.12/bin/zkServer.sh start
搭建kafka:
[root@localhost ~]# tar -zxvf kafka_2.12-2.1.0.tgz -C /usr/local/
ln -s /usr/local/kafka_2.12-2.1.0/ /usr/local/kafka
cd /usr/local/kafka
[root@localhost kafka]# vi config/server.properties
写的是自己的IP
再添加一条delete.topic.enable=true
[root@localhost kafka]# mkdir -p /data/kafka/kfdata
[root@localhost kafka]# /usr/local/kafka/bin/kafka-server-start.sh -daemon /usr/local/kafka/config/server.properties 开启kafka
[root@localhost kafka]# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.133.100:2181 --replication-factor 1 --partitions 1 --topic elktest
[root@localhost kafka]# /usr/local/kafka/bin/kafka-topics.sh --create --zookeeper 192.168.133.100:2181 --replication-factor 1 --partitions 1 --topic elktest
创建会话
[root@localhost kafka]# /usr/local/kafka/bin/kafka-topics.sh --zookeeper 192.168.133.100:2181 --topic “elktest” --describe 查看kafka详细信息
生产者:/usr/local/kafka/bin/kafka-console-producer.sh --broker-list 192.168.133.80:9092 --topic elktest 创建会话信息
消费者:[root@localhost ~]# /usr/local/kafka/bin/kafka-console-consumer.sh --bootstrap-server 192.168.133.100:9092 --topic elktest --from-beginning 接受会话消息
搭建logstash:
[root@localhost ~]# tar -zxvf logstash-6.3.2.tar.gz -C /usr/local/
[root@localhost ~]# ln -s /usr/local/logstash-6.3.2/ /usr/local/logstash
[root@localhost ~]# vi /usr/local/logstash/config/logstash.yml
config.reload.automatic: true
config.reload.interval: 10
http.host: “192.168.133.60”
path.config: /usr/local/logstash/config/*.conf
path.logs: /var/log/logstash
config.reload.automatic: 配置文件是否自动加载 true表示自动加载
config.reload.interval: 配置文件自动加载时间的时间间隔
http.host: 添加的是自己的IP地址 因为没有多余的虚拟机就监听自己然后收集自己的信息