转自:
http://koda.iteye.com/blog/788862
http://koda.iteye.com/blog/682547
使用MySQL将读写请求转接到主从Server。
一 安装MySQL Proxy
MySQL Proxy的二进制版非常方便,下载解压缩后即用。
解压缩的目录为:
$mysql-proxy_installed_dir (这里为/usr/local/mysql-proxy)
|_ bin
|_ include
|_ lib
|_ share
1. 为mysql-proxy建立配置文件。
如在$mysql-proxy_installed_dir创建文件mysql-proxy.cnf,内容如下:
注:在windows下我没发现admin.lua, 关于admin功能我还没去尝试。重要的是proxy-backend-addresses配置,上面的例子表示发往mysql proxy的请求将转发到192.168.1.241这个MySQL服务器的3306端口。
Linux下mysql-proxy.cnf要设置为0660权限。
2.启动MySQL Proxy
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.cnf &
默认启动4040端口。
解压缩的目录为:
$mysql-proxy_installed_dir (这里为/usr/local/mysql-proxy)
|_ bin
|_ include
|_ lib
|_ share
1. 为mysql-proxy建立配置文件。
如在$mysql-proxy_installed_dir创建文件mysql-proxy.cnf,内容如下:
- [mysql-proxy]
- admin-address = localhost:4041
- admin-username = mytest
- admin-password = 123456
- admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy/lua/admin.lua
- proxy-backend-addresses=192.168.1.241:3306
注:在windows下我没发现admin.lua, 关于admin功能我还没去尝试。重要的是proxy-backend-addresses配置,上面的例子表示发往mysql proxy的请求将转发到192.168.1.241这个MySQL服务器的3306端口。
Linux下mysql-proxy.cnf要设置为0660权限。
2.启动MySQL Proxy
/usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/mysql-proxy.cnf &
默认启动4040端口。
二 使用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采用连接池的方式连接,因此额外的压力还是可以接受的。
由于数据延迟问题的存在,当应用程序在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采用连接池的方式连接,因此额外的压力还是可以接受的。
相关推荐
1. **配置文件**:默认情况下,MySQL Proxy 使用 `proxy.conf` 文件进行配置,包括代理端口、后端服务器地址等信息。 2. **Lua 脚本**:可以通过 Lua 脚本自定义代理行为,如日志记录、查询过滤、性能统计等。 3. **...
接下来,我们需要安装 Lua,因为 MySQL Proxy 使用 Lua 脚本来处理数据流。可以从 Lua 官方网站下载源码并进行编译安装。如果在编译过程中遇到缺少 `readline` 头文件的错误,需要安装 `libreadline-dev` 包。 安装...
4. **安装 MySQL Proxy**:从源码编译 MySQL Proxy,创建自定义的安装目录,并使用 `./configure` 和 `make` 命令来编译和安装。 完成以上步骤后,MySQL Proxy 应该已经成功安装。接下来,可以通过编写 Lua 脚本来...
此外,MySQL Proxy使用Lua语言作为其脚本语言,Lua具有轻量级、高效的特点,常用于嵌入式系统和移动设备。它能够方便地与其他组件集成,用于配置和改造应用程序的不同部分。 总的来说,MySQL Proxy是应对互联网时代...
MySQL Proxy 是一个开源...理解并熟练使用MySQL Proxy,能帮助IT专业人士更好地管理和维护数据库环境。不过,使用时需注意,过度的中间件可能引入额外的延迟,因此在实际部署中要权衡利弊,确保整体系统的高效运行。
四、MySQL Proxy使用场景 1. **性能监控**:通过记录SQL查询,可以收集性能数据,分析数据库瓶颈。 2. **安全性增强**:可以拦截恶意查询,或者对敏感数据进行脱敏处理。 3. **开发测试**:在开发环境中,可以...
MySQL Proxy使用Lua脚本来决定哪些请求应该发送到主服务器,哪些应该发送到从服务器。 下面是配置MySQL Proxy的步骤: 1. 下载并安装MySQL Proxy。确保下载对应操作系统的版本,如文中提到的`mysql-proxy-0.8.5-...
6. **自定义扩展**:MySQL Proxy 支持使用Lua语言编写插件,开发者可以根据需求定制处理逻辑,实现更复杂的功能,如SQL审计、性能优化、错误处理等。 **安装与配置**: MySQL Proxy 的安装通常包括编译源码或者直接...
总的来说,这个数据包提供了一套完整的解决方案,帮助Windows用户部署和使用MySQL Proxy。通过这个代理,你可以提高数据库系统的稳定性和效率,同时也能实现更复杂的数据管理策略。在实际操作中,一定要遵循最佳实践...
- 使用`/usr/local/mysql/bin/mysql`命令连接到通过Proxy的MySQL服务器,指定端口为4040。 - 为了实现远程访问,客户端也可以通过`mysql`命令指定主机地址、用户名、密码以及Proxy的端口号。 4. **使用Lua脚本**...
例如,在Unix/Linux系统中,你可以使用`/usr/local/bin/mysql-proxy`命令,配合不同的参数来管理Proxy。 9. **测试与监控**: 安装完成后,通过简单的连接测试确保MySQL Proxy正常工作。同时,考虑使用日志记录和...
然而,使用 MySQL Proxy 时可能会遇到一些问题,本篇文章将详细讨论这些问题及其解决方案。 首先,我们遇到的问题是无法通过 MySQL Proxy 连接 MySQL 服务器,即使提供了正确的 host 和 password。这可能是由于 ...
### 使用mysql-proxy实现MySQL读写分离 随着业务规模的不断扩大,数据库系统往往成为整个系统中的瓶颈之一。为了提高系统的响应速度以及数据处理能力,一种常用的技术手段就是采用**读写分离**的方式。读写分离的...
此外,为了提升性能,Angel Proxy可能还采用了多线程或者异步I/O(如使用Python的asyncio库)等优化手段。它可能还有日志记录功能,方便开发者追踪和调试问题。 总结来说,Angel Proxy是一个用Python实现的MySQL...
- 使用 MySQL 客户端连接 MySQL-Proxy: ```bash mysql -h 192.168.1.15 -u proxy -p123 ``` - 查询数据: ```sql > use db; > select * from test; ``` - 更新数据: ```sql > update test set id = ...
通过以上步骤,我们不仅成功安装了 MySQL Proxy 并配置了读写分离与负载均衡,还对 MySQL Proxy 的基本使用进行了简单的介绍。MySQL Proxy 作为一款强大的中间件工具,极大地简化了数据库集群的管理和维护工作。对于...
MySQL Proxy 就是这么一个中间层代理,简单的说,MySQL Proxy 就是一个连接池,负责将前台应用的连接请求转发给后台的数据库,并且通过使用 lua 脚本,可以实现复杂的连接控制和过滤,从而实现读写分离和负载平衡。...