日志监控平台搭建 关于flume Kafka Elk
来源:互联网 发布:继续教育网络培训总结 编辑:程序博客网 时间:2024/06/06 07:27
最近需要搭建一套日志监控平台,参考了新浪与美团的一些东西.现在实录一下搭建与优化调整的过程
目前把这几件放在一起的文档还不够多,其中相当一部分因为elk的升级配置也已经不能用了,更多的是单机版的配置,完全没有参考性.
优化的部分将等待项目与新平台正式上线在另一篇文章写出
拓扑图
软硬件配置
- 本机 ubuntu 14.04
- 线上 centos 6.5
搭建
basic
新机器修改root密码sudo passwd
创建用户
useradd clusterpasswd clusterchmod +w /etc/sudoersvim /etc/sudoerscluster ALL=(root)NOPASSWD:ALL chmod -w /etc/sudoersmkdir /home/clustermkdir /home/stackchmod 777 /home/clusterchmod 777 /home/stack
以上部分/home/stack用于存储所需所有tar.gz包
/home/cluster作为所有软件的安装目录
而后创建cluster目录下data目录,用于存放各组件配置,日志,数据
scp推荐工具ZOC7
同步各个机器的hosts
127.0.0.1 localhost 10.1.12.25 c110.1.12.23 c210.1.12.24 c310.1.12.27 c410.1.12.28 c5
分发各机器的rsa公钥
ssh-keygencat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keyschmod 700 ~/.ssh/authorized_keys chmod 600 -R ~/.ssh/
各机器profile设置
tar -zxvf sudo vim /etc/profileexport JAVA_HOME=/home/cluster/jdkexport ZK_HOME=/home/cluster/zookeeperexport KAFKA_HOME=/home/cluster/kafkaexport SCALA_HOME=/home/cluster/scalaexport PATH=$PATH:$JAVA_HOME/bin:$ZK_HOME/bin:$KAFKA_HOME/bin:$SCALA_HOME/bin 替换系统默认javasudo update-alternatives --install /usr/bin/java java /home/cluster/jdk/jre/bin/java 301 sudo update-alternatives --config java java -version
前三台机器的cluster目录树
drwxr-xr-x 4 root root 4096 4月 20 14:34 data/drwxr-xr-x 8 uucp 143 4096 3月 21 13:13 jdk/drwxr-xr-x 7 root root 4096 4月 20 14:30 kafka/drwxrwxr-x 6 cluster cluster 4096 3月 4 23:30 scala/drwxr-xr-x 10 zy zy 4096 4月 20 14:13 zookeeper/
后两台机器的cluster目录树
drwxr-xr-x 4 zy root 4096 4月 21 17:23 data/drwxrwxrwx 7 zy root 4096 4月 21 15:07 elasticsearch/drwxr-xr-x 8 zy 143 4096 3月 21 13:13 jdk/drwxr-xr-x 10 zy staff 4096 3月 29 06:46 kibana/drwxr-xr-x 5 zy root 4096 4月 21 18:06 logstash/
开发环境下关闭防火墙
chkconfig iptables off && service iptables status或者ufw disable或者systemctl stop firewalld.service && systemctl disable firewalld.service && setenforce 0
非ubuntu机器关闭SELinux
修改 /etc/selinux/config,将 SELINUX=enforcing 改为 SELINUX=disabledselinux默认ubuntu不安装,iptables默认也是全开放的.可以用getenforce和iptables -L命令查看下两个组件的状态
同步各机器时区
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime或者ntpdate cn.pool.ntp.org
zookeeper配置
修改conf目录下模板配置为zoo.cfg
tickTime=2000initLimit=10syncLimit=5dataDir=/home/cluster/data/zookeeperclientPort=2181server.1= c1:2888:3888server.2= c2:2888:3888server.3= c3:2888:3888
而后
在配置的dataDir目录下创建一个myid文件,里面写入一个0-255之间的一个随意数字,每个zk上这个文件的数字要是不一样的,这些数字应该是从1开始,依次写每个服务器。
文件中序号要与dn节点下的zk配置序号一直,如:server.1=c1:2888:3888,那么dn1节点下的myid配置文件应该写上1
- 各节点启动:
bin/zkServer.sh start
- 查看节点状态与leader与否
bin/zkServer.sh status
- 查看java进程
jps
kafka配置
配置目录下
zookeeper.properties
dataDir=/home/cluster/data/zookeeperclientPort=2181maxClientCnxns=0
server.properties
############### Server Basics ###############broker.id=0############# Socket Server Settings #############listeners=PLAINTEXT://:9092num.network.threads=3num.io.threads=8socket.send.buffer.bytes=102400socket.receive.buffer.bytes=102400socket.request.max.bytes=104857600##############Log Basics ##############log.dirs=/home/cluster/data/kafka/lognum.partitions=1num.recovery.threads.per.data.dir=1############ Log Retention Policy ###############log.retention.hours=168log.segment.bytes=1073741824log.retention.check.interval.ms=300000############## Zookeeper ###############zookeeper.connect=localhost:2181zookeeper.connection.timeout.ms=6000
producer.properties
############### Producer Basics ##############metadata.broker.list=c1:9092,c2:9092,c3:9092producer.type=synccompression.codec=noneserializer.class=kafka.serializer.DefaultEncoder
consumer.properties
zookeeper.connect=c1:2181,c2:2181,c3:2181zookeeper.connection.timeout.ms=6000group.id=cluster-consumer-group
- 启动
nohup bin/kafka-server-start.sh config/server.properties &
- 依然jps
jps
测试
本部分的分片partitions有待调整,分布式的logstash需要分片的消息,否则会出现消息顺序错误
leader上执行
bin/kafka-topics.sh --zookeeper c1:2181,c2:2181,c3:2181 --topic tt_topic --replication-factor 3 --partitions 3 --createbin/kafka-topics.sh --zookeeper c1:2181,c2:2181,c3:2181 --topic tt_topic --describe
leader消息发送
bin/kafka-console-producer.sh --broker-list c1:9092,c2:9092,c3:9092 --topic tt_topic
从者消息消费
bin/kafka-console-consumer.sh --zookeeper c1:2181,c2:2181,c3:2181 --from-beginning --topic tt_topic
elasticsearch配置
修改es文件夹所属用户组 chown -R cluster /home/cluster/elasticsearch
修改data文件夹所属用户组 chown -R cluster /home/cluster/data
es配置
cluster.name: elasticsearchnode.name: c4path.data: /home/cluster/data/elasticsearch/datapath.logs: /home/cluster/data/elasticsearch/logbootstrap.mlockall: true//这行一定要填ipnetwork.host: 10.1.12.27http.port: 9200discovery.zen.ping.unicast.hosts: ["c4", "c5"]discovery.zen.minimum_master_nodes: 2
安装插件
bin/plugin install mobz/elasticsearch-head bin/plugin install lmenezes/elasticsearch-kopf bin/plugin install lukas-vlcek/bigdesk
- 运行
bin/elasticsearch -d
- 状态查看
http://10.1.12.27:9200/_plugin/head/
kibana配置
基本设置需要修改的部分
server.port: 5601server.host: "c4"elasticsearch.url: "http://c4:9200"
- 启动
nohup bin/kibana &
- 访问
http://10.1.12.27:5601
logstash配置
修改ruby源,修改Gemfile文件https://ruby.taobao.org
安装插件
bin/logstash-plugin install logstash-input-kafkabin/logstash-plugin install logstash-output-elasticsearch
新建kafka-logstash-es.conf
置于cluster/data/logstash/conf目录下
input { kafka { zk_connect => "c1:2181,c2:2181,c3:2181" group_id => "cluster-consumer-group" topic_id => "tt_topic" reset_beginning => false consumer_threads => 5 decorate_events => true codec => "plain" } }output { elasticsearch { hosts => ["c4:9200","c5:9200"] index => "logstash-log-%{+YYYY.MM.dd}" workers => 5 codec => "json" } }
测试配置文件
bin/logstash -f /home/cluster/data/logstash/conf/kafka-logstash-es.conf --configtest
运行
nohup bin/logstash -f /home/cluster/data/logstash/conf/kafka-logstash-es.conf &
这个平台搭建的后期我遇见了新的需求,对flume的定制需求越来越多,如果你不想面对这种情况,那么可以这样:
bin/logstash-plugin install logstash-input-log4j bin/logstash-plugin install logstash-output-kafka
把flume的部分替换成使用logstash来进行:
input{ log4j { mode => "server" host => "[c1/c2/c3]" port => 4560 }}output{ kafka { bootstrap_servers => "c1:9092,c2:9092,c3:9092" topic_id => "tt_topic" workers => 5 codec => "plain" }}
同样在log4j中配置新的SocketAppender指向挂在logstash集群前的负载均衡.
<appender name="LOGSTASH-APPENDER" class="org.apache.log4j.net.SocketAppender"> <param name="remoteHost" value="lb1" /> <param name="port" value="4560" /> <param name="Threshold" value="INFO" /> <param name="ReconnectionDelay" value="1000" /> <param name="LocationInfo" value="true" /> <layout class="org.apache.log4j.PatternLayout"> <param name="ConversionPattern" value="%-d{yyyy-MM-dd HH:mm:ss}-[%p]-[%l]-%m%n" /> </layout> </appender>
想要使用多个 logstash 端协同消费同一个 topic 的话,那么需要把两个或是多个 logstash 消费端配置成相同的 group_id 和 topic_id
但是前提是要把相应的 topic 分多个 partitions (区),多个消费者消费是无法保证消息的消费顺序性的
查看后台任务 jobs
杀掉后台任务 kill %number
flume配置
- 确定jdk
- 上传stack
- 同步hosts
flume-env.sh
export JAVA_HOME=/opt/software/java export JAVA_OPTS="-Xms1024m -Xmx2048m"
flume-kafka.properties
ag1.sources=src1 src2ag1.sinks=sink1ag1.channels=chn1ag1.sources.src1.type = execag1.sources.src1.shell = /bin/bash -cag1.sources.src1.command = tail -F tt.logag1.sources.src1.channels = chn1ag1.sources.src2.type = execag1.sources.src2.shell = /bin/bash -cag1.sources.src2.command = tail -F tt.logag1.sources.src2.channels = chn1ag1.channels.chn1.type = memoryagent.channels.chn1.keep-alive = 60 ag1.channels.chn1.capacity = 1000ag1.channels.chn1.transactionCapacity = 100ag1.sinks.sink1.type = org.apache.flume.sink.kafka.KafkaSinkag1.sinks.sink1.topic = tt_topicag1.sinks.sink1.brokerList = c1:9092:c2:9092:c2:9092ag1.sinks.sink1.channel = chn1
启动
bin/flume-ng agent -n ag1 -c conf -f conf/flume-kafka.properties
初步成果
初步成果如图,我们成功把22台机器的agent安好,获得了应用集群上的指定日志内容,后续的优化包括
- 性能
- 日志filter
- 存储/压缩/备份
- visualize与dashboard配置
- 更多可视化插件安装
- 日志监控平台搭建 关于flume Kafka Elk
- ELK 日志监控平台环境搭建及使用说明
- ELK日志监控系统搭建
- ELK日志监控系统搭建
- ELK日志监控系统搭建
- ELK 日志分析平台搭建
- ELK 日志分析平台搭建
- ELK 日志分析平台搭建
- ELK 搭建实时日志平台。
- ELK+Kafka 企业日志收集平台(一)
- ELK+Kafka 企业日志收集平台(二)
- ELK+kafka日志系统搭建-实战
- ELK+kafka日志系统搭建-实战
- 基于Heka+Flume+Kafka+ELK的日志系统
- CentOS6.5搭建ELK套件搭建日志分析和监控平台
- ELK Stack 日志分析监控平台
- ELK Stack 日志分析监控平台
- ELK 日志系统搭建--监控nginx
- java android 面试基础 &&读书笔记
- 欢迎使用CSDN-markdown编辑器
- EditText自定义下划线
- Pyhotn 中编码的问题:'ascii' codec can't decode byte 0xef in position 0: ordinal not in range(128)的错误
- Anaconda安装+添加国内镜像+python 2与python 3共存整体解决方案
- 日志监控平台搭建 关于flume Kafka Elk
- JavaScript-DOM-事件
- postgresql 9.6 的 wal_compression 设置为 on/off 的对比
- hibernate annotation注解方式来处理映射关系
- 新一代 CI 持续集成工具 flow.ci 正式开源
- 【线段树合并】【bzoj4399】: 魔法少女LJJ
- vmware修改Linux终端界面分辨率的方法
- Android微信支付流程
- 关于java集合(2)-LinkedList