您的位置:首页 > 数据库 > MySQL

MySQL复制解决方案(Replication Solutions)

2010-12-10 23:03 1536 查看

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:

  • Master1作为最主要的master,所有的变更全部由它来写入数据库,二进制日志功能必须开启
  • Master2是Master1的一个slave,Master2也必须开启二进制日志功能,和--log-slave-updates,这样来自于的Master1的复制指令在Master2中同样被写入了二进制日志,从而可以通过Master2复制给其它Slaves
  • Slave1,Slave2,Slave3,都是Master2的Slave

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)----暂略

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息