程序技术好文:点我吧工作总结(技术篇)Cobar原理和环境搭建

简介: 程序技术好文:点我吧工作总结(技术篇)Cobar原理和环境搭建

我思故我在,提问启迪思考!


1.什么是Cobar?


  Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。cobar已经在阿里巴巴B2B公司稳定运行了3年以上。目前已经接管了3000+个MySQL数据库的schema,为应用提供数据服务。据最近统计cobar集群目前平均每天处理近50亿次的SQL执行请求。


  Cobar是阿里巴巴(B2B)部门开发的一种关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。master是主库,slave是从库,配合cobar的使用过,需要在建表的时候加入分库字段,由cobar分库路由分配到不同的数据库上做查询。


2.什么是数据库的schema?


  在mysql中创建一个schema跟创建一个database是一样的效果,schema为数据库对象的集合,为了区分各个集合,我们需要给这个集合起个名字,这些名字就是我们在企业管理器的方案下看到的许多类似用户名的节点,这些类似用户名的节点其实就是一个schema。(个人理解,schema可以理解为数据库database的一个快捷方式)。


3.cobar解决了哪些问题?{最好是能用缓存挡掉数据库访问的压力}


  随着业务的进行数据库的数据量和访问量的剧增,需要对数据进行水平拆分来降低单库的压力,而且需要高效且相对透明的来屏蔽掉水平拆分的细节?


为提高访问的可用性,数据源需要备份,数据源可用性的检测和failover?前台的高并发造成后台数据库连接数过多,降低了性能,怎么解决?针对以上问题就有了cobar施展自己的空间了,cobar中间件以proxy的形式位于前台应用和实际数据库之间,对前台的开放的接口是mysql通信协议。将前台SQL语句变更并按照数据分布规则转发到合适的后台数据分库,再合并返回结果,模拟单库下的数据库行为。


  cabar优点总结:1.数据和访问从集中式改变为分布,Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分,Cobar也支持将不同的表放入不同的库,多数情况下,用户会将以上两种方式混合使用。(注意!:Cobar不支持将一张表,例如test表拆分成test_1,test_2, test_3.....放在同一个库中,必须将拆分后的表分别放入不同的库来实现分布式。)2.解决连接数过大的问题。3.对业务代码侵入性少。4.提供数据节点的failover,


HA(High Available高可用性):Cobar的主备切换有两种触发方式,一种是用户手动触发,一种是Cobar的心跳语句检测到异常后自动触发。那么,当心跳检测到主机异常,切换到备机,如果主机恢复了,需要用户手动切回主机工作,Cobar不会在主机恢复时自动切换回主机,除非备机的心跳也返回异常。Cobar只检查MySQL主备异常,不关心主备之间的数据同步,因此用户需要在使用Cobar之前在MySQL主备上配置双向同步。(当出错的时候,频繁的在主从之间切换,会导致业务逻辑层的sql查询不可用现象发生)。


4.cobar应用举例。


应用介绍:


1.通过Cobar提供一个名为test的数据库,其中包含t1,t2两张表。后台有3个MySQL实例(ip:port)为其提供服务,分别为:A,B,C。


2.期望t1表的数据放置在实例A中,t2表的数据水平拆成四份并在实例B和C中各自放两份。t2表的数据要具备HA(High Available高可用性)功能,即B或者C实例其中一个出现故障,不影响使用且可提供完整的数据服务。


5.其他类似功能的MySQL中间件了解?


Atlas,cobar,TDDL(


6.Cobar的环境搭建


  如上图所示, 我们在schema中定义了两个表,第一个表命名为tb1,另外一个表命名为tb2。但是在实际的物理数据库服务器上,却是将表tb1存放在数据库dbtest1上,将表tb2分别存放在dbtest2数据库和dbtest3数据库。tb1作为对比,来感受一下用Cobar实现的分库功能。


  首先,我们创建dbtest1、dbtest2、dbtest3三个数据库和tb1,tb2,tb2三个表。因为这些都是实际在物理数据库服务器上存在的,而dbtest是虚幻的,不实际存在的快捷方式吧。


#创建dbtest1 ;在dbtest1上创建tb1


drop database if exists dbtest1;


create database dbtest1;


use dbtest1;


create table tb1(


id int not null,


gmt datetime);


#创建dbtest2;在dbtest2上创建tb2


drop database if exists dbtest2;


create database dbtest2;


use dbtest2;


create table tb2(


id int not null,


val varchar(256));


#创建dbtest3;在dbtest3上创建tb2


drop database if exists dbtest3;


create database dbtest3;


use dbtest3;


create table tb2(


id int not null,


val varchar(256));


创建好上述数据库和表之后,注意一般是要放在三台服务器上,为了分担读写压力。我们来配置装有Cobar的服务器上的几个Cobar配置文件,schema.xml、rule.xml和server.xml,它们的配置分别如下:


[/span>?xml version="1.0" encoding="UTF-8"?

[/span>!DOCTYPE cobar:schema SYSTEM "schema.dtd"

[/span>cobar:schema xmlns:cobar=""

[/span>!-- schema定义 -->


[/span>schema name="dbtest" dataNode="dnTest1"

[/span>table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1" />



[/span>!-- 数据节点定义,数据节点由数据源和其他一些参数组织而成。-->


[/span>dataNode name="dnTest1"

[/span>property name="dataSource"

[/span>dataSourceRef



[/span>dataNode name="dnTest2"

[/span>property name="dataSource"

[/span>dataSourceRef



[/span>dataNode name="dnTest3"

[/span>property name="dataSource"

[/span>dataSourceRef



[/span>!-- 数据源定义,数据源是一个具体的后端数据连接的表示。-->


[/span>dataSource name="dsTest" type="mysql"

[/span>property name="location"

[/span>!--注意:替换为您的MySQL IP和Port{数组}-->


[/span>location

[/span>location

[/span>location


[/span>!--注意:替换为您的MySQL用户名-->


[/span>property name="user"

[/span>!--注意:替换为您的MySQL密码-->


[/span>property name="password"

[/span>property name="sqlMode"



  上图的配置文件,完成了从dbtest中tb2到dbtest2中的tb2(即192.168.0.1:3306/dbtest2库)和dbtest3中的tb2(即192.168.0.1:3306/dbtest3库)的映射,那么它们是怎么被映射呢,映射算法是在rule.xml中配置的。


[/span>?xml version="1.0" encoding="UTF-8"?

[/span>!DOCTYPE cobar:rule SYSTEM "rule.dtd"

[/span>cobar:rule xmlns:cobar=""

[/span>!-- 路由规则定义,定义什么表,什么字段,采用什么路由算法。-->


[/span>tableRule name="rule1"

[/span>rule

[/span>columns

[/span>algorithm!【CDATA【 func1(${id})】】



[/span>!-- 路由函数定义,应用在路由规则的算法定义中,路由函数可以自定义扩展。-->


[/span>function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong"

[/span>property name="partitionCount"

[/span>property name="partitionLength"



上图的rule.xm配置文件,定义了分库规则:按照id字段把tb2表中的数据分配到dnTest2和dnTest3两个分区中,其中id小于512的数据会被放到dnTest2库的分区中,而其余的会被放到dnTest3库的分区中。Server.xml中则配置了地Cobar服务的数据库结构、用户名和密码。在启动Cobar服务之后,使用用户名root和密//代码效果参考:http://www.jhylw.com.cn/065738175.html

码passwd就可以登录Cobar服务。启动Cobar服务。

首先使用命令“mysql -h127.0.0.1 -uroot -ppasswd -P8066 -Ddbtest”来登录Cobar服务。登陆:127.0.0.1:8066/dbtest;用户名:root;密码:passwd。


其次使用命令“show database”。


然后在表tb2中插入三条记录,然后我们取看真正的物理数据库,id大于512的被映射到dbtest3中的tb2,而id小于512的被映射到dbtest2中的tb2.

相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。   相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情: https://www.aliyun.com/product/rds/mysql 
相关文章
|
安全 网络安全 数据库
达梦数据库 忘记 SYSDBA 密码 处理方法
达梦数据库支持四种安全验证模式:数据库身份验证、基于操作系统的身份验证、外部身份验证和UKEY验证。当忘记SYSDBA密码时,可通过启用操作系统认证模式来恢复:修改`dm.ini`配置文件启用`ENABLE_LOCAL_OSAUTH = 1`,重启服务后,使用`disql / as sysdba`登录修改密码。之后,禁用操作系统认证,恢复原验证模式,确保数据库安全。
5606 0
|
4月前
|
人工智能 JavaScript 编译器
AI工具的“超级外挂”:从零手把手教你搭建私人 MCP 服务器
本文手把手教你用Node.js从零搭建私人MCP(模型上下文协议)服务器,解决AI无法直接访问本地文件、数据库等痛点。含环境配置、TypeScript编译避坑、Hello World工具开发及Inspector调试全流程,助你赋予AI真实行动力!
1434 1
AI工具的“超级外挂”:从零手把手教你搭建私人 MCP 服务器
|
7月前
|
人工智能 Java API
Java Spring Boot 拥抱 AI 原生:从 API 调用到架构重构的进化之路
在AI时代,Java开发者需突破调用API的表层应用,以Spring Boot为基石,推动从“菜单驱动”到“意图驱动”的范式变革。通过构建智能体为核心、工具化封装Service、强化记忆与安全管控的四层架构,融合RAG、异步调度与全链路监控,实现AI原生应用的工程化落地。依托Spring生态的稳定性与可管理性,逐步演进现有系统,让Java在AI原生时代焕发新生。
439 8
|
Linux
linux给指定用户分配文件夹权限
linux给指定用户分配文件夹权限
573 0
|
6月前
|
传感器 边缘计算 自动驾驶
蚂蚁正式开源 LingBot-Depth,基于掩码深度建模的新一代空间感知模型
蚂蚁灵波科技开源LingBot-Depth空间感知模型,首创“掩码深度建模”技术,显著提升消费级双目相机对透明、反光物体的深度补全能力。实测精度与覆盖率超越顶级工业相机,支持机器人稳定抓取、4D场景理解,已轻量化部署。
905 3
蚂蚁正式开源 LingBot-Depth,基于掩码深度建模的新一代空间感知模型
|
Web App开发 JavaScript 前端开发
前端接收数据流实现图片预览效果--ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践
本文为转载文章 原文链接:https://www.cnblogs.com/cdemo/p/5225848.html 首先要谢谢这位大神的无私贡献!解决了我的问题也完美表达了我当时的心路历程 ajax 请求二进制流 图片 文件 XMLHttpRequest 请求并处理二进制流数据 之最佳实践 写在前面 :从提出需求到完美的解决问题,实现过程是曲折的。
8647 0
|
12月前
|
人工智能 小程序 前端开发
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
808 0
小程序、网站 vs. APP:成本差异究竟在哪里?技术栈如何决定项目上限?优雅草卓伊凡
|
8月前
|
Java 测试技术 API
Java 跳出多层循环
本文详解Java中如何使用带标签的`break`语句跳出多层循环。通过实例展示其语法与应用场景,如图像黑屏检测,并对比传统方法与Stream API,帮助开发者在性能与可读性间做出权衡,提升代码效率与质量。(238字)
296 0
使用Netty实现文件传输的HTTP服务器和客户端
本文通过详细的代码示例,展示了如何使用Netty框架实现一个文件传输的HTTP服务器和客户端,包括服务端的文件处理和客户端的文件请求与接收。
527 1
使用Netty实现文件传输的HTTP服务器和客户端
|
应用服务中间件 nginx 数据安全/隐私保护
安装Nginx报错:make: *** 没有规则可以创建“default”需要的目标“build”。 停止。
安装Nginx报错:make: *** 没有规则可以创建“default”需要的目标“build”。 停止。
1126 0

热门文章

最新文章