zoukankan      html  css  js  c++  java
  • 半同步复制,从库的日常管理和错误处理

    推荐的清理purge的方法:

    >purge binary logs to 'mybin.log000001';

    半同步复制
    主库产生binlog到主库的binlog file,传到从库中继日志,然后从库应用。
    即:传输是异步的,应用也是异步的。

    半同步复制指的是传输同步,应用还是异步的。

    • 好处:保证数据不丢失(本机和远端都有binlog)
    • 坏处:不能保证应用的同步。

    半同步复制的原理:
    (半同步复制的流程:)
    这里写图片描述
    (即 主库忽然崩了时,从库虽然说有延迟,但是延迟过后,可以把从库提升为主库继续服务,事后恢复到主库即可)

    (MySQL的异步复制流程:)
    这里写图片描述

    如何实现半同步复制?
    半同步复制是一个功能模块,库要能支持动态加载才能实现半同步复制!

    • ①看库是否支持动态加载(现在一般都支持)
    > select @@have_dynamic_loading;

    这里写图片描述

    • ②主从库上分别安装插件

    在主库上安装插件 semisync_master.so

    > install plugin rpl_semi_sync_master soname 'semisync_master.so';

    在从库上安装 semisync_slave.so

    > install plugin rpl_semi_sync_slave soname 'semisync_slave.so';
    • ③安装完成后,从plugin表中能够看到刚才安装的插件
    select * from mysql.plugin;
    • ④分别在主从库打开半同步复制(可加到配置文件里)
    > set @@global.rpl_semi_sync_master_enabled=on;
    > set @@global.rpl_semi_sync_slave_enabled=on;

    当一主多从

    • ⑤重启一下从库的IO
    > start slave io_thread;
    > start slave io_thread;
    (stop slave;  -->IO和应用线程)
    • ⑥查看半同步状态
    > show global status like '%rpl%';

    这里写图片描述
    (图是主库在压测的时候的状态)

    Rpl_semi_sync_master_clients  
    Rpl_semi_sync_master_net_avg_wait_time:网络等待的平均时间
    Rpl_semi_sync_master_net_wait_time:网络等待时间       
    Rpl_semi_sync_master_net_waits       
    Rpl_semi_sync_master_no_times    
    Rpl_semi_sync_master_no_tx:大于0就是异步。半同步是应为0            
    Rpl_semi_sync_master_status        
    Rpl_semi_sync_master_timefunc_failures
    Rpl_semi_sync_master_tx_avg_wait_time:平均等待时间
    Rpl_semi_sync_master_tx_wait_time:总的等待时间       
    Rpl_semi_sync_master_tx_waits
    Rpl_semi_sync_master_wait_pos_backtraverse 
    Rpl_semi_sync_master_wait_sessions 
    Rpl_semi_sync_master_yes_tx:大于0就是 同步模式

    开启半同步复制意味着什么?
    在主库开启一个事务,这个事务在主库和远端的从库各存一份。此时 Rpl_semi_sync_master_yes_tx 的值加一。忽然断网时,会有10s的hang住(rpl_semi_sync_master_timeout =10000),然后mysql会自己关闭主从复制。然后变成异步。此时Rpl_semi_sync_master_yes_tx 值不变了,而Rpl_semi_sync_master_no_tx 的值就开始加一。

    • ⑦模拟断网时的状态
    # iptables -A INPUT -s IP -j DROP
    -A:处理INPUT
    -s:源地址
    -j:处理的策略是DROP

    会发现,压测的trx忽然降低,但不会降低为0。因为此时变成了异步。但是一会儿之后,mysql会自动恢复到同步。


    从库的日常管理和错误处理

    • 1、master_connect_retry 参数
    mysql> change master to 
    master_host='192.168.159.131',
    master_user='congku',
    master_password='123123',
    master_log_file='mastera.000028',
    master_log_pos=245,
    master_connect_retry=10;    
    #连接主库失败时,每隔10s钟就重新连一下
    • 2、log_slave_updates参数

    用来配置一级从库是否写二进制日志。此参数要和–logs-bin 参数一起使用。

    • 3、–read-only 参数

    用来设置从库只能接受root的更新操作,限制了应用程序错误的对从库的更新操作。使用后,保证了主从的一致性,从库的更新就只能来自于主库的更新了。可在从库启动时启动,也可以加到配置文件。

    # mysqld_safe --defaults-file=/etc/my.cnf --user=root --read-only
    • 4、–replicate-do-table 参数

    从库启动时添加。实现了从库的分拆,将从库分拆成多个不一致的从库,分别同步不同的库或表。
    (例如,让四个从库来同步一个主库,这样应用延迟就会降低。
    主库的日志会分4个完整的,传给4个从库。然后从库都接到后,再看是对谁做的操作,例如是对促销的相关操作。就只有对应的2号从库更新。)
    事务层面:主库的事务不能跨组操作,只能操作某个组里面的2个!
    此参数使用的限制:
    这里写图片描述

    • 5、slave-skip-errors 参数

    在复制过程中,从库可能由于各种原因遇到执行binlog中的SQL出错的情况(比如主键冲突),默认情况从库将会停止复制进程,等待用户处理,不再进行同步(hang住)。
    此参数的作用就是用来定义复制过程中从库可以自动跳过的错误号。
    取值:ddl_exist_errors(具体错误号)、all
    用法:

    #mysqld_safe --slave-skip-errors=1064  --defaults-file=/etc/my.cnf &

    PS:1064错误,是常见的sql语法不对时出现的错误。
    从库如何处理sql应用出现的错误?

    • ①slave-skip-errors 为all
      时,忽略所有错误。为ddl_exist_errors(具体错误号)时,跳过这一个错误。(自动)
    • ②set global sql_slave_skip_counter=n:n的值为1或2。如果来自主库的更新语句不使用auto_increment 或 last_insert_id(),n值应为1,否则为2。(手工)然后重启stop slave;start slave;

    这里写图片描述
    上面的这一个sql,会生成2条日志,如果想在同步时跳过这条sql,n=2即可。
    怎么监控:> show slave status G #看读和执行的pos是不是在快速的缩短。

    • 6、log event entry exceeded max_allowed_packet 的处理

    如果应用中使用大的blog列或者长字符串,那么在从库上进行恢复的时候,可能会出现”log event entry exceeded max_allowed_packet”错误,这是因为含有大文本的记录无法通过网络进行传输导致。解决的办法就是在主从库上增加 max_allowed_packet 参数的大小。默认值1MB。可按实际需要修改。

    #set global max_allowed_packet =16MB;

    Create By LPeng

  • 相关阅读:
    jqueryautocomplete
    了解CSS的查找匹配原理 让CSS更简洁、高效
    html5网页编码
    刚开始学习 mvc碰到的郁闷问题
    datatable 批量插入方法 求解?
    28个经过重新设计的著名博客案例(1120)
    递归调用中的return
    C++新建一个模板
    C++ 中用 sizeof 判断数组长度
    为什么MySQL选择REPEATABLE READ作为默认隔离级别?
  • 原文地址:https://www.cnblogs.com/lpeng94/p/12546461.html
Copyright © 2011-2022 走看看