plain命令查看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.xml文件,如下部分,记得所有的tableRule 在所有的function前面
?
? ?
? ? ? id
? ? ?
? ?
?
?
?
? ? class="com.alibaba.cobar.route.function.PartitionByString">
? ? 4
? ? 256
? ? :12
?
其中hashSlice的含义是字符串的哪几个字符进行hash运算,例子中:12表示前面的12个字符进行运算,另外还有负数表示法,表示从后面开始数。
在schema.xml增加一个表格
?
1
?
配置好后,我们可以用集群管理的reload方法热更新配置文件。(注意端口是9066)
bin/mysql -ulyw -p123456 -h127.0.0.1 -P 9066
MySQL [(none)]> reload @@config;
Query OK, 1 row affected (0.02 sec)
Reload config success
PartitionByFileMap 按文件内容分片
我们需要修改rule.xml文件,如下部分,
?
? ?
? ? ? district
? ? ?
? ?
?
?
? ? class="com.alibaba.cobar.route.function.PartitionByFileMap">
? ? /home/lyw/file_map.txt
? ? 0
?
rule.xml中fileMapPath字段我们指定了一个配置文件/home/lyw/file_map.txt,这个文件内容的格式是k=v结构,k是分片的字符串,v是节点序号(不是hash值)。内容如下,您可自己多写一些。
a=0
b=1
c=2
d=3
。。。。。。
defaultNode 字段表示如果key值不在这个配置文件中,那么将数据存储在这个节点中。
然后我们还要在schema.xml增加一个表格?
只有字符串完整地属于配置文件中,才算匹配到,不是前缀,如例子中只有a,b,c,d可以找到对应的节点,其他任何值都将放入默认节点。因此这种方式一般不是用于id等主键字段,而是其他种类有限的字段,如国家、省份等。
Dimension2PartitionFunction 二维分片
二维分片有两个维度,都需要配置,因此配置内容较多
rule.xml:
? ?
? ? ? id, id2
? ? ?
? ?
? ?
? ? ? id
? ? ?
? ?
? ?
? ? ? id2
? ? ?
? ?
?
?
? ? class="com.alibaba.cobar.route.function.Dimension2PartitionFunction">
? ? string
? ? 2
? ? 512
? ? :12
? ? long
? ? 2
? ? 512
?
从rule.xml文件中我们看到tableRule配置了三个rule,其中第一个规则是有两个参数的,后两个规则只有一个参数,这3个rule不是必须全配置,但是要实现只匹配一个维度的话,就需要配置,否则当查询语句中只有一个维度的key时会进行所有库的执行,效率不高。
函数需要指定两个维度,字符串和数字都可以,其他类型目前不支持。
同样schema.xml增加一个表格?
如果需要二维分片,集群规模一般要相当大了,比如8*8=64,否则采用二维分片的意义不大。
第六步:Cobar自身集群配置
前面配置的cobar只是在一台机器上运行,而运行时cobar需要的资源是比较多的,一台cobar可以拖3台左右mysql服务器,而实际上只要用到cobar,mysql数量都在8台以上,所以需要多个cobar支撑,集群相关的内容在server.xml中配置,
? ?
? ? ? 192.168.1.8
? ? ? 1
? ?
? ?
? ? ? 192.168.1.9
? ? ? 1
? ?
? ?
? ? ? 192.168.1.10
? ? ? 1
? ?
?
每增加一台机器就多配置一个node,然后将这个配置文件复制到每台cobar电脑上,并启动。这时我们在任意一台电脑上用下面的命令查看活着的集群(宕机的节点不会显示)
MySQL [lyw]> show cobar_cluster;
+--------------+--------+
| HOST? ? ? ? | WEIGHT |
+--------------+--------+
| 192.168.1.8? |? ? ? 1 |
| 192.168.1.9? |? ? ? 1 |
| 192.168.1.10 |? ? ? 1 |
+--------------+--------+
3 rows in set (0.00 sec)
此处虽然有host和weight两个值,但是cobar并没有做负载均衡相关的具体事情,只是告诉客户端,cobar集群的运行情况,让客户端自己制定负载均衡策略。
第七步:Cobar自身管理
前面讲的是数据操作,用的是8066端口,cobar提供集群管理功能默认用的是9066端口
bin/mysql -ulyw -p123456 -h127.0.0.1 -P9066
MySQL [(none