nginx+lua+kafka實現日志統一收集匯總


from  http://hot66hot.iteye.com/blog/2291916

一:場景描述
對於線上大流量服務或者需要上報日志的nginx服務,每天會產生大量的日志,這些日志非常有價值。可用於計數上報、用戶行為分析、接口質量、性能監控等需求。但傳統nginx記錄日志的方式數據會散落在各自nginx上,而且大流量日志本身對磁盤也是一種沖擊。
我們需要把這部分nginx日志統一收集匯總起來,收集過程和結果需要滿足如下需求:

  • 支持不同業務獲取數據,如監控業務,數據分析統計業務,推薦業務等。
  • 數據實時性
  • 高性能保證


二:技術方案
得益於openresty和kafka的高性能,我們可以非常輕量高效的實現當前需求,架構如下:

方案描述:

  • 1:線上請求打向nginx后,使用lua完成日志整理:如統一日志格式,過濾無效請求,分組等。
  • 2:根據不同業務的nginx日志,划分不同的topic。
  • 3:lua實現producter異步發送到kafka集群。
  • 4:對不同日志感興趣的業務組實時消費獲取日志數據。


三:相關技術


四:安裝配置
為了簡單直接,我們采用單機形式配置部署,集群情況類似。
1)准備openresty依賴:

Java代碼  收藏代碼
  1. apt-get install libreadline-dev libncurses5-dev libpcre3-dev libssl-dev perl make build-essential  
  2. # 或者  
  3. yum install readline-devel pcre-devel openssl-devel gcc  


2)安裝編譯openresty:

Java代碼  收藏代碼
  1. #1:安裝openresty:  
  2. cd /opt/nginx/ # 安裝文件所在目錄  
  3. wget https://openresty.org/download/openresty-1.9.7.4.tar.gz  
  4. tar -xzf openresty-1.9.7.4.tar.gz /opt/nginx/  
  5.    
  6. #配置:  
  7. # 指定目錄為/opt/openresty,默認在/usr/local。  
  8. ./configure --prefix=/opt/openresty \  
  9.             --with-luajit \  
  10.             --without-http_redis2_module \  
  11.             --with-http_iconv_module  
  12. make  
  13. make install  


3)安裝lua-resty-kafka

Java代碼  收藏代碼
  1. #下載lua-resty-kafka:  
  2. wget https://github.com/doujiang24/lua-resty-kafka/archive/master.zip  
  3. unzip lua-resty-kafka-master.zip -d /opt/nginx/  
  4.     
  5. #拷貝lua-resty-kafka到openresty  
  6. mkdir /opt/openresty/lualib/kafka  
  7. cp -rf /opt/nginx/lua-resty-kafka-master/lib/resty /opt/openresty/lualib/kafka/  


4):安裝單機kafka

Java代碼  收藏代碼
  1. cd /opt/nginx/  
  2. wget http://apache.fayea.com/kafka/0.9.0.1/kafka_2.10-0.9.0.1.tgz  
  3. tar xvf kafka_2.10-0.9.0.1.tgz  
  4.    
  5. # 開啟單機zookeeper  
  6. nohup sh bin/zookeeper-server-start.sh config/zookeeper.properties > ./zk.log 2>&1 &  
  7. # 綁定broker ip,必須綁定  
  8. #在config/servier.properties下修改host.name  
  9. #host.name={your_server_ip}  
  10. # 啟動kafka服務  
  11. nohup sh bin/kafka-server-start.sh config/server.properties > ./server.log 2>&1 &  
  12. # 創建測試topic  
  13. sh bin/kafka-topics.sh --zookeeper localhost:2181 --create --topic test1 --partitions 1 --replication-factor 1  


五:配置運行
開發編輯/opt/openresty/nginx/conf/nginx.conf 實現kafka記錄nginx日志功能,源碼如下:

Java代碼  收藏代碼
  1. worker_processes  12;  
  2.    
  3. events {  
  4.     use epoll;  
  5.     worker_connections  65535;  
  6. }  
  7.    
  8. http {  
  9.     include       mime.types;  
  10.     default_type  application/octet-stream;  
  11.     sendfile        on;  
  12.     keepalive_timeout  0;  
  13.     gzip on;  
  14.     gzip_min_length  1k;  
  15.     gzip_buffers     4 8k;  
  16.     gzip_http_version 1.1;  
  17.     gzip_types       text/plain application/x-javascript text/css application/xml application/X-JSON;  
  18.     charset UTF-8;  
  19.     # 配置后端代理服務  
  20.     upstream rc{  
  21.         server 10.10.*.15:8080 weight=5 max_fails=3;  
  22.         server 10.10.*.16:8080 weight=5 max_fails=3;  
  23.         server 10.16.*.54:8080 weight=5 max_fails=3;  
  24.         server 10.16.*.55:8080 weight=5 max_fails=3;  
  25.         server 10.10.*.113:8080 weight=5 max_fails=3;  
  26.         server 10.10.*.137:8080 weight=6 max_fails=3;  
  27.         server 10.10.*.138:8080 weight=6 max_fails=3;  
  28.         server 10.10.*.33:8080 weight=4 max_fails=3;  
  29.         # 最大長連數  
  30.         keepalive 32;  
  31.     }  
  32.     # 配置lua依賴庫地址  
  33.     lua_package_path "/opt/openresty/lualib/kafka/?.lua;;";  
  34.    
  35.     server {  
  36.         listen       80;  
  37.         server_name  localhost;  
  38.         location /favicon.ico {  
  39.             root   html;  
  40.                 index  index.html index.htm;  
  41.         }  
  42.         location / {  
  43.             proxy_connect_timeout 8;  
  44.             proxy_send_timeout 8;  
  45.             proxy_read_timeout 8;  
  46.             proxy_buffer_size 4k;  
  47.             proxy_buffers 512 8k;  
  48.             proxy_busy_buffers_size 8k;  
  49.             proxy_temp_file_write_size 64k;  
  50.             proxy_next_upstream http_500 http_502  http_503 http_504  error timeout invalid_header;  
  51.             root   html;  
  52.             index  index.html index.htm;  
  53.             proxy_pass http://rc;  
  54.             proxy_http_version 1.1;  
  55.             proxy_set_header Connection "";  
  56.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;  
  57.             # 使用log_by_lua 包含lua代碼,因為log_by_lua指令運行在請求最后且不影響proxy_pass機制  
  58.             log_by_lua '  
  59.                 -- 引入lua所有api  
  60.                 local cjson = require "cjson"  
  61.                 local producer = require "resty.kafka.producer"  
  62.                 -- 定義kafka broker地址,ip需要和kafka的host.name配置一致  
  63.                 local broker_list = {  
  64.                     { host = "10.10.78.52", port = 9092 },  
  65.                 }  
  66.                 -- 定義json便於日志數據整理收集  
  67.                 local log_json = {}  
  68.                 log_json["uri"]=ngx.var.uri  
  69.                 log_json["args"]=ngx.var.args  
  70.                 log_json["host"]=ngx.var.host  
  71.                 log_json["request_body"]=ngx.var.request_body  
  72.                 log_json["remote_addr"] = ngx.var.remote_addr  
  73.                 log_json["remote_user"] = ngx.var.remote_user  
  74.                 log_json["time_local"] = ngx.var.time_local  
  75.                 log_json["status"] = ngx.var.status  
  76.                 log_json["body_bytes_sent"] = ngx.var.body_bytes_sent  
  77.                 log_json["http_referer"] = ngx.var.http_referer  
  78.                 log_json["http_user_agent"] = ngx.var.http_user_agent  
  79.                 log_json["http_x_forwarded_for"] = ngx.var.http_x_forwarded_for  
  80.                 log_json["upstream_response_time"] = ngx.var.upstream_response_time  
  81.                 log_json["request_time"] = ngx.var.request_time  
  82.                 -- 轉換json為字符串  
  83.                 local message = cjson.encode(log_json);  
  84.                 -- 定義kafka異步生產者  
  85.                 local bp = producer:new(broker_list, { producer_type = "async" })  
  86.                 -- 發送日志消息,send第二個參數key,用於kafka路由控制:  
  87.                 -- key為nill(空)時,一段時間向同一partition寫入數據  
  88.                 -- 指定key,按照key的hash寫入到對應的partition  
  89.                 local ok, err = bp:send("test1", nil, message)  
  90.    
  91.                 if not ok then  
  92.                     ngx.log(ngx.ERR, "kafka send err:", err)  
  93.                     return  
  94.                 end  
  95.             ';  
  96.         }  
  97.         error_page   500 502 503 504  /50x.html;  
  98.         location = /50x.html {  
  99.             root   html;  
  100.         }  
  101.     }  
  102. }  


六:檢測&運行

Java代碼  收藏代碼
  1. # 檢測配置,只檢測nginx配置是否正確,lua錯誤日志在nginx的error.log文件中  
  2. ./nginx -t /opt/openresty/nginx/conf/nginx.conf  
  3. # 啟動  
  4. ./nginx -c /opt/openresty/nginx/conf/nginx.conf  
  5. # 重啟  
  6. ./nginx -s reload  


七:測試
1:使用任意http請求發送給當前nginx,如:

引用

http://10.10.78.52/m/personal/AC8E3BC7-6130-447B-A9D6-DF11CB74C3EF/rc/v1?passport=83FBC7337D681E679FFBA1B913E22A0D@qq.sohu.com&page=2&size=10


2:查看upstream代理是否工作正常
3:查看kafka 日志對應的topic是否產生消息日志,如下:

引用

# 從頭消費topic數據命令
sh kafka-console-consumer.sh --zookeeper 10.10.78.52:2181 --topic test1 --from-beginning


效果監測:

4:ab壓力測試

引用

#單nginx+upstream測試:
ab -n 10000 -c 100 -k http://10.10.34.15/m/personal/AC8E3BC7-6130-447B-A9D6-DF11CB74C3EF/rc/v1?passport=83FBC7337D681E679FFBA1B913E22A0D@qq.sohu.com&page=2&size=10

#結果
Server Software:        nginx
Server Hostname:        10.10.34.15
Server Port:            80
Document Path:          /m/personal/AC8E3BC7-6130-447B-A9D6-DF11CB74C3EF/rc/v1?passport=83FBC7337D681E679FFBA1B913E22A0D@qq.sohu.com
Document Length:        13810 bytes
Concurrency Level:      100
Time taken for tests:   2.148996 seconds
Complete requests:      10000
Failed requests:        9982
   (Connect: 0, Length: 9982, Exceptions: 0)
Write errors:           0
Keep-Alive requests:    0
Total transferred:      227090611 bytes
HTML transferred:       225500642 bytes
Requests per second:    4653.34 [#/sec] (mean)
Time per request:       21.490 [ms] (mean)
Time per request:       0.215 [ms] (mean, across all concurrent requests)
Transfer rate:          103196.10 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.1      0       2
Processing:     5   20  23.6     16     701
Waiting:        4   17  20.8     13     686
Total:          5   20  23.6     16     701
Percentage of the requests served within a certain time (ms)
  50%     16
  66%     20
  75%     22
  80%     25
  90%     33
  95%     41
  98%     48
  99%     69
100%    701 (longest request)

 

引用

#單nginx+upstream+log_lua_kafka接入測試:
ab -n 10000 -c 100 -k http://10.10.78.52/m/personal/AC8E3BC7-6130-447B-A9D6-DF11CB74C3EF/rc/v1?passport=83FBC7337D681E679FFBA1B913E22A0D@qq.sohu.com&page=2&size=10

#結果
Server Software:        openresty/1.9.7.4
Server Hostname:        10.10.78.52
Server Port:            80
Document Path:          /m/personal/AC8E3BC7-6130-447B-A9D6-DF11CB74C3EF/rc/v1?passport=83FBC7337D681E679FFBA1B913E22A0D@qq.sohu.com
Document Length:        34396 bytes
Concurrency Level:      100
Time taken for tests:   2.234785 seconds
Complete requests:      10000
Failed requests:        9981
   (Connect: 0, Length: 9981, Exceptions: 0)
Write errors:           0
Keep-Alive requests:    0
Total transferred:      229781343 bytes
HTML transferred:       228071374 bytes
Requests per second:    4474.70 [#/sec] (mean)
Time per request:       22.348 [ms] (mean)
Time per request:       0.223 [ms] (mean, across all concurrent requests)
Transfer rate:          100410.10 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.2      0       3
Processing:     6   20  27.6     17    1504
Waiting:        5   15  12.0     14     237
Total:          6   20  27.6     17    1504
Percentage of the requests served within a certain time (ms)
  50%     17
  66%     19
  75%     21
  80%     23
  90%     28
  95%     34
  98%     46
  99%     67
100%   1004 (longest request)


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM