【MyCat】分库分表

1.什么是MyCat

  是目前最流行的分布式数据库中间插件,更多解释见官网

2.为什么使用MyCat

  如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。但是,在有些场合NoSQL一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候NoSQL肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储,为应对此问题就出现了——MyCat
  综上所述:Mycat作用为:能满足数据库数据大量存储;提高了查询性能

3.支持的数据库

  mysql,sqlserver,mongoDB等

4.架构

  前端用户可以把mycat看作是一个数据库代理,用mysql客户端工具(如Navicat)和命令访问,而后端支持mysql,sqlserver,oracle等主流数据库,用mysql native 协议和多个mysql服务器通信,也可用JDBC协议与大多数主流数据库服务器通信,其核心功能就是分库分表,即将一个大表水平分割为N个小表,真正的存储在后端Mysql服务器中或其它数据库中

  mycat原理:可以用“拦截”一词形容,它拦截了用户发送过来的SQL语句,首先对SQL语句做了一些特定的分析,如分片分析,路由分析,读写分离分析,缓存分析等,然后将此sql发往后端的真实数据库,并将返回的结果做适当处理,最终返回给用户

5.分片

  数据库分片指:通过某种特定的条件,将我们存放在一个数据库中的数据分散存放在不同的多个数据库(主机)中,这样来达到分散单台设备的负载,根据切片规则,可分为以下两种切片模式:

 5.1垂直切片

  将不同的表切分到不同的数据库中

 5.2水平切片

  将同一种表按照某种条件切分到不同的数据库中(这种方式最常用)

  MyCAT通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法
  1.Schema:逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。
  2.Table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则。
  3.DataNode:MyCAT的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过DataSource来关联到后端某个具体数据库上
  4.DataSource:定义某个物理库的访问地址,用于捆绑到Datanode上

6.配置文件详解

  mycat主要有3个配置文件,rule.xml,schema.xml和server.xml,这主要对这3个文件作讲解

 6.1 rule.xml

  该文件主要定义了分片的规则,这个文件里面主要有tableRule和function这两个标签。在具体使用过程中可以按照需求添加tableRule和function

tableRule标签:

<tableRule name="auto-sharding-long">
	<rule>
		<columns>id</columns>
		<algorithm>rang-long</algorithm>
	</rule>
</tableRule>

  name:用户标识不同的分表规则
  columns:指定按哪一列进行拆分
  algorithm:该属性值为下面function标签中name的属性值,定义了连接表规则的具体的路由算法,多个表规则可以连接到同一个路由算法上

function标签:

<function name="rang-long"
	class="org.opencloudb.route.function.AutoPartitionByLong">
	<property name="mapFile">autopartition-long.txt</property>
</function>

  name:标识算法的名字
  class:指定路由算法具体的类名字
  property:具体算法用到的一些属性


 6.2 schema.xml

  该文件是MyCat中重要的配置文件之一,管理着MyCat的逻辑库、表、分片规则、DataNode以及DataSource

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
	<schema name="e3mall" checkSQLschema="false" sqlMaxLimit="100">
		<table name="tb_item" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
	</schema>
	<dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />
	<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
		writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<writeHost host="hostM1" url="192.168.20.216:3306" user="root"
			password="root">
		</writeHost>
	</dataHost>
</mycat:schema>

  schema标签:定义mycat实例中的逻辑库
  table标签:定义mycat实例中的逻辑表
  dataNode标签:定义mycat中的数据节点,也是通常说的数据分片
  dataHost标签:作为最底层标签存在,定义了具体的真正存放数据的数据库实例,读写分离配置和心跳语句,我这只用来一台主键,所以只配了一个dataHost,如果你配了N个主机,就要配N个dataHost节点
  具体讲解如图(网上借用):
这里写图片描述


 6.3 server.xml

<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
	<system>
	<property name="defaultSqlParser">druidparser</property>
	</system>
	<user name="user">
		<property name="password">user</property>
		<property name="schemas">e3mall</property>
		<property name="readOnly">false</property>
	</user>
</mycat:server>

  system标签:内嵌的所有property标签都与系统配置有关
    defaultSqlParser:指定默认的解析器(如解析sql),目前的可用的取值有:druidparser和 fdbparser。使用的时候可以选择其中的一种,目前一般都使用druidparser

  user标签
    name:逻辑用户名,即登录mycat的用户名
    password:逻辑密码,即登录mycat的用户名对应的密码
    schemas:逻辑数据库,可配置多个,用英文逗号隔开,对应于schema.xml文件中配置的逻辑数据库,两者对应
    readOnly:该数据库是否为只读,如果true就是只读

7.安装

  环境准备:mysql,安装步骤:Linux中在线安装MySQL数据库

  第一步:把MyCat的压缩包上传到linux服务器
  第二步:解压缩 tar zxf 压缩包名称
  第三步:进入mycat/bin目录
  第四步:启动命令:./mycat start
      停止命令:./mycat stop
      重启命令:./mycat restart

8.遇到的问题

 8.1 对表操作或点击表时,报1184 错误

  解决办法:修改mycat的service.xml文件,将readobly属性去掉
readonly初始时为true,因为我们要对文件进行写,我就想改为false就行了,结果运行时就出现了1184错误,将它去掉就可以了,但又出现了问题2

<property name="readOnly">false</property>

  此设置即该数据库是否为只读(就是只能读数据呗),我改为false,就是不是只读呗,就是我可以就行写等其它操作呗,不知道为什么会出现上面错误,但我解决了问题2后,在把该句添上就又可以了,也不报错了,奇怪。。。

## 8.2 创建表时,报3309错误

  解决办法:schema.xml文件写错了,数据源database写的是db1,但是实际在数据库中建的叫d1,所以mycat找不到配置的数据源db1,所以报错了
	<dataNode name="dn1" dataHost="localhost1" database="db1" />

9.测试

  我们用的auto-sharding-long分片策略,经测试,每个表只能容5000000数据,我们一个用了3个节点,所以只能存15000000条数据,多余15000000条时就会报错存不进去

10.遇到的问题

  其实在分库分表后会遇到好多问题,如分布式事务,分页等问题https://www.jianshu.com/p/32b3e91aa22c?from=timeline

10.1 主键自增

  在对表进行分库分表时,如果主键设置为自增,插入数据时,不同库的同一名称的表会出现主键重复问题, 需要利用mycat的主键唯一去处理。 从MyCAT 1.3开始,支持自增长主键,依赖于全局序列号机制,建议采用数据库方式的全局序列号,并正确设置步长,以免影响实际性能。
  首先要开启数据库方式的全局序列号,对于需要定义自增长主键的表,建立对应的全局序列号,与table名称同名大写。但暂不支持主键为null。具体实现参见:https://blog.csdn.net/l1994m/article/details/88641809 ,下面只说一下实现的思路:

  1. 首先在server.xml设置主键的生成方式<property name="sequnceHandlerType">1</property>
  2. 在分表的table上设置主键自增 <table name=”CUSTOMER” autoIncrement=”true”>
  3. 创建生成主键的逻辑表,并插入数据,数据包括:自增主键的表名,初始值,步长
  4. 在其中一个库上执行3个函数分别为:获取当前sequence值,设置sequence值,获取下一个sequence值

10.2 跨库分页

10.3 分布式事务

  这些问题还有待研究中。。。

©️2020 CSDN 皮肤主题: 大白 设计师: CSDN官方博客 返回首页
实付0元
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值