Mycat

重要概念

  • 逻辑库(db_user)
    数据库中间件可以被看做是一个或多个数据库集群构成的逻辑库

  • 逻辑表(db_user里的表)

    • 分片表(用户表)
      —> 是指那些原有的很大数据的表,需要切分到多个数据库的表
    • 全局表(数据字典)
      —> 数据不常变,数据量不大,跟其他表都有一些关联关系,被拷贝到各个分片上。比如数据字典表
    • ER表(用户地址表)
      —> 描述跟分片表的关联关系,与相同ID的分片表在同一个分片上,解决夸库join的问题
    • 非分片表(系统配置表、短信模板表)
      —> 非分片是相对分片表来说的,就是那些不需要进行数据切分的表,数据来源于某一个节点
  • 分片规则
    按照某种业务规则把数据分到某个分片的规则就是分片规则

  • 分片节点
    数据切分后,一个大表被分到不同的分片数据库上面,每个表分片所在的数据库就是分片节点(dataNode)

  • 节点主机
    数据切分后,每个分片节点(dataNode)不一定都会独占一台机器,同一机器上面可以有多个分片数据库,这样一个或多个分片节点(dataNode)所在的机器就是节点主机(dataHost),为了规避单节点主机并发数限制,尽量将读写压力高的分片节点(dataNode)均衡的放在不同的节点主机(dataHost)

mycat配置文件

conf目录下存放配置文件:

  • server.xml 是mycat参数调整和用户授权的配置文件,默认监听端口8066、9066
  • schema.xml 是逻辑库、逻辑表定义及分配引用的配置文件
  • rule.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">autopartition-long.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就是只读

主键自增

  • 在对表进行分库分表时,如果主键设置为自增,插入数据时,不同库的同一名称的表会出现主键重复问题, 需要利用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值

  • 上面生成自增主键的方法,必须注意数据库的存储过程本身无法保证其原子性,因此该问题不得不由我们应用程序的事务或加锁来解决,而这样的办法会使生成ID的效率大打折扣。如果不嫌麻烦的话可以考虑用乐观锁去解决那样效率会高一些。

schema.xml 配置示例

  • 单库大表拆分
  • 跨库分表
  • 读写分离

mycat集群部署架构图

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值