使用MySQL Proxy解决MySQL主从同步延迟
MySQL的主从同步机制非常方便的解决了高并发读 的应用需求,给Web方面开发带来了极大的便利。但这种方式有个比较大的缺陷在于MySQL的同步机制是依赖Slave主动向Master发请求来获取数 据的,而且由于服务器负载、网络拥堵等方面的原因,Master与Slave 之间的数据同步延迟是完全没有保证的。短在1秒内,长则几秒、几十秒甚至更长都有可能。由于数据延迟问题的存在,当应用程序在Master 上进行数据更新,然后又立刻需要从数据库中读取数据时,这时候如果应用程序从Slave上取数据(这也是当前Web开发的常规做法),就可能出现读取不到期望的数据,造成程序运行异常。
解决这个问题有多种方式,比如最简单的在所有的insert和update之后,强制sleep几秒钟。这是非常粗鲁的方式,对于更新操作不是很高的中小型系统,此方式基本能解决问题。
另外一种方式是应用程序把被更新的数据保存在本机的内存(或者集中式缓存)中,如果在写入数据完成后需要直接读取数据,则从本机内存中读取。这种方式的缺点是极大的增加了应用程序的复杂度,而且可靠性并不能完全得到保障。
使用MySQL Proxy可以很方便的解决这个问题。MySQL Proxy是基于MySQL Client 和 MySQL Server之间的代理程序,能够完成对Client所发请求的监控、修改。从Client角度看,通过Proxy访问Server和直接访问 Server没有任何区别。对于既有的程序而言,只要把直接被访问的Server的IP地址和端口号换成Proxy的IP地址和端口号就可以。
MySQL Proxy的工作原理也较简单。在Proxy启动时可以指定Proxy所需要使用的lua脚本,在lua脚本中预先实现6个方法:
* connect_server() // 接收到Client的连接请求时调用
* read_handshake() //
* read_auth() // 读取Client的认证信息时调用
* read_auth_result() // 读取认证结果时调用
* read_query() // 读取Client的query请求时调用
* read_query_result() //读取query结果时调用
当 Proxy接收到Client请求时,在请求的不同的阶段会调用上面的不同方法。这样Proxy使用者就可以根据自己的业务需求,自由的实现这6个方法达到目的。
通过在read_query()中加入代码,我们可以截取出当前的请求是insert、update还是select,然后把 insert和update请求发送到Master中,把select请求发送到Slave中,这样就解决了读写分离的问题。
在解决了读写分离后,如何解决同步延迟呢?
方法是在Master上增加一个自增表,这个表仅含有1个的字段。当Master接收到任何数据更新的请求时,均会触发这个触发器,该触发器更新自增表中的记录。如下图所示:
mysql_proxy_write
由于Count_table也参与Mysq的主从同步,因此在Master上作的 Update更新也会同步到Slave上。当Client通过Proxy进行数据读取时,Proxy可以先向Master和Slave的 Count_table表发送查询请求,当二者的数据相同时,Proxy可以认定 Master和Slave的数据状态是一致的,然后把select请求发送到Slave服务器上,否则就发送到Master上。如下图所示:
mysql_proxy_read
通过这种方式,就可以比较完美的结果MySQL的同步延迟不可控问题。之所以所“比较完美”,是因为这种方案double了查询请求,对Master和 Slave构成了额外的压力。不过由于Proxy与真实的Mysql Server采用连接池的方式连接,因此额外的压力还是可以接受的
http://m.blog.csdn.net/article/details?id=19854783
相关推荐
### MySQL读写分离及主从同步延时解决方案 #### 一、引言 在现代互联网应用中,随着用户量的增长和业务复杂度的提高,单一数据库服务器往往难以满足高并发场景下的性能需求。为了有效应对这种挑战,许多企业选择了...
Spring与MySQL读写分离** Spring作为一个灵活的Java应用程序框架,提供了多种方式来支持数据库的读写分离。通过配置数据源、事务管理器以及AOP(面向切面编程)等机制,Spring可以帮助我们透明地处理读写操作的路由...
常见的MySQL读写分离软件有MySQL Proxy、MaxScale、HAProxy、AMQP等。每款软件都有其特点和适用场景,比如MySQL Proxy轻量级但功能相对简单,MaxScale是MySQL公司官方出品,功能强大且易于集成,HAProxy则常用于网络...
MySQL 读写分离实现需要解决两个问题:主库数据丢失问题和主从同步延时问题。半同步复制可以解决主库数据丢失问题,而并行复制可以解决主从同步延时问题。 半同步复制指的是主库写入 binlog 日志之后,立即将数据...
MySQL 读写分离与主从复制 MySQL 读写分离是指在数据库集群架构中,让主库负责处理事务性查询,而从库只负责处理 select 查询,达到提高数据库整体读写性能的目的。主数据库另外一个功能就是负责将事务性查询导致的...
【MySQL 数据库读写分离与负载均衡】 ...总之,MySQL 的读写分离和主从复制是解决数据库高可用性和性能问题的有效手段。通过合理配置和管理,可以构建出稳定、高效的数据库集群,满足大规模应用的需求。
https://mp.csdn.net/console/uploadResources?spm=1011.2124.3001.4171
在IT行业中,数据库管理是关键任务之一,尤其是在大型企业或高并发应用中。...使用提供的最新修正_Mycat主从与读写分离配置详解与示例_正能量_20150724文档,可以更直观地学习和实践这些配置和解决方案。
读写分离的实现有助于优化数据库性能,但同时也带来了一定的复杂性,比如数据延迟问题、故障恢复策略以及监控维护等。因此,在实际应用中,需要根据业务需求和系统规模谨慎设计和实施读写分离方案。通过理解上述概念...
MySQL主从复制与读写分离是数据库架构中的重要策略,旨在提高系统的可用性、扩展性和数据安全性。在大型系统中,随着数据量的增长和访问压力的增加,单一数据库服务器往往无法满足性能需求。主从复制和读写分离是...
### 基于MyCat的MySQL高可用读写分离集群实战知识点详解 #### 一、MyCat简介 MyCat作为一款开源的数据库中间件,它能够实现对后端多个MySQL数据库进行分片处理,为前端应用提供统一的访问接口。在实际应用中,...
MySQL 5.7 双主互备、高可用与读写分离是数据库系统设计中的重要概念,用于确保数据的稳定性和服务的连续性。在这个实战演练中,我们将深入探讨如何配置和实现这些特性,以及如何结合 keepalived 来增强系统的可用性...
MySQL读写分离是一种数据库架构策略,用于提高数据库系统的性能和可扩展性。在高并发的Web应用中,读取操作通常远多于写入操作,读写分离将这两种操作分配到不同的服务器上,使得主数据库(负责写操作)的压力得以...
MySQL读写分离是一种数据库架构设计模式,旨在通过将查询(读)操作与数据更新(写)操作分配到不同的服务器上执行,来提高系统的整体性能与可用性。在典型的MySQL读写分离场景中,至少包含一个主数据库(Master)和...
本篇实战文档重点讨论了MySQL数据库的读写分离实现,涉及到的技术包括主从复制、代理中间件以及相关配置。 首先,MySQL的主从复制是实现读写分离的基础。主从复制允许我们将数据从一个数据库服务器(称为“主”...
MySQL读写分离是一种常见的数据库优化策略,特别是在高并发和大数据量的场景下,它可以有效提高系统的性能和稳定性。本文将详细介绍如何配置MySQL的读写分离,以案例的形式进行阐述。 首先,理解读写分离的基本原理...
MySQL读写分离主要是通过将数据库的读取请求和写入请求分开,分别指向不同的服务器或节点来实现的。这样可以有效地避免因写操作导致的读操作延迟问题,同时也能显著提升数据库的整体吞吐量。 - **写操作**:通常只...
总之,Amoeba作为一款Java环境下的MySQL读写分离解决方案,通过智能的分片策略和高可用性设计,能够有效提升系统的读取性能和容错能力。但在实际应用中,需要结合业务需求和技术限制,合理选择和配置,才能发挥其...