MySQL复制可被用在许多不同的环境,和用于不同的目的.
1.用于备份
1.1 使用mysqldump备份Slave
为了保证数据的完整性,在备份之前需要暂时停止slave的复制使用:
shell>mysqladmin stop-slave
或只是暂时停止处理中继日志(relay log),通过:
shell>mysql -e 'STOP SLAVE SQL_THREAD;'
这样的话,slave会继续接收数据从master,并将这些数据存储在中继日志中,但阻止了slave执行和修改这些数据,在比较繁忙的时候允许I/O线程继续工作,会加快重新启动slave时的速度.
接下来通过:
shell>mysqldump --all-databases >fulldb.dump 来备份所有数据库
最后重启slave:
shell>mysqladmin start-slave
1.2 直接备份源数据(Raw Data)
1.3 通过将Master或Slave变成只读来进行备份
2. 通过复制来修改存储引擎 -- 比较简单,不必多说
3. 通过复制来实现扩展(Scale-Out)
因为复制工作是分布式的,所以当需要大量的读操作,少量写或更新操作的时候,使用复制实现扩展会工作的很好.如下图显示了通过复制来提高性能的方案:
4.将不同的数据库复制到不同的Slaves
为了实现这种分离,只需要在每一个slave上,通过--replicate-wild-do-table来过滤掉不需要的语句就可以了.
5.提高复制性能
当多个slaves全部连接到一个Master上时,无形之间就增加了Master的负荷,并且每个slave都要接到一份对Master二进制日志的全拷贝,因此随着网络负荷的增加,新的瓶颈也就随着出现了. 如何解决呢? 一种提高性能的办法就是提供深一层的复制架构,让master只服务于一个slave,然后其它的slaves都连接到上个基本的slave来满足它们各自的复制需求.如图:
为了实现上面的架构,需要如此配置MySQL:
6. 故障期间切换Masters
上图中,MySQL Master处理的是Master数据库,MySQL Slaves都是复制用的Slave,每个Web Client处理数据库的读写问题.每个Slave都开启:--log-bin,而不开启:--log-slave-updates,这样从master收到的事件就不会记录在slave的二进制日志中了.而每个slave只是被初始化为空. 如果由于某些原因,MySQL Master变得不可用了,我们就可以拿出其中一个Slave变成新的Master.例如:用Slave1来替换Master,然后将所有的Web Clients重定向到Slave1,Slave1将会记录所有的更新到二进制日志,Slave2,Slave3从Slave1开始复制. 为了确保每个Slave已经完全处理完了它们的中继日志,在每个Slave上,可以先运行:
STOP SLAVE IO_THREAD,然后查看
SHOW PROCESSLIST,直到显示:Has read all relay log
因为Slave1已经被提升为Master,所以需要:STOP SLAVE 和 RESET MASTER.
其它Slaves需要,STOP SLAVE,然后通过CHANGE MASTER TO,来指向现在的新Master. 参考下图:
7. 使用SSL创建复制
为了使用SSL加密传输的数据,首先必须设置Master支持SSL网络连接,同是创建合适的证书,加到Master的配置中的mysqld部分:
ssl-ca=cacert.pem 证书颁发机构(CA)证书
ssl-cert=server-cert.pem 服务器公有钥匙,用于发送到客户端,并验证其所持有的CA证书
ssl-key=server-key.pem 服务器的私有钥匙
在Slave上有两种方法可以设置SSL,一是在slave的配置文件中的[client]部分加上前面的如Master一样的ssl选项,二是使用CHANGE MASTER TO 进行配置.
如果需要强制要求每个Slave必须使用SSL进行连接,那么可以在创建复制用户时加上:REQUEST SSL选项,如:
mysql>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%.mydomain.com' IDENTIFIED BY 'pass' REQUEST SSL;
8. 半同步复制(MySQL>=5.5)----暂略