数据库实战(四)数据库主从复制

来源:互联网 发布:中国股市现状 知乎 编辑:程序博客网 时间:2024/06/05 13:22

数据复制原理

Master将改变记录到二进制日志(binary log)中,Slave将Master的二进制日志文件拷贝到它的中继日志(relay log),Slave重做中继日志(relay log)中的事件。那么,Master的变化,Slave也会变化,这样就是所谓的MYSQL的复制,即MYSQL replication。

值得注意的是,通过上面的机制,可以保证Master和Slave的数据库数据一致,但是时间上肯定有延迟,即Slave的数据是滞后的。

主从复制方式

同步复制

同步复制,即master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回。这样,显然不可取,也不是MYSQL复制的默认设置。比如,在WEB前端页面上,用户增加了条记录,需要等待很长时间。

异步复制

异步复制,master只需要完成自己的数据库操作即可。至于slaves是否收到二进制日志,是否完成操作,不用关心。MYSQL的默认设置。

半同步复制

半同步复制,master只保证slaves中的一个操作成功,就返回,其他slave不管。这个功能,是由google为MYSQL引入的。

主从复制分析

  1. 问题1:master的写操作,slave被动的进行一样的操作,保持数据一致性,那么slave是否可以主动的进行写操作?
    答:假设slave可以主动的进行写操作,slave又无法通知master,这样就导致了master和slave数据不一致了。因此slave不应该进行写操作,至少是slave上涉及到复制的数据库不可以写。实际上,这里已经揭示了读写分离的概念。

  2. 问题2:主从复制中,可以有N个slave,slave的作用?
    答:一方面,进行数据备份,防止单点故障,保证高可用性。另一方面,分担负载,提高查询性能。

  3. 问题3:主从复制中有master,slave1,slave2,…等等这么多MYSQL数据库,那比如一个JAVA WEB应用到底应该连接哪个数据库?
    答:一般,insert/delete/update这些更新数据库的操作,用master进行操作,select用slave进行操作。或者,找一个组件用它来完成MYSQL的代理,实现SQL语句的路由。这就是所谓的MYSQL READ WRITE SPLITE,MYSQL的读写分离。

  4. 问题4:当master的二进制日志每产生一个事件,都需要发往slave,如果我们有N个slave,那是发N次,还是只发一次?
    答:如果只发一次,发给了slave-1,那slave-2,slave-3,…它们怎么办?显然,应该发N次。实际上,在MYSQL master内部,维护N个线程,每一个线程负责将二进制日志文件发往对应的slave。master既要负责写操作,还的维护N个线程,负担会很重。可以这样,slave-1是master的从,slave-1又是slave-2,slave-3,…的主,同时slave-1不再负责select。 slave-1将master的复制线程的负担,转移到自己的身上。这就是所谓的多级复制的概念。


0 0
原创粉丝点击