mycat实现mysql数据库的垂直切分

时间:2023-03-09 05:23:48
mycat实现mysql数据库的垂直切分

在我们的工作中可能会遇到数据库的io瓶颈。

这个时候我们应该怎么办呢?

解决办法有很多,我们可以想到的为:数据库集群,主从复制,读写分离,数据库负载均衡,数据库的分库,分表。接下来我们写一下,数据库的垂直分库。

其实我们实现垂直分库目的是为了,能够分摊主数据库的io压力,一般设置分出去的数据库为读,主服务器为写。主服务器和分服务器要实现主从复制的功能,这样就能实现读写分离,均衡数据库io,从而达到解决数据库瓶颈的目的。

怎么实现垂直分库呢?(之前我们得实现主从复制,我之前的文章中有提到,这里不做赘述)这里,我只做了一个数据库的垂直切分为两个,这样相对来说比较清晰,两个以上的类似。

我们使用mycat来实现我们想要的垂直分库功能。

具体步骤如下:

1、利用主从复制,在各个分服务器中同步我们的主数据库的数据。

利用主从关系,在主和从中都设立一个mysql数据库的账户

创建账户:create user im_mycat@'10.0.4.%' identified by '123456';

授权:grant select,update,delete,insert on *.* to im_mycat@'10.0.4.%';

2、启动mycat,修改schema.xml 和server.xml 的配置。

其中schema.xml配置如下:

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

<schema name="imooc_db" checkSQLschema="false" sqlMaxLimit="100">
<table name="mytest" primaryKey="id" dataNode="dn1,dn2" />
</schema>

<dataNode name="dn1" dataHost="mysql4181" database="imooc_db" />
<dataNode name="dn2" dataHost="mysql4183" database="imooc_db" />

<dataHost name="mysql4181" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="10.0.4.181" url="10.0.4.181:3306" user="im_mycat" password="123456"></writeHost>
</dataHost>
<dataHost name="mysql4183" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="10.0.4.183" url="10.0.4.183:3306" user="im_mycat" password="123456"></writeHost>
</dataHost>

</mycat:schema>

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="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="useHandshakeV10">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sequnceHandlerType">0</property>
<property name="serverPort">8066</property>
<property name="managerPort">9066</property>
<property name="idleTimeout">300000</property>
<property name="bindIp">0.0.0.0</property>
<property name="frontWriteQueueSize">2048</property>
<property name="processors">8</property>
<property name="sequnceHandlerType">2</property>

<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->

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

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

<property name="useOffHeapForMerge">1</property>

<property name="memoryPageSize">64k</property>

<property name="spillsFileBufferSize">1k</property>

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

<property name="systemReserveMemorySize">384m</property>

<property name="useZKSwitch">false</property>

</system>

<user name="app_imooc" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">imooc_db</property>  #其中imooc_db为逻辑数据库,也就是schema.xml中配置的
</user>

</mycat:server>

配置好后,从起mycat

mycat restart

利用mycat登录

mysql -uapp_imooc -p123456 -h10.0.4.180 -P8066

我们可看到我们配置好的,切分出去的那个库。

然后我们将从库中多余的表去掉,并把所有的主从复制断开。

通过连接mycat就能操作两个从表了,mycat作为中间件整合我们垂直分开的库。

这样我们就把数据库的io分摊到了两个数据库服务器中。

大概就是下面这幅图的意思。

mycat实现mysql数据库的垂直切分