實時計算神器:binlog
囉哩八嗦
但是對於有入庫還有自己記錄到日誌的這顯然是多此一舉。因為MySQL本身就有幫你記錄日誌, 而且記錄的日誌比自己應用程式的要準確的多(MySQL 需要開啟row模式)。
- 解析MySQL Binlog,並獲取我們想要的Event。
- 過濾出我們關心的表。
- 將獲得的相關資料實時的儲存到相關儲存中(一般使用redis存資料,之後再定時刷入MySQL)。
模擬步驟:
我們這邊模擬實時算訂銷售總額,和訂單量。
- 使用python-mysql-replication作為實時解析MySQL Binlog的日誌利器(推薦使用 阿里的 canal,這裡主要看公司的開發人員擅長什麼而決定)。
- 我們只關心 WriteRowsEvent (事件號 30)。
- 我們只關心 ord_order 表產生的 WriteRowsEvent 事件。
- 在原來統計的基礎上加上本次訂單的資訊並儲存到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;
- MySQL 掛掉要如何處理。
- 如何實現程式的高可用。
- 如何記錄解析的 log file 和 log pos。
- 需不需要將解析的資料統一管理和儲存。
大家可以考慮一下要如何實現上面的事情。具體如何做我就不說了。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69901823/viewspace-2945269/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MySQL資料庫binlog解析神器-binlog2sql應用MySql資料庫
- 實時計算小括
- 說說實時流式計算
- 實時計算Flink效能調優
- 實時計算Flink——產品安全
- Flink實時計算topN熱榜
- Flink 在有贊實時計算的實踐
- 聊一聊實時計算系統設計
- 實時計算Flink——快速入門概述
- 實時計算無線資料分析
- 用Spark進行實時流計算Spark
- vivo 實時計算平臺建設實踐
- 實時計算Flink>產品定價>計量計費
- 實時計算助力1688打造「實時挑貨」系統
- 實時計算如何幫助淘寶實現線上「實時選品」?
- Java如何使用實時流式計算處理?Java
- 透過延時從庫+binlog複製,恢復誤運算元據
- 認識資料實時同步神器—Canal
- 日常節省 30%計算資源:阿里雲實時計算 Flink 自動調優實踐阿里
- G7在實時計算的探索與實踐
- Apache Flink 在移動雲實時計算的實踐Apache
- 聯通實時計算平臺演進與實踐
- 端到端的實時計算:TiDB + Flink 最佳實踐TiDB
- Hive實戰—時間滑動視窗計算Hive
- Flink實時計算pv、uv的幾種方法
- 時間差計算
- PHP時間計算PHP
- 阿里雲重磅開源實時計算平臺,挑戰計算領域的“珠峰”阿里
- 教你MySQL Binlog實用攻略MySql
- 實時計算 Flink> 產品簡介——最新動態
- 實時計算Flink——獨享模式系統架構模式架構
- 實時計算Flink——獨享模式上下游配置模式
- JavaScript實時計算輸入文字框字元數量JavaScript字元
- 大資料“重磅炸彈”:實時計算框架 Flink大資料框架
- 伍翀 :大資料實時計算Flink SQL解密大資料SQL解密
- 快速部署DBus體驗實時資料流計算
- Concurrent iHawk — 實時平行計算機模擬系統計算機
- 一文讀懂大資料實時計算大資料