分类: Mysql/postgreSQL
2013-03-26 22:53:39
原文地址:淘宝MySQL分布式处理系统Cobar部署 作者:fengzhanhai
Cobar是关系型数据的分布式处理系统,它可以在分布式的环境下看上去像传统数据库一样为您提供海量数据服务。
1) 该产品在阿里巴巴B2B公司已经稳定运行了3+年;
2) 目前已经接管了3000+个MySQL数据库的schema,为应用提供数据服务;
3) 据统计cobar集群目前平均每天处理近50亿次的SQL执行请求。
二、本次测试场景描述
1)系统对外提供的数据库名是dbtest,并且其中有两张表tb1和tb2。
2)tb1表的数据被映射到物理数据库dbsdtv1的tb1上。
3)tb2表的一部分数据被映射到物理数据库dbsdtv2的tb2上,另外一部分数据被映射到物理数据库dbsdtv3的tb2上。
如下图1.1所示:
图1.1模型图
三、实施步骤
操作系统: Linux(CentOS5.8)
MySQL: (推荐使用5.1以上版本)
JDK: (推荐使用1.6以上版本)
Cobar: (下载tar.gz)
MySQL所在服务器IP为10.0.211.5,192.168.202.83,192.168.202.84,端口为3306,用户名为root,密码为123abc,我们需要创建schema:dbtest1、dbtest2、dbtest3,table:tb1、tb2。创建脚本如下:
1、在10.0.211.5服务器上创建数据库dbsdtv1;
create database dbsdtv1;
use dbsdtv1;
create table tb1( id int not null, gmt datetime);
2、在192.168.202.83服务器上创建数据库dbsdtv2;
create database dbsdtv2;
use dbsdtv2;
create table tb2( id int not null, val varchar(256));
3、在192.168.202.84服务器上创建数据库dbsdtv2;
create database dbsdtv2;
use dbsdtv2;
create table tb2( id int not null, val varchar(256));
1)#安装JDK1.6以上版本程序
./ jdk-6u37-linux-x64.bin
2)#配置JAVA环境变量
echo “JAVA_HOME=/usr/local/jdk1.6.0_37
export JAVA_HOME
PATH=$JAVA_HOME/bin:$PATH
export PATH
CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar
export CLASSPATH” >>/etc/profile
source /etc/profile
退出ssh再重新登录输入命令java –version 验证jre环境是否以正确配置
3)下载Cobar压缩文件并解压,进入conf目录可以看到schema.xml, rule.xml, server.xml等相关的配置文件
#wget
# tar -zxf cobar-server-1.2.4.tar.gz
# cd cobar-server-1.2.4
#可以看到bin,conf,lib,logs四个目录
4)schema.xml配置如下(注:schema.xml包含MySQL的IP、端口、用户名、密码等配置,您需要按照注释替换为您的MySQL信息)
5)rule.xml配置如下(本文仅以数字类型的id字段作为拆分字段,将数据拆分到两个库中)
配置需要分发到几个分区上(服务器)-->
分发数据的长度 -->
6)server.xml配置如下
./startup.sh #Cobar进程名为CobarStartup
#使用lsof –i :8066查看进程是否存在如果存在该进程则证明cobar以正常启动
#一般情况下首次启动会报错这时需要调整startup.sh脚本中的xss参数,将该参数调大一些。
· 如何访问Cobar
访问Cobar同访问MySQL的方式相同,常用访问方式如下(注意:本文将Cobar部署在10.0.0.11这台机器上,否则请替换为您的Cobar所在IP,其他信息不变)
mysql -h10.0.0.11 -utest -ptest -P8066 -Ddbtest
#JDBC(建议5.1以上的mysql driver版本) Class.forName("com.mysql.jdbc.Driver"); Connection conn = DriverManager.getConnection("jdbc:mysql:// 10.0.0.11:8066/dbtest", "test", "test"); ......
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同时插入多条数据
#此次根据rule.xml的设计规则id小于512的均插入分区1.大于512的插入分区2(服务器2)
mysql>select * from tb1; #查询表tb1,验证数据被成功插入
mysql>select * from tb2; #查询tb2,验证数据被成功插入
查看后端MySQL数据库dbsdtv1,dbsdtv2和dbsdtv3#验证数据分布在不同的库中