成千上万的程序员和Linuxer都在关注手工打造开源信息和技术的每一个干货。

由于业务的发展,对一些实时统计的需求越来越大。我该怎么办?

啰嗦

但是对于已经入库并记录在自己日志中的人来说,显然是多余的。因为MySQL本身可以帮你记录日志,而且记录的日志比你自己的应用要准确的多(MySQL需要开启行模式)。

解析MySQL Binlog,得到我们想要的事件。

筛选出我们关心的表。

将获得的相关数据实时保存在相关存储中(redis一般用于存储数据,然后定期刷入MySQL)。

模拟步骤:

我们在这里模拟总销售额和订单数量的实时计算。

用python-mysql-replication作为工具实时分析MySQL Binlog(建议用阿里的canal,看公司的开发者擅长什么)。

我们只关心WriteRowsEvent(事件编号30)。

我们只关心ord _ order表生成的WriteRowsEvent事件。

在原始统计的基础上添加该订单的信息,保存到Redis(打印而不是保存到Redis)。

旧的SQL代码

-创建演示文稿的ord _ order表

创建表格顺序(

订单标识整数不为空自动增加注释'订单标识',

金额int不为空默认0注释'订单金额(分钟)',

Create _ time datetime不是null默认current _ timestamp注释'创建时间',

主键(订单标识)

)COMMENT = ' order table

-检查当前日志位置

显示主状态;

+ - + - + - + - + - +

|文件|位置| Binlog _ Do _ DB | Binlog _ Ignore _ DB | Executed _ Gtid _ Set |

+ - + - + - + - + - +

| mysql-bin.000012 | 469 | | |

+ - + - + - + - + - +

-插入几个订单

在订单中插入订单(金额)值

(1000),

(2000),

(3000);

-检查当前日志位置

显示主状态;

+ - + - + - + - + - +

|文件|位置| Binlog _ Do _ DB | Binlog _ Ignore _ DB | Executed _ Gtid _ Set |

+ - + - + - + - + - +

| mysql-bin.000012 | 712 | | |

+ - + - + - + - + - +

绿色Python代码

#!/usr/bin/env python

# -*-编码:utf-8 -*-

从pymysqlreplication导入BinLogStreamReader

#链接数据库的参数,因为python-mysql在pymysqlreplication的底部使用

mysql_settings = {

主机':' 192.168.1.233 ',

端口':3306,

用户':' HH ',

passwd:“‘Oracle’

}

# pymysql replication的server_id以及从Binlog开始解析的位置

stream = BinLogStreamReader(connection _ settings = MySQL _ settings,

server_id=100,

阻塞=真,

log_file='mysql-bin.000012 ',

log_pos=469)

#初始化订单统计

订单_计数_总计= 0

订单_金额_合计= 0

#继续解析以获取解析后的Binlog

对于流中的binlogevent:

#当遇到WriteRowsEvent且表为ord _ order时,进行统计

if binlogevent.event_type == 30且binlog event . table = = ' order _ order ':

Binlogevent.dump() #打印有关事件的信息

#同时计算订单号和金额数组,如:[(1,9),(1,4)]

stat = [(1,行[' values '][' amount ']]),用于binlogevent.rows中的行]

#获取订单号数组,如[1,1]。销售额,如:[9,4]

order_count,order_amount = (*stat)

order _ count _ total+= sum(order _ count)

order_amount_total += sum(订单_金额)

#打印此事件产生的订单和销售数量

打印' order_count:',order_count

打印' order_amount:',order_amount

#打印订单和销售的总数

打印' order_count_total:',order_count_total

打印' order_amount_total:',order_amount_total

运行代码

[root @ centos 7 tmp]# python test . py

=== WriteRowsEvent ===

日期:2016-11-16T17:11:11

日志位置:681

活动规模:54

读取字节:12

表:test . order _ order

受影响的列:3

更改的行:3

价值观:

-

(' * ',u'order_id ',':',1)

(' * ',u'amount ',':',1000)

(' * ',u'create_time ',':',datetime.datetime(2016,11,16,17,11,11))

-

(' * ',u'order_id ',':',2)

(' * ',u'amount ',':',2000)

(' * ',u'create_time ',':',datetime.datetime(2016,11,16,17,11,11))

-

(' * ',u'order_id ',':',3)

(' * ',u'amount ',':',3000)

(' * ',u'create_time ',':',datetime.datetime(2016,11,16,17,11,11))

()

order_count: (1,1,1)

order_amount: (1000,2000,3000)

订单_计数_总计:3

订单_金额_合计:6000

别说钥匙,会气死你的(_)

更改表格顺序

添加分区(PARTITION p 201701 VALUES IN(201701));

ALTER TABLE order _ order DROP PARTITION p 201601;

如何处理MySQL挂机?

如何实现程序的高可用性?

如何记录解析后的日志文件和日志pos?

需要统一管理和存储解析后的数据吗?

你可以考虑如何实现以上的事情。我不会告诉你具体怎么做。

原文来自:

地址:编辑:,审计员:岳

让您学习到的每一节课都有所收获

《这就是学习Linux的方法》是由资深运维专家刘伟和国内多位红帽建筑师(RHCA)共同撰写的基于最新RHEL7系统的高质量Linux技术自学教程。极其适合Linux技术入门教程或者讲座辅助资料。

刘伟老师QQ: 5604241微信:gnu _川

见习助理QQ: 5604674

☀Linux技术交流集团a(全称):560843

Linux技术交流组b: 340829

Linux技术交流c组:463590

Linux技术交流d组:915246(新组,热与热,...)

官方网站:www.linuxprobe.com

电脑在线阅读更好;

http://www.linuxprobe.com/chapter-00.html

按住图片3秒自动关注。

点击左下角查看更多热门技术

1.《log计算 实时计算神器:binlog》援引自互联网,旨在传递更多网络信息知识,仅代表作者本人观点,与本网站无关,侵删请联系页脚下方联系方式。

2.《log计算 实时计算神器:binlog》仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证。

3.文章转载时请保留本站内容来源地址,https://www.lu-xu.com/keji/1619132.html