一年前听Hiro说过MySQL Proxy这个应用,直到现在才来了兴致鼓弄鼓弄,也是因为来到这边后,有生产环境一直在用mysql-proxy实现应用的读写分离,前辈搭好的架构现在好好学习下。也就是从昨天开始,亲自搭建了这个环境,学习学习。下面就说说我的测试环境以及遇到的很多晕来晕去的问题。

先简单说下什么是MySQL Proxy。从名字上就清晰可见代理嘛,就是在你能直接进行操作前,都要经过这个代理或是agent(国外片里的特工),client-agent-server就是这么一个过程,既然mysql-proxy加在客户端和服务端之间,那么它就必须要能听懂双方说的是什么,它的角色就像一名接线员(operator)。我们都知道mysql client和mysqld通信时,采用的是MySQL自己的网络协议,而MySQL Proxy也同样使用的是这个网络协议,那么三者之间也就没有什么障碍了。除了可以按照策略分发请求,既然放在两者中间,那么所有过来的请求它自然都可以截获,如果你愿意当然还可以做操作前的审核,也可注入些新的东西。Agent嘛,无所不能,不过你需要先对Lua无所不能LoL。

实验环境:

CentOS 5.4 + mysql-proxy-0.8.1-linux-glibc2.3-x86-64bit.tar.gz + mysql-5.0.77

192.168.109.5 (mysql-proxy) — 在前端,做读写分离(proxy和主库在一台机器上);

192.168.109.5 (master) + 192.168.109.6 (slave) — 主从同步(测试读写是否分离是,关闭同步,便于我们观察分离情况)

具体实施:

mysql-proxy  -admin-lua-script=/usr/local/mysql-proxy/admin.lua -admin-username=root -admin-password=pass -proxy-address=192.168.109.5:4040 -proxy-backend-addresses=192.168.109.5:3306 -proxy-read-only-backend-addresses=192.168.109.6:3306 -proxy-lua-script=/usr/local/mysql-proxy/rw-splitting.lua -proxy-lua-script=/usr/local/mysql-proxy/reporter.lua -daemon > /tmp/mysql-proxy-err.log

NOTE: mysql-proxy二进制包解压好就能用了,但是需要注意的是一些lib和libexec的路径,即便你-plugin-dir,-lua-path,-basedir都用了执行上面的语句还是会告诉你不是libmysql-chassis.so.0、libadmin.so发现不了,就是commands.so,commands.lua,proxy.so这些找不到。你看下源码包下的./configure -help,就会知道mysql-proxy的相关默认路径(/usr/local/bin, /usr/local/lib),所以,解压后把目录下对应的文件/文件夹copy到这些目录下就不会在有那些犯人的error了。

Lua Scripts:admin.lua和reporter.lua这两个Lua脚本就可以使用mysql-proxy提供的Admin Plugin的功能,对请求进行统计同时还可以显示各种状态;rw-splitting.lua这个脚本就是我们用来做读写分离的,它里面还有两个可以调整的参数分别是:min_idle_connections,max_idle_connections,测试中发现,mysql-proxy与mysqld建立的是长连接,如果你不去主动断开连接,该线程会一直空置在那里,那么这两个命令就可以很好的控制空闲线程的数量,减少资源的浪费。

Admin Plugin 测试:

打开一个客户端,通过mysql-proxy的管理端口(4041),登录到mysql-proxy上,便可以执行Proxy的一些管理语句。

1. shell> mysql -uroot -ppass -P4041 -h192.168.109.5

2. mysql> show querycounter;

+——————-+

| query_counter |

+——————-+

|             2                  |

+——————-+

Note: 这个语句显示的数字是一个累加值,默认一开始是NULL,由这么几部分组成:当你通过mysql连接proxy时会被+1,当你每执行一次sql语句时会被+1,当你quit断开连接时会被+1。

3.  mysql> show proxy processlist;

+——+——————————+————————————+

| Id      | IP Address                            | Time                                                  |

+——+——————————+————————————+

| 14      | 192.168.115.9:48611       | Wed Nov 10 10:17:58 2010   |

| 15      | 192.168.115.10:47626   | Wed Nov 10 10:18:24 2010    |

+——+——————————+————————————+

Note: 这个语句的输出结果,可以告诉我们当前的请求都来自哪里是什么时候连过来的,和Mysql的show processlist效果一样,只不过信息不是那么丰富。有时候执行这个语句会报错误,别太在意,当有请求连接过来以后,你再次执行,就正常了,不知道什么原因。

4. mysql> SELECT * FROM backends;

+—————-+————————-+——-+——+

| backend_ndx | address                            | state  | type |

+—————-+————————-+——-+——+

|           1                 | 192.168.109.5:3306 | 1          | 1        |

|           2                 | 192.168.109.6:3306 | 0         | 2        |

+—————-+————————-+——-+——+

Note: 这个sql语句,还是蛮不错的,告诉我们proxy后端当前代理了哪些DB Server;type这个字段有两个值,1表示该数据库是主库,2表示该数据库是从库;state字段提示DB处于一个什么状态,0表示当前没有请求处于空闲,1表示已经有客户端发起过请求了,即便你断开客端后,这个值还是1,2表示mysqld的服务被停掉了。

5. 还有一个sql可以执行,打开admi.lua你会看到有一个help,就是下面的,告诉你可以执行的语句有谁。

mysql> select help;

+————————————+———————————————————-+

| command                                        | description                                                                          |

+————————————+———————————————————-+

| SELECT HELP                                | This command.                                                                   |

| SHOW PROXY PROCESSLIST  | Show all connections and their true IP Address. |

+———————————-+———————————————————-+

NOTE: 当reporter.lua和rw-splitting.lua一起被设置时,show querycounter;与show proxy processlist; 执行失败没有结果输出。

读写分离遇到的问题:

通过mysql-proxy的4040端连接进来,无论我执行写的操作还是查询的操作,所有的请求都会被发到主库(192.168.109.5)上,也就是-proxy-backend-addresses指定的主机。还发现上面启动的mysql-proxy,也不会对多了连接请求进行轮询分配,就是盯着那个192.168.109.5的主机一个来-_-!!!…郁啦。如果将上面的启动项中-proxy-read-only-backend-addresses也改为-proxy-backend-addresses,那么就可以对请求做轮询处理了,不过这样的话,客服端的请求就也会在从库进行写入操作,不允许的。

终于有了新的发现,就在此刻为了这个纠结的问题,我又再一次的仔细看了一下线上前辈配置的启动项,发现和我的有区别呀,没有配置主库的-proxy-backend-addresses,只有-proxy-read-only-backend-addresses配置的4个从库的ip。我调整后,还是不行呀!!!!奇怪的是,4040连接过来后,mysql-proxy直接就与主库建立了连接,不应该呀,还没有发送具体的操作请求怎么就,擅自决定呢,霸道!?苍天呀。。。有谁能拯救下我呀。。。都第二天啦

troubleshooting…….helping…….

——UPDATED——

2010-11-10 17:20 —MySQL Proxy终于弄明白了,问题解决了,谢谢坐在我旁边东软的哥们,还有MSN群里Dong兄的提示。分析如下:

其实,之前的启动选项是没有问题的,问题的关键在于rw-splitting.lua脚本中的min_idle_connections,max_idle_connections,这两个参数的默认设置最小是4,最大是8,而恰恰之前我测试的时候开启的客户端只有3个,所以,每次连接进来,select看到的总是主库上的记录,proxy会将预先建好的连接连到主库上,如果你连接的请求数小于这个默认值,那么是不会进行读写分离的,只有当请求数大于这个默认值时才会将读的请求发给从库去读,因为proxy会通过read_query()这个函数将新建立连接,按照我们之前启动项中的规则重定向,写到proxy-backend-addresses,读到proxy-read-only-backend-addresses。

此外,当我们使用rw-splitting.lua这个脚本启动,proxy-backend-addresses是读写均可,proxy-read-only-backend-addresses是只读;否则如果光设置后者,也均支持读写。

@打完,收工!

觉得文章有用?立即:

和朋友一起 共学习 共进步!

猜您喜欢

使用mysql-proxy读写分离时的注意事项_mysql-proxy中Admin Plugin的使用以及读写分离的问题...相关推荐

  1. Mysql使用sum函数时的注意事项

    MySQL的SUM函数是用来找出记录中各种的字段的总和. 要了解SUM函数考虑EMPLOYEE_TBL表具有以下记录: mysql> SELECT * FROM employee_tbl; +- ...

  2. mysql command为sleep时项目可以连接_Mysql中Sleep进程连接数过多问题解决

    解决方法 批量删除 sleep 进程状态的连接数. 1).一种直接在MySQL命令控制台操作: mysql> show processlist; mysql> SELECT concat( ...

  3. mysql command为sleep时项目可以连接_mysql数据库常连接造成大量sleep状态怎么办

    设置max_execution_time 来阻止太长的读SQL.那可能存在的问题是会把所有长SQL都给KILL 掉.有些必须要执行很长时间的也会被误杀. 自己写个脚本检测这类语句,比如order by ...

  4. mysql 查询两表 两列 比较大小写_mysql 查询表中列的数据不区分大小写的解决

    mysql查询默认是不区分大小写的 如: select * from some_table where str='abc'; select * from some_table where str='A ...

  5. mysql char 和varchar哪种效率高_MySQL数据库中的字段类型varchar和char的主要区别是什么?那种字段的查找效率要高,为什么?...

    解析: 'ucfirst', explode('-', strtolower($request->action)) ))); ---------------------------------- ...

  6. c语言分离个位十位百位_C语言中 将一个3位数整数,正确分离出它的个位、十位和百位数字,并分别在屏幕上输出...

    展开全部 代码如下: #include int main(void) { int number;int units, tens, hundreds; //定义三个变量分别存储个位.十位和百位上的数字 ...

  7. mysql 按日期拆分成多条记录_mysql性能优化2 设计规范 设计原则 结构优化 拆分 配置优化...

    一.MYSQL数据库设计规范 1.数据库命名规范 a.采用26个英文字母(区分大小写)和0-9的自然数(经常不需要)加上下划线'_'组成; b.命名简洁明确(长度不能超过30个字符); c.例如:us ...

  8. mysql事件类型_MySQL binlog中的事件类型

    MySQL binlog记录的所有操作实际上都有对应的事件类型的,譬如STATEMENT格式中的DML操作对应的是QUERY_EVENT类型,ROW格式下的DML操作对应的是ROWS_EVENT类型. ...

  9. cte公用表表达式_CTE SQL删除; 在SQL Server中删除具有公用表表达式的数据时的注意事项

    cte公用表表达式 In this article, the latest in our series on Common table expressions, we'll review CTE SQ ...

最新文章

  1. python如何并发上千个get_用greenlet实现Python中的并发
  2. IntelliLight: a Reinforcement Learning Approach for Intelligent Traffic Light Control 论文阅读
  3. 「编程面试题库」,大佬开发的一款小程序~
  4. Linux运行级详解
  5. javascript框架比较(三)
  6. 闲话WPF之十八(WPF中的资源 [4] )
  7. windows 根据父进程pid查找所有子进程id(C++)
  8. 学生上课睡觉班主任怎么处理_学生上课睡觉鼾声如雷,老师要拍照发家长群吗?一线教师为你分析...
  9. Spark 基础——RDD 算子
  10. .Net: C#中的委托(Delegate)和事件(Event)
  11. 计算机应用cad题库,cad试题库
  12. rk3399调试ov2659(camera模块@dvp接口)--移植过程
  13. 产品设计:《广告设计与创意》
  14. 服务器工作站显示器,HP Z25n超窄边框显示器【深度测评】
  15. 如何精简ttf字库文件
  16. 高中数学培训:高一数学复习技巧方法
  17. 在C语言中对于整形变量采用有符号数,C语言编程(张欣 机制192-3)-中国大学mooc-题库零氪...
  18. 2019腾讯广告算法大赛之清洗曝光广告数据集以及构造标签
  19. 婆媳矛盾引发小夫妻动手 女子抄尖刀刺死丈夫
  20. SpringCloud-5-Hystrix

热门文章

  1. (转)Python 字符串格式化 str.format 简介
  2. 背景透明,文字不透明效果
  3. 数据段、代码段、堆栈段、BSS段
  4. 8.11 NOIP模拟测试17 入阵曲+将军令+星空
  5. 2008已经到来,我们怎能原地踏步!
  6. UVA-10817- Headmaster's Headache(状压DP)
  7. spring boot 注解
  8. 一句话的设计模式(JAVA版)
  9. 每日笔记---使用@ConfigurationProperties读取yml配置
  10. 让你提前认识软件开发(14):程序中的算法