全栈编程

Balance $ 2,317
Item Sold 1230
文章作者: 全栈编程@luboke.com
版权声明: 本文章为go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!

实际工作中有这样的一个应用场景:针对于我们前面所讲解的微商城小程序,这里就涉及到我们访问小程序所使用的相关接口,因此就涉及到很多的访问日志,当然也包括咱们微商城的交易日志,这们这里重点处理交易日志,也就是用户在微商城平台购买商品下单支付的记录,当交易日志巨增,达到PB级时,如何有效的管理日志?如何高效的来定位某一个具体订单的信息?

我们一起来看一看

针对于我们前面所讲解的微商城小程序,当交易日志大小达到10G以上时,我们如何需要对日志进行处理,去统计其中我们关注或者说关心的数据时,假如按照以前处理比较小的文件,大概是千行级别的文件的设计思路,会将文件内容保存到数据库当中,然后写SQL语句进行统计处理。但当文件达到G级别甚至十G,百G,更甚至更多时,比如千亿行级别的数据时,我们如何处理? 我们一起来看一看解题思路:

单个文件大小超出计算机内存的大小

肯定是不能直接加载到数据库里边来操作了。业内通用的解决方案是把大文件拆分成小文件进行处理,在处理完成之后再合并!

对于文件切割、合并的工作还是shell更加高效:

#下边的一条命令,就是将文件filename切割成每个文件有5000000行的小文件,切割后的文件名前缀是filename-part+3位数字。
split -l 5000000 filename -d -a 3 filename-part



#处理完数据之后需要将结果文件进行合并,filename-part*代表所有处理完的小文件,合并成最后的filename-result文件。
cat filename-part* > filename-reault

这里我们以2g的文件来演示,因为文件太大的话,执行的时间也会相对比较长,很耗费时间,我们这里为了教学,所以以一个相对较小的文件来演示,当然这并不影响我们解决方案的逻辑,各位同学在听完这段视频内容之后,可以找你们公司的DBA,或者大数据部门要一份相对较在原日志文件拿过来处理,或者干脆你们就自己造一个超大的文本文件来演示。

在我们的交易日志当中有N多个请求日志,这里同样包含交易日志,主流的互联风公司在处理日志时都会分门别类的对日志进行分类处理,一般都会按如下几个维度进行处理,我们举几个例子:

1.按业务来,比如支付业务,普通的浏览业务(比如首页,分类页,详情页,购物车页,推荐页),搜索相关的业务,短信通知相关的业务,邮件通知相关的业务,和vip操作相关的业务,都会单独做为一份日志来记录

    支付业务又可以拆分很多种,一般情况下,交易日志会单独做为独立的服务对外暴露接口提供服务,像不同的支付平台 ,支付宝,微信,银联,或者银行卡,等等吧。那咱们再往细了方面来划分又可以拆分出更精细的粒度来,比如选择微信支付好吧,选择微信支付又分为是手机app端的支付,还是公众号的支付,又或者是小程序的支付,总之可以划分的粒度较多,当然越精细越好,这样带来的好处就是公司的老板或者说公司的大数据部门是很关注这些的,特别是大数据部门,他们会按照这些精细的日志进行精准营销策略的推荐。

2.按业务的重要程度,比如支付业务,重要的业务会单独一份日志来记录,相对不重要的业务可以混合在一份日志中来记录

3.按访问的时间,比如可以按天,按月,按季度,按年等等吧,按照不同的时间周期这种不同的时间粒度将不同业务的日志混合在一起来来记录

基本上日志可以按照上述的几个维度来处理,当然上述几个处理方式是可以混合处理的,比如第1个按业务来拆分日志,当拆分到具体的日志之后(比如支付业务),可以按第3个访问时间的维度来处理。

 

像第一种按不同业务来处理如何记录日志?

一般来说不同的业务,它对外暴露的接口地址或者是服务地址是不一样的,那么我们在记录日志时,可以对日志进行单独处理,比如我们有支付业务(服务地址是http://pay.onajax.com/xxx/xxx/xxxxxxx,后面有一大堆,就不写了),商品浏览业务(服务地址是http://item.onajax.com/xxx/xxx/xx),注册业务(服务地址是http://reg.onajax.com/xxx/xxx/xx)等等吧,我们就以这三个业务来举例。

 那么我们就可以针对不同的业务在nginx中进行处理。

比如以上三个业务均是通过go语言程序来编写的,我们放在服务器上的某个目录当中,启动这它之后,监听的端口如下:

upstream pay_onajax_com {
    server 127.0.0.1:8001;
}

#https
server {   
        listen 443 ssl http2;
        server_name pay.onajax.com;
 
        ssl_certificate /home/wwwroot/ssl/1_pay.onajax.com_bundle.crt;
        ssl_certificate_key /home/wwwroot/ssl/2_pay.onajax.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

     location / {
        proxy_pass  http://pay_onajax_com;
    
        proxy_redirect     off;    
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

    location /static/ {
        proxy_pass  http://pay_onajax_com/static/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

    location /product/ {
        proxy_pass  http://pay_onajax_com/product/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }


    location ~ .*\.(js|css|jpg|jpeg|gif|png|ico|pdf|txt)$ {
        proxy_pass http://pay_onajax_com;
    }  

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /.well-known {
        allow all;
    }

    location ~ /.well-known {
       proxy_pass http://pay_onajax_com;
    }
    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/pay.onajax.com.log main;
}

#http
server {
    listen 80;
    server_name pay.onajax.com; 


   location / {
        proxy_pass  http://pay_onajax_com;
        
        proxy_redirect     off;             
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

	location /product/ {
        proxy_pass  http://pay_onajax_com/product/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

	location ~ .*\.(js|css|jpg|jpeg|gif|png|ico|pdf|txt)$ {
		proxy_pass http://pay_onajax_com;
	}

	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /.well-known {
        allow all;
    }

    location ~ /.well-known {
       proxy_pass http://pay_onajax_com;
    }

    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/pay.onajax.com.log main;
}

upstream item_onajax_com {
    server 127.0.0.1:8003;
}

#https
server {   
        listen 443 ssl http2;
        server_name item.onajax.com;
 
        ssl_certificate /home/wwwroot/ssl/1_item.onajax.com_bundle.crt;
        ssl_certificate_key /home/wwwroot/ssl/2_item.onajax.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

     location / {
        proxy_pass  http://item_onajax_com;
    
        proxy_redirect     off;    
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

    location /static/ {
        proxy_pass  http://item_onajax_com/static/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

    location /product/ {
        proxy_pass  http://item_onajax_com/product/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }


    location ~ .*\.(js|css|jpg|jpeg|gif|png|ico|pdf|txt)$ {
        proxy_pass http://item_onajax_com;
    }  

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /.well-known {
        allow all;
    }

    location ~ /.well-known {
       proxy_pass http://item_onajax_com;
    }
    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/item.onajax.com.log main;
}

#http
server {
    listen 80;
    server_name item.onajax.com; 


   location / {
        proxy_pass  http://item_onajax_com;
        
        proxy_redirect     off;             
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

	location /product/ {
        proxy_pass  http://item_onajax_com/product/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

	location ~ .*\.(js|css|jpg|jpeg|gif|png|ico|pdf|txt)$ {
		proxy_pass http://item_onajax_com;
	}

	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /.well-known {
        allow all;
    }

    location ~ /.well-known {
       proxy_pass http://item_onajax_com;
    }

    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/item.onajax.com.log main;
}

upstream reg_onajax_com {
    server 127.0.0.1:8002;
}

#https
server {   
        listen 443 ssl http2;
        server_name reg.onajax.com;
 
        ssl_certificate /home/wwwroot/ssl/1_reg.onajax.com_bundle.crt;
        ssl_certificate_key /home/wwwroot/ssl/2_reg.onajax.com.key;
        ssl_session_timeout 5m;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2 TLSv1.3;
        ssl_prefer_server_ciphers on;
        ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;

     location / {
        proxy_pass  http://reg_onajax_com;
    
        proxy_redirect     off;    
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

    location /static/ {
        proxy_pass  http://reg_onajax_com/static/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

    location /product/ {
        proxy_pass  http://reg_onajax_com/product/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }


    location ~ .*\.(js|css|jpg|jpeg|gif|png|ico|pdf|txt)$ {
        proxy_pass http://reg_onajax_com;
    }  

    location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /.well-known {
        allow all;
    }

    location ~ /.well-known {
       proxy_pass http://reg_onajax_com;
    }
    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/reg.onajax.com.log main;
}

#http
server {
    listen 80;
    server_name reg.onajax.com; 


   location / {
        proxy_pass  http://reg_onajax_com;
        
        proxy_redirect     off;             
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

	location /product/ {
        proxy_pass  http://reg_onajax_com/product/;

        proxy_redirect     off;
        proxy_set_header   Host             $host;
        proxy_set_header   X-Real-IP        $remote_addr;
        proxy_set_header   X-Forwarded-For  $proxy_add_x_forwarded_for;
        proxy_next_upstream error timeout invalid_header http_500 http_502 http_503 http_504;
        proxy_max_temp_file_size 0;
        proxy_connect_timeout      90;
        proxy_send_timeout         90;
        proxy_read_timeout         90;
        proxy_buffer_size          4k;
        proxy_buffers              4 32k;
        proxy_busy_buffers_size    64k;
        proxy_temp_file_write_size 64k;
    }

	location ~ .*\.(js|css|jpg|jpeg|gif|png|ico|pdf|txt)$ {
		proxy_pass http://reg_onajax_com;
	}

	location ~ .*\.(gif|jpg|jpeg|png|bmp|swf)$
    {
        expires      30d;
    }

    location ~ .*\.(js|css)?$
    {
        expires      12h;
    }

    location ~ /.well-known {
        allow all;
    }

    location ~ /.well-known {
       proxy_pass http://reg_onajax_com;
    }

    location ~ /\.
    {
        deny all;
    }

    access_log  /home/wwwlogs/reg.onajax.com.log main;
}

 

在我们的日志中有N多日志,现在老师单独将其中一个交易日志给提取到一个文件夹当中,方便我们进行操作,如下截图,pay.log日志,2.1G大小,我们需要对它进行处理。

通过上面的分析,对这个大文件处理可按如下步骤来处理。

1.查看当前这个2.1G的文件有多少行

2.打算将这么多行的文件拆开成多少个文件?每个文件多少行?

比如上面我们看到是600多万行的文件,这个还相对较小,如果是亿行,千亿行的话,处理的话,对系统的性能消耗可能瞬间就会让机器宕机,所以如果一个文件有这么大,那架构师就要从自身找原因了,我们肯定不能让一个文件达到这样的级别,这样处理起来会很麻烦,我们读取的时候对磁盘IO的开销是无法评估的,直接带来的灾难性的后果就是机器宕机,所以需要根据具体的业务所产生的日志量级进行定义格式,存储方式,存储周期需要综合考虑。

这里我们假如 :6109604行的文件,我们拆分每个文件10万行,切割后的文件名前缀是pay-part+3位数字。被拆成了62个文件,不足10万行的,放在最后一个文件当中,命令如下:

split -l 100000 pay.log  -d -a 3 pay-part

 

3.处理每个拆分的较小的日志文件

先来看我们nginx的日志格式,这个要统一,因为我们教学中使用这种日志格式,我们在处理的时候也是按照这种格式来的,那各位同学学会了课程当中老师讲的,那你们就可以自定义你们具体业务所需要的日志格式了,这样也明白如何处理日志。

nginx日志格式

log_format main '$remote_addr | $remote_user |  "$request" | $status | $body_bytes_sent | $request_body "$http_referer" | "$http_user_agent"|';

我们截取的一段nginx日志内容

27.187.116.223 | - |  "GET /Api/callback HTTP/1.1" | 200 | 109 | <xml><appid><![CDATA[wx6cd93ed0194fae7f]]></appid><bank_type><![CDATA[CFT]]></bank_type><cash_fee><![CDATA[1]]></cash_fee><fee_type><![CDATA[CNY]]></fee_type><is_subscribe><![CDATA[N]]></is_subscribe><mch_id><![CDATA[1483469312]]></mch_id><nonce_str><![CDATA[1572760465986496000]]></nonce_str><openid><![CDATA[oR3eB4hDIXDypm-TMVR5bY0uzpfI]]></openid><out_trade_no><![CDATA[111111111220002]]></out_trade_no><result_code><![CDATA[SUCCESS]]></result_code><return_code><![CDATA[SUCCESS]]></return_code><sign><![CDATA[8FB363C83CD596012B2AEA0E3E8EF623]]></sign><time_end><![CDATA[20191103135437]]></time_end><total_fee>1</total_fee><trade_type><![CDATA[JSAPI]]></trade_type><transaction_id><![CDATA[4200000407201911032614813137]]></transaction_id></xml> "-" | "PostmanRuntime/7.26.5"|

 

 

文章作者: 全栈编程@luboke.com
版权声明: 本文章为go语言体系课视频教程配套电子书,版权归 全栈编程@luboke.com所有,欢迎免费学习,转载必须注明出处!但禁止任何商业用途,否则将受到法律制裁!
copyright © 2020 全栈编程@luboke.com