一剑飞虹

道可道非常道,名可名非常名
  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

mysql主从同步操作,及队列设计

Posted on 2012-02-25 12:28  greatqn  阅读(798)  评论(0编辑  收藏  举报

1.mysql主从同步操作
参考搜索文章:
http://7056824.blog.51cto.com/69854/400642
http://lymrg.blog.51cto.com/1551327/696132
http://tech.it168.com/a2009/0526/577/000000577322.shtml
http://www.aslibra.com/blog/read.php?1038
http://www.cnblogs.com/yuanermen/archive/2010/08/11/1797206.html
http://www.linux521.com/2009/database/200901/170.html
http://www.xuephp.com/main/detail.php?type=database&cid=16894


主库:
1> my.cnf
log-bin=master-bin 二进制文件的名字,开启二进制日志
log-bin-index=master-bin.index 正在使用的二进制文件的索引目录
binlog-format=maxed
server-id=1

binlog-do-db = yourdb 需要备份的数据库名,如果备份多个数据库,重复设置这个选项即可(据说是危险的)
binlog-ignore-db = mysql 不需要备份的数据库苦命,如果备份多个数据库,重复设置这个选项即可

2> server mysqld restart
3> 检测修改是否有效
mysql>show master status; 不应为空
mysql>show variables like 'log_bin'; 不应为NO
mysql>reset master; (清除日志文件)
mysql>show master logs;
4> 添加同步用户
mysql>GRANT REPLICATION CLIENT,REPLICATION SLAVE ON *.* TO repl@'192.168.1.%' IDENTIFIED BY 'passwd';
mysql>FLUSH PRIVILEGES;
5> 上锁
mysql> FLUSH TABLES WITH READ LOCK;
6> 同步现有的数据库
tar -zcvf /tmp/mysql-yourdb.tar.gz ./yourdb
scp mysql-yourdb.tar.gz root@192.168.1.103:/tmp/mysql-yourdb.tar.gz
7> 解锁
mysql> show master status;
mysql-bin.000002 |      106 |
记录该值。以后设置从服务器时需要使用这些值。
它们表示复制坐标,从服务器应从该点开始从主服务器上进行新的更新。
mysql> unlock tables;

从库:
1> 复制原库数据
service mysqld stop
tar -zxvf mysql-yourdb.tar.gz 注意解开之后的目录权限.
2> my.cnf
server-id=2
3> 测试主库连接
mysql -urepl -h 192.168.1.105 -P 3306 -ppasswd
不通时检查网络,端口.(iptables)
3> 启动从库
mysql>change master to
master_host='192.168.1.105',
master_user='repl',
master_password='passwd',
master_port=3306,
master_log_file='mysql-bin.000002',
master_log_pos=106,
master_connect_retry=30;
4> 启动复制进程
mysql> START SLAVE;
5> 检查状态
mysql> show slave status \G;
上面出现: Slave_IO_Running: Yes 和 Slave_SQL_Running: Yes 表示复制正常

2.同步过程
http://www.diybl.com/course/6_system/linux/Linuxjs/2008108/149090.html
客户端--D->主库sql--A->主库binlog--B->从库relay-log--C->从库sql.
如果从库也开启binlog,则还可以继续级联同步下去.
mysql的同步过程是异步的,从库可以在任意时间开启,继续之前的同步.日志队列可以保证不会错过一条语句.
从库在线时,这个异步过程还是相当的快的.因为主库有更新时,会通知从库来取日志,而不是从库定时刷新主库.
A应该是原子性的,B,C的操作使数据达到最终一致性.
B,C出错时,同步过程会停止,等待人工干预.
D,C执行的是一样的语句.为了达到分布式执行的效果,mysql在主从两台机器上都写了日志文件.
简化,独立了B的操作,B只要完成binlog到relay-log的过程就好了.

3.队列设计
1> 日志文件单向增长
log-bin-index 日志文件索引
mysql-bin.000002 某日志文件
pos 坐标
从库按参数 master_log_file='mysql-bin.000002',master_log_pos=106, 来定位从队列的哪个位置开始读取数据.
对relay-log也是一样的定位.
3> 日志清理
http://www.jzxue.com/shujuku/mysql/201102/22-6298.html