本文共 2933 字,大约阅读时间需要 9 分钟。
所需进程
Master上需要dump,slave需要IO和SQL线程;
Dump读取master binlog并发送给slave,每个slave对应1个;
Slave端的IO读取master传来的内容并写入relay log,sql线程读取relay log并解析成sql应用于slave;
连接参数
Slave-net-timeout
如超过此时间无相应则slave认定连接超时 ,默认3600s
Master-connect-retry
两次重连间隔时间,默认60s
Master-retry-count
重连次数 ,默认86400
为何引入relay log?
类似oracle的standby redo,Mysql replication采用的是异步机制,slave将event暂时保存relay log,而master 无需等待slave同步执行完就可以发送下一个event;
何时切换
Master binlog切换一次relay log就随着切换一次;
IO线程重启;
Flush logs;
达到max_relay_log_size限制,如果此值为0,则以max_binlog_size为准;
relay-log.info && master-log.info
中继日志通过这两个文件来跟踪复制进度;
Master-log.info记录连接master的信息(host/user/password/port)以及master log的读取位置read_master_log_pos;
Slave IO启动时会读取该文件内容;
Relay-log.info则由slave sql线程维护,包含relay log的基本信息以及执行位置exec_master_log_pos,由此决定下一个要执行的事件;
这两个文件由relay-log-info-file/master-info-file指定,默认名如上;
只有执行start slave,这两个文件才会被创建,此后的每次slave重启,都会从这两个文件获取复制/执行进度;
如果relay log丢失但是relay-log.info还在,便可以查看当前sql线程的进度,通过change master to让slave从master重新读取相应bin log
Show salve status
Read_master_log_pos:I/O进程读取到master的binary log的位置
Exec_master_log_pos:sql进程执行到的master binary log位置,如果有延迟则会落后于read_master_log_pos
Seconds_behind_master:即使此参数为0,也不一定意味着slave已经同步,比如主备之间的网络断开但IO线程还未察觉,即slave_net_timeout尚未计时;
通过比较read_master_log_pos和exec_master_log_pos,可以确认是否有事件等待执行;
Slave上与复制有关的线程包括I/O thread和sql thread
I/O线程错误
参数log_warnings=1(默认)会记录I/O线程的错误
有几种常见可能
1
主库上的user没有replication slave权限
2
网络无法连接
使用ping命令查看OS是否正常;
telnet master_host port查看mysql是否启动;
远程连接master,mysql –h host –p port -uUser –p检验密码是否正确,成功后查询select user(), current_user()--避免proxy user或使用其他用户连接,再执行show grants验证权限;
3
频繁断线
使用tcpdump/netstat检查网络
Netstat –a| grep port应该能显示与master建立的连接
Tcpdump –I en1 host mast_host port 3306
如果lag太大,使用tcpdump或通过复制大文件的方式检验网络
Sql thread只有一个,当master负载繁忙时可能会导致复制延时,当排除以上可能后,只能升级硬件或调优参数,要么就使用多线程sql;
有时sql 线程可能会抱错delay log corrupted,大部分时候是IO线程操作引起的,也有可能master上binlog;
此时应使用mysqlbinlog检查master binlog和delay log,如果前者出错,手工应用slave,start slave until ,然后检查主备库上的表checksum table test;
SQL线程错误
最常见的是master/slave表结构不一致
如果show slave status显示的sql文本不全,则需使用mysqlbinlog查看master的binlog或slave的 relaylog;
Mk-heartbeat
可用于监控replication延迟
首先在master上创建一个名为heartbeat的表,结构如下
CREATE TABLE heartbeat (
ts varchar(26) NOT NULL,
server_id int unsigned NOT NULL PRIMARY KEY,
file varchar(255) DEFAULT NULL, -- SHOW MASTER STATUS
position bigint unsigned DEFAULT NULL, -- SHOW MASTER STATUS
relay_master_log_file varchar(255) DEFAULT NULL, -- SHOW SLAVE STATUS
exec_master_log_pos bigint unsigned DEFAULT NULL -- SHOW SLAVE STATUS
);
然后再slave端开启监控
假定某级联复制master -> slave1 -> slave2
mk-heartbeat --daemonize -D test --update -h master
mk-heartbeat --daemonize -D test --update -h slave1
监控master到slave2的延迟
mk-heartbeat -D test --master-server-id 1 --check slave2
监控 slave1到slave2的延迟
mk-heartbeat -D test --master-server-id 2 --check slave2
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15480802/viewspace-757959/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/15480802/viewspace-757959/