视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
数据库–Cobar分布式数据库集群MySQL中间件_MySQL
2020-11-09 19:50:35 责编:小采
文档
 原创作品,转载请标明:http://blog.geekcome.com/archives/252

运行环境:

  • 主机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

    实验拓扑图如下:


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

    01#创建dbtest1脚本
    02 dropdatabaseif exists dbtest1;
    03 createdatabasedbtest1;
    04 use dbtest1;
    05 #在dbtest1上创建tb1
    06 createtabletb1(
    07 id intnotnull,
    08 gmt datetime);
    09#创建dbtest2
    10 dropdatabaseif exists dbtest2;
    11 createdatabasedbtest2;
    12 use dbtest2;
    13 #在dbtest2上创建tb2
    14 createtabletb2(
    15 id intnotnull,
    16 val varchar(256));
    17#创建dbtest3
    18 dropdatabaseif exists dbtest3;
    19 createdatabasedbtest3;
    20 use dbtest3;
    21 #在dbtest3上创建tb2
    22 createtabletb2(
    23 id intnotnull,
    24 val varchar(256));

    Cobar配置:

    schema.xml配置如下

    01
    02<cobar:schema xmlns:cobar="http://cobar.alibaba.com/">
    03
    04 <schema name="dbtest" dataNode="dnTest1">
    05 <table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1" />
    06 schema>
    07
    08 <dataNode name="dnTest1">
    09 <property name="dataSource">
    10 <dataSourceRef>dsTest[0]dataSourceRef>
    11 property>
    12 dataNode>
    13 <dataNode name="dnTest2">
    14 <property name="dataSource">
    15 <dataSourceRef>dsTest[1]dataSourceRef>
    16 property>
    17 dataNode>
    18 <dataNode name="dnTest3">
    19 <property name="dataSource">
    20 <dataSourceRef>dsTest[2]dataSourceRef>
    21 property>
    22 dataNode>
    23
    24 <dataSource name="dsTest" type="mysql">
    25 <property name="location">
    26 <location>192.168.137.8:3306/dbtest1location>
    27 <location>192.168.137.31:3306/dbtest2location>
    28 <location>192.168.137.32:3306/dbtest3location>
    29 property>
    30 <property name="user">cobarproperty>
    31 <property name="password">saproperty>
    32 <property name="sqlMode">STRICT_TRANS_TABLESproperty>
    33 dataSource>
    34cobar:schema>

    server.xml简单配置

    1
    2<cobar:server xmlns:cobar="http://cobar.alibaba.com/">
    3
    4 <user name="root">
    5 <property name="password">saproperty>
    6 <property name="schemas">dbtestproperty>
    7 user>
    8cobar:server>

    rule.xml配置

    01
    02<cobar:rule xmlns:cobar="http://cobar.alibaba.com/">
    03
    04 <tableRule name="rule1">
    05 <rule>
    06 <columns>valcolumns>
    07 <algorithm>algorithm>
    08 rule>
    09 tableRule>
    10
    11 <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong">
    12 <property name="partitionCount">2property>
    13 <property name="partitionLength">512property>
    14 function>
    15
    16 <function name="func2" class="com.alibaba.cobar.route.function.PartitionByString">
    17 <property name="partitionCount">2property>
    18 <property name="partitionLength">512property>
    19 <property name="hashSlice">-5:property>
    20 function>
    21cobar:rule>

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

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

    然后查看输入的日志:

    01yan@yan-Z400:~/cobar-server-1.2.7/logs$ tail -f stdout.log
    0209:57:00,155 INFO Cobar is ready to startup ...
    0309:57:00,155 INFO Startup processors ...
    0409:57:00,198 INFO Startup connector ...
    0509:57:00,202 INFO Initialize dataNodes ...
    0609:57:00,811 INFO dnTest1:0 init success
    0709:57:00,816 INFO dnTest3:0 init success
    0809:57:00,821 INFO dnTest2:0 init success
    0909:57:00,835 INFO CobarManager is started and listening on 9066
    1009:57:00,837 INFO CobarServer is started and listening on 8066
    1109:57:00,837 INFO ===============================================

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

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

    01yan@yan-Z400:~$ mysql -uroot -psa -P8066 -h192.168.137.8
    02Welcome to the MySQL monitor. Commands end with ; or \g.
    03Your MySQL connection id is 1
    04Server version: 5.1.48-cobar-1.2.7 Cobar Server (ALIBABA)
    05
    06Copyright (c) 2000, 2013, Oracle and/or its affiliates. All rights reserved.
    07
    08Oracle is a registered trademark of Oracle Corporation and/or its
    09affiliates. Other names may be trademarks of their respective
    10owners.
    11
    12Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

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

    01#!/usr/bin/env python
    02#coding=utf-8
    03import MySQLdb
    04
    05#连接
    06cxn = MySQLdb.Connect(host='192.168.137.8',port=8066, user = 'root', passwd = 'sa')
    07#游标
    08cur = cxn.cursor()
    09
    10cur.execute("USE dbtest")
    11
    12for i in range(1,200):
    13 cur.execute("INSERT INTO tb2 (val) values ('this is a test record %d')"%i)
    14 print 'insert the %d record into cobar'%i
    15
    16cur.close()
    17cxn.commit()
    18cxn.close()

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

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

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

    (完)

    下载本文
  • 显示全文
    专题