Mycat 笔记 3:垂直拆分

 

1. 开始

假定有一个业务数据库,里面有 10 个表,
随着业务量的增加,其中的 table1 和 table2 数据量不断增大,压力比较高,
其余 8 个表数据量不是很大,

这个时候可以准备 3 个数据节点,
table1 放到节点 1,
table2 放到节点 2,
其余的 8 个表就放在节点 3,

然后通过 mycat 将这三个节点的数据组合起来,形成一个逻辑库,
应用就通过逻辑库来访问相应的数据。

 
如上,
将 table 1 的数据导入到 table1 节点的物理数据库上,
将 table 2 的数据导入到 table2 节点的物理数据库上,
其余表的数据导入到 table3 节点的物理数据库,
由此,
前两个节点都只有 1 个表的数据,如果登录物理数据库查看仅能看见这一个表,

这些节点的数据通过 mycat 的逻辑库连接在一起,登录 mycat 查看的时候,能看见所有的表,
前端通过 mycat 访问的时候,感知不到这些表已经分开。

 

2. 实验结构

此处采用 2 个分片(sharding,也就是上面绿框)来实验,

world 数据库中有 3 个数据表:city,country,countrylanguage 三个表,
需要将 city 表和 country 表挪到分片 1,countrylanguage 表需要挪到分片 2
具体架构如下:

 

如上,
如上一篇文章描述,一个 sharding 的架构是双主双从,

sharding 1 的的双主双从建立在 192.168.0.100 和 192.168.0.101,
每个机器各跑两个 mysql 实例。

sharding 2 的的双主双从建立在 192.168.0.190 和 192.168.0.191,
两个机器各跑两个 mysql 实例。

 

也可以两台主机,每台主机上跑 4 个 mysql 实例,如下:

 

3. 搭建

主从关系搭建(略)

  • mycat 的配置文件中写的用来连接各实例的账号,不要忘记创建

  • 搭建后测试连接,从 mycat 节点使用配置的账号访问每一个实例,确保可以连接

  • sharding 1 对应的实例中需要有 world.city,world.country;sharding 2 对应的实例需要有 world.countrylanguage

 

4. mycat 配置文件

这里修改 TESTDB 这个逻辑库名为 logical_world,server.xml 和 schema.xml 中对应的地方都修改。

server.xml

<user name="root" defaultAccount="true">
        <property name="password">123456</property>
        <property name="schemas">logical_world</property>
        <property name="defaultSchema">logical_world</property>
</user>

<user name="mycat">
        <property name="password">123456</property>
        <property name="schemas">logical_world</property>
        <property name="defaultSchema">logical_world</property>
</user>

 

schema.xml

<schema name="logical_world" checkSQLschema="false" sqlMaxLimit="100" 
        dataNode="sharding1">
    <table name="city,country" dataNode="sharding1"> </table>
    <table name="countrylanguage" dataNode="sharding2"> </table>
</schema>

<dataNode name="sharding1" dataHost="sharding1_2m2s" database="world" />
<dataNode name="sharding2" dataHost="sharding2_2m2s" database="world" />

<dataHost name="sharding1_2m2s" maxCon="1000" minCon="10" balance="1"  
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  
        slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.0.100:3306" user="root" password="123456">
        <readHost host="hostS1" url="192.168.0.100:3307" password="123456" user="root" />
    </writeHost>
    <writeHost host="hostM2" url="192.168.0.101:3306" user="root" password="123456">
        <readHost host="hostS2" url="192.168.0.101:3307" password="123456" user="root" />
    </writeHost>
</dataHost>

<dataHost name="sharding2_2m2s" maxCon="1000" minCon="10" balance="1"  
        writeType="0" dbType="mysql" dbDriver="native" switchType="1"  
        slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM3" url="192.168.0.190:3306" user="root" password="123456">
        <readHost host="hostS3" url="192.168.0.190:3307" password="123456" user="root" />
    </writeHost>
    <writeHost host="hostM4" url="192.168.0.191:3306" user="root" password="123456">
        <readHost host="hostS4" url="192.168.0.191:3307" password="123456" user="root" />
    </writeHost>

</dataHost>

 

  • <schema> 标签

schema 标签的 dataNode="sharding1" 指定默认的分片节点,
如果有很多表的话,没有单独指定分片的表就走这个分片

  • <table>标签

相比较前面的例子,添加上了 <table> 标签
table 标签的两个属性,name 和 dataNode
指明了要访问的表走哪一个分片节点,name 可以指定多个表,逗号分隔

  • <dataHost> 标签

因为有两个分片,所以有两个 <dataHost> 标签

 

5. 测试

关于逻辑库

 
如上,
在 mysql 实例中,都只有部分表,如
sharding1 的实例中只有 city 和 country 表
sharding2 的实例中只有 countrylanguage 表
但是 mycat 的逻辑库 logical_world 中,3 个表都能看到。

 

6. 分库需要注意的问题

稍后

posted @ 2022-05-06 13:57  牛顿撕鸡  阅读(48)  评论(0编辑  收藏  举报