vlambda博客
学习文章列表

Mysql主从参数配置与调优

    上一章节,我们介绍了如何基于GTID搭建Mysql的主从和一些常见问题,这一节我们介绍一下Mysql的常见主从参数配置。


    这篇文章主要讲3个点:

  • 基本参数配置

  • 搭建半同步主从配置

  • 搭建并行复制主从配置

 

基本参数


数据库字符集

default_character_set=utf8mb4collation_server = utf8mb4_general_cicharacter_set_server=utf8mb4

    配置数据库字符集非常有必要,如果主从配置不一致会导致数据表结构不一致,严重导致数据库主从节点挂掉。


日志文件

basedir =/usr/local/mysqldatadir = /usr/local/mysql/datasocket = /tmp/mysql.socklog-error = /usr/local/mysql/data/error.logpid-file = /usr/local/mysql/data/mysqld.pidlog-bin=mysql-binrelay_log = mysql-relay-bin

    其中log-error是错误日志,会记录项目里mysql中的错误信息;


    bin-log二进制文件记录主从同步日志文件;


    relay-log中继日志从库会开启多个线程从bin-log拷贝数据到自己的中继日志里;


开启慢查询日志

slow_query_log = 1long_query_time = 2slow_query_log_file=mysql-slow.log

    查询速度超过2秒则记录进日志


GTID主从配置

gtid_mode=onenforce_gtid_consistency=on

Bin-log同步模式

binlog_format= row

    一共三种row(行更新语句)、statement(sql执行日志)、mixed(混合)


    建议使用row模式,row模式能够保证主从同步一致性,其他模式在某些特殊场景会导致数据不一致。


最大查询语句包配置

max_allowed_packet=64M

    查询语句包的最大尺寸,用于复杂查询,不建议使用。


    会导致大事务和主从延迟。

    

主从高可靠配置

innodb_flush_log_at_trx_commit=1sync_binlog=1#innodb_flush_log_at_trx_commit=2#sync_binlog=500

    主从双1配置,binlog、redo实时写入磁盘,保证数据不丢失。


    如果可以接受断电少量事务数据丢失,使用2,500可以极大提高吞吐量

 


搭建半同步主从配置

    Mysql默认使用异步同步配置,这样会导致主从数据不一致。


    我们可以通过配置半同步极大程度实现主从一致。

 

    数据库之间通过一个ack来确定是否成功写入从库,值得注意的是当使用一主多从的时候,只要有一台数据库ack,原事务就算执行成功。


具体配置

Master:
install plugin rpl_semi_sync_master soname 'semisync_master.so'; ##导入半同步master模块set global rpl_semi_sync_master_enabled=1;set global rpl_semi_sync_master_timeout=10000 # 10sshow variables like 'rpl%';show status like 'rpl%';

 

Slave:
install plugin rpl_semi_sync_slave soname 'semisync_slave.so';set global rpl_semi_sync_slave_enabled=1;stop slave io_thread;start slave io_thread;show variables like 'rpl%';show status like 'rpl%';

    在variables 和status中可以查看到具体主从同步信息


参数详解

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:共有几次从Semi-sync跌回普通状态Rpl_semi_sync_master_no_tx:库未及时响应的事务数,如果这个值很大就有问题Rpl_semi_sync_master_status:服务器当前是否工作于半同步复制模式Rpl_semi_sync_master_timefunc_failures:时间函数未正常工作的次数Rpl_semi_sync_master_tx_avg_wait_time:开启Semi-sync,事务返回需要等待的平均时间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_session:当前有几个线程在等备库响应Rpl_semi_sync_master_yes_tx :表示通过半同步复制到从库的事务数

 

搭建并行复制主从配置

    在上一篇文章中我们介绍了集中会导致从库数据同步慢于主库的场景,而具体的解决方案就是通过在从库配置并行复制。


    利用多线程的特性,使加速数据同步。


    配置文件中添加:

slave-parallel-type=LOGICAL_CLOCKslave-parallel-workers=8master_info_repository=TABLErelay_log_info_repository=TABLErelay_log_recovery=ON

     执行语句:

show processlist;



    可以发现多了好几个线程做主从同步等待队列,代表配置成功