MySQL的Replication是一种多个MySQL的数据库做主从同步的方案,特点是异步,广泛用在各种对MySQL有更高性能,更高可靠性要求的场合。
Replication原理
Mysql 的 Replication 是一个异步的复制过程,从一个MySQL节点(称之为Master)复制到另一个MySQL节点(称之Slave)。在 Master 与 Slave 之间的实现整个复制过程主要由三个线程来完成,其中两个线程(SQL 线程和 I/O 线程)在 Slave 端,另外一个线程(I/O 线程)在 Master 端。
要实现 MySQL 的 Replication ,首先必须打开 Master 端的 Binary Log,因为整个复制过程实际上就是 Slave 从 Master 端获取该日志然后再在自己身上完全顺序的执行日志中所记录的各种操作。
看上去MySQL的Replication原理非常简单,总结一下:
* 每个从仅可以设置一个主。
* 主在执行sql之后,记录二进制log文件(bin-log)。
* 从连接主,并从主获取binlog,存于本地relay-log,并从上次记住的位置起执行sql,一旦遇到错误则停止同步。
从这几条Replication原理来看,可以有这些推论:
* 主从间的数据库不是实时同步,就算网络连接正常,也存在瞬间,主从数据不一致。
* 如果主从的网络断开,从会在网络正常后,批量同步。
* 如果对从进行修改数据,那么很可能从在执行主的bin-log时出现错误而停止同步,这个是很危险的操作。所以一般情况下,非常小心的修改从上的数据。
* 一个衍生的配置是双主,互为主从配置,只要双方的修改不冲突,可以工作良好。
* 如果需要多主的话,可以用环形配置,这样任意一个节点的修改都可以同步到所有节点。
主从设置
假设分别在192.168.0.1、192.168.0.2上安装mysql,并将192.168.0.1作为主数据库。
首先在master上,为slave创建一个用户:
GRANT REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'slave'@'192.168.0.1' IDENTIFIED BY 'mysql';
修改master的my.cnf或者my.ini文件,在[mysqld]这一节下面增加:
server-id=1 log-bin=master-bin log-bin-index=master-bin.index
重启mysql服务,使用:SHOW MASTER STATUS 命令查看二进制日志的状态,并注意Position的值,在配置从数据库的时候会使用到。
File Position Binlog_Do_DB Binlog_Ignore_DB
----------------- -------- ------------ ------------------
master-bin.000001 2794
修改slave的my.cnf或者my.ini文件,在[mysqld]这一节下面增加:
server-id=2 relay-log-index=slave-relay-bin.index relay-log=slave-relay-bin
注意server-id不能重复。重启服务后,在slave执行如下命令:
CHANGE MASTER TO MASTER_HOST='192.168.0.52',MASTER_PORT=3306,MASTER_USER='repl', MASTER_PASSWORD='mysql',MASTER_LOG_FILE='master-bin.000001', MASTER_LOG_POS=1840;
其中 MASTER_LOG_POS 就是master二进制日志中的position的值。最后在slave执行命令:START SLAVE;
配置结束,现在可以再master修改数据,获取添加表等,slave检测到二进制日志改变后进行异步复制。