搜狐媒体平台-搜狐网站>IT

他一出家就成中国最帅和尚

眼眸深邃、轮廓分明、身材颀长,活生生的一幅画。

大学副教授与在押服刑女结婚

这在监狱民警看来,那么令人不可思议。

实时计算神器:binlog

声明:本文由入驻搜狐公众平台的作者撰写,除搜狐官方账号外,观点仅代表作者本人,不代表搜狐立场。举报

  纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注。

  由于业务的发展,一些实时统计的需求越来越多。怎么办呢?

  啰哩八嗦

但是对于有入库还有自己记录到日志的这显然是多此一举。因为MySQL本身就有帮你记录日志, 而且记录的日志比自己应用程序的要准确的多(MySQL 需要开启row模式)。

  1. 解析MySQL Binlog,并获取我们想要的Event。

  2. 过滤出我们关心的表。

  3. 将获得的相关数据实时的保存到相关存储中(一般使用redis存数据,之后再定时刷入MySQL)。

模拟步骤:

我们这边模拟实时算订销售总额,和订单量。

  1. 使用python-mysql-replication作为实时解析MySQL Binlog的日志利器(推荐使用 阿里的 canal,这里主要看公司的开发人员擅长什么而决定)。

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

  3. 我们只关心 ord_order 表产生的 WriteRowsEvent 事件。

  4. 在原来统计的基础上加上本次订单的信息并保存到Redis(使用打印来代替保存到Redis)。

  老套的 SQL 代码

  --创建演示的 ord_order 表

  CREATE TABLE ord_order(

  order_id INT NOT NULL AUTO_INCREMENT COMMENT '订单ID',

  amount INT NOT NULL DEFAULT 0 COMMENT '订单金额(分)',

  create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',

  PRIMARY KEY(order_id)

  )COMMENT = '订单表';

  -- 查看 当前日志所在位置

  SHOW MASTER STATUS;

  +------------------+----------+--------------+------------------+-------------------+

  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

  +------------------+----------+--------------+------------------+-------------------+

  | mysql-bin.000012 | 469 | | | |

  +------------------+----------+--------------+------------------+-------------------+

  -- 插入几笔订单

  INSERT INTO ord_order(amount) VALUES

  (1000),

  (2000),

  (3000);

  -- 查看 当前日志所在位置

  SHOW MASTER STATUS;

  +------------------+----------+--------------+------------------+-------------------+

  | File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |

  +------------------+----------+--------------+------------------+-------------------+

  | mysql-bin.000012 | 712 | | | |

  +------------------+----------+--------------+------------------+-------------------+

  青涩的 Python 代码

  #!/usr/bin/env python

  # -*- coding:utf-8 -*-

  from pymysqlreplication import BinLogStreamReader

  # 链接数据库的参数 因为 pymysqlreplication 底层使用的是 python-mysql

  mysql_settings = {

  'host': '192.168.1.233',

  'port': 3306,

  'user': 'HH',

  'passwd': 'oracle'

  }

  # 这 pymysqlreplication 的 server_id 和从 Binlog 的什么位置开始解析

  stream = BinLogStreamReader(connection_settings=mysql_settings,

  server_id=100,

  blocking=True,

  log_file='mysql-bin.000012',

  log_pos=469)

  # 初始化订单统计数据

  order_count_total = 0

  order_amount_total = 0

  # 不停的解析 获取解析的 Binlog

  for binlogevent in stream:

  # 碰到 WriteRowsEvent 并且 表是 ord_order 则进行统计

  if binlogevent.event_type == 30 and binlogevent.table == 'ord_order':

  binlogevent.dump() # 打印事件相关信息

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

  stat = [(1, row['values']['amount']) for row in binlogevent.rows]

  # 分别获得 订单数数组如:[1, 1]。 销售额, 如: [9, 4]

  order_count, order_amount = zip(*stat)

  order_count_total += sum(order_count)

  order_amount_total += sum(order_amount)

  # 打印本次事件 产生的订单数和销售额

  print 'order_count:', order_count

  print 'order_amount:', order_amount

  # 打印总的订单数和销售额

  print 'order_count_total:', order_count_total

  print 'order_amount_total:', order_amount_total

运行代码

  [root@centos7 tmp]# python test.py

  === WriteRowsEvent ===

  Date: 2016-11-16T17:11:11

  Log position: 681

  Event size: 54

  Read bytes: 12

  Table: test.ord_order

  Affected columns: 3

  Changed rows: 3

  Values:

  --

  ('*', 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)

  order_count_total: 3

  order_amount_total: 6000

  关键的不说, 气死你 (^_^)

  ALTER TABLE ord_order

  ADD PARTITION (PARTITION p201701 VALUES IN (201701));

  ALTER TABLE ord_order DROP PARTITION p201601;

  1. MySQL 挂掉要如何处理。

  2. 如何实现程序的高可用。

  3. 如何记录解析的 log file 和 log pos。

  4. 需不需要将解析的数据统一管理和存储。

大家可以考虑一下要如何实现上面的事情。具体如何做我就不说了。

  原文来自:https://www.ttlsa.com/database/mysql-binlog-complete-real-time-computing/

  本文地址:https://www.linuxprobe.com/binlog-real-time-computing.html编辑:杨鹏飞,审核员:岳国帅

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

  《Linux就该这么学》是由资深运维专家刘遄及全国多名红帽架构师(RHCA)基于最新RHEL7系统共同编写的高质量Linux技术自学教程,极其适合用于Linux技术入门教程或讲课辅助教材。

  ? 刘遄老师QQ:5604241 微信:gnu_chuan

  ? 学员助教QQ:5604674

  ?Linux技术交流A群():560843

  ? Linux技术交流B群:340829

  ? Linux技术交流C群:463590

  ? Linux技术交流D群:915246(新群,火热加群中……

  ? 官方站点:www.linuxprobe.com

  ? 电脑在线阅读效果更佳:

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

按住图片3秒,即可自动关注。

点击左下角查看更多热门技术
mt.sohu.com true Linux就该这么学 https://mt.sohu.com/20170121/n479279178.shtml report 7734 纯手工打造每一篇开源资讯与技术干货,数十万程序员和Linuxer已经关注。由于业务的发展,一些实时统计的需求越来越多。怎么办呢?啰哩八嗦但是对于有入库还有自己记
阅读(0) 举报
欢迎举报抄袭、转载、暴力色情及含有欺诈和虚假信息的不良文章。

热门关注

搜生活

搜生活+关注

搜狐公众平台官方账号

MAGIC杨梦晶

MAGIC杨梦晶+关注

生活时尚&搭配博主 /生活时尚自媒体 /时尚类书籍作者

搜狐教育

搜狐教育+关注

搜狐网教育频道官方账号

星吧GEO

星吧GEO+关注

全球最大华文占星网站-专业研究星座命理及测算服务机构

热门图片

  • 热点视频
  • 影视剧
  • 综艺
  • 原创
锦绣缘

同步热播-锦绣缘

主演:黄晓明/陈乔恩/乔任梁/谢君豪/吕佳容/戚迹
神雕侠侣

大结局-神雕侠侣

主演:陈晓/陈妍希/张馨予/杨明娜/毛晓彤/孙耀琦
封神英雄榜

同步热播-封神英雄榜

主演:陈键锋/李依晓/张迪/郑亦桐/张明明/何彦霓

六颗子弹

主演:尚格·云顿/乔·弗拉尼甘/Bianca Bree
龙虎少年队2

龙虎少年队2

主演:艾斯·库珀/ 查宁·塔图姆/ 乔纳·希尔

《奔跑吧兄弟》

baby14岁写真曝光

《我看你有戏》

李冰冰向成龙撒娇争宠

《明星同乐会》

李湘遭闺蜜曝光旧爱

《非你莫属》

美女模特教老板走秀

《一站到底》

曝搬砖男神奇葩择偶观

搜狐视频娱乐播报

柳岩被迫成赚钱工具

大鹏嘚吧嘚

大屁小P虐心恋

匆匆那年第16集

匆匆那年大结局

隐秘而伟大第二季

乔杉遭粉丝骚扰

The Kelly Show

男闺蜜的尴尬初夜

我来说两句排行榜

客服热线:86-10-58511234

客服邮箱:kf@vip.sohu.com