在我们的工作中可能会遇到数据库的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数据库的垂直切分的更多相关文章

  1. Windows版Mycat结合mysql安装配置+水平切分(转载)

    来源:https://segmentfault.com/a/1190000009495748 参考文档:Mycat安装与使用 环境 环境 版本 windows 10 java 1.8.0 mysql ...

  2. 利用mycat实现mysql数据库读写分离

    1.这里是在mysql主从复制实现的基础上,利用mycat做读写分离,架构图如下: 2.Demo 2.1 在mysql master上创建数据库创建db1 2.2 在数据库db1创建表student ...

  3. Mycat实现Mysql数据库读写分离

    Linux和Windows环境下搭建Mycat数据读写分离 前提需要:1.服务器装有JVM虚拟机,就是JDK.2.两个Mysql数据库已经实现主从复制,参考:https://www.cnblogs.c ...

  4. windows系统下使用mycat实现mysql数据库的主从复制,从而实现负载均衡

    在之前有记录过在一台系统中安装多台数据库,同时实现主从复制,但是那个主从复制只是一个基于dosc命令的,再实际的开发中我们不会去直接连接数据库,一般情况下我们也是通过间接的采用一些中间件去连接,本来是 ...

  5. mycat分布式mysql中间件(数据库切分概述)[转]

    mysql数据库切分 前言 通 过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制,一旦数据库过于庞大,尤其是当写入过于频繁,很难由一台主机支撑的时 候,我们还是会面临到扩展 ...

  6. mysql数据库切分

    一.数据的垂直切分概念:数据的垂直切分,也可以称之为纵向切分.将不同的表分散到不同的数据库主机中.一个应用系统,总体功能肯定是由很多个功能模块所组成的,而每一个功能模块所需要的数据对应到数据库中就是一 ...

  7. 使用MYCAT作为Mysql HA的中间件(转)

    记得在上一篇文章“Java集群--大型网站是怎样解决多用户高并发访问的”的结尾处本人阐述了数据库的高可用的一种方案----实现主从部署,那么今天,就让我聊聊本人关于数据库的一些所思所想吧! 下面是本人 ...

  8. mysql数据库分库分表(Sharding)

    mysql数据库切分 前言 通过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制.一旦数据库过于庞大,尤其是当写入过于频繁,非常难由一台主机支撑的时候,我们还是会面临到扩展瓶 ...

  9. mysql数据库分库分表(Sharding)(转)

    mysql数据库切分 前言 通过MySQLReplication功能所实现的扩展总是会受到数据库大小的限制.一旦数据库过于庞大,尤其是当写入过于频繁,非常难由一台主机支撑的时候,我们还是会面临到扩展瓶 ...

随机推荐

  1. sap component 导航 链接

    1: 定义一个导航链接名字,这个名子如果在程序中遇到(该名字会在程序中使用),就会触发这样一个导航. 导航有两个view,一个原来的view,一个出发abc之后的target view,也就是目标视图 ...

  2. 116A

    #include <stdio.h> int main() { int n; int a1,a2; int min=0; int cap=0; scanf("%d",& ...

  3. (转)Docker镜像构建上下文(Context)

    镜像构建上下文(Context) Docker在构建镜像时,如果注意,会看到 docker build 命令最后有一个 ... 表示当前目录,而 Dockerfile 就在当前目录,因此不少初学者以为 ...

  4. DLNg[结构化ML项目]第二周迁移学习+多任务学习

    1.迁移学习 比如要训练一个放射科图片识别系统,但是图片非常少,那么可以先在有大量其他图片的训练集上进行训练,比如猫狗植物等的图片,这样训练好模型之后就可以转移到放射科图片上,模型已经从其他图片中学习 ...

  5. [LeetCode] 1. Two Sum_Easy

    Given an array of integers, return indices of the two numbers such that they add up to a specific ta ...

  6. php 实现php代码的加密解密

    php 代码加密类,大家可以根据自己的需求进行修改,原类如下,是对之前的加密解密类的有一次修改,希望能分享给大家.本次在ubuntu下测试没有问题,与之前的版本的区别在于,这次的版本更加的通用性. & ...

  7. python string method

    嗯,学习其它语言没这样全练过,嘻嘻 //test.py 1 # -*- coding: UTF-8 -*- 2 3 str = "i am worker" 4 print str. ...

  8. Hibernate.基础篇《一》.Hibernate工具类.

    Hibernate.基础篇<一>.Hibernate工具类. 话述: Hibernate.基础篇第一篇,前面是代码.后面再加理论&实践. Hibernate使用的版本是:5.x,在 ...

  9. 记dynamic的一个小坑 -- RuntimeBinderException:“object”未包含“xxx”的定义

    from:http://blog.csdn.net/feiyun0112/article/details/39697955 创建一个控制台程序和一个类库, 在控制台创建一个匿名对象,然后再在类库中访问 ...

  10. JS实例2

    进度条 <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8 ...