ELK+kafka构建日志收集系统之环境安装
1.背景
ELK由Elasticsearch、Logstash和Kibana三部分组件组成;
Elasticsearch是个开源分布式搜索引擎,它的特点有:分布式,零配置,自动发现,索引自动分片,索引副本机制,restful风格接口,多数据源,自动搜索负载等。
Logstash是一个完全开源的工具,它可以对你的日志进行收集、分析,并将其存储供以后使用
kibana 是一个开源和免费的工具,它可以为 Logstash 和 ElasticSearch 提供的日志分析友好的 Web 界面,可以帮助您汇总、分析和搜索重要数据日志。
那本章主要内容为ELK+Kafka的安装,对于什么是ELK、Kafka就不过多的介绍了。
2.搭建环境
本次选择搭建环境为 ubuntu16 并使用docker容器完成快速搭建
3.ELK+Kafka 执行原理图
4.搭建步骤
整体搭建步骤分为:
- Kafka以及zookpeer的安装
- elk的安装
- 使用springboot发送消息到kafka并使用kibana查看日志
5.开始搭建
5.1:搭建Kafka以及zookpeer
1、下载镜像
docker pull wurstmeister/zookeeper
docker pull wurstmeister/kafka
2、启动镜像
docker run -d --name zookeeper --publish 2181:2181 --volume /etc/localtime:/etc/localtime wurstmeister/zookeeper:latest
docker run -d --name kafka --publish 9092:9092 --link zookeeper --env KAFKA_ZOOKEEPER_CONNECT=zookeeper:2181
--env KAFKA_ADVERTISED_HOST_NAME=kafka所在宿主机的IP --env KAFKA_ADVERTISED_PORT=9092 --volume /etc/localtime:/etc/localtime
wurstmeister/kafka:latest
3、测试发送消息
执行Docker ps,找到kafka的Container ID,进入容器内部:
docker exec -it ${CONTAINER ID} /bin/bash
进入kafka默认目录
cd opt/kafka_2.11-0.10.1.1/
下面就是跟一般的kafka没什么区别了
创建一个主题:
bin/kafka-topics.sh --create --zookeeper zookeeper:2181 --replication-factor 1 --partitions 1 --topic mykafka
运行一个消息生产者,指定topic为刚刚创建的主题
bin/kafka-console-producer.sh --broker-list localhost:9092 --topic mykafka
运行一个消费者,指定同样的主题
bin/kafka-console-consumer.sh --zookeeper zookeeper:2181 --topic mykafka --from-beginning
这时在生产者输入测试消息,在消费者就可以接收消息了
到此Kafka安装完成,接下来安装ELK
5.2搭建ELK
1、ELK的帮助手册
Docker Hub官网:https://hub.docker.com/r/sebp/elk/ Docker ELK使用文档:http://elk-docker.readthedocs.io/
2、安装前提条件:
Docker至少得分配3GB的内存;
Elasticsearch至少需要单独2G的内存;
防火墙开放相关端口;
vm.max_map_count至少需要262144,附永久修改vm.max_map_count方法如下图:
执行命令:sysctl -p 查看
3、安装ELK
1、执行命令,将镜像pull到本地来;
docker pull sebp/elk
2、执行命令,将镜像运行为容器,为了保证ELK能够正常运行,加了-e参数限制使用最小内存及最大内存。
docker run -p 5601:5601 -p 9200:9200 -p 9300:9300 -p 5044:5044 -e ES_MIN_MEM=128m -e ES_MAX_MEM=2048m -it --name elk sebp/elk
3、打开浏览器,输入:http://宿主机ip:5601,看到如下界面说明安装成功
4、配置使用
4.1:使用以下命令进入容器
docker exec -it <container-name> /bin/bash
4.2:进入容器后执行命令:
/opt/logstash/bin/logstash -e 'input { stdin { } } output { elasticsearch { hosts => ["localhost"] } }'
注意:如果看到这样的报错信息 Logstash could not be started because there is already another instance using the configured data directory. If you wish to run multiple instances, you must change the “path.data” setting. 请执行命令:service logstash stop 然后在执行就可以了。
4.3:当命令成功被执行后,看到:Successfully started Logstash API endpoint {:port=>9600} 信息后,输入:this is a dummy entry 然后回车,模拟一条日志进行测试。
4.4:打开浏览器,输入:http://宿主机ip:9200/_search?pretty 如图,就会看到我们刚刚输入的日志内容
4.5:到此,ELK简单配置成功,接下来配置Logstash连接Kafka将日志发送给es
- 进入elk容器,进入 /etc/logstash/conf.d 文件夹地址中创建文件 logstash.conf
input {
beats {
port => 5044
}
kafka {
bootstrap_servers => ["宿主机IP:9092"]
group_id => "test-consumer-group"
auto_offset_reset => "latest"
consumer_threads => 5
decorate_events => true
topics => ["user_consumer"]
type => "bhy"
}
}
output {
elasticsearch {
hosts => ["http://localhost:9200"]
index => "dmservice-%{+YYYY.MM.dd}"
#user => "elastic"
#password => "changeme"
}
}
- 执行命令
vim /etc/init.d/logstash
打开logstash启动文件后,找到第29 30行,为logstash启动用户,都改为root,效果如下
LS_USER=root //原来默认为logstash
LS_GROUP=root //原为默认为logstash
- 启动logstash
/etc/init.d/logstash start
到此,logstash已经连接上Kafka并且实时监控消息发送到es存储,接下来我们使用Springboot发送一下消息试一下
5.3 搭建Springboot项目,实现Kafka继承并发送消息到Kafka
该项目使用springboot版本为 1.5.6.RELEASE
1、创建Springboot项目,添加web以及Kafka依赖
pom.xml 引用依赖如下
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.kafka</groupId>
<artifactId>spring-kafka</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
2、application.yml添加一下配置
spring:
kafka:
producer:
bootstrap-servers: kafka.yhq:9092
key-serializer: org.apache.kafka.common.serialization.StringSerializer
value-serializer: org.apache.kafka.common.serialization.StringSerializer
3、application.yml添加一下配置
编写controller,实现消息发送,代码如下
/**
* elk+kafka 日志记录
*
* @author sam
*/
@RestController
public class KafkaController {
@Resource
private KafkaTemplate<String, String> kafkaTemplate;
@RequestMapping("/sendMsgToKafka")
public String sendMsgToKafka() {
for (int i =60; i < 70; i++) {
kafkaTemplate.send("user_consumer", "dm", "hello,kafka!---->" + i);
}
return "发送消息到Kafka完毕";
}
}
4、启动项目,使用postman进行测试访问
访问后显示 “发送消息到Kafka完毕” 则数据发送成功,如下图
5、访问es查看存储的数据
若此处获取到了数据,则logstash配置是没有问题的,否则检查logstash
6、使用kibana展示数据
操作步骤
点击 management --> Index Patterns
到此,ELK+Kafka实现搭建企业级实时日志分析平台已完成,有问题欢迎交流!