mysql读写分离和主从复制的基本原理

原创 2016年07月23日 12:20:41

mysql的读写分离的基本原理是:让master(主数据库)来响应事务性操作,让slave(从数据库)来响应select非事务性操作,然后再采用主从复制来把master上的事务性操作同步到slave数据库中。



主从复制只要还是使用log_bin日志来实现主从复制,也可做增量备份


显示binlog二进制日志的柱表,一般都是position 106开始的。可以使用mysql的mysqlbinlog命令查看


报错的原因是my.cnf中配置了default-character-ser=utf8,可以使用参数--no-defaluts参数来解决



从中可以看到,所有的对表的操作都会记录下来。


首先我们先进行一次数据库备份,在备份的时候加上参数-F表示备份后产生一个新的bin-log日志来记录备份后的操作


参数中-l表示加读锁,等备份完成后自动解锁 

然后进行一些mysql的操作例如表中插入数据都会记录到bin-log日志中,例如误删除了表等。


我们需要恢复之前备份的数据,然后数据库备份后数据只能通过bin-log日志来恢复这些操作。


这里的-v参数会记录恢复的详细信息,-f表示当遇到错误时,可以跳过去,继续执行下面的语句。

数据库恢复后,备份数据后的操作不能恢复,这就需要bin-log日志恢复了

执行语句 mysqlbinlog --no-defaults mysql.bin.000003 | mysql -uroot -p 密码

如果从bin-log日志中恢复误操作的语句,可以使用设置恢复position的位置区间来精确定位 --start-position="459" --stop-position="561",也可根据时间点来恢复

可通过查看binlog日志中内容来确定要恢复的position区间



《MySQL Proxy learns R/W Splitting》中详细的介绍了这种技巧以及连接池问题:

  为了实现读写分离我们需要连接池。我们仅在已打开了到一个后端的一条经过认证的连接的情况下,才切换到该后端。MySQL协议首先进行握手。当进入到查询/返回结果的阶段再认证新连接就太晚了。我们必须保证拥有足够的打开的连接才能保持运作正常。
实现读写分离的LUA脚本: 
  -- 读写分离 
  -- 
  -- 发送所有的非事务性Select到一个从数据库 

if is_in_transaction == 0 and 
  packet:byte() == proxy.COM_QUERY and 
  packet:sub(2, 7) == "SELECT" then 
  local max_conns = -1 
  local max_conns_ndx = 0 
  for i = 1, #proxy.servers do 
  local s = proxy.servers[i] 
  -- 需要选择一个拥有空闲连接的从数据库 
  if s.type == proxy.BACKEND_TYPE_RO and 
  s.idling_connections > 0 then 
  if max_conns == -1 or 
  s.connected_clients < max_conns then 
  max_conns = s.connected_clients 
  max_conns_ndx = i 
  end 
  end 
  end 
  -- 至此,我们找到了一个拥有空闲连接的从数据库 
  if max_conns_ndx > 0 then 
  proxy.connection.backend_ndx = max_conns_ndx 
  end 
  else 
  -- 发送到主数据库 
  end 
  return proxy.PROXY_SEND_QUERY 
注释:此技巧还可以用来实现其他的数据分布策略,例如分片(Sharding)。


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

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

构建高性能web之路------mysql读写分离实战

一个完整的mysql读写分离环境包括以下几个部分:应用程序clientdatabase proxydatabase集群在本次实战中,应用程序client基于c3p0连接后端的database prox...
  • cutesource
  • cutesource
  • 2010年07月03日 12:05
  • 100069

mysql 主从复制和读写分离的应用层实现

前期项目上用到了mysql的主从复制和读写分离功能,实现的方式有两种,分别是应用层实现和中间插件实现,前期使用中间件(变形虫插件)实现了数据库的主从复制和读写分离,具体实现参考这篇博文,博文地址htt...
  • seudongnan
  • seudongnan
  • 2017年03月01日 10:43
  • 2160

MySQL读写分离原理图

注意:图中的mysqlproxy有一些提到方案,如:Amoeba等等.
  • u010689306
  • u010689306
  • 2016年06月14日 23:03
  • 1640

Mysql一主多从和读写分离配置简记

近期开发的系统中使用MySql作为数据库,由于数据涉及到Money,所以不得不慎重。同时,用户对最大访问量也提出了要求。为了避免Mysql成为性能瓶颈并具备很好的容错能力,特此实现主从热备和读写分离。...
  • chenjie19891104
  • chenjie19891104
  • 2012年05月30日 16:44
  • 35558

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

1.MySQL主从复制入门 首先,我们看一个图: 影响MySQL-A数据库的操作,在数据库执行后,都会写入本地的日志系统A中。 假设,实时的将变化了的日志系统中的数据库事件操作,在MYSQ...
  • boonya
  • boonya
  • 2016年05月31日 15:09
  • 2043

mysql读写分离原理是什么

假设我现在有一个WEB程序,有两个mysql数据库服务器,就叫A,B吧,A主,B从,如何实现读写分离? 1,在读写这两个操作中,web程序在写的时候就找A,读的时候找B,还是web程序发一样的指令,...
  • killSamaritan
  • killSamaritan
  • 2016年12月13日 22:35
  • 194

高性能web 架构之 mysql 读写分离

高性能web架构主要保证程序的高可用性和高并发性. 高可用就是 保证程序在99.99%的情况下可以使用,不会因为单机节点故障整体崩溃.  高并发说到底也是为了高可用服务.保证在大量...
  • a379936197
  • a379936197
  • 2016年02月26日 16:27
  • 1421

Mysql读写分离实现的三种方式

1 程序修改mysql操作类 可以参考PHP实现的Mysql读写分离,阿权开始的本项目,以php程序解决此需求。 优点:直接和数据库通信,简单快捷的读写分离和随机的方式实现的负载均衡,权限独立分配...
  • anzhen0429
  • anzhen0429
  • 2017年08月09日 19:53
  • 1239

【mysql 读写分离】10分钟了解读写分离的作用

1、what 读写分离 读写分离,基本的原理是让主数据库处理事务性增、改、删操作(INSERT、UPDATE、DELETE),而从数据库处理SELECT查询操作。数据库复制被用来把事务性操作...
  • u013421629
  • u013421629
  • 2017年12月13日 17:04
  • 425
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:mysql读写分离和主从复制的基本原理
举报原因:
原因补充:

(最多只允许输入30个字)