成千上万的程序员和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