二撩小姐姐MYCAT

Posted 海鲨数据库架构师

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了二撩小姐姐MYCAT相关的知识,希望对你有一定的参考价值。

这次撩她的分身术! 

看我的SCHEMA


<?xml version="1.0"?>

<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">

 <!-- 逻辑表配置 -->

           <table name="studet" dataNode="dn1,dn2" rule="auto-sharding-long"/>

           <table name="class"  primaryKey="id" type="global" dataNode="dn1,dn2" />

        </schema>


 <!-- 分片配置 -->

        <dataNode name="dn1" dataHost="zabbix" database="mycat" />

        <dataNode name="dn2" dataHost="dev" database="mycat" />



<!-- 物理数据库配置 -->

        <dataHost name="zabbix" maxCon="1000" minCon="10" balance="0"

                          writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">

               <heartbeat>select user();</heartbeat>

                <writeHost host="zabbix8" url="10.0.8.6:3306" user="root" password="123456">

                </writeHost>

        </dataHost>


         <dataHost name="dev" maxCon="1000" minCon="10" balance="0"

                   writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">

                <heartbeat>select user();</heartbeat>

                <writeHost host="dev75" url="10.0.7.5:3306" user="root" password="123456">

                </writeHost>

        </dataHost>

</mycat:schema>


设置默认表存放节点DN1, 设置表STUDET 存放在两个表,分片规则是auto-sharding-log。另外设置了个全局表 class。

这里遇到小姐姐发脾气,说什么 datanode不能小写 必须符合JAVA范。还无理取闹地抛异常 而且是NULL异常。

Caused by: java.lang.NullPointerException

io.mycat.config.loader.xml.XMLSchemaLoader.getDbType(XMLSchemaLoader.java:462)

io.mycat.config.loader.xml.XMLSchemaLoader.loadTables(XMLSchemaLoader.java:384)

io.mycat.config.loader.xml.XMLSchemaLoader.loadSchemas(XMLSchemaLoader.java:168)

io.mycat.config.loader.xml.XMLSchemaLoader.load(XMLSchemaLoader.java:117)

这要懂女人的JAVA思维模式 load -> loadSchemas->loadTables->getDbType 发脾气原因链。检查了下物理配置MYSQL节点是没有错的呀! 哎女人就是这样子,让你猜!最后发现在这里

<table name="studet" dataNode="dn1,dne2"   多打个字符。我比较讨厌JAVA。XML配置。因为双引号里的字符输错了,很难发现,报错提示也不精确。

还是喜欢传统的女人!


搞定了后再上。。。。

Caused by: io.mycat.config.util.ConfigException: Illegal table conf : table [ STUDET ] rule function [ rang-long ] partition size : 3 > table datanode size : 2, please make sure table datanode size = function partition size

默认的分片是分为3片,而我就设置了2个库。然后我又填了个新库,可以正常启动。 如果要修改分片规则,则需要修改rule.xml和其中对应的规则文件。

意思说着这个分片规则需要3个逻辑节点! 你妹啊


看看rule.xml配置情况

。。。。

<tableRule name="auto-sharding-long">

<rule>

<columns>id</columns>

<algorithm>rang-long</algorithm>

</rule>

</tableRule>

。。。。

rule.xml 前部分都是这样的分片规则,规则名,分片字段,分片算法

name 属性指定唯一的名字,用于标识不同的表规则。内嵌的 rule 标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。
columns 内指定要拆分的列名字。
algorithm 使用 function 标签中的 name 属性。连接表规则和具体路由算法。当然,多个表规则可以连接到
同一个路由算法上。 table 标签内使用。让逻辑表使用这个规则进行分片

<funcrang-longtion name="rang-long"

class="io.mycat.route.function.AutoPartitionByLong">

<property name="mapFile">autopartition-long.txt</property>

</function>

name 指定算法的名字。

class 制定路由算法具体的类名字。
property 为具体算法需要用到的一些属性。
修改分片规则,这样高深的事情,要等与小姐姐感情深了再说,现在再添加个物理节点。

三个库,其中两个库建了表,第3个没有建表。

[SQL]INSERT INTO studet (NAME) VALUES('Shark');

[Err] 1064 - bad insert sql (sharding column:ID not provided,INSERT INTO studet (NAME)

VALUES ('Shark')


需要添加ID进去

[SQL]INSERT INTO studet (id,NAME) VALUES(1,'Shark');

受影响的行: 1

时间: 0.023s


发现插入到了ZABBIX物理机上,然后连续插了4笔,都插在这台物理机上了。什么情况啊? 查看下分片规则如下

[root@DBA_ZABBIX conf]# cat autopartition-long.txt

# range start-end ,data node index

# K=1000,M=10000.

0-500M=0

500M-1000M=1

1000M-1500M=2[root@DBA_ZABBIX conf]#

0-500万 放到第一个分片节点上。


丢没想到小姐姐的这脾气!


换个分片规则,看看MOD-LOG

        <tableRule name="mod-long">

                <rule>

                        <columns>id</columns>

                        <algorithm>mod-long</algorithm>

                </rule>

        </tableRule>


<function name="mod-long" class="io.mycat.route.function.PartitionByMod">

                <!-- how many data nodes -->

                <property name="count">3</property>

        </function>


  <table name="studet" dataNode="dn1,dn2,dn3" rule="mod-long"/>



[SQL]INSERT INTO studet (id,NAME) VALUES(5,'ZabbixBigx');

[Err] 1146 - Table 'mycat.studet' doesn't exist


啥意思呢? 哦 第三个库没有建该表,那就建一个表!然后5就插入成功了。

先把第一个库的1-4个学生清空,然后再插入

INSERT INTO studet (id,NAME) VALUES

(1,'Shark'),

(2,'Dog'),

(3,'Big'),

(4,'Bigx');


分别看插到哪些库:



同学3被放到了ZABBIX节点上

二撩小姐姐MYCAT

同学1和4被放到Dev节点上

二撩小姐姐MYCAT

同学2和5放在GanDai节点上


然后在MYCAT前端工具

select * from mycat.studet

返回的数据是按照 各个分片节点 结果集拼接回来的。

二撩小姐姐MYCAT


总结下:对要分片的表,需要了解合适的分片算法,以及该算法分片字段,还有了解分片算法需要起步的节点数,每个节点都要建好对应的表,最后了解分片算法的值拆分范围。



以上是关于二撩小姐姐MYCAT的主要内容,如果未能解决你的问题,请参考以下文章

MycatMycat核心开发者带你看尽Mycat三大核心配置文件!!

请问谁有姐姐们的slam dunk e08的网盘资源可以共享。谢谢。

如何用MATLAB为小姐姐跳舞视频增添另一个小姐姐跳舞进度条

如何用MATLAB为小姐姐跳舞视频增添另一个小姐姐跳舞进度条

开发小姐姐点的七夕限定青蛙服务,马上安排!

手把手教姐姐写消息队列