| 操作系统 | ip | Mysql版本 |
主机(master) | debian 6 | 192.168.33.196 | 5.1.49 |
从机(slave) | centos 6.2 | 172.22.22.219 | 5.1.67 |
1. 原理
将Mysql的数据分布到多个系统上去,这种分布的机制,是通过将Mysql的某一台主机的数据复制到其它主机(slaves)上,并重新执行一遍来实现的。复制过程中一个服务器充当主服务器,而一个或多个其它服务器充当从服务器。主服务器将更新写入二进制日志文件,并维护文件的一个索引以跟踪日志循环。这些日志可以记录发送到从服务器的更新。当一个从服务器连接主服务器时,它通知主服务器从服务器在日志中读取的最后一次成功更新的位置。从服务器接收从那时起发生的任何更新,然后封锁并等待主服务器通知新的更新。
整体上来说,复制有3个步骤:
(1) master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary
log events);
(2) slave将master的binary log events拷贝到它的中继日志(relay log);
(3) slave重做中继日志中的事件,将改变反映它自己的数据。
该过程的第一部分就是master记录二进制日志。在每个事务更新数据完成之前,master在二日志记录这些改变。MySQL将事务串行的写入二进制日志,即使事务中的语句都是交叉执行的。在事件写入二进制日志完成后,master通知存储引擎提交事务。
下一步就是slave将master的binary log拷贝到它自己的中继日志。首先,slave开始一个工作线程——I/O线程。I/O线程在master上打开一个普通的连接,然后开始binlog dump process。Binlog dump process从master的二进制日志中读取事件,如果已经跟上master,它会睡眠并等待master产生新的事件。I/O线程将这些事件写入中继日志。
SQL slave thread(SQL从线程)处理该过程的最后一步。SQL线程从中继日志读取事件,并重放其中的事件而更新slave的数据,使其与master中的数据一致。只要该线程与I/O线程保持一致,中继日志通常会位于OS的缓存中,所以中继日志的开销很小。
此外,在master中也有一个工作线程:和其它MySQL的连接一样,slave在master中打开一个连接也会使得master开始一个线程。复制过程有一个很重要的限制——复制在slave上是串行化的,也就是说master上的并行更新操作不能在slave上并行操作。
(1)主机配置
A. 知道数据库的my.cnf文件,一般这个文件在/etc/mysql下或者直接就在/etc目录下。比如centos就在/etc目录下
B. 用编辑器打开,在[mysqld]项目下加入以下行
server-id = 1
log-bin=mysql-bin
binlog-do-db=mysql1 #需要备份的数据库名,如果备份多个数据库,重复设置这个选项 即可
binlog-ignore-db=mysql2 #不需要备份的数据库名,如果备份多个数据库,重复设置这 个选项即可
log-slave-updates=1 #这个参数一定要加上,否则不会给更新的记录些到二进制文件 里
slave-skip-errors=1 #是跳过错误,继续执行复制操作(可选)
然后保存退出。
C. 进入数据库建立从机用户
mysql> grant replication slave on *.* to haitao@172.22.22.219 identified by 'pht';
此时,你可在Slave上做连接测试: mysql -h 主机ip -u haitao -p,如果输入密码”pht”后能够进入则表示用户已经创建成功。如果登陆后能看到的数据库跟主机的不一样,那么可能是用户权限不够,最简单的办法是在mysql的管理平台phpmyadmin里把mysql库里的user表haitao相应的各个权限按需更改N为Y即可。现在重启下Mysql吧,以确保更改的配置生效。
D.锁定主库表 mysql> FLUSH TABLES WITH READ LOCK;
E.查看主库信息 mysql> SHOW MASTER STATUS;
正常情况效果应该如下(前两列数据不一定与下表相同)
------------- +- ---------+------------------+---------------------+
| File | Position | Binlog_do_db | Binlog_ignore_db |
+------------------+----------+--------------+------------------+---------+
| mysql-bin.000001 | 107 | mysql1 | mysql2 |
+------------------+----------+--------------+------------------+---------+
F.将主库的现有数据拷贝到从库下,这是为了保证时间点之前的数据完全一致,且由于我们之前已经锁定表,所以也能保证不再配置过程中发生数据丢失或者冲突。复制用简单是scp即可。
引用别人说的,如下截图,说得更清楚些。
好啦,master端配置告一段落。
(2)从机配置
A. 打开从机配置my.cnf,在[mysqld]下加入如下行并保存
server-id=2
log-bin=mysql-bin
master-host=192.168.33.196
master-user=haitao
master-password=pht
replicate-ignore-db=mysql
master-connect-retry=60
log-slave-updates=1
B. 重启mysql确保配置生效
C.进入mysql,然后关闭slave: mysql>stop slave;
D.配置记录点以及主机的log文件
Mysql>CHANGE MASTER TO
MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=107;
E. 打开slave: mysql>start slave;
并查看slave状态 mysql> SHOW SLAVE STATUS\G
在这里主要是看:
Slave_IO_Running=Yes
Slave_SQL_Running=Yes
你可查看master和slave上线程的状态。在master上,你可以看到slave的I/O线程创建的连接:在master上输入show processlist\G;
到目前为止已经完成了配置,你可以在主库中添加删除数据,看看从库是不是跟着发生变化了呢。
本文多段文字引自下文:http://blog.youkuaiyun.com/hguisu/article/details/7325124