• 关于超大binlog事件的问题


    我手里维护了一个项目,其功能是用Java模拟一个MariaDB的slave库连接到主库,对从主库传输过来的binlog事件进行监听与分析

    碰到一个问题是:

    如果主库做了一个很大的修改操作(比方说直接delete了一个百万条数据的表),那么会产生一个很大的binlog事件,这个binlog事件会在我们的binlog监听器中被处理,然后组装成一个很大的对象(含有这100万条数据)

    问题就出在这里,这个对象太大了(占用上g的heap毫不费力),然后我们在对这个对象的分析过程中,会产生更多的对象,而这些对象都是强引用,占用的是实打实的内存。于是就OOM了

    我接受这个项目的时候,前人提出的方案很简单:禁止用户执行过大的操作。

    很暴力的方案,而且确实也可以解决问题。

    但是我觉得应该有更好的解决方法

    第一反应是修改binlog监听器模块的代码

    由于binlog事件是通过网络传输,我们也许可以在接收binlog事件的时候,对监听到的超大binlog事件进行拆分,将其逐步拆分为多个等效的小binlog事件

    但是这一块的代码风格很差,很难修改

    于是在Google上搜了一下相关的关键词,发现有一个叫做binlog-row-event-max-size的神奇启动参数,其英文注释如下

    The maximum size in bytes of a row-based binary log event. Should be a multiple of 256. Minimum 256, maximum 18446744073709547520.

    似乎正好是我需要的?

    但是很不幸,这个参数只在MariaDB 10.0.17之后有效

    而公司的生产环境用的是MariaDB 10.0.10

    对比一下两者的效果吧

    MariaDB 10.0.10,delete一个百万元素的表

    | Log_name            | Pos             | Event_type | Server_id | End_log_pos | Info  
    
    | mysql-bin.000319 | 446952048 | Gtid | 90174306 | 446952086 | BEGIN GTID 17186-90174306-429975571 |
    | mysql-bin.000319 | 446952086 | Table_map | 90174306 | 446952126 | table_id: 14520 (cc.t1) |
    | mysql-bin.000319 | 446952126 | Delete_rows_v1 | 90174306 | 455952146 | table_id: 14520 flags: STMT_END_F |
    | mysql-bin.000319 | 455952146 | Xid | 90174306 | 455952173 | COMMIT /* xid=489278797 */
    View Code

    可以看到这个delete事件对应于一个很大的binlog事件

    MariaDB 10.1.22,binlog-row-event-max-size设置为262144,同样delete一个百万元素的表

    mysql> SHOW BINLOG EVENTS IN 'mysqld-bin.000001';
    +-------------------+---------+-------------------+-----------+-------------+-----------------------------------------------------+
    | Log_name          | Pos     | Event_type        | Server_id | End_log_pos | Info                                                |
    +-------------------+---------+-------------------+-----------+-------------+-----------------------------------------------------+
    | mysqld-bin.000001 |       4 | Format_desc       |         1 |         249 | Server ver: 10.1.22-MariaDB-1~jessie, Binlog ver: 4 |
    | mysqld-bin.000001 |     249 | Gtid_list         |         1 |         274 | []                                                  |
    | mysqld-bin.000001 |     274 | Binlog_checkpoint |         1 |         314 | mysqld-bin.000001                                   |
    | mysqld-bin.000001 |     314 | Gtid              |         1 |         352 | BEGIN GTID 0-1-1                                    |
    | mysqld-bin.000001 |     352 | Table_map         |         1 |         394 | table_id: 19 (test.t1)                              |
    | mysqld-bin.000001 |     394 | Delete_rows_v1    |         1 |      262557 | table_id: 19                                        |
    | mysqld-bin.000001 |  262557 | Delete_rows_v1    |         1 |      524720 | table_id: 19                                        |
    | mysqld-bin.000001 |  524720 | Delete_rows_v1    |         1 |      786883 | table_id: 19                                        |
    | mysqld-bin.000001 |  786883 | Delete_rows_v1    |         1 |     1049046 | table_id: 19                                        |
    | mysqld-bin.000001 | 1049046 | Delete_rows_v1    |         1 |     1311209 | table_id: 19                                        |
    | mysqld-bin.000001 | 1311209 | Delete_rows_v1    |         1 |     1573372 | table_id: 19                                        |
    | mysqld-bin.000001 | 1573372 | Delete_rows_v1    |         1 |     1835535 | table_id: 19                                        |
    | mysqld-bin.000001 | 1835535 | Delete_rows_v1    |         1 |     2097698 | table_id: 19                                        |
    | mysqld-bin.000001 | 2097698 | Delete_rows_v1    |         1 |     2359861 | table_id: 19                                        |
    | mysqld-bin.000001 | 2359861 | Delete_rows_v1    |         1 |     2622024 | table_id: 19                                        |
    | mysqld-bin.000001 | 2622024 | Delete_rows_v1    |         1 |     2884187 | table_id: 19                                        |
    | mysqld-bin.000001 | 2884187 | Delete_rows_v1    |         1 |     3146350 | table_id: 19                                        |
    | mysqld-bin.000001 | 3146350 | Delete_rows_v1    |         1 |     3408513 | table_id: 19                                        |
    | mysqld-bin.000001 | 3408513 | Delete_rows_v1    |         1 |     3670676 | table_id: 19                                        |
    | mysqld-bin.000001 | 3670676 | Delete_rows_v1    |         1 |     3932839 | table_id: 19                                        |
    | mysqld-bin.000001 | 3932839 | Delete_rows_v1    |         1 |     4195002 | table_id: 19                                        |
    | mysqld-bin.000001 | 4195002 | Delete_rows_v1    |         1 |     4457165 | table_id: 19                                        |
    | mysqld-bin.000001 | 4457165 | Delete_rows_v1    |         1 |     4719328 | table_id: 19                                        |
    | mysqld-bin.000001 | 4719328 | Delete_rows_v1    |         1 |     4981491 | table_id: 19                                        |
    | mysqld-bin.000001 | 4981491 | Delete_rows_v1    |         1 |     5243654 | table_id: 19                                        |
    | mysqld-bin.000001 | 5243654 | Delete_rows_v1    |         1 |     5505817 | table_id: 19                                        |
    | mysqld-bin.000001 | 5505817 | Delete_rows_v1    |         1 |     5767980 | table_id: 19                                        |
    | mysqld-bin.000001 | 5767980 | Delete_rows_v1    |         1 |     6030143 | table_id: 19                                        |
    | mysqld-bin.000001 | 6030143 | Delete_rows_v1    |         1 |     6292306 | table_id: 19                                        |
    | mysqld-bin.000001 | 6292306 | Delete_rows_v1    |         1 |     6554469 | table_id: 19                                        |
    | mysqld-bin.000001 | 6554469 | Delete_rows_v1    |         1 |     6816632 | table_id: 19                                        |
    | mysqld-bin.000001 | 6816632 | Delete_rows_v1    |         1 |     7078795 | table_id: 19                                        |
    | mysqld-bin.000001 | 7078795 | Delete_rows_v1    |         1 |     7340958 | table_id: 19                                        |
    | mysqld-bin.000001 | 7340958 | Delete_rows_v1    |         1 |     7603121 | table_id: 19                                        |
    | mysqld-bin.000001 | 7603121 | Delete_rows_v1    |         1 |     7865284 | table_id: 19                                        |
    | mysqld-bin.000001 | 7865284 | Delete_rows_v1    |         1 |     8127447 | table_id: 19                                        |
    | mysqld-bin.000001 | 8127447 | Delete_rows_v1    |         1 |     8389610 | table_id: 19                                        |
    | mysqld-bin.000001 | 8389610 | Delete_rows_v1    |         1 |     8651773 | table_id: 19                                        |
    | mysqld-bin.000001 | 8651773 | Delete_rows_v1    |         1 |     8913936 | table_id: 19                                        |
    | mysqld-bin.000001 | 8913936 | Delete_rows_v1    |         1 |     9001409 | table_id: 19 flags: STMT_END_F                      |
    | mysqld-bin.000001 | 9001409 | Xid               |         1 |     9001436 | COMMIT /* xid=3000082 */                            |
    +-------------------+---------+-------------------+-----------+-------------+-----------------------------------------------------+
    View Code

    可以看到这个delete事件已经被拆分成了30多个稍小的binlog事件

    看来只能尽量推动数据库的升级工作了。

  • 相关阅读:
    mysql之SQL入门与提升(三)
    DROOLS通过URL访问changset
    drools规则管理Guvnor的安装
    kafka offset manage
    kafka comsumer
    kafka与zookeeper
    kafka数据祸福和failover
    kafka一些问题点的分析
    近期开发storm遇到一些问题的解决点
    关于大数据平台ETL可行性方案
  • 原文地址:https://www.cnblogs.com/stevenczp/p/6739042.html
Copyright © 2020-2023  润新知