Cobar是taobao公司用java开发的分布式MySQL中间件,可以支持数据的分片,且接口与mysql相同,因此可以无缝切换。并且不仅支持Mysql,而且还支持MariaDB哦,对版本的要求也很低,只要5.1以上就可以了。如果公司有较多的java项目,推荐使用。我们就来试试Cobar的集群搭建吧。
第一步:下载Cobar
现在可以从两个官方地址下载,一个是github上:https://github.com/alibaba/cobar? 可以下载源码,也可以直接下载编译好的包https://github.com/alibaba/cobar/releases
淘宝现在的开源网站也有:http://code.taobao.org/p/cloud-cobar/src/
两个地方下载的目录结构稍有不同,但目前内容基本一样,且都可以运行,您可以自行选择。本例子所用版本为1.2.7。
第二步:安装多个MySQL数据库
第三步:部署Cobar
Cobar只有配置文件,没有其他的元数据,因此关键就在于配置文件的修改,下载的包里面有一个例子配置文件,我们在此基础上做修改。我们第一次先只使用分片1~4,后面的4个等下再使用。
首先我们修改schema.xml,我的内容如下
?
?
? ?
?
?
?
? ?
? ? ? ds[0]
? ?
?
?
? ?
? ? ? ds[1]
? ?
?
?
? ?
? ? ? ds[2]
? ?
?
?
? ?
? ? ? ds[3]
? ?
?
?
?
? ?
? ? ? ds[8]
? ?
?
?
?
? ?
? ? ? 192.168.1.8:14011/lyw
? ? ? 192.168.1.8:14021/lyw
? ? ? 192.168.1.8:14031/lyw
? ? ? 192.168.1.8:14041/lyw
? ? ? 192.168.1.8:14051/lyw
? ? ? 192.168.1.8:14061/lyw
? ? ? 192.168.1.8:14071/lyw
? ? ? 192.168.1.8:14081/lyw
? ? ? 192.168.1.8:14091/lyw
? ?
? ? lyw
? ? 123456
? ? STRICT_TRANS_TABLES
?
配置好schema.xml后,我们可以看到里面有个字段rule="ruleLong",这个ruleLong的具体内容是配置在rule.xml文件中,我们这里的配置如下
?
?
?
? ?
? ? ? id
? ? ?
? ?
?
? ?
?
?
? ? class="com.alibaba.cobar.route.function.PartitionByLong">
? ? 4
? ? 256
?
?
可以看到ruleLong规则中用到funcLong函数,funcLong函数在下面定义,注意所有函数定义都需要在规则下面,partitionCount * partitionLength必须等于1024,否则无法启动。
然后是server.xml,这个文件修改下用户名密码就可以了,其他用默认参数。
? ?
?
? ? 123456
? ? lyw
?
另外还有个配置文件log4j.xml,无需修改。
我们的配置文件都已准备好,然后就启动吧
$ bin/startup.sh
$ jps
15894 CobarStartup
15946 Jps
$ netstat -nlp|grep java
tcp6? ? ? 0? ? ? 0 :::8066? ? ? ? ? ? ? ? :::*? ? ? ? ? ? ? ? ? ? LISTEN? ? ? 15894/java? ? ?
tcp6? ? ? 0? ? ? 0 :::9066? ? ? ? ? ? ? ? :::*? ? ? ? ? ? ? ? ? ? LISTEN? ? ? 15894/java
java7下可以直接启动,如果时java8需要注释掉startup.sh中的一行。? ? ?
# JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSCompactAtFullCollection"
请检查下进程是否启动,如果配置有误是无法启动的。启动后,我们可以看到已经开启了两个端口,8066和9066,其中8066是用于数据读写等操作的,9066是用于cobar自身管理的。我们迫不及待的要去试下了。
第四步:使用Cobar
lyw@lywd:~/db/mariadb-10.1$ bin/mysql -ulyw -p123456 -h127.0.0.1 -P8066
MySQL [(none)]> show databases;
+----------+
| DATABASE |
+----------+
| lyw? ? ? |
+----------+
1 row in set (0.04 sec)
MySQL [(none)]> use lyw;
Database changed
MySQL [lyw]> show tables;
Empty set (0.00 sec)
MySQL [lyw]> create table h1 (id int primary key, v varchar(32));
Query OK, 0 rows affected (0.01 sec)
MySQL [lyw]> insert into h1 (id, v) values(1, 'aa'), (2, '2'), (256, 'cc'), (600,'dd'),(900, 'ee'), (1000, 'ff');
Query OK, 6 rows affected (0.02 sec)
Records: 2? Duplicates: 0? Warnings: 0
MySQL [lyw]> select * from h1;
+------+------+
| id? | v? ? |
+------+------+
|? 256 | cc? |
|? 900 | ee? |
| 1000 | ff? |
|? 600 | dd? |
|? ? 1 | aa? |
|? ? 2 | 2? ? |
+------+------+
6 rows in set (0.00 sec)
MySQL [lyw]> select * from h1 where id = 256;
+-----+------+
| id? | v? ? |
+-----+------+
| 256 | cc? |
+-----+------+
1 row in set (0.00 sec)
MySQL [lyw]> select * from h1 where id in (256, 900, 901);
+-----+------+
| id? | v? ? |
+-----+------+
| 256 | cc? |
| 900 | ee? |
+-----+------+
2 rows in set (0.00 sec)
最后返回的结果看起来有点乱,并且每次执行这样的select语句,顺序都会不同,这是因为我们插入的这6条数据已经根据ruleLong的规则分散在了4个数据库中,返回的时候cobar只是简单的合并,并没有排序。我们这时候可以到4个库中分别查询,每个库都只包含其中的一部分数据。
注意:前面的insert语句中指定了列名(id, v),这是必须的,否则会将数据插入到所有数据库中去,即插入1条等于插入4条。
select * from h1 where id = 256;? 这行查询语句指定了id = 256,因此cobar会计算256这个值是在哪个数据库(第二个)因此这条语句只会在第二个数据库中查找
select * from h1 where id in (256, 900, 901);? 这行查询语句指定了两个id,cobar会计算这些id都属于哪个库,然后去对应的库查询,实际上会变成两个语句,
在第二个库执行select * from h1 where id in (256),
在第四个库执行select * from h1 where id in (900, 901),
然后合并数据返回。
我们可以用ex