# 背景 今天同事分享的主题就是mysql-proxy,于是下来自己了解下,不求精通,只求知道这个玩意 # 简介 mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client 它使用mysql协议,任何使用mysql-client的上游无需修改任何代码,即可迁移至mysql-proxy上。 mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层: ? 、 进一步的,mysql-proxy可以分析与修改请求。拦截查询和修改结果,需要通过编写Lua脚本来完成。 mysql-proxy允许用户指定Lua脚本对请求进行拦截,对请求进行分析与修改,它还允许用户指定Lua脚本对服务器的返回结果 进行修改,加入一些结果集或者去除一些结果集均可。 所以说,根本上,mysql-proxy是一个官方提供的框架,具备良好的扩展性,可以用来完成: sql拦截与修改 性能分析与监控 读写分离 请求路由 # 用途 1.
4.3 配置mysql-proxy mysql-proxy自带读写分离脚本,我们还需要修改一下 cp /usr/local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua /usr/local/mysql-proxy/lib/mysql-proxy/lua/ 修改读写分离脚本: vim /usr/local/mysql-proxy/lib/mysql-proxy/lua package.path: /usr/local/mysql-proxy/lib/mysql-proxy/lua/?. lua;/usr/local/mysql-proxy/lib/mysql-proxy/lua/?. ps aux |grep "mysql-proxy" killall -9 mysql-proxy 五、读写分离测试 5.1、创建并授权MYSQL-PROXY登录用户 登录master 和 slave
实现读写分离 下载mysql-proxy https://downloads.mysql.com/archives/proxy/ 解压并配置mysql-proxy # tar zxvf mysql-proxy =/usr/local/mysql-proxy/mysql-proxy-0.8.5-linux-el6-x86-64bit/share/doc/mysql-proxy/admin-sql.lua #指定管理脚本 ,改为1 max_idle_connections = 1, mysql-proxy的bin目录下启动mysql-proxy # . 主库: 从库: mysql-proxy: 停止从库的docker容器,通过mysql-proxy插入一条数据,主库中刷新也有新增的数据,写分离验证成功。 mysql-proxy: 主库: 从库: 至此,mysql的主从复制已经通过mysql-proxy实现读写分离已实现。
https://github.com/Qihoo360/Atlas/releases image.png rpm -ivh Atlas-2.2.el6.x86_64.rpm /usr/local/mysql-proxy cd /usr/local/mysql-proxy/conf vim test.cnf [mysql-proxy] 带#号的为非必需的配置项目 管理接口的用户名 admin-username = 8 日志级别,分为message、warning、critical、error、debug五个级别 log-level = message 日志存放的路径 log-path = /usr/local/mysql-proxy /mysql-proxyd test start 在这个目录下有mysql-proxy mysql-proxyd, 第一个是mysql团队的, 第二个是属于360团队的, 我们使用的是360的。 admin -padmin -P 2345 -h 192.168.99.60 mysql -u admin -padmin -P 1234 -h 192.168.99.60 日志/usr/local/mysql-proxy
MySql-Proxy之多路结果集归并 笔者觉得Cobar之类的分库分表最神奇的部分就是靠一条sql查询不同schema下(甚至不同实例下)的不同的表。
一、mysq-proxy简介与安装 1.1、mysql-proxy简介 mysql-proxy是官方提供的mysql中间件产品可以实现负载平衡,读写分离,failover等 MySQL Proxy 我们可以通过mysql-proxy -V查看是否配置成功。 ? 二、使用mysql-proxy实现负载均衡 那我们该怎么去配置负载均衡呢? /bin/bash /opt/mysql-proxy/bin/mysql-proxy \ --proxy-address=1.0.0.3:4040 \ #这个是安装mysql-proxy的主机上的ip 两个都是一样的,说明主主复制的两个集群,使用mysql-proxy管理成功! 总结:在这个负载均衡当中,其实就是使用mysql-proxy均衡两个MySQL服务器的连接数。 :sudo killall mysql-proxy #!
一、mysql-proxy简介 mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。 它使用mysql协议,任何使用mysql-client的上游无需修改任何代码,即可迁移至mysql-proxy上。 mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层: ? 进一步的,mysql-proxy可以分析与修改请求。拦截查询和修改结果,需要通过编写Lua脚本来完成。 二、mysql-proxy架构与原理 如“简介”中所述,mysql-proxy向用户提供了6个hook点,让用户实现Lua脚本来完成各种功能,这些hook点是以函数的形式提供的,用户可以实现这些函数,在不同事件 案例四:性能水平扩展 mysql-proxy启动时,通过参数配置多个后端,即可实现性能的水平扩展,无需修改任何代码: shell> mysql-proxy \ --proxy-backend-addresses
无意中发现mysql-proxy居然预留了6个钩子允许用户通过Lua脚本去调用他们,也就是说我们可以自行编写Lua脚本来掌握“用户的命运”。 2.用户使用mysql客户端连接指定的mysql-proxy,此时进入read_auth钩子函数,先对用户提交的口令进行确认。 显然,使用用户名test登录mysql-proxy,最终跳转到mysql上时用户已经变为developer。 0x05 总结 用于非业务场景连接数据库,比如开发运维人员在公司连接数据库。 管理脚本需要监控每个mysql-proxy进程的状态,负责他们的启动和停止,以及将他们的域名解析为ip存入redis中。 授权脚本读取一个yaml文件,将文件中的授权规则同步到redis中。 mysql-proxy需要使用源码编译安装。 启动mysql-proxy的命令为: ?
MySQL-Proxy简介 mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server。 它使用mysql协议,任何使用mysql-client的上游无需修改任何代码,即可迁移至mysql-proxy上。mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层: ? 进一步的,mysql-proxy可以分析与修改请求。拦截查询和修改结果,需要通过编写Lua脚本来完成。 /share/doc/mysql-proxy/rw-splitting.lua #lua位置 log-file=/cyb/soft/mysql-proxy/log/mysql-proxy.log 修改rw-splitting.lua vim /cyb/soft/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ? ?
# cp ./ mysql-proxy-0.8.5-linux-rhel5-x86-64bit/* /usr/local/mysql-proxy # cd /usr/local/mysql-proxy mysql-proxy #mkdir /usr/local/mysql-proxy/run #mkdir /usr/local/mysql-proxy/log #cd /usr/local/mysql-proxy /init.d/ #---启动mysql-proxy #. /mysql-proxy start #---停止mysql-proxy #./mysql-proxy stop #---重启mysql-proxy #. /mysql-proxy restart 一些相关参数: PROXY_PATH=/usr/local/mysql-proxy/bin //定义mysql-proxy服务二进制文件路径 --proxy-read-only-backend-addresses
即将使用mysql-proxy进行读写分离,配置192为proxy,写82读83。 mysql-proxy mysql-proxy是一个处于客户端和服务器之间的中间件,它可以检测,分析或改变它们的通信。 对于应用来说只需要连接到mysql-proxy的监听端口即可(默认4040) 下载mysql-proxy https://downloads.mysql.com/archives/proxy/ 根据系统选择 新建文件夹 1 2 mkdir /usr/local/mysql-proxy/lua 创建脚本存放目录 mkdir /usr/local/mysql-proxy/logs 创建日志目录 复制配置文件 | grep 4040 #已经启动 killall -9 mysql-proxy #关闭mysql-proxy使用 测试读写分离 创建Proxy用户 在主服务器创建Proxy用户用户mysql-proxy
我们可以使用mysql-proxy中间件实现Mysql的读写分离,mysql-proxy在这里是作为什么角色呢? mysql-proxy来处理就可以了。 /local/mysql-proxy/share/doc/mysql-proxy/rw-splitting.lua ? mysql-proxy执行流程简析 我们这里测试是为了方便采取一主一从的架构去测试,但是很多时候后端Mysql服务不止一个,我们最后来大致了解下mysql-proxy的工作流程: 实际上客户端向mysql-proxy 用户进行账号权限验证时传递账号密码等信息,mysql-proxy会调用read_auth()函数,当后端mysql服务向mysql-proxy认证结果时,mysql-proxy则会调用read_auth_result
据网上很多人说mysql-proxy的性能不高。 killall -9 mysql-proxy #关闭mysql-proxy使用 4.或者创建mysql-proxy服务管理脚本 $vi /etc/init.d/mysql-proxy #! /etc/rc.d/init.d/functions #定义mysql-proxy服务二进制文件路径 PROXY_PATH=/opt/mysql-proxy/bin prog="mysql-proxy /lib/mysql-proxy/lua/admin.lua" #pid文件路径 PROXY_PID=/opt/mysql-proxy/mysql-proxy.pid # Source mysql-proxy 操作实例 mysql-proxy读写分离的流程步骤: 当在mysql-proxy插入数据时写入到了master上,查询数据是从slave上查看插入主库数据,停止主从后当在slave上插入数据,在mysql-proxy
全量内存分配火焰图执行以下命令,追踪 mysql-proxy 进程所有 malloc 及其变体调用 60s,并生成全量内存分配火焰图。# 步骤 1. /memstacks -p $(pgrep -nx mysql-proxy) -af 60 > all_mallocs.stacks# 步骤 2. memstacks -p $(pgrep -nx mysql-proxy) -f 60 > unfreed_mallocs.stacks# 步骤 2. 其中,据研发反馈,tdsql::Item_param::set_str 正是导致 mysql-proxy 内存泄露发生的地方。而另一处并非真正的泄露。 缺页异常火焰图(现有版)执行以下命令,追踪 mysql-proxy 进程所有缺页事件 60s,并生成缺页异常火焰图。
一、mysql-proxy简介 mysql-proxy是mysql官方提供的mysql中间件服务,上游可接入若干个mysql-client,后端可连接若干个mysql-server,它使用mysql协议 ,任何连接mysql的上游无需任何更改即可迁移至mysql-proxy上。 mysql-proxy最基本的用法,就是作为一个请求拦截,请求中转的中间层: ? 进一步的,mysql-proxy可以分析与修改请求。拦截查询和修改结果,需要通过编写Lua脚本来完成。 /mysql-proxy --defaults-file=. /mysql-proxy --help ./mysql-proxy --help-all Proxy常用选项 说明 注意: 如果设置了多个后端mysql,负载均衡策略为round-robin。
/bin/bash # # mysql-proxy This script starts and stops the mysql-proxy daemon # # chkconfig: - 78 30 # processname: mysql-proxy # description: mysql-proxy is a proxy daemon for mysql # Source function mysql-proxy configuration. if [ -f /etc/sysconfig/mysql-proxy ]; then . ="/usr/local/mysql-proxy/share/doc/mysql-proxy/admin.lua" PROXY_ADDRESS="" PROXY_USER="mysql-proxy" PROXY_OPTIONS 6)启动mysql-proxy [root@proxy-node ~]# service mysql-proxy start Starting /usr/local/mysql-proxy/bin/mysql-proxy
查看当前用 4.4.3 增加Atlas用户 作者:AshesCat 1、介绍 Atlas是由Qihoo 360, Web平台部基础架构团队开发维护的一个基于MySQL协议的数据中间层项目 它是在mysql-proxy /conf/ [root@db3 conf]# mv test.cnf test.cnf.bak [root@db3 conf]# vim test.cnf [mysql-proxy] admin-username ]# /usr/local/mysql-proxy/bin/mysql-proxyd test start OK: MySQL-Proxy of test is started [root@db3 mysql-proxy 00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf 00:00:00 /usr/local/mysql-proxy/bin/mysql-proxy --defaults-file=/usr/local/mysql-proxy/conf/test.cnf
它在MySQL官方推出的MySQL-Proxy 0.8.2版本的基础上,修改了大量bug,添加了很多功能特性。 A: 这是我们对原版MySQL-Proxy的第一项改进,符合国情是必须的 Q: 自动读写分离挺好,但有时候我写完马上就想读,万一主从同步延迟怎么办? 能问这样的问题, 说明你用过官方的mysql-proxy, 很遗憾官方版本并未解决这个问题 Q: 检测后端DB状态会阻塞正常请求么? A: 通过管理接口可以轻松实现 Q: 相比官方mysql-proxy, atlas还有哪些改进? = user #管理接口的用户名 admin-password = pwd #管理接口的密码 admin-lua-script = /usr/local/mysql-proxy/lib/mysql-proxy
本文特别邀请到了腾讯后台开发工程师邢孟棒以 TDSQL实际生产中mysql-proxy内存泄露问题作为分析对象,分享其基于动态追踪技术的通用内存泄露(增长)分析方法。 背景 某个 TDSQL 私有化环境中, 中间件 mysql-proxy 进行大量请求转发时,内存占用量持续增长导致 OOM 现象,最终影响了用户业务的正常使用 。 /memstacks -p $(pgrep -nx mysql-proxy) -af 60 > all_mallocs.stacks # 步骤 2. 其中,据研发反馈,tdsql::Item_param::set_str 正是导致 mysql-proxy 内存泄露发生的地方。而另一处并非真正的泄露。 缺页异常火焰图(现有版) 执行以下命令,追踪 mysql-proxy 进程所有缺页事件 60s,并生成缺页异常火焰图。
下载mysql-proxy 下载:http://dev.mysql.com/downloads/mysql-proxy/ wget https://downloads.mysql.com/archives ** 配置mysql-proxy,创建主配置文件** cd /usr/local/mysql-proxy mkdir lua #创建脚本存放目录 mkdir logs #创建日志目录 cp share /doc/mysql-proxy/rw-splitting.lua . /lua #复制读写分离配置文件 vi /etc/mysql-proxy.cnf #创建配置文件 [mysql-proxy] user=root #运行mysql-proxy用户 admin-username #已经启动killall -9 mysql-proxy #关闭mysql-proxy