轻量级中间件MySQL Router介绍与性能测试
来自: http://www.innomysql.net/article/25361.html
话说去年11月去参加OOW大会,听了一场关于MySQL Router的分享。因为我以为这货没这么快会GA,但是没想到的是在OOW大会前MySQL Router就同MySQL 5.7一起GA了。回来之后一直想去测试,但是一直因为各种原因耽搁了。好在过年时抽出点时间研究了下,今天在服务器上完成了性能测试。
官方对于MySQL Router的定义是:
MySQL Router is lightweight middleware that provides transparent routing between your application and any backend MySQL Servers. It can be used for a wide variety of use cases, such as providing high availability and scalability by effectively routing database traffic to appropriate backend MySQL Servers. The pluggable architecture also enables developers to extend MySQL Router for custom use cases.
一言以蔽之,MySQL Router就是一个轻量级的中间件用来实现高可用和扩展性的功能。MySQL Fabric不是也有这样的作用吗?的确,但是MySQL Fabric最大的一个缺点是应用需要改造,用Fabric独有的Java或Python驱动,并且目前只支持Java,Python和PHP语言,即MySQL Fabric是在驱动层面实现的高可用和扩展功能。而MySQL Router是一个中间件,该中间的访问协议与MySQL一致,应用不需要做任何的修改。例如下面的MySQL Router配置文件:
[DEFAULT] logging_folder = /var/log/mysqlrouter [logger] level = INFO [routing:failover] bind_address = 10.166.224.50 bind_port = 7001 max_connections = 1024 mode = read-write destinations = 10.166.224.33:3310,10.166.224.34:3310 [routing:balancing] bind_address = 10.166.224.50 bind_port = 7002 connect_timeout = 3 max_connections = 1024 mode = read-only destinations = 10.166.224.33:3310,10.166.224.34:3310
通过该配置文件启动MySQL Router会监听两个端口10.166.224.50:7001和10.166.224.50:7002。10.166.224.50:7001是一个高可用的端口(mode=read-write),通过7001的端口访问MySQL Router中间件会首先将请求发送到服务器10.166.224.33:3310,如果确定该服务器宕机,则会发送到服务器10.166.224.34:3310。10.166.224.50:7002是一个负载均衡的端口,每个都请求可以将通过roundrobin的方式发送到destiantions对应的MySQL服务器。通过MySQL Router用户可以快速实现一个简单的带有读写分离的高可用集群。MySQL Router甚至可以链接MySQL Fabric的元数据库,具体可查看MySQL Router的相关文档。
MySQL Router之前官方的中间件是MySQL Proxy,这么多年一直是alpha版本,堪称业界奇迹。不过随着MySQL Router的发布,官网其实已经无法直接下载MySQL Proxy了。但Inside君还是决定对MySQL Router和MySQL Proxy做一个简单的性能测试。测试场景是全内存的SELECT操作,测试工具使用sysbench,测试环境是网易云主机。最终的测试结果如下图所示:
测试使用16线程的select.lua脚本的测试,对比远程客户端直连MySQL,远程客户端连接MySQL Router,远程客户端连接到MySQL Proxy,后两者需要再进行一个转发才能连接到目的MySQL数据库,因此性能肯定会比直连MySQL方式要差。从结果看MySQL Router比直连MySQL性能要差15%,QPS平均值接近20000。但是MySQL Proxy的测试结果QPS仅5700,简直惨不忍睹。导致这样结果最重要的原因是MySQL Proxy采用使用lua脚本语言,测试过程中CPU负载高达290%(4核CPU)。MySQL Proxy测试过程中CPU的使用率在50%左右,表现较为平稳。
看来MySQL Router用来做负载均衡是一个不错的选择,特别是用来做高可用架构下的只读VIP,那么对比传统的LVS性能又会是怎样呢?接着Inside君又对比了MySQL Router和LVS的负载均衡性能测试对比,同样是SELECT全内存测试,但是并发数提升至128个线程。测试结果如下所示:
可以发现在128个线程下单实例MySQL直连模式和MySQL Router中间件模式已经没有太大的区别,QPS都在26000左右。当采用两个MySQL实例实现只读操作的负载均衡时,可以发现MySQL Router的QPS在48000左右,而LVS模式在52000左右,性能提升8%,更为重要的是LVS转发服务器上基本没有什么负载。
这就是Inside君MySQL Router的简单介绍与性能测试报告,总结来说MySQL Router的优点:
- 上手快,很容易配置
- 较为稳定,性能中没有遇到什么问题
- 插件式的架构允许用户进行额外功能的扩展
缺点的话:
- 仅支持简单的负载均衡功能
- 高可用功能有待进一步测试
- 虽然支持Fabric元数据,但是不支持分库分表(不得不说是一个遗憾)
- 白名单,SQL统计功能,防火墙功能缺失
- 需要gcc 4.8以上版本支持,老系统编译比较麻烦些