关闭

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

411人阅读 评论(1) 收藏 举报
分类:

1.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很可能跟不上。


2.主从复制的几种方式


同步复制

所谓的同步复制,意思是master的变化,必须等待slave-1,slave-2,...,slave-n完成后才能返回。

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

异步复制

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

半同步复制

master只保证slaves中的一个操作成功,就返回,其他slave不管。

这个功能,是由google为MYSQL引入的。

 

3.主从复制分析

问题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的主从复制架构没有什么太多关系呢?可以看下面的图:

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 ? 主从复制架构已经满足不了。

可以分库【垂直拆分】,分表【水平拆分】。

1
0
查看评论

thinkphp框架实现mysql读写分离

基于thinkphp3.2.3,官方手册:http://www.kancloud.cn/manual/thinkphp/1733 注意事项: 1、首先得配置好mysql主从,可以多主多从 2、在读写分离的情况下,默认第一个数据库配置是主服务器的配置信息,负责写入数据,如果设置了DB_MASTER_N...
  • nuli888
  • nuli888
  • 2016-08-03 20:33
  • 3593

thinkphp mysql 读写分离

ThinkPHP提供了完善的读写分离功能,不需要手动切换数据库。什么时候读,什么时候写系统会自动判断。读数据时系统会操作从服务器,而写数据时系统会操作主服务器。最终由数据库实现同步,这就是一个最典型的数据库读写分离,下以将配置好的两台主从数据库为例,详细介绍实现读写分离。 首先打开项目下的数据...
  • weixin_29778143
  • weixin_29778143
  • 2017-04-17 18:42
  • 521

读写分离的作用

1第一种解释 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作导致的变更同步到集群中的从数据库。 2第二种解释: 数据库读写分离和数据一致性的冲突 读写...
  • Ideality_hunter
  • Ideality_hunter
  • 2016-12-04 11:47
  • 3958

使用Spring实现读写分离( MySQL实现主从复制)

1.  背景 我们一般应用对数据库而言都是“读多写少”,也就说对数据库读取数据的压力比较大,有一个思路就是说采用数据库集群的方案, 其中一个是主库,负责写入数据,我们称之为:写库; 其它都是从库,负责读取数据,我们称之为:读库;   那么,对我们的要求是: 1、读库和写...
  • jack85986370
  • jack85986370
  • 2016-06-01 21:32
  • 25852

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

1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中。 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-A的3306端口,通过网络发给MYSQL-B。 MYSQL-B收到后,写入本地日志系统B,然后一...
  • boonya
  • boonya
  • 2016-05-31 15:09
  • 2040

MySQL主从复制与读写分离的实现

MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求...
  • ccrrt
  • ccrrt
  • 2013-01-17 18:20
  • 23901

Mysql的主从复制与读写分离

Mysql的主从复制实践 1.两台MySQL服务器                                    ...
  • he90227
  • he90227
  • 2015-05-15 17:59
  • 1411

数据库读写分离和负载均衡策略

最近在学习数据库的读写分离和主从复制,采用的是一主多从策略,采用轮询的方式,读取从数据库的内容。但是,假如某一台从数据库宕机了,而客户端不知道,每次轮选到此从数据库,不都要报错?到网上查阅了资料,找到一篇不错的博文,不仅讲了解决方案,也详细的讲述了数据库的分区,分表,集群和负载均衡策略,博文原址ht...
  • seudongnan
  • seudongnan
  • 2017-02-26 11:26
  • 3650

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

MySQL 主从复制与读写分离概念及架构分析 1.MySQL主从复制入门 首先,我们看一个图:     影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQL-...
  • qq_26386171
  • qq_26386171
  • 2017-05-27 10:36
  • 520

Mysql“集群”和”主从“两者的区别

之前一直用oracle数据库,而且只是用,没有关心过数据库的架构,现在的项目使用mysql数据库,而且要自己设计数据存储架构。所以研究了一下mysql的集群(cluster)和主从(master/slave)这两个概念。两者非常容易混淆,特别是对于菜鸟来讲。 Mysql cluster: share...
  • wutian713
  • wutian713
  • 2016-02-17 19:49
  • 5393
    个人资料
    • 访问:181958次
    • 积分:2722
    • 等级:
    • 排名:第15653名
    • 原创:61篇
    • 转载:112篇
    • 译文:3篇
    • 评论:24条
    最新评论