第一步:下载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数据库
请参考文章http://bangbangba.blog.bitsCN.com/3180873/1703972 的第二步,不过Cobar不需要gtid支持,因此gtid相关的配置可选,如果是MariaDB,这几行是不需要配的,此处我们使用的是MariaDB-10.1。
我们配置9个数据库用于测试
作用 地址 端口 数据文件路径 配置文件路径
分片1 192.168.1.8 14011 /dev/shm/data/co11 cobra/co11.cnf
分片2 192.168.1.8 14021 /dev/shm/data/co21 cobra/co21.cnf
分片3 192.168.1.8 14031 /dev/shm/data/co31 cobra/co31.cnf
分片4 192.168.1.8 14041 /dev/shm/data/co41 cobra/co41.cnf
备份1 192.168.1.8 14051 /dev/shm/data/co51 cobra/co51.cnf
备份2 192.168.1.8 14061 /dev/shm/data/co61 cobra/co61.cnf
备份3 192.168.1.8 14071 /dev/shm/data/co71 cobra/co71.cnf
备份4 192.168.1.8 14081 /dev/shm/data/co81 cobra/co81.cnf
不分片 192.168.1.8 14091 /dev/shm/data/co91 cobra/co91.cnf
编辑好co11.cnf ~ co91.cnf 这9个配置文件,执行init_start.sh即可全部初始化好并启动。这里之所以配置为ip而不是localhost或127.0.0.1是为了后面集群做准备。
第三步:部署Cobar
Cobar只有配置文件,没有其他的元数据,因此关键就在于配置文件的修改,下载的包里面有一个例子配置文件,我们在此基础上做修改。我们第一次先只使用分片1~4,后面的4个等下再使用。
首先我们修改schema.
配置好schema.
可以看到ruleLong规则中用到funcLong函数,funcLong函数在下面定义,注意所有函数定义都需要在规则下面,partitionCount * partitionLength必须等于1024,否则无法启动。
然后是server.
另外还有个配置文件log4j.
我们的配置文件都已准备好,然后就启动吧
$ 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中的一行。
1
# 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),
然后合并数据返回。
我们可以用explain命令查看cobar的拆分情况。这个命令只是语法分析,不会到mysql中执行。
MySQL [lyw]> explain select * from h1 where id in (256, 900, 901);
+-----------+-----------------------------------------+
| DATA_NODE | SQL |
+-----------+-----------------------------------------+
| dn1 | SELECT * FROM h1 WHERE id IN (256) |
| dn3 | SELECT * FROM h1 WHERE id IN (900, 901) |
+-----------+-----------------------------------------+
2 rows in set (0.00 sec)
Cobar是不支持事务的,begin命令就不可以运行,很多操作尽量使用语句内原子操作。比如
update h1 set a=a+1 where id = 2;
而不是先读出数据,再修改。拆成两条就需要事务支持才安全了。
Cobar支持多库同时操作,但只是在多个库分别执行后,一起返回数据而已,我们试下下面的几个语句
MySQL [lyw]> select * from h1 limit 1;
+-----+------+
| id | v |
+-----+------+
| 600 | dd |
| 256 | cc |
| 1 | aa |
| 900 | ee |
+-----+------+
我们是想要得到一条数据,而实际上是得到4条,并且是每个库中一条,因此这样的结果并不符合我们的初衷,所以对于分页这样的操作用cobar并不合适。大家还可以去试下sort, group,join等操作,以及他们的组合操作,都是如此。
那Cobar合适的是什么呢?cobar最合适的就是单行的操作,另外还有in这样的多行操作。或者其他只需要一个库就能搞定的操作。这也是需要我们在设计表结构的时候多下工夫才行。
第五步:多种分片方式配置
前面讲了一个按照数字进行hash分片的例子。cobar自身提供了4种分片方法,分别是PartitionByLong,PartitionByString,PartitionByFileMap,Dimension2PartitionFunction。每种方法需要配置的参数都不同
PartitionByString 按字符串hash分片
我们需要修改rule.
其中hashSlice的含义是字符串的哪几个字符进行hash运算,例子中:12表示前面的12个字符进行运算,另外还有负数表示法,表示从后面开始数。
在schema.
1