• 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分摊到了两个数据库服务器中。

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

  • 相关阅读:
    爬取动态html网页,requests+execjs
    pycharm2019.2一个奇怪的bugger,执行后输出内容被莫名处理
    博客园啥时候升级了,刚看到
    在浏览器的市场上,IE依然是放弃了,firefox还在继续~~
    jetbrain rider 逐渐完美了,微软要哭了么?
    div层的滑入滑出实例
    关于js的<、>、=、<=、>=的比较
    Jquery实现左右轮播效果
    Html5离线缓存详细讲解
    CANVAS画布与SVG的区别
  • 原文地址:https://www.cnblogs.com/573734817pc/p/10172720.html
Copyright © 2020-2023  润新知