美文网首页数据库技术
mysql 数据库水平切分

mysql 数据库水平切分

作者: 一生悬命Cat | 来源:发表于2019-03-18 15:50 被阅读22次

小编按照以下顺序,逐步描述水平切分 的有关信息。
1.数据库切分原因
2.数据库切分原理
3.mycat切分配置
4.防止跨分片,父子表的实现
5.分片实现集群
6.水平切分优缺点
1.切分原因
当我们数据量太大的时候,即使用了垂直切分,还没呢解决我们的服务器瓶颈的时候,就需要按照数据量来划分数据,实现分散负载效果。
2.数据库切分原理

水平.jpg
在垂直分片的基础上:
1.上图分为 原始单机单节点数据库 与 使用mycat中间件 实现的数据库垂直切分两个部分。
2.单机单节点难以承受压力,故使用mycat中间件进行切分, 生成虚拟逻辑库 ,里面包含虚拟逻辑表
3.虚拟逻辑表通过节点 分别连接 真实数据库 来实现分散负载效果
添加水平切割:
4.实现垂直后,我们任然感受到压力,故继续在虚拟表中增加节点 ,按照一定的算法 ,把数据分到每一个分片中
3.mycat切分配置
1. schema.conf (逻辑数据库)
2. server.conf (设置用户)
3. rule.conf(设置规则)

schema.conf

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
    <!--配置数据表-->
    <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
        <table name="t_user" dataNode="dn1,dn2" rule="mod-long" />
    </schema>
    <!--配置分片关系-->
    <dataNode name="dn1" dataHost="cluster1" database="test" />
    <dataNode name="dn2" dataHost="cluster2" database="test" />
    <!--配置连接信息-->
    <dataHost name="cluster1" maxCon="1000" minCon="10" balance="2" 
                writeType="1" dbType="mysql" dbDriver="native" switchType="1"  
                slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="W1" url="192.168.99.151:3306" user="admin" 
                     password="Abc_123456">
            <readHost host="W1R1" url="192.168.99.159:3306" user="admin" 
                        password="Abc_123456" />
            <readHost host="W1R2" url="192.168.99.215:3306" user="admin" 
                        password="Abc_123456" />
        </writeHost>
        <writeHost host="W2" url="192.168.99.159:3306" user="admin" 
                     password="Abc_123456">
            <readHost host="W2R1" url="192.168.99.151:3306" user="admin" 
                        password="Abc_123456" />
            <readHost host="W2R2" url="192.168.99.215:3306" user="admin" 
                        password="Abc_123456" />
        </writeHost>
    </dataHost>
    <dataHost name="cluster2" maxCon="1000" minCon="10" balance="2" 
                writeType="1" dbType="mysql" dbDriver="native" switchType="1"  
                slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="W1" url="192.168.99.121:3306" user="admin"
                   password="Abc_123456">
            <readHost host="W1R1" url="192.168.99.122:3306" user="admin" 
                        password="Abc_123456" />
            <readHost host="W1R2" url="192.168.99.123:3306" user="admin" 
                        password="Abc_123456" />
        </writeHost>
        <writeHost host="W2" url="192.168.99.122:3306" user="admin"
                   password="Abc_123456">
            <readHost host="W2R1" url="192.168.99.121:3306" user="admin" 
                        password="Abc_123456" />
            <readHost host="W2R2" url="192.168.99.123:3306" user="admin" 
                        password="Abc_123456" />
        </writeHost>
    </dataHost>
</mycat:schema>

server .conf

<?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>
        <property name="useHandshakeV10">1</property>
        <property name="useSqlStat">0</property>
        <property name="useGlobleTableCheck">0</property>
        <property name="sequnceHandlerType">2</property>
        <property name="subqueryRelationshipCheck">false</property>
        <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>
    <!--这里是设置的admin用户和虚拟逻辑库-->
    <user name="admin" defaultAccount="true">
        <property name="password">Abc_123456</property>
        <property name="schemas">test</property>
    </user>
</mycat:server>

rule.conf

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    <property name="count">2</property>
</function>

4.防止跨分片,父子表的实现
由于不能跨分片查询,所以最好的办法就是做父子表

<table name="t_customer" dataNode="dn1,dn2" rule="sharding-customer">
    <childTable name="t_orders" primaryKey="ID" joinKey="customer_id"   
                parentKey="id"/>
</table>

5.分片实现集群

为了让分片能够实现读写分离,加强数据库的负载能力,故使用数据库主从复制功能实现

首先为每个分片 搭建数据库集群 (详细参考我的replication复制 或者 PXC集群搭建文章)

replication 复制方法 教程
www.jianshu.com/p/6ab29651d2bd
PXC 复制方法 教程
www.jianshu.com/p/59404ae4bb0e

然后在schema 中设置dataHost 增加读写分配功能

<dataHost name ="mysql146" maxCon="1000" minCon="10" balance="3"  writeType="0" dbType="mysql" dbDriver="native" switchType="1">
  <heartbeat> select user() </heartbeat>
  <writeHost host="192.168.1.146" url="192.168.1.146:3306" user="root" password="password" >
      <readHost host="xx.xx.xx.xx" url="xx.xx.xx.xx:3306" user="root" password="123456" />
      <readHost host="xx.xx.xx.xx" url="xx.xx.xx.xx:3306" user="root" password="123456" />
      <readHost host="xx.xx.xx.xx" url="xx.xx.xx.xx:3306" user="root" password="123456" />
  </writeHost>
</dataHost>

6.水平切分优缺点
优点:
1.不存在单库大数据和高并发的性能瓶颈
2.提高了系统的稳定性和负载能力
缺点:
分片事务一致性难以解决
跨节点Join性能差,逻辑复杂

相关文章

  • mysql分库分表

    课程内容 mysql分区 水平切分 垂直切分 1. mysql分区 1.1 什么是分区? mysql数据库中的数据...

  • mysql 数据库水平切分

    小编按照以下顺序,逐步描述水平切分 的有关信息。1.数据库切分原因2.数据库切分原理3.mycat切分配置4.防止...

  • MySQL水平切分

    【转载】原文见http://zhengdl126.iteye.com/blog/419850 第1章 引言随着互...

  • 2018-04-02 java中常用的中间件

    myCat 用于切分mysql数据库(为什么要切分:当数据量过大时,mysql查询效率变低)ActiveMQ,ka...

  • 多key业务,数据库水平切分架构一次搞定

    数据库水平切分是一个很有意思的话题,不同业务类型,数据库水平切分的方法不同。 本篇将以“订单中心”为例,介绍“多k...

  • mysql数据库优化 摘要

    数据库优化 sql语句优化 索引优化 加缓存 读写分离 分区 分布式数据库(垂直切分) 水平切分 MyISAM和I...

  • 互联网公司为啥都不用MySQL分区表?

    潜在场景如何? 当MySQL单表的数据量过大时,数据库的访问速度会下降,“数据量大”问题的常见解决方案是“水平切分...

  • 数据库的垂直切分与水平切分

    1. 为什么要拆分数据库? 单体项目在构建之初,数据库的负载和数据量都不大,所以不需要对数据库做拆分,小型财务系统...

  • mysql数据库 垂直切分

    小编按照以下顺序,逐步描述垂直切分 的有关信息。1.数据库切分原因2.数据库切分原理3.mycat切分配置4.跨分...

  • 基于Mycat的MySQL水平分库分表

    分库分表分库分表分为垂直切分和水平切分:垂直分库:把整个系统划分为不同的业务模块,根据业务模块把数据库系统划分为不...

网友评论

    本文标题:mysql 数据库水平切分

    本文链接:https://www.haomeiwen.com/subject/lhtbmqtx.html