数据库–Cobar分布式数据库集群MySQL中间件

运行环境:

  • 主机1:Ubuntu14.04 Desktop + MySQL5.5 + JDK 1.7(HP Z400)  内网IP地址:192.168.137.8
  • NODE1:Ubuntu 13.04 server + MySQL5.5  内网IP地址:192.168.137.31
  • NODE2:Ubuntu 13.04 server + MySQL5.5  内网IP地址:192.168.137.32

注:(NODE1和NODE2运行于XEN虚拟化平台,硬件环境HP Z800)

Cobar简介:

Cobar是关系型数据库的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。

  • 产品在阿里巴巴B2B公司已经稳定运行了3年以上。
  • 目前已经接管了3000+个MySQL数据库的schema,为应用提供数据服务。
  • 据最近统计cobar集群目前平均每天处理近50亿次的SQL执行请求。

Cobar最主要解决的问题是:分布式和HA。

分布式:主要是通过将同一个表的数据拆分成多个,放入不同的数据库实例,查询的时候也会按照同样的操作方式,来更新具体数据库实例中的对应的数据。

HA:高可用性,在设置了MYSQL心跳的情况下,如果主数据库发生了异常,Cobar会自动连接从数据库,如果主数据库恢复正常,只能手动恢复到主数据库。Cobar只负责切换数据库实例,不负责主从数据库的同步,所以需要提前将主从数据库设置双向同步。

存在的不足:

  • (1).不支持跨库情况下的join、分页、排序、子查询操作。
  • (2).SET语句执行会被忽略,事务和字符集设置除外。
  • (3).分库情况下,insert语句必须包含拆分字段列名。
  • (4).分库情况下,update语句不能更新拆分字段的值。
  • (5).不支持SAVEPOINT操作。
  • (6).暂时只支持MySQL数据节点。
  • (7).使用JDBC时,不支持rewriteBatchedStatements=true参数设置(默认为false)。
  • (8).使用JDBC时,不支持useServerPrepStmts=true参数设置(默认为false)。
  • (9).使用JDBC时,BLOB, BINARY, VARBINARY字段不能使用setBlob()或setBinaryStream()方法设置参数。

当然,如果想努力实现这些功能,可以fork官方的源码:https://github.com/alibaba/cobar

环境搭建

  • Cobar服务器:192.168.137.8:8066 用户名/密码:root/sa 实例名:dbtest
  • 主机1:192.168.137.8:3306 用户名/密码:cobar/sa 实例名:dbtest1
  • Node1:192.168.137.31:3306 用户名/密码:cobar/sa 实例名:dbtest2
  • Node2:192.168.137.32:3306 用户名/密码:cobar/sa 实例名:dbtest3

Cobar-Server-1.2.7版本下载:http://pan.baidu.com/s/1pJudQh9

实验拓扑图如下:

首先分别在三个主机创建数据库实例:

#创建dbtest1脚本
   dropdatabaseif exists dbtest1;
   createdatabasedbtest1;
   use dbtest1;
   #在dbtest1上创建tb1
   createtabletb1(
   id   intnotnull,
   gmt   datetime);
#创建dbtest2
   dropdatabaseif exists dbtest2;
   createdatabasedbtest2;
   use dbtest2;
   #在dbtest2上创建tb2
   createtabletb2(
   id   intnotnull,
   val  varchar(256));
#创建dbtest3
   dropdatabaseif exists dbtest3;
   createdatabasedbtest3;
   use dbtest3;
   #在dbtest3上创建tb2
   createtabletb2(
   id   intnotnull,
   val  varchar(256));

Cobar配置:

schema.xml配置如下

<!DOCTYPE cobar:schema SYSTEM "schema.dtd">
<cobar:schema xmlns:cobar="http://cobar.alibaba.com/">
  <!-- schema定义 -->
  <schema name="dbtest" dataNode="dnTest1">
    <table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1" />
  </schema>
  <!-- 数据节点定义,数据节点由数据源和其他一些参数组织而成。-->
  <dataNode name="dnTest1">
    <property name="dataSource">
      <dataSourceRef>dsTest[0]</dataSourceRef>
    </property>
  </dataNode>
  <dataNode name="dnTest2">
    <property name="dataSource">
      <dataSourceRef>dsTest[1]</dataSourceRef>
    </property>
  </dataNode>
  <dataNode name="dnTest3">
    <property name="dataSource">
      <dataSourceRef>dsTest[2]</dataSourceRef>
    </property>
  </dataNode>
  <!-- 数据源定义,数据源是一个具体的后端数据连接的表示。-->
  <dataSource name="dsTest" type="mysql">
    <property name="location">
      <location>192.168.137.8:3306/dbtest1</location>
      <location>192.168.137.31:3306/dbtest2</location>
      <location>192.168.137.32:3306/dbtest3</location>
    </property>
    <property name="user">cobar</property>
    <property name="password">sa</property>
    <property name="sqlMode">STRICT_TRANS_TABLES</property>
  </dataSource>
</cobar:schema>

server.xml简单配置

<!DOCTYPE cobar:server SYSTEM "server.dtd">
<cobar:server xmlns:cobar="http://cobar.alibaba.com/">
  <!-- 用户访问定义,用户名、密码、schema等信息。 -->
  <user name="root">
    <property name="password">sa</property>
    <property name="schemas">dbtest</property>
  </user>
</cobar:server>

rule.xml配置

<!DOCTYPE cobar:rule SYSTEM "rule.dtd">
<cobar:rule xmlns:cobar="http://cobar.alibaba.com/">
  <!-- 路由规则定义,定义什么表,什么字段,采用什么路由算法 -->
  <tableRule name="rule1">
    <rule>
      <columns>val</columns>
      <algorithm><![CDATA[ func2(${val}) ]]></algorithm>
    </rule>
  </tableRule>
  <!-- 路由函数定义 -->
  <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong">
    <property name="partitionCount">2</property>
    <property name="partitionLength">512</property>
  </function>
  <!-- 路由函数定义 -->
  <function name="func2" class="com.alibaba.cobar.route.function.PartitionByString">
    <property name="partitionCount">2</property>
    <property name="partitionLength">512</property>
    <property name="hashSlice">-5:</property>
  </function>
</cobar:rule>

这里需要说明,INSERT语句中必须包含路由规则定义的字段,否则Cobar不会对数据进行拆分,同时存储到多个数据库实例中,比如上面的tb2表中,id字段如果设置了auto_increment,插入语句中不用指明id字段,这样就无法达到数据包拆分的目的。

准备完成之后直接运行bin目录下的./startup.sh即可。

然后查看输入的日志:

[email protected]:~/cobar-server-1.2.7/logs$ tail -f stdout.log
09:57:00,155 INFO  Cobar is ready to startup ...
09:57:00,155 INFO  Startup processors ...
09:57:00,198 INFO  Startup connector ...
09:57:00,202 INFO  Initialize dataNodes ...
09:57:00,811 INFO  dnTest1:0 init success
09:57:00,816 INFO  dnTest3:0 init success
09:57:00,821 INFO  dnTest2:0 init success
09:57:00,835 INFO  CobarManager is started and listening on 9066
09:57:00,837 INFO  CobarServer is started and listening on 8066
09:57:00,837 INFO  ===============================================

这样cobar服务端就已经启动。

直接使用jdbc或mysql终端连接cobar:

[email protected]:~$ mysql -uroot -psa -P8066 -h192.168.137.8
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 1
Server version: 5.1.48-cobar-1.2.7 Cobar Server (ALIBABA)

Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type ‘help;‘ or ‘\h‘ for help. Type ‘\c‘ to clear the current input statement.

下面使用几句Pyhton进行数据库的插入操作:

#!/usr/bin/env python
#coding=utf-8
import MySQLdb

#连接
cxn = MySQLdb.Connect(host=‘192.168.137.8‘,port=8066, user = ‘root‘, passwd = ‘sa‘)
#游标
cur = cxn.cursor()

cur.execute("USE dbtest")

for i in range(1,200):
    cur.execute("INSERT INTO tb2 (val) values (‘this is a test record %d‘)"%i)
    print ‘insert the %d record into cobar‘%i 

cur.close()
cxn.commit()
cxn.close()

插入后查看数据库dbtest2和数据dbtest3的情况:

可以看到有100条数据插入了dbtest2,99条数据插入了dbtest3。

后面会对Cobar进行更深入的了解。我的Fork分支

(完)

原创作品,转载请标明:http://blog.geekcome.com/archives/252

时间: 2024-08-09 01:26:47

数据库–Cobar分布式数据库集群MySQL中间件的相关文章

36套精品Java高级课,架构课,java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,第三方支付,web安全,高并发,高性能,高可用,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,大型分布式电商项目实战视频教程

新年伊始,学习要趁早,点滴记录,学习就是进步! QQ:1225462853 视频课程包含: 36套Java精品高级课架构课包含:java8新特性,P2P金融项目,程序设计,功能设计,数据库设计,架构设计,web安全,高并发,高性能,高可用,高可扩展,分布式,集群,电商,缓存,性能调优,设计模式,项目实战,工作流,程序调优,负载均衡,Solr集群与应用,主从复制,中间件,全文检索,Spring boot,Spring cloud,Dubbo,Elasticsearch,Redis,ActiveMQ

分布式服务器集群架构方案思考

nginx-reverse-proxy-conf 研究了一套完整的分布式服务器集群架构方案. 0x01.大型网站演化 简单说,分布式是以缩短单个任务的执行时间来提升效率的,而集群则是通过提高单位时间内执行的任务数来提升效率. 集群主要分为:高可用集群(High Availability Cluster),负载均衡集群(Load Balance Cluster,nginx即可实现),科学计算集群(High Performance Computing Cluster). 分布式是指将不同的业务分布在

分布式和集群区别?什么是云计算平台?分布式的应用场景?

分布式是指将一个业务拆分不同的子业务,分布在不同的机器上执行,集群是指多台服务器集中在一起,实现同一业务,可以视为一台计算机,一个云计算平台,就是通过一套软件系统把分布式部署的资源集中调度使用.要应对大并发,要实现高可用,既需要分布式,也离不开集群. 分布式和集群区别? 分布式 分布式:是指将一个业务拆分不同的子业务,分布在不同的机器上执行. 常用的分布式就是在负载均衡服务器后加一堆web服务器,然后在上面搞一个缓存服务器来保存临时状态,后面共享一个数据库, 如图所示: 这种环境下真正进行分布式

分布式与集群的区别

转自:http://sctrack.360doc1.net/track/click/eyJ1c2VyX2lkIjogMzkwMjIsICJ0YXNrX2lkIjogIiIsICJlbWFpbF9pZCI6ICIxNDUyNzgzODgwNDI4XzM5MDIyXzI5NTM3XzE0OTkuc2MtMTBfMTBfMTI3XzUxLWluYm91bmQwJGN4emR5QHZpcC5xcS5jb20iLCAic2lnbiI6ICI2NjgyOTU1Zjg1YTZiZWNkZTNjMWNjYjlh

分布式和集群的区别

在IDF05(Intel Developer Forum 2005)上,Intel首席执行官Craig Barrett就取消4GHz芯片计划一事,半开玩笑当众单膝下跪致歉,给广大软件开发者一个明显的信号,单纯依靠垂直提升硬件性能来提高系统性能的时代已结束,分布式开发的时代实际上早已悄悄地成为了时代的主流,吵得很热的云计算实际上只是包装在分布式之外的商业概念,很多开发者(包括我)都想加入研究云计算这个潮流,在google上通过"云计算"这个关键词来查询资料,查到的都是些概念性或商业性的宣

分布式ActiveMQ集群

分布式ActiveMQ集群的部署配置细节: 官方资料:http://activemq.apache.org/clustering.html 基本上看这个就足够了,本文就不具体分析配置文件了. 1.Queue consumer clusters: 同一个queue,如果一个consumer失效,那么未被确认的消息都会被发送到这个queue的其它consumer上.如果某个consumer处理消息比较快,那么它将处理更多的消息. Queue consumer clusters 不需要特殊的配置. 2

分布式与集群

一直听说过分布式由于找工作需要所以学习,都知道有分布式集群(Hdoop).分布式存储(GFS,NFS).分布式数据库(Hbase,redis,memcaced).分布式系统.分布式软件等,今天开始后续的学习. 分布式就是分开了.分散了.比如数据处理(北京搞北京.天津搞天津),比如集群(一个人干一件事.发现不如一个人生十个八个然后每俩去干一件事情). 并行处理是利用多个功能部件或多个处理机同时工作来提高系统性能或可靠性的计算机系统,这种系统至少包含指令级或指令级以上的并行. 分布式处理则是将不同地

MongoDB 分布式分片集群 [四]

MongoDB的分布式分片集群(sharding cluster)配置Sharding cluster介绍这是一种可以水平扩展的模式,在数据量很大时特给力,实际大规模应用一般会采用这种架构去构建monodb系统.要构建一个 MongoDB Sharding Cluster,需要三种角色:Shard Server: mongod 实例,用于存储实际的数据块,实际生产环境中一个shard server角色可由几台机器组个一个relica set承担,防止主机单点故障.Config Server: m

分布式ActiveMQ集群--转载

原文地址:http://shensy.iteye.com/blog/1752529 回顾总结前一段时间学习的ActiveMQ分布式集群相关的知识,分享出来希望对看到的人有所帮助. 一.分布式ActiveMQ集群的部署配置细节: 官方资料:http://activemq.apache.org/clustering.html 基本上看这个就足够了,本文就不具体分析配置文件了. 1.Queue consumer clusters: 同一个queue,如果一个consumer失效,那么未被确认的消息都会