优化的解决方案:Openresty+Lua+Kafka实现日志实时采集

优采云 发布时间: 2022-12-17 01:33

  优化的解决方案:Openresty+Lua+Kafka实现日志实时采集

  发表于 2022 年 6 月 20 日,由 admin

  在很多数据采集场景中,Flume是一款高性能的采集日志工具,相信大家都有所了解。许多人认为 Flume 是一个组件。他们中的大多数人会想到 Flume 和 Kafka 的组合来进行日志记录采集。该方案具有高性能、高吞吐量、数据可靠性等诸多优点。但是如果我们需要实时的采集日志,这显然不是一个好的方案。原因如下:

  目前,Flume 可以支持实时监控某个目录下的数据文件。一旦目录中的文件 采集 完成,它将被标记为完成标志。如果以后这个文件中有更多的数据,Flume 将不会被检测到。

  所以,我们更多的是用这个方案来计时采集,只要有新的数据目录生成,我们就会采集这个目录下的数据文件。

  那么这篇文章就给大家介绍一下基于Openresty+Lua+Kafka的日志实时采集。

  很多时候,我们需要对用户的埋点数据进行一个实时的采集,然后利用这些数据对用户的行为做一些实时的分析。所以,当然,第一步是弄清楚如何采集实时数据。

  我们这里采用的方案是Openresty+Lua+Kafka。

  那么什么是 Openresty?这是官方报价:

  OpenResty 是一个基于 Nginx 和 Lua 的高性能 Web 平台,集成了大量优秀的 Lua 库、第三方模块及其大部分依赖。用于方便地构建能够处理超高并发和高扩展性的动态Web应用程序、Web服务和动态网关。

  OpenResty 通过汇集各种精心设计的 Nginx 模块,有效地将 Nginx 变成一个强大的通用 Web 应用平台。这样,Web开发人员和系统工程师就可以使用Lu脚本语言调动Nginx支持的各种C和Lua模块,快速构建一个能够处理10K甚至1000多个单机并发连接的高性能Web应用系统。

  OpenResty 的目标是让你的 web 服务直接运行在 Nginx 服务内部,充分利用 Nginx 的非阻塞 I/O 模型,不仅针对 HTTP 客户端请求,甚至针对远程后端,如 MySQL、PostgreSQL、Memcached 和Redis等均以一致的高性能响应。

  简单的说,就是将客户端的请求(本文指的是用户的行为日志)通过Nginx投递到我们指定的地方(Kafka),而为了实现这个需求,我们使用了Lua脚本,因为Openresty封装了各种Lua模块已经安装好,其中之一就是对Kafka模块进行分包。我们只需要写一个简单的脚本,将用户的数据通过Nginx转发给Kafka,方便后面消费数据。

  下面是一张架构图供大家理解:

  这里简单总结一下使用Openresty+Lua+Kafka的优势:

  1.支持多种业务数据,不同的业务数据,只需要配置不同的Lua脚本,就可以将不同的业务数据发送到Kafka的不同主题。

  2、对用户触发的埋点数据进行实时采集

  3、高可靠的集群,由于Openresty是基于Nginx的,其集群具有非常高的性能和稳定性。

  4.高并发。与tomcat、apache等web服务器相比,Nginx的并发度远高于其他两者。一般情况下,处理几万并发并不难。

  那我们就实践一下吧。

  Openresty安装

  本例采用单机部署形式。单机部署成功后,集群搭建和单机一样,只是在不同的机器上执行相同的步骤。

  注:本实验基于centos7.0操作系统

  1、下载Openresty依赖:

  yum install readline-devel pcre-devel openssl-devel gcc

  2.编译安装Openresty:

  #1.安装openresty:

mkdir /opt/software

mkdir /opt/module

cd /opt/software/ # 安装文件所在目录

wget https://openresty.org/download/openresty-1.9.7.4.tar.gz

tar -xzf openresty-1.9.7.4.tar.gz -C /opt/module/

cd /opt/module/openresty-1.9.7.4

#2.配置:

# 指定目录为/opt/openresty,默认在/usr/local。

<p>

./configure --prefix=/opt/openresty \

--with-luajit \

--without-http_redis2_module \

--with-http_iconv_module

make

make install

</p>

  3.安装lua-resty-kafka

  因为我们需要通过nginx+lua脚本将数据转发给Kafka,所以在编写lua脚本的时候需要用到lua模块中对Kafka的一些依赖。

  #下载lua-resty-kafka:

cd /opt/software/

wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip

unzip master.zip -d /opt/module/

#拷贝kafka相关依赖脚本到openresty

cp -rf /opt/module/lua-resty-kafka-master/lib/resty/kafka/ /opt/openresty/lualib/resty/

  注:由于大家都熟悉kafka,这里就不介绍它的安装了。

  Openresty安装完成后,目录结构如下:

  drwxr-xr-x 2 root root 4096 Mar 24 14:26 bin

drwxr-xr-x 6 root root 4096 Mar 24 14:26 luajit

drwxr-xr-x 7 root root 4096 Mar 24 14:29 lualib

drwxr-xr-x 12 root root 4096 Mar 24 14:40 nginx

  4.配置文件

  编辑/opt/openresty/nginx/conf/nginx.conf

  user nginx; #Linux的用户

worker_processes auto;

worker_rlimit_nofile 100000;

#error_log logs/error.log;

#error_log logs/error.log notice;

#error_log logs/error.log info;

#pid logs/nginx.pid;

events {

worker_connections 102400;

multi_accept on;

use epoll;

http {

include mime.types;

default_type application/octet-stream;

<p>

log_format main '$remote_addr - $remote_user [$time_local] "$request" '

'$status $body_bytes_sent "$http_referer" '

'"$http_user_agent" "$http_x_forwarded_for"';

access_log /var/log/nginx/access.log main;

resolver 8.8.8.8;

#resolver 127.0.0.1 valid=3600s;

sendfile on;

keepalive_timeout 65;

underscores_in_headers on;

gzip on;

include /opt/openresty/nginx/conf/conf.d/common.conf; #common.conf这个文件名字可自定义

}</p>

  编辑/opt/openresty/nginx/conf/conf.d/common.conf

  ##api

lua_package_path "/opt/openresty/lualib/resty/kafka/?.lua;;";

lua_package_cpath "/opt/openresty/lualib/?.so;;";

lua_shared_dict ngx_cache 128m; # cache

lua_shared_dict cache_lock 100k; # lock for cache

server {

listen 8887; #*敏*感*词*端口

server_name 192.168.3.215; #埋点日志的ip地址或域名,多个域名之间用空格分开

root html; #root指令用于指定虚拟主机的网页根目录,这个目录可以是相对路径,也可以是绝对路径。

lua_need_request_body on; #打开获取消息体的开关,以便能获取到消息体

access_log /var/log/nginx/message.access.log main;

error_log /var/log/nginx/message.error.log notice;

location = /lzp/message {

lua_code_cache on;

charset utf-8;

default_type 'application/json';

content_by_lua_file "/opt/openresty/nginx/lua/testMessage_kafka.lua";#引用的lua脚本

}

}

  编辑/opt/openresty/nginx/lua/testMessage_kafka.lua

  #创建目录mkdir /opt/openresty/nginx/lua/

vim /opt/openresty/nginx/lua/testMessage_kafka.lua

#编辑内存如下:

  解决方案:【ROS实时采集Android的图像和IMU数据】的更多相关文章

  

  基于Python结合InfluxDB和Grafana图表实时采集Linux多主机性能数据的性能测试

  

  基于Python结合InfluxDB和Grafana图表实时采集Linux多主机性能数据通过:授予客户实现功能测试环境环境搭建使用前提使用方法运行程序效果展示无需在被监控主机上安装代理即可实现功能,一键配对Linux远程服务器对不同主机进行性能监控。性能数据采集命令,并实时展示支持跨堡垒机采集实时性能数据(注意:定制开发,不通用)支持docker容器(因为程序是从docker容器中实现获取性能的内部数据,所以目前只支持CPU、内存、I/O)使用前提可以是...

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线