美文网首页
MySQL复制中重要参数及优化

MySQL复制中重要参数及优化

作者: 古飞_数据 | 来源:发表于2022-10-06 22:02 被阅读0次

    1.从库Crash后为什么复制会中断,如何避免?
    2.有哪些办法可以减少复制延迟?
    3.如果让MySQL复制,只复制部分表?
    4.如何将多个数据源汇总在一个从库实例上?

    1.从库Crash后为什么复制会中断,如何避免?

    1.从库异常down机后,启动start slave;复制不能进行。
    2.如何处理?实质原因: mysql relay log损坏
    

    GTID环境解决

    stop slave;
    reset slave;          -- 清空relay log
    start slave;
    
    mysqldump -A --single-transaction --master-data=2 -S /tmp/mysql3306.sock -p > db3306.sql
    more db3306.sql
    启动一个实例 
    /usr/local/mysql/bin/mysqld --defaults-file=/data/mysql/mysql3308/my3308.cnf &
    如果有数据需要清空数据
    drop database xxx;
    reset master;  --清空binlog
    reset slave all;
    show master status;
    恢复数据
    mysql -S /tmp/mysql3308.sock < /data/backup/db3306.sql
    show master status;  --查看同步的gtid
    change master to master_host='127.0.0.1' master_port='3306' master_user='repl', master_password='repl4slave',master_auto_position=1;
    start slave;
    
    
    主库
    create table tb1(
    id int(11) NOT NULL,
    c1 varchar(64) DEFAULT NULL,
    PRIMARY KEY (id)
    )ENGINE=InnoDB DEFAULT CHARSET=utf8
    insert into tb1(id,c1) values(22,'abcd');
    show master status;
    
    
    

    小插曲,配置问价加载不生效,分析

    为了区分显示,加了端口
    [mysql]
    auto-rehash
    prompt="\\u@\\h:\p [\\d]>"
    
    
    分析加载情况
    strace -S /tmp/mysql3308.sock -p | grep my.cnf
    mv my.cnf my.cnf_bak_`date +%Y%m%d`
    
    

    position环境

    stop slave;
    change master to 
    master_log_file = relay_master_log_file
    master_log_pos = exec_log_position
    start slave io_thread;
    
    
    show slave status\G    记录信息
    Relay_Master_Log_File: mysql-bin.000021
    Exec_Master_Log_Pos: 3441
    
    
    
    
    复制自动recovery,主从都配置
           relay_log_info_repository = table
           relya _log_recovery=1
           relay_log_purge=1
    
    start slave until SQL_after_MTS_GAPS;    需要上述三个参数才行
    
    需要注意的是mha环境  relay_log_purge=0    就不能使用上面的功能了
    
    

    2.有哪些办法可以减少复制延迟?

    并行复制
    slave_parallel_type=LOGICAL_CLOCK
    slave_parallel_workers=4-8
    为什么开了这两个参数,实质上并没有启用并行复制?
    
    怎么看并行复制是生效的呢?
    select * from ps_replication_applier_status_by_worker\G;
    show global variables like '%slave%';
    
    并行复制需要开启的参数
    Master:
    Binlog group commit:
    binlog_group_commit_sync_delay
    binlog_group_commit_sync_no_delay_count
    
    
    Slave并行复制:
    slave_parallel_type=LOGICAL_CLOCK              以来上面的binlog group commit
    slave_parallel_workers=4-8
    binlog_transaction_dependency_tracking=writeset
    slave-preserve-commit-order=0
    
    如果slave-preserve-commit-order 配置为1  writeset就不工作了
    
    
    
    
    
    
    什么是binlog group commit?
    Binlog Group Commit的过程
    flush Stage
    Sync Stage
    Commit Stage
    
    commied=No,seqxxxed=No     其中 seqxxxed=No 一样就是一组
    
    
    binlog_group_commit_sync_delay                   配置100微妙
    binlog_group_commit_sync_no_delay_count   队列大小  配置在20-30
    
    slave_parallel_type=LOGICAL_CLOCK
    slave_parallel_workers=4-8
    
    8.0的writeSet
    binlog group commit是5.7引入,为了提高从库的应用速度,在主库上尽量提高并行
    8.0做的设计是针对从库,即使主库在串行提交的事务,只要不互相冲突,在Slave上也可以并行回放:WriteSet
    
    binlog_transaction_dependency_tracking=commit_order/writesetlwriteset_session
    transaction_write_set_extraction (hash方法) xxhash64
    binlog_transaction_dependency_history_size (hash大小) 默认25000
    
    如果slave-preserve-commit-order 配置为1  writeset就不工作了
    
    
    groupcommit和write set 同时设置会不会冲突?
    优先使用write set
    
    
     binlog中引入: last_commited和sequence_number
    sequence_number 是自身事务ID
    last_commited是上一个提交事务的ID
    ·如果两事务的last_commited相同,说明两个事务是在同一个Group内提交
    
    
    
    pke函数
    基于Slave上的并行复制优化
    依赖于日志中commit timestamps或是writesets并行回放事务需要使用到函数
    rpl_write_set_handler.cc:add_pke()     ( binlog_write_row中调用)
    非唯一索引名称+分隔符+库名+分隔符+库名长度+表名+分隔符+表名长度+索引字段1数值+分隔符+索引字段1长度[+索引字2段数值+分隔符+索引字段2长度...]
    
    
    每个表都有一个唯一的key
    hash,isapply?
    
    update tb1 set c1=10 where id=10;
    主键hash一个值  id:10zst:3tb1:3 --> 0
    update tb1 set c1=11 where id=11;  发现主键值一样,不能并行,不放在队列中
    update tb1 set c1=11 where id=11;  又形成一个hash, id:11zst:3tb1::3 -->0
    
    binlog_transaction_dependency_history_size=25000   池子的概念, 在队列里取任务,然后按照slave_parallel_workers=4取值并发
    
    并发完后 id:10zst:3tb1:3 --> 1    id:11zst:3tb1::3 --> 1  标记为1  60秒会清理一次
    
    如果并发出错了,就停止了
    
    Master中的配置writeset
    binlog_transaction_dependency_tracking
    
    

    select * from sys.memory_global_total;
    select * from sys.memory_global_by_current_bytes;

    总结:

    #relay log recovery
     relay_log_info_repository = table
     relya _log_recovery=1
     relay_log_purge=1
    
    #binlog group commit
    binlog_group_commit_sync_delay=100
    binlog_group_commit_sync_no_delay_count=20
    
    #replication parallel
    slave_parallel_type=LOGICAL_CLOCK
    slave_parallel_workers=8
    binlog_transaction_dependency_tracking=writeset
    slave-preserve-commit-order=0
    

    复制中重要功能启用

    sync_relay_log_info = 1
    
    show slave status\G   从哪里读取的数据
    
    
    这是一个性能杀手的配置
    sync_relay_log_info=1 & relay_log_info_repository=file
    正确的姿势
    sync_relay_log_info=1 & relay_log_info_repository=table
    sync_master_info = 1
    #如果使用了crash-safe replication这个参数建议配置大点,提升性能。
    

    复制延迟功能

    #启用延迟复制,保持和主库一个小时库
    
    的延迟
    mysq>stop slave sql_thread;
    mysq>change master to \
    master_delay=3600;
    mysq>start slave sql_thread;
    
    
    
    #禁用延迟复制
    mysqI>stop slave sql_thread;
    mysql>change master to \
    master_delay= 0;
    mysql>start slave sql_thread;
    
    change master to master_delay=0;
    start slave sql_thread until SQL_BEFORE_GTIDS=uuid:N;        重放到删库前的uuid
    
    
    如果数据库很大 都有好几T了, 可以用延时从库做灾备    12小时延迟
    
    

    3.如果让MySQL复制,只复制部分表?

    binlog_do_db不要在主库上配置
    stop slave sql_thread;
    change replication filter replicate_do_db=(tencent);
    start slave sql_thread;

    DDL binlog   都是 statement
    
    statement  格式 不能跨库操作,
    跨库DDL操作可能遇到不能复制的情况
    

    4.如何将多个数据源汇总在一个从库实例上?

    多源复制
    change master to \
    ...
    for channel 'channelname'
    
    启用多源复制的限制
    master_info_repository=table
    relay_log_info_repository=table
    +GTID
    从管理方便上讲:
    binlog_format=row
    gtid_mode=on
    
    change master to .... for channel db3306;
    change master to ... for channel db3307;
    
    
    
    show slave status\G
    show master status;   获取gitd
    reset master;                  
    show master status;
    导入数据
    mysql < ./db3307.sql
    show master status;  获取gtid
    set global gtid_purged='uuid1:1-N;uuid2:1-N'
    show master status;
    
    change master to mast_host=uuid2 ... for channel db3307;
    
    start slave for channel db3307;
    start slave for channel db3306;
    
    
    
    
    

    相关文章

      网友评论

          本文标题:MySQL复制中重要参数及优化

          本文链接:https://www.haomeiwen.com/subject/uqsbartx.html