贝贝数据库中间件定制和优化实践

Posted 贝贝技术团队

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了贝贝数据库中间件定制和优化实践相关的知识,希望对你有一定的参考价值。

在刚刚过去的2016双11电商大促活动中,贝贝数据库中间件cobarx全面经受住了大促的考验,面对秒杀、拼团等抢购活动超过日常数十倍的大流量冲击,始终能够平稳、高效运行。下面分享一下贝贝数据库中间件选型、定制和持续优化的实践经验。


在相当长一段时间里,古老的开源数据库中间件amoeba一直支撑着公司的核心数据库集群,但在2015年贝贝业务快速发展的一年中,贝贝的用户量急速增长,业务量增长了数十倍。amoeba在性能和可用性方面的问题开始凸显,甚至出现多次单实例宕机,导致整个核心数据库集群服务受到影响。




我们围绕是继续优化amoeba,还是选择其他更合适的开源数据访问层解决方案进行了深入思考:

1、Client or proxy,这是一个方向性的问题,由于贝贝还在持续完善Java服务化体系的建设,在未来的一段时间内,仍然会面临诸多异构的业务系统并存的情况,因此数据访问层只能采用透明的proxy模式,来降低应用适配的成本。


2、数据库中间件要足够稳定可靠,经历过大规模应用和大体量的业务场景检验。


3、数据库中间件必须具备优良的HA架构设计,确保数据访问层稳定健壮,能够检测数据库集群的各种故障,做到快速failover,最终构建一个持续可服务的数据库平台。


4、数据库中间件要能够构建数据库平台的水平扩展能力,支撑未来千亿级业务体量。


5、选择符合上述4个特性的开源分布式数据库中间件快速定制,而不是自己从头造轮子。


以下是主流数据库中间件特性对比:

贝贝数据库中间件定制和优化实践


统一和深化认识后,我们很容易就从成熟度不同、架构设计不同、功能特性不同和开源程度不同的众多开源数据库中间件中筛选出了合适的产品。最终我们选择了基于开源的数据库中间件Cobar进行快速定制。Cobar在开源之初已经在阿里接管数以千计的mysql数据库实例,平均每天处理几十亿次的SQL执行请求,其稳定性和可靠性已经得到相对充分的验证。但其开源的版本一定程度上进行了裁剪,存在功能层面上的一些缺失。


下面介绍大半年来我们围绕贝贝业务系统的需求,对Cobar核心特性的定制和优化实践。

1

数据库水平拆分能力

 

Cobar支持将一张表水平拆分成多份分别放入不同的库和数据库实例来实现表的水平拆分。数据库的表通过路由规则引擎映射到多个逻辑的Datanode。每个Datanode是由一主多备多个数据源组成,每个数据源映射到一个物理的MySQL数据库实例上的一个逻辑库。其逻辑层次设计如下:


贝贝数据库中间件定制和优化实践


Cobar支持的逻辑层次关系具有较强的灵活性,可对每个表单独定义路由规则,能够轻松将不同的表映射到不同的Datanode和DataSource。


在实现分库分表的情况下,数据库自增ID已经无法保证全局唯一,同样业务的唯一性主键也无法保证全局唯一性约束这个特性,为此,我们扩展了全局自增ID功能。


贝贝数据库中间件定制和优化实践

1、Sequence由多个数据库实例分担完成,每个数据库实例负责一个Sequence Group,不同Group的ID值间隔跳开,不会重复。


2、 单个数据库实例故障,Sequence仍然可以由其他数据库实例的Sequece Group产生,确保全局ID生成功能高可用。


3、Cobar轮询每个数据库实例,批量从不同的group获取sequence,并缓存在cache中。


4、SQL解析模块扫描insert语句,当Insert语句包含自增ID字段且业务方未填充value时,对自增ID字段自动进行填充。sequence value 从cache中获取。


5、Cobar client session对象中保存insert语句写入的自增ID值,client调用last _insert_id函数能够得到该值,实现了对mysql协议的完全兼容,业务方可以像使用MySQL自增ID字段一样使用Cobar提供的全局自增ID特性。


6、当数据库库实例发生故障时,故障节点负责的Sequence ID段不再向前自增,当节点故障恢复后,有两种处理策略。策略一:优先使用落后的数据库实例的Sequence ID段,当追上其他数据库实例增长进度后,继续采用轮询策略,均衡的让各个数据库实例产生Sequence ID。策略二:让落后的数据库实例的Sequence ID直接向前跳,这样Cobar仍然采用轮询的策略,均衡的让各个数据库实例产生Sequence ID。


7、全局自增ID主要目标是为了保证所定义唯一字段中的数据的全局唯一(比如PRIMARY KEY,UNIQUE KEY等)和有序递增,但不保证连续性,不能依赖sequence的连续性进行任何业务操作。


2

 读写分离和流量负载均衡


对于大多数高并发的互联网业务场景而言,数据库集群读写分离功能必不可少,但过去因为主从同步延迟的问题cobar内部裁剪掉了读写分离功能,在一些对数据实时一致性要求不是那么高的场景下,似乎有点过于一刀切了。


我们对DataNode链路管理模块进行扩展,重新实现了读写分离功能。包括增加了DataSource Balancer组件,完善了DataSource Health Checker组件,并修改了DataNode,DataSource Connection Pool组件,完成了读写分离功能的添加。


该功能上线后一直稳定可靠运行,很好的支撑了会员、商品、促销、物流、交易、购物车数据库垂直拆分,表现了优秀的灵活性,能对不同的业务场景制定不同的读写分离策略,也支持通过hint的方式强制指定SQL路由。


贝贝数据库中间件定制和优化实践


DataSource Balancer组件是动态读写分离功能的核心组件,能够根据DataNode各个数据源的权重、负荷和节点健康状况综合计算,自动选择数据源。


1、 根据权重实时计算和选择数据源采用近似方法,将参与计算的多个数据源按权重映射到固定数量的slot中,每次请求到达时,用随机数与slot取模,近似选择数据源,从测试和实际线上运行情况看,这种算法基本能保证按权重比例均衡读流量,并且CPU消耗很低。


2、 实时统计各个数据源的活动链接数量,当某个数据库实例的活动链接数按权重比例远大于其他数据库实例时,说明这个数据库实例已经过负荷了,此时会均衡的将流量平摊到其他数据库节点,直到所有数据库的负荷比例都比较接近,避免一个数据库实例变慢,大量请求会持续挤压在这个实例上。


3、 DataSource Health Checker组件检测到MySQL Slave节点故障,负载均衡组件会首先剔除掉该节点,不再让该节点参与流量均衡计算,自动将故障节点流量均衡的迁移到其他正常节点。数据库节点故障恢复后,能够自动回切流量,完全不用人工干预。


4、增加SQL hint强制路由走主库或者备库功能。在一致性要求高的场景可以追加hint信息,强制走主库,而大多数一致性要求不高的场景,就直走备库,大大降低了主库的负荷,保障了数据库稳定运行。


3

HA特性支持


Cobar实现了对后端MySQL实例的心跳检测机制,判断MySQL运行状况,一旦运行出现异常,Cobar可以自动切换到备机工作。


贝贝数据库中间件定制和优化实践


DataSource Balancer组件也非常依赖于DataSouce Health Checker的健康检测结果,我们完善了该组件的状态转换和迁移处理机制:

1.心跳初始化成功后,收到 OK响应,切换到OK状态

2.1.检测到一次心跳超时,状态切换,累计超时次数

2.2.如果心跳发送链路异常,直接转移到Error状态

3.1.没有到达超时次数限制时,收到正常响应,状态切回OK

3.2.超时次数超过阈值,转换到Error状态

4.1.收到正常响应后切换回OK状态

4.2.因为心跳发送链路异常造成的Error状态,重新开启新的链路,初始化心跳。


贝贝数据库中间件定制和优化实践

4

支持MYSQL原生通信协议的透明代理


php业务系统和JAVA业务系统都可以将cobar当成一个透明的数据库代理,仍然可以像访问原生MySQL服务器一样。


贝贝数据库中间件定制和优化实践


5

数据库连接复用


业务集群动辄几百台实例,如果直连数据库,将会占用大量的MySQL数据库连接资源,而通过cobar能够让业务集群复用数据库连接,大大降低数据库的连接消耗。


贝贝数据库中间件定制和优化实践


我们优化了数据库连接池管理,增加了数据库链路ping检测机制,及时把连接池中失效的链路清除掉。另外设置了连接池最小水位,减少连接反复创建和销毁,连接池中的连接维持在一个理想的水位,很少发生数据库连接创建和销毁动作。


6

数据库数据安全


在Sql解析模块增加了写操作的条件检测,对于没有设置where条件或者条件永远为真的情况,直接拒绝请求。对于会破坏数据库、修改表结构的语句同样进行了限制,不允许通过数据库中间件操作,只能由DBA到数据库后台操作。规范所有的业务方都必须通过数据库中间件连接数据库,更好的管控了业务访问数据库的行为。


从2016年初确定基于cobar定制开始,经过大半年的特性扩展和优化完善,构建了适合贝贝业务场景的分布式数据库中间件cobarx。目前cobarx已经平稳替换了生产环境所有的amoeba,接管了交易、会员、商品、物流、促销、供应链等核心业务和其他各类业务共计上百个数据库实例,自上线以来运行稳定可靠, 单实例能支撑25W QPS。同时得益于cobarx更优良的Sql解析能力和异步IO处理框架,CPU资源消耗下降一半,Sql处理时延也有明显下降。


贝贝数据库中间件定制和优化实践


另外我们也增强了cobarx的可维护性,完善了配套的管理控制台cobarx manager,丰富了cobarx内部状态监控、告警和权限管理,能清晰、统一的展现所有cobarx集群的实时负荷和状态,方便快捷的完成数据库故障切换和维护,极大方便了日常运维管理和大促技术保障。


贝贝数据库中间件定制和优化实践


在cobarx定制、优化和应用实践过程中,结合贝贝的业务场景和发展规划,DBA团队和数据库中间件团队一起共同推动了贝贝数据库架构体系演变,从单一核心库到按业务垂直拆分,再到目前正在稳步推进的数据库水平拆分工作,每一步都走的踏踏实实,平稳有序,致力于将贝贝的数据库平台打造的更可靠、更易扩展,支撑贝贝更大的业务体量。


明年我们计划将贝贝数据库中间件cobarx开源,我们从开源之中获得了很大的受益,也希望在满足自身需求的同时,让更多的组织和个人能从我们的实践和技术经验积累中受益。


——END——



小编后记

这篇文章写在双11之后,本文作者与所有研发人一样,都刚刚经历了双11大考,所幸,贝贝有这股洪荒之力的战士,我们完满毕业。就当是毕业论文吧,分享给同路前行的技术人,一起,用技术改变世界。


贝贝技术团队
关注我们,了解更多技术分享及干货
微信号:beibeitechnology

以上是关于贝贝数据库中间件定制和优化实践的主要内容,如果未能解决你的问题,请参考以下文章

《贝贝GO》技术支持

linkis与SQL中间件(跨数据源混查)结合实践分享

单机数据库优化的一些实践

单机数据库优化的一些实践

单机数据库优化的一些实践(mysql)

浅谈单机数据库优化的一些实践