MySQL分片高可用集群之Cobar部署使用(3)

最后返回的结果看起来有点乱,并且每次执行这样的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.xml文件,如下部分,记得所有的tableRule 在所有的function前面

<tableRule>

<rule>

<columns>id</columns>

<algorithm><![CDATA[ funcString(${id}) ]]></algorithm>

</rule>

</tableRule>

<function

>

<property>4</property>

<property>256</property>

<property>:12</property>

</function>

其中hashSlice的含义是字符串的哪几个字符进行hash运算,例子中:12表示前面的12个字符进行运算,另外还有负数表示法,表示从后面开始数。
在schema.xml增加一个表格

1
 

<table dataNode="dn0,dn1,dn2,dn3" rule="ruleString" />


配置好后,我们可以用集群管理的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文件,如下部分,

<tableRule>

<rule>

<columns>district </columns>

<algorithm><![CDATA[ funcFileMap(${id}) ]]></algorithm>

</rule>

</tableRule>

<function

>

<property>/home/lyw/file_map.txt</property>

<property>0</property>

</function>

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增加一个表格 

<table dataNode="dn0,dn1,dn2,dn3" rule="ruleFileMap" />

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/c28903e8abfd246b63014d434c8319eb.html