使用MySQL Proxy解决MySQL主从同步延迟
转自:http://koda.iteye.com/blog/682547
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采用连接池的方式连接,因此额外的压力还是可以接受的。
相关推荐
MySQL 主从同步、读写分离、性能调优 在本文中,我们将讨论 MySQL 主从同步、读写分离和性能调优的相关知识点。 MySQL 主从同步 MySQL 主从同步是指将一个 MySQL 服务器的数据复制到另一个 MySQL 服务器上,以便...
9. MYSQL主从复制:MYSQL主从复制是指将Master数据库的数据同步到Slave数据库,以保证数据的一致性和可用性。 10. MYSQL读写分离的优点:MYSQL读写分离可以提高数据库的性能和可用性,减少数据库的压力,提高网站的...
然而,使用 MySQL Proxy 时可能会遇到一些问题,本篇文章将详细讨论这些问题及其解决方案。 首先,我们遇到的问题是无法通过 MySQL Proxy 连接 MySQL 服务器,即使提供了正确的 host 和 password。这可能是由于 ...
例如,创建用户itcast,授予其replication slave权限,以便在主从节点之间实现数据的同步。 使用Mysql、Haproxy、Mycat、PXC、Zookeeper可以实现高可用集群,提高系统的可用性和性能。但是,需要注意的是,这个高...
- 将解压后的目录重命名为 `/usr/local/proxymysql`,然后进入该目录的`sbin`子目录,确认包含`mysql-proxy`可执行文件。 - 运行 `./mysql-proxy --help-all` 查看所有可用的命令行选项。 2. **基本参数**: - `...
### 使用mysql-proxy实现MySQL读写分离 随着业务规模的不断扩大,数据库系统往往成为整个系统中的瓶颈之一。为了提高系统的响应速度以及数据处理能力,一种常用的技术手段就是采用**读写分离**的方式。读写分离的...
MySQL主从配置在Linux环境下的实施是数据库高可用性和数据安全性的重要组成部分,它涉及到数据库的复制功能,使得数据可以从一个服务器(主服务器)实时同步到另一个服务器(从服务器)。这样,即使主服务器出现故障...
### MySQL-Proxy 主从复制与读写分离搭建详解 #### 一、MySQL-Proxy简介 MySQL-Proxy 是一个轻量级的代理服务器,用于在客户端应用程序和 MySQL 服务器之间建立一层中间层。它能够实现诸如负载均衡、读写分离、...
通过上述步骤,您已经成功地在Docker环境中搭建了一个MySQL主从复制系统。这种架构不仅能够有效提高数据的安全性和可靠性,还能够提升系统的整体性能。此外,利用Docker进行部署,使得整个过程更加便捷高效。未来,...
3. **高可用性**:MySQL Proxy可以用于实现主从切换,当主库出现故障时,可以自动或手动将流量切换到备库,确保服务连续性。 4. **负载均衡**:通过MySQL Proxy,可以将多个MySQL服务器组织成一个集群,根据预设...
mysql数据库主从数据同步, vim /etc/mysql/my.cnf server-id = 1 log_bin = /var/log/mysql/mysql-bin.log binlog-do-db=proxy 注:binlog-do-db提供数据同步服务的数据库 #忽略的数据库复制 binlog-ignore-db=...
MySQL主从复制是一种数据同步机制,可以实现数据的实时或接近实时的同步。这种机制允许一个或多个从服务器接收来自主服务器的更新,从而保持数据的一致性。 **主从复制原理**: 1. **主服务器**(Master)将数据更改...
同步方案是主从架构的关键,MySQL提供了master-slave双向热备功能。主服务器的所有变更都会实时地复制到从服务器,以保证数据的一致性。配置文件/etc/my.cnf用于设置同步参数,确保实时同步。 备份方案是为了防止...
本篇文章将深入探讨proxy和Mycat的对比测试,以及如何在MySQL主从架构中进行测试。 首先,我们来看proxy。Proxy通常指的是数据库代理服务器,它位于应用服务器和数据库服务器之间,起到路由请求、负载均衡和透明化...
8. **替代方案**:除了 MySQL Proxy,还有其他工具和方法实现读写分离,例如使用数据库中间件(如 Tungsten Replicator)、数据库管理工具(如 Orchestrator)或直接在应用程序层面实施逻辑。 总之,MySQL Proxy 是...
6. 在主服务器上创建一个用于MySQL Proxy的用户,该用户将在从服务器上同步,以允许Proxy访问数据库。 测试读写分离的简单方法是通过创建新用户并进行读写操作,查看它们是否被正确地路由到主或从服务器。 在实际...
- 可以使用中间件如MySql Proxy或HAProxy进行读写分离。 7. **故障切换**: - 当主库出现故障时,可以快速将从库提升为主库,保持业务连续性。 - 定期检查并维护主从一致性,确保数据准确无误。 在ECSHOP的环境...
在设置MySQL Proxy时,需要确保主从复制的正确配置。如果在测试过程中禁用了复制(如`REPLICATION`),可能会影响数据的一致性和Proxy的正常工作。 **总结** MySQL Proxy作为一个灵活的数据库中间层,对于实现读写...