数据库中间件cobar调研笔记

MySQL分片高可用集群的Cobar部署与MySQL Cobar是一个开源的MySQL分片代理工具,它提供了一个中间层来处理分片和路由请求。Cobar是一个开源的MySQL分片代理工具,它提供了一个中间层来处理分片和路由请求。在Cobar的配置文件(cobar.xml)中,你需要指定每个分片的连接信息,例如主机名、端口号、用户名和密码。在Cobar的配置文件(cobar.xml)中,你需要指定每个分片的连接信息,例如主机名、端口号、用户名和密码。Cobar提供了一个中间层来处理分片和路由请求MySQL分片高可用集群的Cobar部署与MySQL。 阅读详情

转自:https://mp.weixin.qq.com/s/nfTKSTpCvNcvNFAdl2J7mQ    58沈剑 架构师之路

13年底负责数据库中间件设计时的调研笔记,拿出来和大家分享,轻拍。文章很长,可提前收藏,转发。


一,cobar是什么

  • 阿里开源的mysql的中间件服务

  • 使用mysql协议

  • 对上游,cobar就是传统mysql数据库

  • 对上游,它屏蔽后端分布式mysql集群

画外音:数据库中间件有基于服务端的,也有基于客户端的,cobar属于前者。


二,cobar应用场景举例



逻辑上:

  • 数据库dbtest(虚拟的)

  • 表tb1和tb2

物理上:

  • tb1表的数据在dbtest1(物理的)的tb1上

  • tb2表的一部分数据在dbtest2(物理的)的tb2上,另外一部分在dbtest3(物理的)的tb2上


三,cobar使用方式

命令行:连dbtest虚拟库

JDBC:也是连dbtest虚拟库


查看db:


查看table:


插入一些数据,对用户而言,后端的分布式mysql是透明的:


  • 对tb1,数据实际上存在dbtest1的tb1中

  • 对tb2,数据实际上存储在dbtest2和dbtest3的tb2中

画外音:从其官网上看,自12年12月之后,cobar就没有再更新过,官方微博也非常不活跃,不清楚现在它在阿里的使用情况,知道的同学请说一说。

 

四,cobar不支持什么

  • 不支持夸库join,分页,排序,子查询

  • set语句会被忽略(事务和字符集设置除外)

  • 如果分库,insert必须包含patition key(否则麻烦大了)

  • 如果分库,patition key不能被update

  • 不支持读写分离

  • 不支持存储过程

  • 如果使用JDBC,rewriteBatchedStatements,useServerPrepStmts,BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()

 

五,cobar支持什么

分布式数据库:通过分库实现

  • 支持一张表放到不同的库

  • 支持不同的表放入不同的库

需要注意:不支持将test拆分成test_1,test_2,test_3并放入同一个库中这样的拆分方式。

画外音:后者正是360的atals的做法(atlas只支持单实例单库分表)。

 

HA:通过到mysql的心跳实现

  • 主机挂了会自动切换回备机,但主机恢复,需要手动切回

  • 只检测主备异常,不关心主备数据同步(需要dba手动配)

画外音:需要注意,cobar是需要用户自己来实现负载均衡的,方式有三种:

  • 自己使用软件例如LVS

  • 自己使用硬件例如F5

  • cobar提供了命令获取集群信息,用户可以根据这些信息做负载均衡;当然,淘宝已经实现了一个具有负载均衡功能的cobar客户端产品-cobar.driver

 

SQL路由

在分库的情况下,cobar会从sql中提取partition key列,来判断SQL被路由到哪一个分库进行执行;如果没有带partition key,则会将SQL分发到所有分库执行。


示例

tb1(id INT)

假设以id切分数据,后端分了N个库:

  • insert into tb1 values(1);

    => N个库都会执行插入,因为没有带partition key;

  • insert into tb1(id) values(1);

    => 只会路由到1个库,带了partition key;

  • update tb1 set id=2 where id=1;

    => 不支持,不能修改partition key;

画外音:SQL带上partition key对cobar来说,非常非常重要,并且partition key不支持修改(修改了库就不对了哟)。

 

cobar不允许在同一个连接中切换库。

画外音:数据库连接和库是绑定关系。


不建议通过cobar来执行DDL语句。

画外音:所以建库,建索引什么的,还是直连mysql自己搞吧。

 

COBAR自定义语句

  • 查询cobar节点的状态


cobar允许管理员通过管理命令上线和下线cobar节点。

 

  • 查询cobar集群的状态


被定义在一个cobar集群中的cobar节点之间都会发送心跳,所谓的心跳就是上面提到的show cobra_status; 这样的话,就为每一个cobar节点提供了知道同一个集群内的所有cobar信息的机会。当然,被下线,或者心跳超时的cobar节点的信息不会被显示出来。

 

  • 查询SQL语句的路由情况


SQL语句前加上explain即可知道SQL语句的路由情况。


事务的支持

cobar对单库保持事务的强一致性。


对分库保持事务的弱一致性。


分库后事务提交包含两个阶段:

  • 执行阶段:SQL按照规则被路由到多个分库,此时发生错误,还能回滚

  • 提交阶段:提交阶段出错,无法正确回滚


两个阶段之间,执行与提交串行处理,阶段内部各个分库并行处理。

画外音:额,基本就是不支持分布式事务。

 

六,cobar系统架构

系统模块图


画外音:从模块图来看,cobar的结构还是挺清晰的:

  • 前端对上游的连接池

  • 后端对下游mysql的连接池

  • 对每一个请求,会经过:

    SQL分析

    SQL路由

    SQL执行

    投递给后端mysql

  • 对每一个响应,需要做结果合并

 

数据流图

数据流图和上述模块图对应:


网络模型

采用异步网络模型:


结果合并

会把多个物理库的结果集合并,再返回给上游:


八,cobar路由算法

partition key是int时

好办,直接取模


partition key是string时

f(string) = hash(string) % 1024


假设分4个库:

  • 哈希结果0-255 -> 库1

  • 哈希结果256-511 -> 库2

  • 哈希结果512-767 -> 库3

  • 哈希结果768-1024 -> 库4


如何扩容:

  • 哈希结果0-255 -> 库1

拆分后:

  • 哈希结果0-127 -> 库1.1

  • 哈希结果128-255 -> 库1.2


数据非均匀分布路由:

  • 哈希结果0-511(513范围) -> 库1

  • 哈希结果512-767(256范围) -> 库2

  • 哈希结果768-895(128范围) -> 库3

  • 哈希结果896-1023(128范围) -> 库4

 

九,cobar对于SQL的转发

带partition key单记录查询


将IN进行拆分,请求发到对应多个分库,然后将结果集合并。

 

不带partition key的where查询


假设partition key是user字段,在product字段上的where查询,会将请求广播到所有分库,然后将结果集合并。

 

二维partition key

一张表的多个字段同时作为定位库的拆分字段,仍以上图的visit(product, user, info)为例,可以以product和user两个字段来同时来定位库。


SELECT * FROM visit WHERE product=‘ColaCola’ AND user=‘A’

对于上述业务需求,同时带有两个列作为查询条件,可以直接定位到库7。


但是,此时如果只有其中的一个字段作为查询条件,反而得查询多个库,再做聚合:


SELECT * FROM visit WHERE product=‘ColaCola’

对于上述业务需求,就必须查询库3,7,11,15了。

画外音:不懂为什么要按照双key来做路由,单key路由,对于双key的查询,也没有增加多少数据扫描量啊,加入双key反而使得某些情况下策略复杂了,带来的收益也不高。

 

小结

对的,对于where,cobar就是这样的处理方式:

  • 根据字段的一致性hash分布数据

  • 多维拆分

  • 根据where中的partition key分发查询

  • SQL语句变换,分发至各个分库执行,对结果进行合并

 

十,cobar的高级特性

JOIN有限的处理


如上,两个表都进行了分库,JOIN需求如下:

SELECT * FROM tb1 INNER JOIN tb2

    ON tb1.MEMBER_ID=tb2.NAME

结果集理应如下:


方案一:迭代查询

FOR row1 IN select * FROM tb1{

    ADD(

        SELECT* FROM tb2 WHERE

          tb2.name = row1.member_id

    )TO RESULT

}

画外音:我去,外层循环是对tb1中的所有记录,在tb2来一遍扫描,bt1数据量大的情况下,这哪里受得了?

 

方案二:夸库索引


对于tb1和tb2存在的潜在JOIN需求,对JOIN列建立夸库索引。

  • 直接JOIN查询:建立了夸库索引后,对于JOIN的直接查询,就是idx索引表内的数据的合并就是结果

  • JOIN后带WHERE条件:

SELECT * FROM tb1 INNER JOIN tb2

ON tb1.MEMBER_ID=tb2.NAME

      WHEREtb1.id=5

此时需要改写SQL语句,直接在索引表上进行查询:

SELECT * FROM idx WHERE id1=5

 

此处需要注意:

  • 索引表的partition key:WHERE条件所在表的partition key,作为索引表的partition key

  • 索引必须包含参与JOIN相关表的主键,JOIN字段,包含WHERE条件的字段

  • 索引的更新:需要分布式事务的支持


GROUP BY的处理


以上表为例,patition key是ID,要在C1上进行GROUP BY操作:

SELECT SUM(price) FROM tb1 GROUP BY c1;

改写SQL语句,先在各个分库上GROUP BY一次,并将sum计算出来:

SELECT SUM(price), c1 FROM tb1 GROUP BY c1 ORDER BY c1;


各分库进行GROUP BY + ORDER BY + sum之后,根据排序后的c1及对应sum结果,归并一遍后即得到最终结果。

 

小结

对于复杂语句,可以这样处理:

  • 对于JOIN,可以迭代查询,或者使用分布式索引

  • 对于GROUP BY,需要增加查询列,以及ORDER BY


13年底的调研笔记,文中的“画外音”是我当时的批注,希望能让大家对cobar能有一个初步的认识,有疑问之处,欢迎交流。

































 



STM32+ST7789屏实战:手把手教你打造物理按键控制的3级菜单GUI(附完整代码) 本文详细介绍了如何使用STM32和ST7789屏构建物理按键控制的3级菜单GUI系统。从硬件架构设计、SPI驱动配置到菜单状态机实现,提供了完整的代码示例和优化技巧,帮助开发者快速掌握嵌入式GUI开发的核心技术。 阅读详情

相关推荐

《惠普工作站设置BIOS从U盘装系统》

惠普工作站设置BIOS 惠普工作站在做服务器时应用广泛,本文介绍下其BIOS开机自启动设置,附上图片,以供学习参考。 惠普工作站设置BIOS 启动步骤如下: 第一步:根据需要对BIOS进行更改,并保存 1.重启工作站按F10进入BIOS设置(也可以按ESC键选择进入BIOS设置的选项)。 图1 惠普工作站B...

istrangeboy&begin zero的博客 2万+

[存储] Cobar使用文档(可用作MySQL大型集群解决方案)

最近好不容易抽空研究了下Cobar,感觉这个产品确实很不错(在文档方面比Amoeba强多了),特此推荐给大家。Cobar是阿里巴巴研发的关系型数据的分布式处理系统,该产品成功替代了原先基于Oracle的数据存储方案,目前已经接管了3000+个MySQL数据库的schema,平均每天处理近50亿次的SQL执行请求。首先,使用Cobar的核心功能如下:分布式:Cobar的分布式主要是通过将表放入不同的

石头君专栏 4万+

AI提示词实战:用EARS语法5步搞定产品需求拆解(附完整案例)

本文详细介绍了如何运用EARS语法将模糊的产品需求进行原子化拆解,转化为清晰、可执行的结构化指令。通过一个完整的自由职业者项目管理工具案例,演示了从原始需求分析到构建增强AI提示词的五步实战流程,帮助产品经理和技术人员实现高效、精准的需求传达与协作。

nokia的博客 1031

【亲测免费】 探索阿里巴巴开源神器:Cobar - 实时数据复制与分库分表利器

是阿里巴巴开源的一款高性能、轻量级的数据库中间件,它主要用于实现数据库的实时数据复制和分库分表功能。在大数据处理和高并发场景中,Cobar 提供了强大的解决方案,帮助开发者和企业优化其数据库架构。 ## 技术解析 ### 1. 分库分表 Cobar 的核心特性之一是支持分库分表,它可以将一个大型的数据表分散到多个物理数据库上,从而有效地解决单表数据量过大导致的性能瓶颈。Cobar 使用了哈希...

gitblog_00026的博客 962

Vue3实战:集成bpmn-js与Activiti工作流引擎的完整指南

本文详细介绍了如何在Vue3项目中集成bpmn-js流程图编辑器与Activiti工作流引擎,构建一个完整的前端流程设计器。文章重点解析了Vue3响应式系统与bpmn-js集成的核心陷阱及解决方案,并提供了属性面板配置、XML命名空间适配、撤销重做等实用功能的完整实现指南,帮助开发者高效完成工作流系统的前端开发。

weixin_29009881的博客 211

Unidbg补环境实战:复现Shopee风控Native层运行环境

Android App风控已从HTTP层签名校验,演进为深度依赖Native层系统调用与硬件特征的多维验证。其核心原理在于通过JNI桥接Java与Native代码,调用openat、sysconf、getrandom等系统接口读取/proc、/sys、/dev等路径的真实状态,并结合SELinux策略、CPU拓扑、分区哈希等硬性指标构建设备可信画像。这种技术架构显著提升了对抗黑灰产的能力,但也对逆向分析与自动化调用提出更高要求——必须精准模拟底层环境而非仅Hook逻辑。Unidbg补环境正是为此而生:它支持

weixin_30533109的博客 636

CORBA

欢迎访问: www.ptcms.cn CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构)是由OMG组织制订的一种标准的面向对象应用程序体系规范。或者说 CORBA体系结构是对象管理组织(OMG)为解决分布式处理环境(DCE)中,硬件和软件系统的互连而提出的一种解决方案;OMG组织是一个国际性的非盈利组织,其职责是为应用开发提供一...

j2ee开发的专栏 313

DAP-Link DIY复刻指南

DAP-Link是ARM开源的一个项目,主要用于代码下载以及调试,支持SWD和JTAG调试接口,对于开发嵌入式的同学相信都或多或少有所耳闻。除了DAP-Link之外还有很多同类型的调试器,如ST-LinkJ-Link,但是这些都是不开源的,无法复刻或进行二次开发。但DAP-Link不同,完全开源,不用担心侵权问题,且随着开源社区大家的共同努力,DAP-Link经过了不断的迭代,先如今已取代ARM之前推出的CMSIS-DAP开源项目。

爱出名的狗腿子 1万+

分库分表,读写分离数据库中间件选型调研

之前由于项目和工作上对数据库的压力比较小,没有涉及到数据库的分库分表,读写分离等减轻数据库压力的操作,今天由于新的客户要开通mysql数据库支持的要求(之前的项目是oracle不存在数据量超标等情况)考虑到稳定性,安全性,和数据库响应等方面,考虑做mysql的读写分离,分库分表操作,于是开始选择相应的数据库中间件(之前没有用到)。。。 与是开始各种查阅资料,了解到目前比较主流的一些数...

weixin_39389888的博客 1426

多尺度Transformer+特征融合新范式,算力减半精度猛增

在大模型时代,多尺度特征融合与Transformer架构的结合正成为研究热点。多尺度特征融合能够捕捉数据在不同尺度上的关键信息,而Transformer架构凭借其强大的并行处理能力和对长距离依赖的建模能力,为复杂数据处理提供了新的思路。这种结合在处理多模态数据时展现出巨大潜力。

Tulingxueshu的博客 1057

软件项目管理期末复习(看这一篇就够了)

软件项目管理考试复习 🔶🔶🔶🔶🔶加了🔶的是考点 第一章软件项目管理概述 1.1.1项目及其特征 项目定义:🔶 项目就是为了创造一个唯一的产品或提供一个唯一的服务而进行的临时性的努力; 是以一套独特而互相联系的任务为前提,有效地利用资源,在一段时间内满足一系列特定目标的多项相关工作的总称。 日常运作和项目的区别: 项目是一次性的,而日常运作是重复进行的。 项目是以目标为导向的,日常运作是通过效率和有效性体现的。 项目是通过项目经理及其团队工作完成的,日常运作是职能式的线性管理。 项目存在大量的变更管理,

qq_50886857的博客 3万+

Cobar SQL审计的设计与实现

本文已收录 https://github.com/lkxiaolou/lkxiaolou 欢迎star。 背景介绍 Cobar简介 Cobar 是阿里开源的一款数据库中间件产品。 在业务高速增长的情况下,数据库往往成为整个业务系统的瓶颈,数据库中间件的出现就是为了解决数据库瓶颈而产生的一种中间层产品。 在软件工程中,没有什么问题是加一层中间层解决不了的,如果有,再加一层。 一款proxy类型(本文不讨论client SDK类型的数据库中间件)的数据库中间件具备以下能力: 支持数据库的透明代理,做到用户.

捉虫大师 261

Matlab结果性能评价---rms函数(计算矩阵、数组和向量元素均方根)

实例1:创建一个向量(正弦波)并计算其均方根值 实例2:创建一个二维矩阵并计算其均方根值 实例3:计算二维矩阵沿指定维度的均方根值 本例程配套完整源码下载 均方根(Root-Mean-Square Level): 向量x的均方根值为沿着指定的维度执行求和: 语法描述: y = rms(x)返回输入x的均方根值。如果x是行或列向量,y是实数值标量。对于大小尺寸大于1矩阵x,y包含沿x的第一个数组维度计算的均方根值。例如,如果x是N > 1的N*M矩阵,那么y是1*M行向量,对应x矩..

qq_32809093的博客 3万+

到底怎么做需求分析,技术调研,技术设计?

本文以数据库中间件为例,全流程展现架构师做设计的过程:首先,需求分析其次,技术调研最后,技术设计同时,本文也系统的介绍了实现数据库中间件的核心技术点,基于服务端/客户端的...

shenjian58的博客 1727

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

数据库中间件为何不支持join

有网友对《假如让你来设计数据库中间件》一文中,数据库中间件仅仅支持四类SQL存有疑问:partition key普通查询partition key上的IN查询非partition key上的查询有限功能的排序+分页查询这四类SQL就能满足公司业务的需求么,这个结论是怎么来的?看来《假如让你来设计数据库中间件》的架构结论并不能让刨根究底的网友们满意,于是把13年底,需求调研的过程细节也说一说,作为一...

weixin_42066711的博客 285

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

mysql数据库中间件研究

随着互联网的发展,数据量的不断增大。 单台实例已经远远无法满足业务的需要。 对数据库分库分表的需求不断的增加随之而来的就是数据库中间件的开发。 一、 单台实例主要面临下面几个问题: 1. 数据量太大单台机器无法承载 2. 数据查询效率太低,单表数据达到一定的量业务性能就无法满足 3. 数据库优化上的瓶颈 4. 数据安全的问题,大量数据放置在一台机器如果数据出问题回复周期会特别长,...

weixin_30414635的博客 93

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

谈下mysql中间件(问题域、业内组件)

这段时间团队在梳理mysql使用上的一些痛点(分库分表、读写分离、权限控制、监控告警、日志审计等),也调研了业内一些mysql中间件的实现,这里把对问题域的思考,以及常见中间件整理沉淀一下   一、问题域(业务自己搭mysql痛点是什么?目标是什么?)   痛点 目标 连接管理 客户端连接使用不受限制,没有复用,业务之间互相影响(如1个服务写得有问题就可把mysql连接...

依然的专栏 1667

mysql动态扩容调研

MySQL动态扩容方案目前可用方案 MySQL的复制:一个Master数据库,多个Salve,然后利用MySQL的异步复制能力实现读写分离,这个方案目前应用比较广泛,这种技术对于以读为主的应用很有效。 数据切分(MySQL的Sharding策略):垂直切分:一种是按照不同的表(或者Schema)来切分到不同的数据库(主机)之上,这种切可以称之为数据的垂直(纵向)切分;垂直切分的思路就是分析表间的聚合

借你一秒 5933

我给 Apache 顶级项目提了个优化

大家好,我是坤哥,今天给大家大家一篇我看了非常有收获的文章,作者是我的前同事,滴滴大佬,干货满满,我昨天分享的一篇高性能队列设计思想,文中提到 skywalking 的队列性能也很强大,...

weixin_41385912的博客 173

后分库分表时代的数据库新选择:二维火搭载OceanBase再出发

归档库切换 OceanBase 后,凭借 OceanBase 的高级压缩技术,所需存储空间缩减至原有的 1/5,降本效果立竿见影;同时,得益于原生分布式架构,数据归档和历史信息查询的性能也有了明显提升。

OceanBase分布式数据库的博客 1220

从分库分表到数据访问层中间件

因为业务的发展,数据量也在不断的增长,单一数据库无法满足我们读写的性能需求,而分库分表分散存储压力。水平分割,基于数据记录,通过建立结构相同的几张表分别存储数据。垂直分割,基于列字段,将经常一起使用的字段放在一个单独的表中,分割后的表记录之间是一一对应关系。既然是优化,当然也遵循一些原则,完全可以按照下面的优化顺序来,确定当前没有优化的空间,然后才选择终结方案。 1. 背景 为数据库减压 ...

布道 2万+

大规模数据(2000W)管理相关技术学习笔记

目标 通过预研找到契合团队技术现状的业务下一阶段可能达到的大规模数据(2000W)管理性能问题的解决方案,并建立原型框架验证解决方案。 技术调研主要过程 测试单表2000W数据的性能,从而确定是否需要进行分库分表 SQL(s) Mybatis(s) 备注 计数 166163 164596 Count 分页查询 12 1066 SELECT * from result_data LIMIT 10;...

zhaoenweiex的博客 1022

大数据分析技术研究报告(二)

二 大数据背景下事务型处理系统相关技术 在google、facebook、taobao等大互联网公司出现之后,这些公司注册和在线用户数量都非长大,因此该公司交易系统需要解决“海量数据+高并发+数据一致性+高可用性”的问题。 为了解决该问题,从目前资料来看,其实没有一个通用的解决方案,各大公司都会根据自己业务特点定制开发相应的系统,但是常用的思路主要包括以下几点: (1)数据库分片,结合业

njpjsoftdev的博客 2707

分库分表总结,Mycat从入门到放弃

之前调研分库分表框架,最后选择了sharding-jdbc, 下面是我总结的各个框架: Atlas:不能实现分布式分表,所有的子表必须在同一台DB的同一个database里且所有的子表必须事先建好,Atlas没有自动建表的功能。Atlas参考链接 Cobar:必须将拆分后的表分别放入不同的库来实现分布式。Cobar参考链接 TDDL:阿里,功能强大,过于复杂,部分开源。需要评估使用情况,防止过...

caodongfang126的博客 285
上一篇: Guava官方文档-RateLimiter类
下一篇: 数据库中间件TDDL调研笔记
涛濤
博客等级 码龄12年 136粉丝 92原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值