来自:DBAplus社群

团队介绍

网易乐得DBA组,负责网易乐得电商、网易邮箱、网易技术部数据库日常运维,负责数据库私有云平台的开发和维护,负责数据库及数据库中间件Cetus的开发和测试等等。

一、背景

随着业务的爆发式增长,电商系统中的读写压力越来越高,单节点MySQL实例压力越来越大,单纯升级服务器硬件已经无法满足生产环境的需要。解决读请求压力,需要支持从库扩展;解决写请求压力,对数据分片增加多个节点,降低单节点MySQL实例的压力成了更优的选择。

传统的分片是通过DAO层进行的,但是DAO层对数据分片存在诸多问题。从业务角度看,配置修改需要重启服务,代价巨大;需要对分片结果集进行处理,业务逻辑愈加复杂;功能相对简单。从数据库运维角度看,配置管理的统一化难度较大;DB的升级、迁移等操作复杂。

网易电商同样面临着这些问题,为了彻底解决数据库瓶颈,网易乐得团队在实际生产中研发了自己的中间件Cetus。其具有正统基因,基于官方MySQL-Proxy的版本进行全面修复和再创新,已于不久前开源,在各个产品线上得到广泛应用,性能和稳定性均表现良好。

Cetus兼容MySQL协议,前端应用不用修改即可通过Cetus访问数据库,方便DBA运维同学和开发同学使用,实现了数据库层面的横向扩展。

目前Cetus有读写分离和Sharding两个版本,可通过编译参数选择适合的版本。它支持对用户透明的多项功能,例如分布式事务、连接池、结果集压缩、安全管理、状态监控、Tcp Stream传输等等。

二、负载均衡策略及性能优化

本文所讨论的负载均衡,指的是读流量的负载均衡,即读流量如何分配到后端同一MySQL集群内的各个DB。

Cetus的负载均衡策略,主要分为两部分:

  • 主从库之间读流量的负载策略;

  • 从库之间读流量的负载策略。

具体实现时候,流量的分配单位与Atlas等中间件也略有不同,进行了性能优化。下面章节将依次详细介绍。

1、主从库之间读流量的负载策略

默认情况下,非事务中、未通过注释强制路由主库或未使用锁的读流量会优先路由到从库,各个从库之间负载均衡。只有当从库都不可用时,读流量才会路由到主库。

有些业务场景下,主库可以分担部分读流量,这时就涉及到读流量在主库和从库上配置负载策略了。

Cetus中,可以通过配置参数read-master-percentage来指定默认的读流量路由到主库的百分比,该参数的取值范围是[0, 100]。

该值默认为0,即所有读流量会优先路由从库,所有从库均不可用时,才会路由主库;如果该参数设置为100时,则所有读流量都会路由到主库;如果该值设置为(0, 100)时,则会按照设置的比例进行路由。需要注意的是,该值表示的是主库和所有从库的比例。

2、从库之间的读流量负载策略

路由到从库的流量会在各个从库之间进行负载均衡。目前Cetus各个从库之间的读流量负载策略仅支持轮询(RR)方式。

在流量分配方面,Cetus也进行了优化。一些MySQL数据库中间件(例如Atlas)是基于SQL的维度做负载均衡的,不会考虑SQL是同一个连接还是不同连接发送来的,中间件依次将接收到的SQL按照策略发往后端的数据库。

在实际使用中发现,长连接的场景下,该策略会造成大量的连接切换,从而导致session级变量的频繁调整,影响SQL执行效率。因此,Cetus对其进行了优化,并非完全按照SQL的维度做负载均衡。

Cetus考虑了同一个连接连续发送SQL请求的情况,不会立即将当前SQL使用完的Cetus与MySQL的连接放回连接池复用,而是持有短暂(256毫秒)时间,以期后续仍有SQL执行,从而避免了session级变量的调整,大大增加了SQL执行的效率。

长连接场景下,对优化前后的Cetus进行了简单测试。通过测试发现,通过优化后的Cetus针对长连场景下的读流量的吞吐量有了明显提升。下图是在docker环境下的简单测试对比:

为了防止IO过高,简单改造了sysbench发送的SQL,限制了返回的结果集大小。禁用事务和prepare的情况下,采用100个线程每次测试60s,连续测试5次,结果如下:

由于本机Docker性能较差,且sysbench模拟测试的语句较为简单,不涉及session变量的切换,因此对比效果不甚明显,本次测试性能仅提升30%左右。长连接业务场景下,性能优化可能会更加明显。

3、读流量的路由策略总结

在存在至少1个可用从库的情况下,影响查询语句的路由策略的因素主要有:

  1. 事务中的查询;

  2. select...for update 或 select ... lock in share mode;

  3. Cetus设置参数master-preferred=true所有流量默认全部路由主库;

  4. Cetus设置参数read-master-percentage控制主从读流量负载;

  5. 使用注释/*#mode=READWRITE*/或/*#mode=READONLY*/。

默认情况下,读流量会优先路由到从库,从库之间按照轮询策略在各个从库之间做负载均衡;一旦所有从库均不可用,会路由到主库上。目前Cetus的各个从库暂不支持按照权重做负载。

  • 对于a、b、c点,Cetus会将查询语句直接路由主库;

  • 对于d点,如果设置read-master-percentage=100,所有的查询流量均路由到主库;如果设置read-master-percentage=[0, 100),Cetus会将读流量按照该比例路由到主库和从库(注意,这里的从库指的是全部的从库,即该比例指的是主库和全部从库的比例);

  • 对于e点,如果使用注释/*#mode=READWRITE*/,读流量会路由到主库;如果使用注释/*#mode=READONLY*/读流量会路由从库,如果所有从库均不可用时才会路由到主库。

上面的各个因素的优先级,注释的优先级最高,其次是参数master-preferred,最后是参数read-master-percentage。

三、总结

MySQL数据库中间件的主要特性是对客户端发送的SQL进行路由,而其中负载均衡便是路由策略中的重要部分。通过了解Cetus的负载均衡机制,可以在后续维护过程中,更好的对数据库中间件进行调优,更灵活地控制SQL的路由。

Cetus中间件开源地址:https://github.com/Lede-Inc/cetus/blob/master/doc/cetus-quick-try.md

特别推荐一个分享架构+算法的优质内容,还没关注的小伙伴,可以长按关注一下:长按订阅更多精彩▼如有收获,点个在看,诚挚感谢

网易MySQL中间件的负载均衡策略及性能优化相关推荐

  1. mysql 中间点策略_网易MySQL中间件的负载均衡策略及性能优化

    团队介绍 网易乐得DBA组,负责网易乐得电商.网易邮箱.网易技术部数据库日常运维,负责数据库私有云平台的开发和维护,负责数据库及数据库中间件Cetus的开发和测试等等. 一.背景 随着业务的爆发式增长 ...

  2. 2 万字长文盘点五种负载均衡策略

    作者 | why技术 来源 |  why技术 责编 | 王晓曼 荒腔走板 老规矩,在技术分享开始之前,先荒腔走板,聊点别的.给枯燥的技术文章注入一抹其它的色彩. 上面的图片,是我在骑车的过程中拍的.衣 ...

  3. web应用负载均衡策略

    1.  名词解释 1.  正向代理与反向代理 简单说 我们内网访问facebook用的代理就叫正向代理 从美国访问我们内网需要的代理就叫反向代理 多台服务器处于一个内网,而我们要访问这些服务器,中间加 ...

  4. 算法高级(14)-Nginx的负载均衡策略

    一.nginx初体验 Nginx是一个http服务器.是一个使用c语言开发的高性能的http 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器.nginx能够支撑5万并发链接,并且cp ...

  5. spring boot、mybatis集成druid数据库连接池,实现mysql cluster HA负载均衡访问

    spring boot.mybatis集成druid数据库连接池,实现mysql cluster HA负载均衡访问 1.原理实现介绍 本质来说使用连接池是为了节省创建.关闭数据库连接的资源消耗,从而提 ...

  6. 经过负载均衡图片加载不出来_吐血输出:2万字长文带你细细盘点五种负载均衡策略。...

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

  7. 吐血输出:2万字长文带你细细盘点五种负载均衡策略。

    Dubbo的五种负载均衡策略 2020 年 5 月 15 日,Dubbo 发布 2.7.7 release 版本.其中有这么一个 Features 新增一个负载均衡策略. 熟悉我的老读者肯定是知道的, ...

  8. tedu 四阶段springcloud学习day02学习总结(idea连接数据库/nacos远端调用及负载均衡策略/Feign方式远端调用)

    目录 查看接口有哪些实现类 ctrl + h 一.cmd方式启动Nacos的命令 二.在IDEA中打开MySQL数据库 第一步: 打开View中数据库的工具栏 第二步:添加数据库为MySql 第三步: ...

  9. ribbon设置权重_Ribbon负载均衡策略配置

    在这里吐槽一句:网上很多文章真是神坑,你不看还好,看了只会问题越来越多,就连之前的问题都没有解决!!! 不多说了,Ribbon作为后端负载均衡器,比Nginx更注重的是请求分发而不是承担并发,可以直接 ...

最新文章

  1. 为什么很难创造出新的处理器?
  2. exp ORA-01455: converting column overflows integer datatype
  3. SpringCloud教程- 服务链路追踪(Spring Cloud Sleuth)(SpringCloud版本Greenwich.SR4)
  4. 自然语言处理综述(一)
  5. 阿里云联合中国信通院发布《云计算开放应用架构》标准,加速云原生应用规模化落地进程
  6. aspx练习备忘录#想锤自己两拳#1
  7. 使silverlight适应IE窗口大小的方法
  8. idea spring tomcat启动失败_技术篇 | 实用IDEA插件和工具系列
  9. java dom cdata_java – 通过DOM解析器从XML处理CDATA
  10. JavaScript实现封闭区域布尔运算
  11. Oracle所有分析函数
  12. 你知道硬齿面减速机价格为什么比齿轮减速机,蜗轮蜗杆减速机高?
  13. poj 3345 Bribing FIPA
  14. HTML5期末大作业:网站设计——天天生鲜水果蔬菜商城网站静态模板 (10个页面) HTML+CSS+JavaScript...
  15. 全年无限次免费畅读电子书,这份大礼包你想不想要?
  16. 校长 – Roy's Blog
  17. 【欢迎来怼】事后诸葛亮会议
  18. [统计]_怎样用数据炒菜:统计建模的两种文化
  19. 试看5分钟视频python_不会Python吗?几分钟看完资深程序员给你的Python入门指南...
  20. 关于JS中的setTimeout()

热门文章

  1. Splay ---- 文艺平衡树区间翻转的建树模式
  2. 【分块】#6283. 数列分块入门 7(区间乘法、区间加法、单点查询)
  3. 模板 - C++ STL
  4. Java 查看文件绝对路径,JAVA获取文件绝对路径的方法
  5. 2018秋寒假作业6—PTA编程总结3
  6. 浏览器保存密码后自动填充问题
  7. 新方案-eclipse配置tomcat中文乱码另一种解决方案
  8. 12c adg添加数据文件报错处理ORA-01111
  9. 2017 多校3 hdu 6061 RXD and functions
  10. linux 锁定重要文件 更改重要命令