zoukankan      html  css  js  c++  java
  • MySQL数据库 Master库大量delete操作导致slave日志应用延迟

    问题背景:

    客户反馈slave每到凌晨就出现延迟现象,需要排查原因

    1>首先查看master库每天凌晨有什么操作:

    分析binlog日志

    1 mysqlbinlog --no-defaults --base64-output=decode-rows -v mysql-bin.000204 > mysql-bin.000204.sql

    查看日志在凌晨有大量的delete操作

    复制代码
    #191126  0:08:35 server id 1  end_log_pos 1073744234 CRC32 0x11bf4f5d  Table_map: `user`.`table_name` mapped to number 4012691
    
    # at 1073744234
    
    #191126  0:08:35 server id 1  end_log_pos 1073744393 CRC32 0xa3229214  Delete_rows: table id 4012691 flags: STMT_END_F
    
    ### DELETE FROM `user`.`table_name`
    ### WHERE
    ###   @1=259121
    ###   @2='2019-11-25'
    ###   @3=1
    ###   @4=1
    ###   @5=0
    ###   @6='2019-11-25'
    ###   @7='08:30'
    ###   @8='2019-11-25'
    ###   @9='17:30'
    ###   @10=540
    ###   @11=''
    ###   @12=''
    ###   @13=NULL
    ###   @14=''
    ###   @15=''
    ###   @16=NULL
    ###   @17=0
    ###   @18=0
    ###   @19=0
    ###   @20=0
    ###   @21=0
    ###   @22=540
    ###   @23=0
    ###   @24=0
    ###   @25=0
    ###   @26=0
    ###   @27=0
    ###   @28='{}'
    # at 1073744393
    
    #191126  0:08:35 server id 1  end_log_pos 1073744424 CRC32 0x5a03e7aa  Xid = 25909247548
    复制代码

    2> 判断为大量的delete操作产出大量的binlog日志,slave应用不过来

    一般而言,slave相对master延迟较大,其根本原因就是slave上的复制线程没办法真正做到并发。简单说,

    在master上是并发模式(以InnoDB引擎为主)完成事务提交的,而在slave上,

    复制线程只有一个sql thread用于binlog的apply,所以slave在高并发时会远落后master。

    查看slave复制方式

    复制代码
     1 mysql> show variables like"%slave%";
     2 
     3 +-------------------------------------------+----------------------+
     4 
     5 | Variable_name                             | Value                |
     6 
     7 +-------------------------------------------+----------------------+
     8 
     9 | init_slave                                |                      |
    10 
    11 | log_slave_updates                         | ON                   |
    12 
    13 | log_slow_slave_statements                 | OFF                  |
    14 
    15 | pseudo_slave_mode                         | OFF                  |
    16 
    17 | rpl_semi_sync_master_wait_for_slave_count | 1                    |
    18 
    19 | rpl_semi_sync_master_wait_no_slave        | OFF                  |
    20 
    21 | rpl_semi_sync_slave_enabled               | ON                   |
    22 
    23 | rpl_semi_sync_slave_trace_level           | 32                   |
    24 
    25 | rpl_stop_slave_timeout                    | 31536000             |
    26 
    27 | slave_allow_batching                      | OFF                  |
    28 
    29 | slave_checkpoint_group                    | 512                  |
    30 
    31 | slave_checkpoint_period                   | 300                  |
    32 
    33 | slave_compressed_protocol                 | OFF                  |
    34 
    35 | slave_exec_mode                           | STRICT               |
    36 
    37 | slave_load_tmpdir                         | /tmp                 |
    38 
    39 | slave_max_allowed_packet                  | 1073741824           |
    40 
    41 | slave_net_timeout                         | 60                   |
    42 
    43 | slave_parallel_type                       | DATABASE             |
    44 
    45 | slave_parallel_workers                    | 0                    |
    46 
    47 | slave_pending_jobs_size_max               | 134217728            |
    48 
    49 | slave_preserve_commit_order               | OFF                  |
    50 
    51 | slave_rows_search_algorithms              | INDEX_SCAN,HASH_SCAN |
    52 
    53 | slave_skip_errors                         | OFF                  |
    54 
    55 | slave_sql_verify_checksum                 | ON                   |
    56 
    57 | slave_transaction_retries                 | 10                   |
    58 
    59 | slave_type_conversions                    |                      |
    60 
    61 | sql_slave_skip_counter                    | 0                    |
    62 
    63 +-------------------------------------------+----------------------+
    64 
    65 27 rows in set (0.00 sec)
    复制代码

    配置从服务器上的多线程并行复制的参数(此处为实现多线程复制的重要参数)在数据库配置文件 my.cnf中设置

    复制代码
     1 slave-parallel-type=LOGICAL_CLOCK
     2 
     3 slave-parallel-workers=16          #16为设置的并发线程个数,之后根据项目对数据传输的具体要求再更改
     4 
     5                                                 #一个schema下,slave_parallel_workers中的worker线程并发执行relay log中主库提交的事务
     6 
     7 master_info_repository=TABLE
     8 
     9 relay_log_info_repository=TABLE
    10 
    11 relay_log_recovery=ON
    12 
    13 注:变量slave-parallel-type可以有两个值
    14 
    15  
    16 DATABASE 为默认值,意为基于库的并行复制方式;
    17 
    18 LOGICAL_CLOCK:基于组提交的并行复制方式
    复制代码

    1、下面查看复制类型和并行数量配置

    复制代码
     1 mysql> show variables like 'slave_parallel_type';
     2 
     3 +---------------------+----------+
     4 
     5 | Variable_name  | Value |
     6 
     7 +---------------------+----------+
     8 
     9 | slave_parallel_type | DATABASE |
    10 
    11 +---------------------+----------+
    12 
    13 1 row in set (0.00 sec)
    复制代码

    当前的复制类型是 DATABASE,也就是统一数据库下只有一个线程进行复制,不能并行复制。

    复制代码
     1 mysql> show variables like 'slave_parallel_workers';
     2 
     3 +------------------------+-------+
     4 
     5 | Variable_name   | Value |
     6 
     7 +------------------------+-------+
     8 
     9 | slave_parallel_workers | 0  |
    10 
    11 +------------------------+-------+
    12 
    13 1 row in set (0.01 sec)
    14 
    15  
    复制代码

    当前并行工作的进程数是 0

    配置多线程

    1、停止从节点复制

    1 mysql> stop slave;
    2 
    3 Query OK, 0 rows affected (0.01 sec)

    2、设置复制类型为 LOGICAL_CLOCK

    复制代码
     1 mysql> set global slave_parallel_type='logical_clock';
     2 
     3 Query OK, 0 rows affected (0.00 sec)
     4 
     5 mysql> show variables like 'slave_parallel_type';
     6 
     7 +---------------------+---------------+
     8 
     9 | Variable_name  | Value   |
    10 
    11 +---------------------+---------------+
    12 
    13 | slave_parallel_type | LOGICAL_CLOCK |
    14 
    15 +---------------------+---------------+
    16 
    17 1 row in set (0.01 sec)
    复制代码

    3、设置并行数量为 4

    复制代码
     1 mysql> set global slave_parallel_workers=4;
     2 
     3 Query OK, 0 rows affected (0.00 sec)
     4 
     5 mysql> show variables like 'slave_parallel_workers';
     6 
     7 +------------------------+-------+
     8 
     9 | Variable_name   | Value |
    10 
    11 +------------------------+-------+
    12 
    13 | slave_parallel_workers | 4  |
    14 
    15 +------------------------+-------+
    16 
    17 1 row in set (0.00 sec)
    复制代码

    4、启动从节点复制

    1 mysql> start slave;
    2 
    3 Query OK, 0 rows affected (0.02 sec)
    4 
    5  
  • 相关阅读:
    UVA 408 (13.07.28)
    linux概念之用户,组及权限
    Java实现 蓝桥杯 历届试题 网络寻路
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 约数倍数选卡片
    Java实现 蓝桥杯 历届试题 九宫重排
    Java实现 蓝桥杯 历届试题 九宫重排
  • 原文地址:https://www.cnblogs.com/shujuyr/p/13080935.html
Copyright © 2011-2022 走看看