MYSQL主从同步
MYSQL主从同步架构是眼下使用最多的数据库架构之中的一个。MySam引擎负责新增改动删除操作。InnoDB引擎负责查询,所谓的读写分离。尤其是负载比較大的站点。因此对于主从同步的管理也就显得很重要。新手往往在出现主从同步错误的时候不知道怎样入手,这篇文章就是依据自己的经验来具体叙述mysql主从的管理。
MYSQL主从同步的作用
(1) 数据分布
(2) 负载平衡(load balancing)
(3) 备份
(4) 高可用性(high availability)和容错
MYSQL主从同步的原理
关于MYSQL的主从同步。最基本的是要了解MYSQL的主从同步是怎样工作的也即主从同步的原理,通过下图能非常明确的指导其工作的过程:
大致描写叙述一下过程:从server的IO线程从主server获取二进制日志,并在本地保存为中继日志,然后通过SQL线程来在从上运行中继日志中的内容,从而使从库和主库保持一致。主从同步的具体步骤例如以下:
1. 主server验证连接。
2. 主server为从server开启一个线程。
3. 从server将主server日志的偏移位告诉主server。
4. 主server检查该值是否小于当前二进制日志偏移位。
5. 假设小于,则通知从server来取数据。
6. 从server持续从主server取数据。直至取完,这时,从server线程进入睡眠,主server线程同一时候进入睡眠。
7. 当主server有更新时,主server线程被激活。并将二进制日志推送给从server。并通知从server线程进入工作状态。
8. 从serverSQL线程运行二进制日志,随后进入睡眠状态。
MYSQL主从同步的搭建实战
主从同步的搭建是一项比較细的技术活,前期做好了一些事情会让你在以后的工作中降低非常多工作,搭建的时候须要注意一些问题,一会搭建的时候会一边搭建一边介绍须要注意的问题。让刚開始学习的人能在刚開始的时候就有效的规避掉一些潜在的问题(MYSQL安装这里不做介绍):
1. 主从同步环境介绍
操作系统环境:Centos 5.5 64 bit
MYSQL版本号:MYSQL 5.1.50
主server的IP:10.1.1.75
从server的IP:10.1.1.76
2. 在主server上建立同步帐号
GRANT REPLICATION SLAVE,FILE ON *.* TO 'replication'@'10.1.1.%' IDENTIFIED BY '123456';
FLUSH PRIVILEGES;
注意:大家在设置权限的时候不要将password设置过于简单。
3. 从server配置文件的更改
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.%在以后须要加入同步数据库的时候能方便加入而不须要又一次启动从server的数据库。
由于以后非常可能须要同步其它的数据库。
3) auto_increment_increment和auto_increment_offset參数,这 两个參数一般用在主主同步中,用来错开自增值, 防止键值冲突。
4) --slave-skip-errors參数。不要胡乱使用这些跳过错误的參数,除非你很确定你在做什么。
当你使用这些參数时候,MYSQL会忽略那些错误,这样会导致你的主从server数据不一致。
4. 从主server得到一个快照版本号
假设你的是MYISAM或者既有MYISAM又有INNODB的话就在主server上使用例如以下命令导出server的一个快照:
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二进制日志位置,一会会用到。
5. 将快照版本号还原到从server上
mysqldump -uroot -p -h 10.1.1.76 test < db.sql
将快照版本号还原到从server上以后。此时从server上的数据和主server的数据是一致的。
6. 在从server上使用change master从主server上同步
使用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主从同步的命令:
1. 停止MYSQL同步
STOP SLAVE IO_THREAD; #停止IO进程
STOP SLAVE SQL_THREAD; #停止SQL进程
STOP SLAVE; #停止IO和SQL进程
2. 启动MYSQL同步
START SLAVE IO_THREAD; #启动IO进程
START SLAVE SQL_THREAD; #启动SQL进程
START SLAVE; #启动IO和SQL进程
3. 重置MYSQL同步
RESET SLAVE;
用于让从属server忘记其在主server的二进制日志中的复制位置, 它会删除master.info和relay-log.info文件,以及全部的中继日志,并启动一个新的中继日志,当你不须要主从的时候能够在从上运行这个操作。不然以后还会同步。可能会覆盖掉你的数据库,我曾经就遇到过这样傻叉的事情。
哈哈!
4. 查看MYSQL同步状态
SHOW SLAVE STATUS;
这个命令主要查看Slave_IO_Running、Slave_SQL_Running、Seconds_Behind_Master、Last_IO_Error、Last_SQL_Error这些值来把握复制的状态。
5. 暂时跳过MYSQL同步错误
常常会朋友mysql主从同步遇到错误的时候,比方一个主键冲突等,那么我就须要在确保那一行数据一致的情况下暂时的跳过这个错误,那就须要使用SQL_SLAVE_SKIP_COUNTER = n命令了,n是表示跳过后面的n个事件,比方我跳过一个事件的操作例如以下:
STOP SLAVE;
SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;
START SLAVE;
6. 从指定位置又一次同步
有的时候主从同步有问题了以后,须要从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主从同步的管理经验介绍
1. 不要乱使用SQL_SLAVE_SKIP_COUNTER命令。
这个命令跳过之后非常可能会导致你的主从数据不一致。一定要先将指定的错误记录下来。然后再去检查数据是否一致,尤其是核心的业务数据。
2. 结合percona-toolkit工具pt-table-checksum定期查看数据是否一致。
这个是DBA必需要定期做的事情。呵呵,有合适的工具何乐而不为呢?另外percona-toolkit还提供了对数据库不一致的解决方式,能够採用pt-table-sync。这个工具不会更改主的数据。
还能够使用pt-heartbeat来查看从server的复制落后情况。详细的请查看:http://blog.chinaunix.net/uid-20639775-id-3229211.html。
3. 使用replicate-wild-ignore-table选项而不要使用replicate-do-db或者replicate-ignore-db。
原因已经在上面做了说明。
4. 将主server的日志模式调整成mixed。
5. 每一个表都加上主键,主键对数据库的同步会有影响尤其是居于ROW复制模式。