Cobar部署与测试

Cobar部署与测试

一、Cobar介绍

1.1功能概述:

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

1.1.1 Cobar核心功能:

Ø 分布式:Cobar的分布式主要是通过将表放入不同的库来实现:

1. Cobar支持将一张表水平拆分成多份分别放入不同的库来实现表的水平拆分。

2. Cobar也支持将不同的表放入不同的库。

3. 多数情况下,用户会将以上两种方式混合使用这里需要强调的是,Cobar不支持将一张表,例如test表拆分成test_1, test_2, test_3…..放在同一个库中,必须将拆分后的表分别放入不同的库来实现分布式。

 

Ø HA:

在用户配置了MySQL心跳的情况下,Cobar可以自动向后端连接的MySQL发送心跳,判断MySQL运行状况,一旦运行出现异常,Cobar可以自动切换到备机工作。但需要强调的是:

1. Cobar的主备切换有两种触发方式,一种是用户手动触发,一种是Cobar的心跳语句检测到异常后自动触发。那么,当心跳检测到主机异常,切换到备机,如果主机恢复了,需要用户手动切回主机工作,Cobar不会在主机恢复时自动切换回主机,除非备机的心跳也返回异常。

2. Cobar只检查MySQL主备异常,不关心主备之间的数据同步,因此用户需要在使用Cobar之前在MySQL主备上配置双向同步,详情可以参阅MySQL参考手册。

1.1.2 Cobar的注意事项

1.请注意表的拆分方式,一张表水平拆分多份到不同的库中,而不是放入同一个库中。

2.如果使用HA功能,请在MySQL主备之间配置双向同步

1.1.3目录结构

1.1.3.1基本目录

解压cobar安装包后,可以看到以下目录:

bin #包含Cobar的启动、重启、停止等脚本文件

conf #包含Cobar所有配置文件

lib #包含Cobar及其依赖的jar文件

logs #包含Cobar所有日志文件

1.1.3.2启动脚本

Cobar的所有启动停止脚本全部放在bin目录中,进入bin目录,可以看到:

startup.sh   #Linux环境启动脚本

startup.bat  #Windows环境启动脚本

restart.sh    #Linux环境重启脚本

shutdown.sh #Linux环境停止脚本

1.1.3.3配置文件

Cobar的所有配置文件全部放在conf目录中,进入conf目录,可以看到:

  1. server.xml   #Cobar系统、用户、集群等相关配置
  2. rule.xml     #分布式规则定义
  3. log4j.xml    #日志相关配置
  4. schema.xml  #schema,dataNode,dataSource相关配置,其中:
  5. dataSource:数据源,表示一个具体的数据库连接,与一个物理存在的schema一一对应。
  6. dataNode:数据节点,由主、备数据源,数据源的HA以及连接池共同组成,可以将一个dataNode理解为一个分库。
  7. schema:cobar可以定义包含拆分表的schema(如schema1),也可以定义无拆分表的schema(如schema2)。
1.1.3.4配置文件详解:

略!请见官方文档!!!

二、Cobar配置及安装

下面我们将使用一个最简单的分库分表的例子来说明Cobar的基本用法,数据库schema如下图(该实例也可参考:Cobar产品首页)。

http://www.reader8.cn/uploadfile/jiaocheng/20140149/2854/2014012803542143106.jpg

1.系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。

2.tb1表的数据被映射到物理数据库dbtest1的tb1上。

3.tb2表的一部分数据被映射到物理数据库dbtest2的tb2上,另外一部分数据被映射到物理数据库dbtest3的tb2上。

2.1环境准备

  1. 操作系统:Linux Centos6.7
  2. MySQL:5.5.49版本
  3. JDL:jdk-8u60-linux-x64.tar
  4. Cobar:cobar-server-1.2.7.tar

2.2分布式环境部署

(1)提前安装mysql,并提前在mysql /data/3306实例创建dbtest1库与tb1表,dbtest2库与tb2表,dbtest3库与tb2表,并且授权。

  1. mysql -uroot -poldboy123 -S /data/3306/mysql.sock
  2. mysql> grant all privileges on *.* to 'cobar'@'172.16.1.%' identified by 'oldboy123';
  3. mysql> flush privileges;
  4. create database dbtest1;
  5. create database dbtest2;
  6. create database dbtest3;
  7. use dbtest1;
  8. create table tb1(
  9. id int(4) not null,
  10. name char(20) not null,
  11. age tinyint(2) NOT NULL default '0',
  12. dept varchar(16) default NULL,
  13. primary key(id),
  14. KEY index_name(name)
  15. );
  16. use dbtest2;
  17. create table tb2 (
  18. id int(4) NOT NULL,
  19. name char(20) NOT NULL,
  20. PRIMARY KEY (id)
  21. );
  22. use dbtest3;
  23. create table tb2 (
  24. id int(4) NOT NULL,
  25. name char(20) NOT NULL,
  26. PRIMARY KEY (id)
  27. );

上传jdk和cobar的gz包到/home/oldboy/tools

(2)配置java环境

  1. cd /application/tools/
  2. tar xf jdk-8u60-linux-x64.tar.gz -C /application/
  3. ln -s /application/jdk1.8.0_60 /application/jdk
  4. sed -i.ori '$a export JAVA_HOME=/application/jdk\nexport PATH=$JAVA_HOME/bin:$JAVA_HOME/jre/bin:$PATH\nexport CLASSPATH=.$CLASSPATH:$JAVA_HOME/lib:$JAVA_HOME/jre/lib:$JAVA_HOME/lib/tools.jar' /etc/profile
  5. source /etc/profile

(3)配置cobar环境

  1. cd /home/oldboy/tools
  2. tar xf cobar-server-1.2.7.tar.gz
  3. cp -a cobar-server-1.2.7 /application/
  4. mv /application/cobar-server-1.2.7 /application/cobar
  5. cd /application/cobar/
  6. cd conf

(4)配置cobar配置文件

1.配置schema.xml文件

  1. [root@db02 conf]# cat schema.xml
  2. xml version="1.0" encoding="UTF-8"?>
  3. DOCTYPE cobar:schema SYSTEM "schema.dtd">
  4. <cobar:schema xmlns:cobar="http://cobar.alibaba.com/">
  5.  
  6.  
  7.  <schema name="dbtest" dataNode="dnTest1"> #这条规则意思是dbtest主要映射的是dnTest1库,也就是下面172.16.1.52:3306/dbtest1库
  8.    <table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1" /> #tb2表则是按照规则rule1,被分配到dnTest2库(即172.16.1.52:3306/dbtest2库)和dnTest3库(即172.16.1.52:3306/dbtest3库)中
  9.  schema>
  10.  
  11.  
  12.  <dataNode name="dnTest1"> 
  13.    <property name="dataSource">
  14.      dsTest[0]dataSourceRef>
  15.    property>
  16.  dataNode>
  17.  <dataNode name="dnTest2">
  18.    <property name="dataSource">
  19.      dsTest[1]dataSourceRef>
  20.    property>
  21.  dataNode>
  22.  <dataNode name="dnTest3">
  23.    <property name="dataSource">
  24.      dsTest[2]dataSourceRef>
  25.    property>
  26.  dataNode>
  27.  
  28.  
  29.  <dataSource name="dsTest" type="mysql">
  30.    <property name="location">
  31.      172.16.1.52:3306/dbtest1location> #数据库的IP和端口号
  32.      172.16.1.52:3306/dbtest2location>
  33.      172.16.1.52:3306/dbtest3location>
  34.    property>
  35.    <property name="user">cobarproperty> #数据库给cobar的用户名
  36.    <property name="password">oldboy123property> #数据库给cobar的密码
  37.    <property name="sqlMode">STRICT_TRANS_TABLESproperty>
  38.  dataSource>
  39.  
  40. cobar:schema>

2.配置rule.xml文件

  1. [root@db02 conf]# cat rule.xml
  2. xml version="1.0" encoding="UTF-8"?>
  3. DOCTYPE cobar:rule SYSTEM "rule.dtd">
  4. <cobar:rule xmlns:cobar="http://cobar.alibaba.com/">
  5.  
  6.  
  7.  <tableRule name="rule1">
  8.    
  9.      idcolumns>
  10.      CDATA[ func1(${id}) ]]>algorithm>
  11.    rule>
  12.  tableRule>
  13.  
  14.  
  15.  <function name="func1" class="com.alibaba.cobar.route.function.PartitionByLong">
  16.    <property name="partitionCount">2property> #需要注意的就是这两行,对数据库插入大于512的会存储至dnTest3对应的库表中
  17.    <property name="partitionLength">512property>
  18.  function>
  19.  
  20. cobar:rule>
  21. 3.配置server.xml文件
  22. [root@db02 conf]# cat server.xml
  23. xml version="1.0" encoding="UTF-8"?>
  24. DOCTYPE cobar:server SYSTEM "server.dtd">
  25. <cobar:server xmlns:cobar="http://cobar.alibaba.com/">
  26.  
  27.  
  28.  
  29.  
  30.  
  31.  <user name="cobar">
  32.    <property name="password">oldboy123property>
  33.    <property name="schemas">dbtestproperty>
  34.  user>
  35.  
  36.  
  37.  
  38.  
  39.   
  40.  
  41.  
  42.  
  43. cobar:server>
  44. #这里定义的帐号密码就是命令行登录数据库的帐号密码

登录命令:

  1. mysql -ucobar -poldboy123 -h172.16.1.52 -P8066

上面的说明:用户就是server.xml定义的用户cobar,密码也是配置文件里面的密码,cobar是用8066端口登录的,这个也是启用的java进程的端口号。

2.3分库分表测试阶段

  1. 启动cobar:
  2. /application/cobar/bin/startup.sh
  3. 查看启动结果:
  4. [root@db02 conf]# ps -ef|grep cobar
  5. root    10219    1 0 18:17 ?       00:00:16 /application/jdk/bin/java -Dcobar.home=/application/cobar -classpath /application/cobar/conf:/application/cobar/lib/classes:/application/cobar/lib/cobar-server-1.2.7.jar:/application/cobar/lib/log4j-1.2.16.jar -server -Xms1024m -Xmx1024m -Xmn256m -Xss256k -XX:+AggressiveOpts -XX:+UseBiasedLocking -XX:+UseFastAccessorMethods -XX:+DisableExplicitGC -XX:+UseParNewGC -XX:+UseConcMarkSweepGC -XX:+CMSParallelRemarkEnabled -XX:+UseCMSCompactAtFullCollection -XX:+UseCMSInitiatingOccupancyOnly -XX:CMSInitiatingOccupancyFraction=75 com.alibaba.cobar.CobarStartup
  6. root    10251    1 0 18:47 ?       00:00:00 grep --color=auto cobar
  7. [root@db02 conf]# netstat -tulnap |grep 8066
  8. tcp6      0     0 :::8066                :::*                   LISTEN     10219/java
  9. 使用cobar登录,简单测试一下:
  10. [root@db02 conf]# mysql -ucobar -poldboy123 -h172.16.1.52 -P8066
  11. 进入数据库执行测试操作:
  12. mysql> show databases;
  13. +----------+
  14. | DATABASE |
  15. +----------+
  16. | dbtest  |
  17. +----------+
  18. mysql> use dbtest;
  19. Database changed
  20. mysql> show tables;
  21. +------------------+
  22. | Tables_in_dbtest |
  23. +------------------+
  24. | tb2             |
  25. | tb1             |
  26. +------------------+
  27. mysql> insert into tb2(id,name) values(55,'oldgirl');  
  28. mysql> insert into tb2(id,name) values(520,'oldboy');   #520大于512,因此会被存储到3306实例的dbtest3库的tb2表下
  29. mysql> quit
  30. 然后进入3306实例里面查看:
  31. [root@db02 conf]# mysql -uroot -poldboy123 -S /data/3306/mysql.sock
  32. mysql> show databases;
  33. +--------------------+
  34. | Database          |
  35. +--------------------+
  36. | information_schema |
  37. | dbtest            |
  38. | dbtest1           |
  39. | dbtest2           |
  40. | dbtest3           |
  41. | mysql             |
  42. | oldboy            |
  43. | performance_schema |
  44. +--------------------+
  45. mysql> use dbtest3
  46. Database changed
  47. mysql> show tables;
  48. +-------------------+
  49. | Tables_in_dbtest3 |
  50. +-------------------+
  51. | tb2              |
  52. +-------------------+
  53. mysql> select * from tb2;
  54. +-----+--------+
  55. | id | name  |
  56. +-----+--------+
  57. | 520 | oldboy |
  58. +-----+--------+
  59. 果然只有520存储到3306实例的dbtest3库的tb2表下

 

添加一个实例测试:

  1. 启动新实例:
  2. [root@db02 conf]# data/3308/mysql start
  3. 登录数据库:
  4. [root@db02 conf]# mysql -uroot -poldboy123 -S /data/3308/mysql.sock
  5. mysql> grant all privileges on *.* to 'cobar'@'172.16.1.%' identified by 'oldboy123';
  6. mysql> flush privileges;
  7. create database dbtest1;
  8. create database dbtest2;
  9. create database dbtest3;
  10. use dbtest1;
  11. create table tb1(
  12. id int(4) not null,
  13. name char(20) not null,
  14. age tinyint(2) NOT NULL default '0',
  15. dept varchar(16) default NULL,
  16. primary key(id),
  17. KEY index_name(name)
  18. );
  19. use dbtest2;
  20. create table tb2 (
  21. id int(4) NOT NULL,
  22. name char(20) NOT NULL,
  23. PRIMARY KEY (id)
  24. );
  25. use dbtest3;
  26. create table tb2 (
  27. id int(4) NOT NULL,
  28. name char(20) NOT NULL,
  29. PRIMARY KEY (id)
  30. );
  31. 修改cobar的schema.xml配置文件:
  32. [root@db02 conf]# cat schema.xml
  33. xml version="1.0" encoding="UTF-8"?>
  34. DOCTYPE cobar:schema SYSTEM "schema.dtd">
  35. <cobar:schema xmlns:cobar="http://cobar.alibaba.com/">
  36.  
  37. <schema name="dbtest" dataNode="dnTest1">
  38. <table name="tb2" dataNode="dnTest2,dnTest3" rule="rule1" />
  39. schema>
  40.  
  41. <dataNode name="dnTest1">
  42. <property name="dataSource">
  43. dsTest[0]dataSourceRef>
  44. property>
  45. dataNode>
  46. <dataNode name="dnTest2">
  47. <property name="dataSource">
  48. dsTest[1]dataSourceRef>
  49. property>
  50. dataNode>
  51. <dataNode name="dnTest3">
  52. <property name="dataSource">
  53. dsTest[2]dataSourceRef>
  54. property>
  55. dataNode>
  56.  
  57. <dataSource name="dsTest" type="mysql">
  58. <property name="location">
  59. 172.16.1.52:3306/dbtest1location>
  60. 172.16.1.52:3306/dbtest2location>
  61. 172.16.1.52:3308/dbtest3location>
  62. property>
  63. <property name="user">cobarproperty>
  64. <property name="password">oldboy123property>
  65. <property name="sqlMode">STRICT_TRANS_TABLESproperty>
  66. dataSource>
  67.  
  68. cobar:schema>

在登录cobar用户:

  1. [root@db02 conf]# mysql -ucobar -poldboy123 -h172.16.1.52 -P8066

mysql> insert into tb2(id,name) values(555,’qiangge’);

!!!!!#在插入信息的时候一定要在表名后面加(id,name),不然不能实现分布式储存的,只会同时写入两个表中,以至于成为双写。

再登录3308实例查看是否555,’qiangge’插入到dbtest3的tb2中:

  1. [root@db02 conf]# mysql -uroot -poldboy123 -S /data/3308/mysql.sock
  2. mysql> use dbtest3;
  3. mysql> select * from tb2;
  4. +-----+----------+
  5. | id| name    |
  6. +-----+----------+
  7. | 555 | qiangge2 |
  8. +-----+----------+

本文转载老男孩28期赵天宇分享

「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
MySQL
MySQL
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论