mysql 数据库水平切分
2019-03-18 本文已影响22人
一生悬命Cat
小编按照以下顺序,逐步描述水平切分 的有关信息。
1.数据库切分原因
2.数据库切分原理
3.mycat切分配置
4.防止跨分片,父子表的实现
5.分片实现集群
6.水平切分优缺点
1.切分原因
当我们数据量太大的时候,即使用了垂直切分,还没呢解决我们的服务器瓶颈的时候,就需要按照数据量来划分数据,实现分散负载效果。
2.数据库切分原理
在垂直分片的基础上:
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性能差,逻辑复杂