• 极客文库-知识库上线!
  • 极客文库小编@勤劳的小蚂蚁,为您推荐每日资讯,欢迎关注!
  • 每日更新优质编程文章!
  • 更多功能模块开发中。。。

MySQL 主从复制与读写分离概念及架构分析

MySQL主从复制入门
首先,我们看一个图:
影响 MySQL-A 数据库的操作,在数据库执行后,都会写入本地的日志系统 A 中。

假设,实时的将变化了的日志系统中的数据库事件操作,在 MYSQL-A 的 3306 端口,通过网络发给 MYSQL-B。

MYSQL-B 收到后,写入本地日志系统 B,然后一条条的将数据库事件在数据库中完成。那么,MYSQL-A 的变化,MYSQL-B 也会变化,这样就是所谓的 MYSQL 的复制,即 MYSQL replication。

在上面的模型中,MYSQL-A 就是主服务器,即 master,MYSQL-B 就是从服务器,即 slave。

日志系统 A,其实它是 MYSQL 的日志类型中的二进制日志,也就是专门用来保存修改数据库表的所有动作,即 bin log。【注意 MYSQL 会在执行语句之后,释放锁之前,写入二进制日志,确保事务安全】

日志系统 B,并不是二进制日志,由于它是从 MYSQL-A 的二进制日志复制过来的,并不是自己的数据库变化产生的,有点接力的感觉,称为中继日志,即 relay log。

可以发现,通过上面的机制,可以保证 MYSQL-A 和 MYSQL-B 的数据库数据一致,但是时间上肯定有延迟,即 MYSQL-B 的数据是滞后的。

即便不考虑什么网络的因素,MYSQL-A 的数据库操作是可以并发的执行的,但是 MYSQL-B 只能从 relay log 中读一条,执行下。因此 MYSQL-A 的写操作很频繁,MYSQL-B 很可能跟不上。

主从复制的几种方式
同步复制
所谓的同步复制,意思是 master 的变化,必须等待 slave-1,slave-2,…,slave-n 完成后才能返回。

这样,显然不可取,也不是 MYSQL 复制的默认设置。比如,在 WEB 前端页面上,用户增加了条记录,需要等待很长时间。

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

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

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

问题 2:主从复制中,可以有 N 个 slave,可是这些 slave 又不能进行写操作,要他们干嘛?
可以实现数据备份。类似于高可用的功能,一旦 master 挂了,可以让 slave 顶上去,同时 slave 提升为 master。

异地容灾,比如 master 在北京,地震挂了,那么在上海的 slave 还可以继续。主要用于实现 scale out,分担负载,可以将读的任务分散到 slaves 上。

【很可能的情况是,一个系统的读操作远远多于写操作,因此写操作发向 master,读操作发向 slaves 进行操作】

问题 3:主从复制中有 master,slave1,slave2,…等等这么多 MYSQL 数据库,那比如一个 JAVA WEB 应用到底应该连接哪个数据库?
当然,我们在应用程序中可以这样,insert/delete/update 这些更新数据库的操作,用 connection(for master)进行操作,select 用 connection(for slaves)进行操作。那我们的应用程序还要完成怎么从 slaves 选择一个来执行 select,例如简单的轮循算法。

这样的话,相当于应用程序完成了 SQL 语句的路由,而且与 MYSQL 的主从复制架构非常关联,一旦 master 挂了,某些 slave 挂了,那么应用程序就要修改了。能不能让应用程序与 MYSQL 的主从复制架构没有什么太多关系呢?可以看下面的图:
找一个组件,application program 只需要与它打交道,用它来完成 MYSQL 的代理,实现 SQL 语句的路由。

mysql proxy 并不负责,怎么从众多的 slaves 挑一个?可以交给另一个组件(比如 haproxy)来完成。这就是所谓的 MYSQL READ WRITE SPLITE,MYSQL 的读写分离。

问题 4:如果 mysql proxy , direct , master 他们中的某些挂了怎么办?
总统一般都会弄个副总统,以防不测。同样的,可以给这些关键的节点来个备份。

问题 5:当 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 的复制线程的负担,转移到自己的身上。这就是所谓的多级复制的概念。

问题 6:当一个 select 发往 mysql proxy,可能这次由 slave-2 响应,下次由 slave-3 响应,这样的话,就无法利用查询缓存了。
应该找一个共享式的缓存,比如 memcache 来解决。将 slave-2,slave-3,…这些查询的结果都缓存至 mamcache 中。

问题 7:随着应用的日益增长,读操作很多,我们可以扩展 slave,但是如果 master 满足不了写操作了,怎么办呢?

scale on ?更好的服务器? 没有最好的,只有更好的,太贵了。。。
scale out ? 主从复制架构已经满足不了。
可以分库【垂直拆分】,分表【水平拆分】。


丨极客文库, 版权所有丨如未注明 , 均为原创丨
本网站采用知识共享署名-非商业性使用-相同方式共享 3.0 中国大陆许可协议进行授权
转载请注明原文链接:MySQL 主从复制与读写分离概念及架构分析
喜欢 (0)
[247507792@qq.com]
分享 (0)
勤劳的小蚂蚁
关于作者:
温馨提示:本文来源于网络,转载文章皆标明了出处,如果您发现侵权文章,请及时向站长反馈删除。

欢迎 注册账号 登录 发表评论!

  • 精品技术教程
  • 编程资源分享
  • 问答交流社区
  • 极客文库知识库

客服QQ

247507792

工作时间:09:00-23:00

新浪微博:点我访问

个人博客:点我访问