0

0

MySQLOPS 数据库与运维自动化技术分享

php中文网

php中文网

发布时间:2016-06-07 15:48:05

|

1633人浏览过

|

来源于php中文网

原创

阿里巴巴解决数据拆分的伪分布式数据库 中间件Cobar正式开源 六月 19, 2012 by admin · 1 Comment 编者加注: 阿里巴巴于2012年6月19日,正式对外开源的数据库中间件Cobar,前身是早已经开源的Amoeba,不过其作者陈思儒离职去盛大之后,阿里巴巴内部考虑到A

阿里巴巴解决数据拆分的伪分布式数据库  中间件Cobar正式开源

六月 19, 2012 by admin  · 1 Comment

编者加注:

阿里巴巴于2012年6月19日,正式对外开源的数据库中间件cobar,前身是早已经开源的amoeba,不过其作者陈思儒离职去盛大之后,阿里巴巴内部考虑到amoeba的稳定性、

性能和功能支持,以及其他因素,重新设立了一个项目组并且更换名称为Cobar,当时的开发人员是贺贤懋(备注:可能名字的字不对,实在有点久远,虽然当时一起合作),还

有一位百阿的同事也加入这个团队(备注:旺旺密码不记得了,所以他的名字也无法记起,看见请莫怪我这位记忆力不好的百阿同学),开发语言是Java,一开始只支持MySQL

数据库,并且用在新项目BRMMS(中文名称:商人社区,BRMMS是项目代号,一般只记得代号,实在参与过太多项目研发),后来也支持Oracle数据库,因为阿里巴巴中文站

的Offer数据库,需要从Oracle数据库+存储设备,迁移到MySQL+PC Server平台上,为保证用户数据的安全性,迁移过程是每128分之一切换的模式。虽然测试的非常严格,我

们几乎所有可能碰到的情况,甚至极端情况都测试过,但是依然碰过一些莫名其妙的问题,比如从MySQL双主复制模式,从主A切换为B,出现过某个小集群的应用程序连接确实

切换成功,但是又自己切换回来了,直到我离开也没有找出原因,不过后来再切换又从未出现过,Cobar开源对大家解决数据的垂直拆分和水平拆分,那是如虎贴翼,非常方便!

场景描述

Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下像传统数据库一样为您提供海量数据服务。以下是快速启动场景:

  • 系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。
  • tb1表的数据被映射到物理数据库dbtest1的tb1上。
  • tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。
    如下图所示:

MySQLOPS 数据库与运维自动化技术分享

步骤一:环境准备

  • 软件准备

    操作系统: Linux或者Windows (推荐在Linux环境下运行Cobar)
    MySQL: http://www.mysql.com/downloads/ (推荐使用5.1以上版本)
    JDK: http://www.oracle.com/technetwork/java/javase/downloads/ (推荐使用1.6以上版本)
    Cobar: http://code.alibabatech.com/wiki/display/cobar/release/ (下载tar.gz或者zip文件)

数据准备

假设本文MySQL所在服务器IP为192.168.0.1,端口为3306,用户名为test,密码为空,我们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2,脚本如下:

数据库创建脚本:

?

1

2

3

Yodayo
Yodayo

一个专为动漫迷和vTuber打造的AI艺术创作平台、交流社区

下载

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

#创建dbtest1

drop database if exists dbtest1;

create database dbtest1;

use dbtest1;

#在dbtest1上创建tb1

create table tb1(

id    int not null,

gmt   datetime);

#创建dbtest2

drop database if exists dbtest2;

create database dbtest2;

use dbtest2;

#在dbtest2上创建tb2

create table tb2(

id    int not null,

val   varchar(256));

#创建dbtest3

drop database if exists dbtest3;

create database dbtest3;

use dbtest3;

#在dbtest3上创建tb2

create table tb2(

id    int not null,

val   varchar(256));

步骤二:部署和配置Cobar

请确保机器上设置了JAVA环境变量JAVA_HOME 下载Cobar压缩文件并解压,进入conf目录可以看到schema.xml, rule.xml, server.xml等相关的配置文件

?

1

2

3

4

5

6

wget http://code.alibabatech.com/mvn/releases/com/alibaba/cobar/cobar-server/1.2.4/cobar-server-1.2.4.tar.gz

tar zxf cobar-server-1.2.4.tar.gz

cd cobar-server-1.2.4 #可以看到bin,conf,lib,logs四个目录

<strong>schema.xml配置如下<span style=</strong>"color: #ff0000;">(注意:schema.xml包含MySQL的IP、端口、用户名、密码等配置,您需要按照注释替换为您的MySQL信息。)</span>

<strong>schema.xml 配置</strong>:

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

<?xml version="1.0" encoding="UTF-8"?>

/code><code>"schema.dtd">

<schema xmlns:cobar="</code"><code>"http://cobar.alibaba.com/">

  <!-- schema定义 -->

  <schema name="</code"><code>"dbtest" dataNode="dnTest1">

    <table name="</code"> <code>"tb2" dataNode="dnTest2,dnTest3" rule="rule1" />

 

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

  <datanode name="</code"><code>"dnTest1">

    <property name="</code"><code>"dataSource">

      <datasourceref>dsTest[</datasourceref>0]

   

 

  <datanode name="</code"><code>"dnTest2">

    <property name="</code"><code>"dataSource">

      <datasourceref>dsTest[</datasourceref>1]

   

 

  <datanode name="</code"><code>"dnTest3">

    <property name="</code"><code>"dataSource">

      <datasourceref>dsTest[</datasourceref>2]

   

 

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

  <datasource name="</code"><code>"dsTest" type="mysql">

    <property name="</code"><code>"location">

      <location></location>192.168.0.1:3306/dbtest1 <!--注意:替换为您的MySQL IP和Port-->

      <location></location>192.168.0.1:3306/dbtest2 <!--注意:替换为您的MySQL IP和Port-->

      <location></location>192.168.0.1:3306/dbtest3 <!--注意:替换为您的MySQL IP和Port-->

   

    <property name="</code"><code>"user">test

    <property name="</code"><code>"password">

    <property name="</code"><code>"sqlMode">STRICT_TRANS_TABLES

 

?

1

<strong>rule.xml配置如下<span style="</code"><code>"color: #ff0000;">(本文仅以数字类型的id字段作为拆分字段,将数据拆分到两个库中。)

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

<?xml version="1.0" encoding="UTF-8"?>

/code><code>"rule.dtd">

<rule xmlns:cobar="</code"><code>"http://cobar.alibaba.com/">

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

  <tablerule name="</code"><code>"rule1">

    <rule></rule>

      <columns>id</columns>

      <algorithm></algorithm>

   

 

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

  <code>function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong">

    <property name="</code"><code>"partitionCount">2

    <property name="</code"><code>"partitionLength">512

  function>

?

1

<strong>server.xml配置如下</strong>

?

1

2

3

4

5

6

7

8

9

10

<?xml version="1.0" encoding="UTF-8"?>

/code><code>"server.dtd">

<server xmlns:cobar="</code"><code>"http://cobar.alibaba.com/">

  <!--定义Cobar用户名,密码-->

  <user name="</code"><code>"test">

    <property name="</code"><code>"password">test

    <property name="</code"><code>"schemas">dbtest

 

步骤三:启动和使用Cobar

启动Cobar,进入bin目录可以看到Cobar的启动、停止与重启脚本

?

1

2

3

./startup.sh #Cobar进程名为CobarStartup

<strong>查看logs目录下stdout.log, 启动成功日志如下<code>/strong>

?

1

2

3

4

5

6

7

8

9

10

11

12

13

10:54:19,264 INFO  ===============================================

10:54:19,265 INFO  Cobar is ready to startup ...

10:54:19,265 INFO  Startup processors ...

10:54:19,443 INFO  Startup connector ...

10:54:19,446 INFO  Initialize dataNodes ...

10:54:19,470 INFO  dnTest1:0 init success

10:54:19,472 INFO  dnTest3:0 init success

10:54:19,473 INFO  dnTest2:0 init success

10:54:19,481 INFO  CobarManager is started and listening on 9066

10:54:19,483 INFO  CobarServer is started and listening on 8066

10:54:19,484 INFO  ===============================================

<strong>访问Cobar同访问MySQL的方式完全相同, 常用访问方式如下<code>/strong><span style="</code"><code>"color: #ff0000;">(注意:本文将Cobar部署在192.168.0.1这台机器上,否则请替换为您的Cobar所在IP,其他信息不变)<code>/span>

?

1

2

3

4

5

6

7

8

9

#命令行

mysql -h192.168.0.1 -utest -ptest -P8066 -Ddbtest

#JDBC(建议5.1以上的mysql driver版本)

Class.forName("com.mysql.jdbc.Driver");

Connection conn = DriverManager.getConnection("jdbc:mysql://192.168.0.1:8066/dbtest", "test", "test");

......

<strong>SQL执行示例,执行语句时与使用传统单一数据库无区别<code>/strong>

?

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

mysql>show databases;                                                #dbtest1、dbtest2、dbtest3对用户透明

+----------+

| DATABASE |

+----------+

| dbtest   |

+----------+

mysql>show tables;                                                   #dbtest中有两张表tb1和tb2

+-------------------+

| Tables_in_dbtest1 |

+-------------------+

| tb1               |

| tb2               |

+-------------------+

mysql>insert into tb1 (id, gmt) values (1, now());                   #向表tb1插入一条数据

mysql>insert into tb2 (id, val) values (1, "part1");                 #向表tb2插入一条数据

mysql>insert into tb2 (id, val) values (2, "part1"), (513, "part2"); #向表tb2同时插入多条数据

mysql>select * from tb1;                                             #查询表tb1,验证数据被成功插入

+----+---------------------+

| id | gmt                 |

+----+---------------------+

|  1 | 2012-06-12 15:00:42 |

+----+---------------------+

mysql>select * from tb2;                                             #查询tb2,验证数据被成功插入

+-----+-------+

| id  | val   |

+-----+-------+

|   1 | part1 |

|   2 | part1 |

| 513 | part2 |

+-----+-------+

mysql>select * from tb2 where id in (1, 513);                        #根据id查询

+-----+-------+

| id  | val   |

+-----+-------+

|   1 | part1 |

| 513 | part2 |

+-----+-------+

  • 查看后端MySQL数据库dbtest1,dbtest2和dbtest3,验证数据分布在不同的库中

产品约束

  • 使用JDBC时,推荐使用5.1以上版本Driver进行连接
  • 不支持跨库的关联操作:join、分页、排序、子查询。
  • 不支持rewriteBatchedStatements=true参数设置。默认为false
  • 不支持useServerPrepStmts=true参数设置。默认为false
  • BLOB, BINARY, VARBINARY字段不能使用。若特殊需求需要这三种字段,禁止使用PreparedStatement的setBlob()或setBinaryStream()方法设置参数。
  • 不支持SAVEPOINT操作。
  • 不支持SET语句的执行,事务和字符集设置语句除外
  • 对于拆分表(一个表的数据被映射到多个MySQL数据库),不能更新已有记录的拆分字段(分库字段)值
  • 只支持MySQL数据节点。
  • 对于拆分表,插入操作须给出列名,必须包含拆分字段。

源码下载地址:http://code.alibabatech.com/svn/cobar/

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

Go高并发任务调度与Goroutine池化实践
Go高并发任务调度与Goroutine池化实践

本专题围绕 Go 语言在高并发任务处理场景中的实践展开,系统讲解 Goroutine 调度模型、Channel 通信机制以及并发控制策略。内容包括任务队列设计、Goroutine 池化管理、资源限制控制以及并发任务的性能优化方法。通过实际案例演示,帮助开发者构建稳定高效的 Go 并发任务处理系统,提高系统在高负载环境下的处理能力与稳定性。

38

2026.03.10

Kotlin Android模块化架构与组件化开发实践
Kotlin Android模块化架构与组件化开发实践

本专题围绕 Kotlin 在 Android 应用开发中的架构实践展开,重点讲解模块化设计与组件化开发的实现思路。内容包括项目模块拆分策略、公共组件封装、依赖管理优化、路由通信机制以及大型项目的工程化管理方法。通过真实项目案例分析,帮助开发者构建结构清晰、易扩展且维护成本低的 Android 应用架构体系,提升团队协作效率与项目迭代速度。

83

2026.03.09

JavaScript浏览器渲染机制与前端性能优化实践
JavaScript浏览器渲染机制与前端性能优化实践

本专题围绕 JavaScript 在浏览器中的执行与渲染机制展开,系统讲解 DOM 构建、CSSOM 解析、重排与重绘原理,以及关键渲染路径优化方法。内容涵盖事件循环机制、异步任务调度、资源加载优化、代码拆分与懒加载等性能优化策略。通过真实前端项目案例,帮助开发者理解浏览器底层工作原理,并掌握提升网页加载速度与交互体验的实用技巧。

97

2026.03.06

Rust内存安全机制与所有权模型深度实践
Rust内存安全机制与所有权模型深度实践

本专题围绕 Rust 语言核心特性展开,深入讲解所有权机制、借用规则、生命周期管理以及智能指针等关键概念。通过系统级开发案例,分析内存安全保障原理与零成本抽象优势,并结合并发场景讲解 Send 与 Sync 特性实现机制。帮助开发者真正理解 Rust 的设计哲学,掌握在高性能与安全性并重场景中的工程实践能力。

223

2026.03.05

PHP高性能API设计与Laravel服务架构实践
PHP高性能API设计与Laravel服务架构实践

本专题围绕 PHP 在现代 Web 后端开发中的高性能实践展开,重点讲解基于 Laravel 框架构建可扩展 API 服务的核心方法。内容涵盖路由与中间件机制、服务容器与依赖注入、接口版本管理、缓存策略设计以及队列异步处理方案。同时结合高并发场景,深入分析性能瓶颈定位与优化思路,帮助开发者构建稳定、高效、易维护的 PHP 后端服务体系。

458

2026.03.04

AI安装教程大全
AI安装教程大全

2026最全AI工具安装教程专题:包含各版本AI绘图、AI视频、智能办公软件的本地化部署手册。全篇零基础友好,附带最新模型下载地址、一键安装脚本及常见报错修复方案。每日更新,收藏这一篇就够了,让AI安装不再报错!

169

2026.03.04

Swift iOS架构设计与MVVM模式实战
Swift iOS架构设计与MVVM模式实战

本专题聚焦 Swift 在 iOS 应用架构设计中的实践,系统讲解 MVVM 模式的核心思想、数据绑定机制、模块拆分策略以及组件化开发方法。内容涵盖网络层封装、状态管理、依赖注入与性能优化技巧。通过完整项目案例,帮助开发者构建结构清晰、可维护性强的 iOS 应用架构体系。

246

2026.03.03

C++高性能网络编程与Reactor模型实践
C++高性能网络编程与Reactor模型实践

本专题围绕 C++ 在高性能网络服务开发中的应用展开,深入讲解 Socket 编程、多路复用机制、Reactor 模型设计原理以及线程池协作策略。内容涵盖 epoll 实现机制、内存管理优化、连接管理策略与高并发场景下的性能调优方法。通过构建高并发网络服务器实战案例,帮助开发者掌握 C++ 在底层系统与网络通信领域的核心技术。

34

2026.03.03

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PostgreSQL 教程
PostgreSQL 教程

共48课时 | 10.6万人学习

Django 教程
Django 教程

共28课时 | 5万人学习

MySQL 教程
MySQL 教程

共48课时 | 2.5万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号