Mycat之数据库分片(分片枚举)-yellowcong

枚举分片,简单来讲,就是根据某个值,决定这条数据放到哪一个库里面。我现在有个需求,我有很多用户,根据地址来放到数据库,三个数据库,湖北、北京、上海。实现的步骤:1、创建数据库,2、配置schema.xml文件,3、配置server.xml,4、添加rule.xml,5.添加partition-hash-int-local.txt (文件名和你自己定义rule.xml中配置的一致,不是固定的),设定分片策略。

创建数据库

-- 创建数据库
create database local1;
-- 使用local1数据库
use local1;
-- 创建用户表
create table user (dbname varchar(32),username varchar(32),province varchar(16),age int(3));

create database local2;
use local2;
create table user (dbname varchar(32),username varchar(32),province varchar(16),age int(3));

create database local3;
use local3;
create table user (dbname varchar(32),username varchar(32),province varchar(16),age int(3));

查看建立好的表结构
这里写图片描述

配置mycat

1、配置schema.xml

vim ./conf/schema.xml

#添加表
#通过这种$的方法,解决了有很多数据库的情况
#jdbc_node$1-3 ,表示的是jdbc_node、jdbc_node、jdbc_node3
<table name="user" dataNode="jdbc_node$1-3" rule="sharding-by-intfile-local"/>

完整配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="yellowcong" checkSQLschema="true" sqlMaxLimit="100">
                <table name="user" dataNode="jdbc_node$1-3" rule="sharding-by-intfile-local"/>
        </schema>

        <dataNode name="jdbc_node1" dataHost="localhost" database="local1" />
        <dataNode name="jdbc_node2" dataHost="localhost" database="local2" />
        <dataNode name="jdbc_node3" dataHost="localhost" database="local3" />

        <dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="host" url="127.0.0.1:3306" user="root" password="root"/>
        </dataHost>
</mycat:schema>

2、配置server.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
        <system>
        <property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
        <property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

                <property name="sequnceHandlerType">2</property>

                <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
                <property name="processorBufferPoolType">0</property>           
                <!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
                <property name="handleDistributedTransactions">0</property>

                        <!--
                        off heap for merge/order/group/limit      1开启   0关闭
                -->
                <property name="useOffHeapForMerge">1</property>

                <!--
                        单位为m
                -->
                <property name="memoryPageSize">1m</property>

                <!--
                        单位为k
                -->
                <property name="spillsFileBufferSize">1k</property>

                <property name="useStreamOutput">0</property>

                <!--
                        单位为m
                -->
                <property name="systemReserveMemorySize">384m</property>


                <!--是否采用zookeeper协调切换  -->
                <property name="useZKSwitch">true</property>


        </system>

        <user name="root">
                <property name="password">root</property>
                <property name="schemas">yellowcong</property>

        </user>

        <user name="user">
                <property name="password">user</property>
                <property name="schemas">yellowcong</property>
                <property name="readOnly">true</property>
        </user>

</mycat:server>

3、配置rule.xml

vim ./conf/rule.xml

#添加rule ,
#设置通过province 这个字段进行分片
<tableRule name="sharding-by-intfile-local">
             <rule>
                     <columns>province</columns>
                     <algorithm>hash-int-local</algorithm>
             </rule>
</tableRule>

#添加hash-int-local 的配置
#mapFile 匹配的文件
#type 类型 ,1表示字符串,0表示是int类型
#defaultNode 默认的节点 ,小于0表示不设置默认节点,大于等于0表示设置默认节点
<function name="hash-int-local"
    class="io.mycat.route.function.PartitionByFileMap">
           <property name="mapFile">partition-hash-int-local.txt</property>
           <property name="type">1</property>
           <property name="defaultNode">0</property>
 </function>

这里写图片描述

添加partition-hash-int-local.txt

#添加这个自定义的分片
vim ./conf/partition-hash-int-local.txt

#添加配置
hubei=0
beijing=1
shanghai=2

这里写图片描述

测试插入数据

#连接mycat 
mysql -h 127.0.0.1 -P 8066 -u root -proot

#使用yellowcong 数据库
use yellowcong 

#插入数据
insert into user (dbname,username,province,age) values (database(),'yellowcong','hubei',12);

insert into user (dbname,username,province,age) values (database(),'yellowcong2','beijing',12);

insert into user (dbname,username,province,age) values (database(),'yellowcong3','shanghai',12);

#插入一条不属于他们任何一个的分类的数据
insert into user (dbname,username,province,age) values (database(),'yellowcong3','haerbin',12);

我们在匹配的时候,设定了默认数据库,如果都不满足,就会直接插入默认的数据库中,我们在rule.xml中配置了默认数据库为 local1,所以那条haerbin的匹配不上,就跑到了默认节点里面了。
这里写图片描述

问题集合

io.mycat.config.util.ConfigException: java.lang.NullPointerException

这个问题的原因,多半就是节点不存在的情况。简单来讲,就是表的节点配置有问题
这里写图片描述

检查节点配置
这里写图片描述

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

狂飙的yellowcong

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值