MYSQL主从同步架构是目前使用最多的数据库架构之一,尤为是负载比较大的网站,所以对于主从同步的管理也就显得很是重要,新手每每在出现主从同步错误的时候不知道如何入手,这篇文章就是根据本身的经验来详细叙述mysql主从的管理。html
MYSQL主从同步的做用mysql
(1) 数据分布
(2) 负载平衡(load balancing)
(3) 备份
(4) 高可用性(high availability)和容错sql
MYSQL主从同步的原理数据库
关于MYSQL的主从同步,最主要的是要了解MYSQL的主从同步是如何工做的也即主从同步的原理,经过下图能很明白的指导其工做的过程:服务器
大体描述一下过程:从服务器的IO线程从主服务器获取二进制日志,并在本地保存为中继日志,而后经过SQL线程来在从上执行中继日志中的内容,从而使从库和主库保持一致。主从同步的详细过程以下:架构
1. 主服务器验证链接。 工具
2. 主服务器为从服务器开启一个线程。 网站
3. 从服务器将主服务器日志的偏移位告诉主服务器。ui
4. 主服务器检查该值是否小于当前二进制日志偏移位。 spa
5. 若是小于,则通知从服务器来取数据。
6. 从服务器持续从主服务器取数据,直至取完,这时,从服务器线程进入睡眠,主服务器线程同时进入睡眠。
7. 当主服务器有更新时,主服务器线程被激活,并将二进制日志推送给从服务器,并通知从服务器线程进入工做状态。
8. 从服务器SQL线程执行二进制日志,随后进入睡眠状态。
MYSQL主从同步的搭建实战
主从同步的搭建是一项比较细的技术活,前期作好了一些事情会让你在之后的工做中减小不少工做,搭建的时候须要注意一些问题,一会搭建的时候会一边搭建一边介绍须要注意的问题,让初学者能在刚开始的时候就有效的规避掉一些潜在的问题(MYSQL安装这里不作介绍):
主从同步环境介绍
操做系统环境:Centos 5.5 64 bit
MYSQL版本:MYSQL 5.1.50
主服务器的IP:10.1.1.75
从服务器的IP:10.1.1.76
在主服务器上创建同步账号
GRANT REPLICATION SLAVE,FILE ON *.* TO 'replication'@'10.1.1.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
注意:你们在设置权限的时候不要将密码设置过于简单!
从服务器配置文件的更改
server-id = 2
replicate-wild-ignore-table=mysql.%
log-slave-updates #这个有须要能够开启
注意:
1) server-id这一项须要认真检查,必定不能和主服务器冲突了,否则到时候会出现莫民其妙的问题,由于同步的时候会会根据server-id作判断,若是server-id同样就不进行同步了,否则可能会致使死循环(主主同步或者环状同步的时候)。
2) 有的人会感受奇怪我这里为何要使用replicate-wild-ignore-table参数,而不是用replicate-do-db或者replicate-ignore-db来过滤须要同步的数据库和不须要同步的数据库。这里有几个缘由:
A. replicate-wild-ignore-table参数能同步全部跨数据库的更新,好比replicate-do-db或者replicate-ignore-db不会同步相似
use mysql;
UPDATE test.aaa SET amount=amount+10;
B. replicate-wild-ignore-table=mysql.%在之后须要添加同步数据库的时候能方便添加而不须要从新启动从服务器的数据库。由于之后极可能须要同步其余的数据库。
3) auto_increment_increment和auto_increment_offset参数,这 两个参数通常用在主主同步中,用来错开自增值, 防止键值冲突。
4) --slave-skip-errors参数,不要胡乱使用这些跳过错误的参数,除非你很是肯定你在作什么。当你使用这些参数时候,MYSQL会忽略那些错误,这样会致使你的主从服务器数据不一致。
4. 从主服务器获得一个快照版本
若是你的是MYISAM或者既有MYISAM又有INNODB的话就在主服务器上使用以下命令导出服务器的一个快照:
mysqldump -uroot -p --lock-tables --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql
试过只有INNODB的话就是用以下命令:
mysqldump -uroot -p --single-transaction --events --triggers --routines --flush-logs --master-data=2 --databases test > db.sql
这里须要注意几个参数的使用:
--single-transaction 这个参数只对innodb适用。
--databases 后面跟除mysql之后的其余全部数据库的库名,我这里只有一个test库。
--master-data 参数会记录导出快照时候的mysql二进制日志位置,一会会用到。
将快照版本还原到从服务器上
mysqldump -uroot -p -h 10.1.1.76 test < db.sql
将快照版本还原到从服务器上之后,此时从服务器上的数据和主服务器的数据是一致的。
在从服务器上使用change master从主服务器上同步
使用grep命令查找到二进制日志的名称以及位置
[root@ns1 ~]# grep -i "change master" db.sql
-- CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;
生成CHANGE MASTER语句,而后在从上执行
STOP SLAVE;
CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;
START SLAVE;
这样就完成了主从同步的搭建,最后使用SHOW SLAVE STATUS\G;查看Slave_IO_Running和Slave_SQL_Running的状态,若是都为Yes,就大功告成了。
注意:不要将同步的信息写入配置文件中,不方便管理,尤为是有变更须要重启。
MYSQL主从同步的管理
这里介绍一些管理MYSQL主从同步的命令:
中止MYSQL同步
STOP SLAVE IO_THREAD; #中止IO进程
STOP SLAVE SQL_THREAD; #中止SQL进程
STOP SLAVE; #中止IO和SQL进程
启动MYSQL同步
START SLAVE IO_THREAD; #启动IO进程
START SLAVE SQL_THREAD; #启动SQL进程
START SLAVE; #启动IO和SQL进程
重置MYSQL同步
RESET SLAVE;
用于让从属服务器忘记其在主服务器的二进制日志中的复制位置, 它会删除master.info和relay-log.info文件,以及全部的中继日志,并启动一个新的中继日志,当你不须要主从的时候能够在从上执行这个操做。否则之后还会同步,可能会覆盖掉你的数据库,我之前就遇到过这样傻叉的事情。哈哈!
查看MYSQL同步状态
SHOW SLAVE STATUS;
这个命令主要查看Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master、Last_IO_Error、Last_SQL_Error这些值来把握复制的状态。
临时跳过MYSQL同步错误
常常会朋友mysql主从同步遇到错误的时候,好比一个主键冲突等,那么我就须要在确保那一行数据一致的状况下临时的跳过这个错误,那就须要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳事后面的n个事件,好比我跳过一个事件的操做以下:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
从指定位置从新同步
有的时候主从同步有问题了之后,须要从log位置的下一个位置进行同步,至关于跳过那个错误,这时候也可使用CHANGE MASTER命令来处理,只要找到对应的LOG位置就能够,好比:
CHANGE MASTER TO MASTER_HOST='10.1.1.75',MASTER_USER='replication',MASTER_PASSWORD='123456',MASTER_LOG_FILE='mysql-bin.000006', MASTER_LOG_POS=106;
START SLAVE;
MYSQL主从同步的管理经验介绍
不要乱使用SQL_SLAVE_SKIP_COUNTER命令。
这个命令跳过以后极可能会致使你的主从数据不一致,必定要先将指定的错误记录下来,而后再去检查数据是否一致,尤为是核心的业务数据。
结合percona-toolkit工具pt-table-checksum按期查看数据是否一致。
这个是DBA必需要按期作的事情,呵呵,有合适的工具何乐而不为呢?另外percona-toolkit还提供了对数据库不一致的解决方案,能够采用pt-table-sync,这个工具不会更改主的数据。还可使用pt-heartbeat来查看从服务器的复制落后状况。具体的请查看:http://blog.chinaunix.net/uid-20639775-id-3229211.html。
3. 使用replicate-wild-ignore-table选项而不要使用replicate-do-db或者replicate-ignore-db。
缘由已经在上面作了说明。
将主服务器的日志模式调整成mixed。
每一个表都加上主键,主键对数据库的同步会有影响尤为是居于ROW复制模式。