欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

MyCat - 数据库中间插件

程序员文章站 2022-10-30 21:58:58
什么是MyCat 是目前最流行的分布式数据库中间插件 为什么使用MyCat 如今随着互联网的发展,数据的量级也是撑指数的增长,从GB到TB到PB。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候NoSQL的出现暂时解决了这一危机。它通过降低数据的安全性 ......

什么是mycat

是目前最流行的分布式数据库中间插件

为什么使用mycat

如今随着互联网的发展,数据的量级也是撑指数的增长,从gb到tb到pb。对数据的各种操作也是愈加的困难,传统的关系性数据库已经无法满足快速查询与插入数据的需求。这个时候nosql的出现暂时解决了这一危机。它通过降低数据的安全性,减少对事务的支持,减少对复杂查询的支持,来获取性能上的提升。

但是,在有些场合nosql一些折衷是无法满足使用场景的,就比如有些使用场景是绝对要有事务与安全指标的。这个时候nosql肯定是无法满足的,所以还是需要使用关系性数据库。如何使用关系型数据库解决海量存储的问题呢?此时就需要做数据库集群,为了提高查询性能将一个数据库的数据分散到不同的数据库中存储,为应对此问题就出现了——mycat

• 综上所述:mycat作用为:能满足数据库数据大量存储;提高了查询性能

原理 

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

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

分片

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

• 垂直切片

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

• 水平切片

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

水平分片【最常用的,因此用这个】

mycat通过定义表的分片规则来实现分片,每个表格可以捆绑一个分片规则,每个分片规则指定一个分片字段并绑定一个函数,来实现动态分片算法

• 1.schema:逻辑库,与mysql中的database(数据库)对应,一个逻辑库中定义了所包括的table。

• 2.table:逻辑表,即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点datanode。在此可以指定表的分片规则。

• 3.datanode:mycat的逻辑数据节点,是存放table的具体物理节点,也称之为分片节点,通过datasource来关联到后端某个具体数据库上

• 4.datasource:定义某个物理库的访问地址,用于捆绑到datanode上

配置文件详解

 mycat主要有3个配置文件,rule.xml,schema.xml和server.xml

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">autopartitionlong.txt</property>
</function>
name:标识算法的名字
class:指定路由算法具体的类名字
property:具体算法用到的一些属性

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节点

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就是只读 

常见分片算法

枚举法

<tablerule name="sharding-by-intfile">
    <rule>
      <columns>user_id</columns>
      <algorithm>hash-int</algorithm>
    </rule>
  </tablerule>
<function name="hash-int" class="io.mycat.route.function.partitionbyfilemap">
    <property name="mapfile">partition-hash-int.txt</property>
    <property name="type">0</property>
    <property name="defaultnode">0</property>
  </function> 

partition-hash-int.txt 配置: 

10000=0
10010=1

上面columns 标识将要分片的表字段,algorithm 分片函数,

其中分片函数配置中,mapfile标识配置文件名称,type默认值为0,0表示integer,非零表示string,

所有的节点配置都是从0开始,及0代表节点1

defaultnode: 默认节点:小于0表示不设置默认节点,大于等于0表示设置默认节点,结点为指定的值


默认节点的作用:枚举分片时,如果碰到不识别的枚举值,就让它路由到默认节点
               

如果不配置默认节点(defaultnode值小于0表示不配置默认节点),碰到
不识别的枚举值就会报错 :like this:can't find datanode for sharding column:column_name val:ffffffff

固定分片hash算法

<tablerule name="rule1">
    <rule>
      <columns>user_id</columns>
      <algorithm>func1</algorithm>
    </rule>
</tablerule>
 
  <function name="func1" class="io.mycat.route.function.partitionbylong">
    <property name="partitioncount">2,1</property>
    <property name="partitionlength">256,512</property>
  </function>

配置说明:

上面columns 标识将要分片的表字段,algorithm 分片函数,

partitioncount 分片个数列表,partitionlength 分片范围列表
分区长度:默认为最大2^n=1024 ,即最大支持1024分区

约束 : count,length两个数组的长度必须是一致的。
1024 = sum((count[i]*length[i])). count和length两个向量的点积恒等于1024

求模法

<tablerule name="mod-long">
    <rule>
      <columns>user_id</columns>
      <algorithm>mod-long</algorithm>
    </rule>
  </tablerule>
  <function name="mod-long" class="io.mycat.route.function.partitionbymod">
   <!-- how many data nodes  -->
    <property name="count">3</property>
  </function>

配置说明:
上面columns 标识将要分片的表字段,algorithm 分片函数,
此种配置非常明确即根据id与count(你的结点数)进行求模预算,相比方式1,此种在批量插入时需要切换数据源,id不连续