数据库技术

mysql 数据库水平切分

2019-03-18  本文已影响22人  一生悬命Cat

小编按照以下顺序,逐步描述水平切分 的有关信息。
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性能差,逻辑复杂

上一篇下一篇

猜你喜欢

热点阅读