Catalog
  1. 1. Mycat简单学习
    1. 1.1. 简介
    2. 1.2. 使用Mycat之后的架构图
    3. 1.3. 使用Mycat之后的优势
      1. 1.3.1. 数据量级
      2. 1.3.2. 开源性质
    4. 1.4. Mycat中的概念
      1. 1.4.1. 一、切分
      2. 1.4.2. 1.1 纵向切分/垂直切分
      3. 1.4.3. 1.2 横向切分/水平切分
      4. 1.4.4. 二、逻辑库-Schema
      5. 1.4.5. 三、逻辑表-Table
      6. 1.4.6. 四、默认端口
      7. 1.4.7. 五、数据主机-DataHost
      8. 1.4.8. 六、数据节点-DataNode
      9. 1.4.9. 七、分片规则
    5. 1.5. Mycat的使用
      1. 1.5.1. 1.读写分离
      2. 1.5.2. 2.主从备份概念
    6. 1.6. Mycat配置文件
      1. 1.6.1. server.xml
      2. 1.6.2. schema.xml
      3. 1.6.3. rule.xml
Mycat简单学习

Mycat简单学习

简介

Mycat是一个开源的分布式数据库系统,但是由于真正的数据库需要存储引擎,而Mycat并没有存储引擎,所以并不是完全意义的分布式数据库系统。

mycat是一个数据库中间件,也可以理解为是数据库代理。在架构体系中是位于数据库和应用层之间的一个组件,并且对于应用层是透明的,即数据库感受不到mycat的存在,认为是直接连接的mysql数据库(实际上是连接的mycat,mycat实现了mysql的原生协议)

总结:MyCat是目前最流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离。

mycat的三大功能:分表,读写分离,主从切换

使用Mycat之后的架构图

使用Mycat之后的优势

数据量级

单一的Mysql数据存储量和操作量级有限,Mycat可以管理若干Mysql数据库,可以实现数据库的存储和操作。

开源性质

Mycat是Java编写的中间件,开源,免费,有非常多的人和组织对Mycat实行开发、维护、管理、更新。Mycat是阿里原应用corba转型而来的。

Mycat中的概念

一、切分

逻辑上的切分,在物理层面使用多库,多表实现切分。

1.1 纵向切分/垂直切分

就是把原来存储在一个库中的数据存储在多个库上,由于数据库的读写都是对同一个库进行操作,所以单库并不能解决大规模并发写入的问题。例如:我们会建立定义数据库workDB、商品数据库payDB,用户数据库userDB、日志数据库logDB等。

优点:

  • 减少增量数据写入时的锁对查询的影响。
  • 由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,是的单表单次查询所需检索的行数表少,减少了磁盘IO、时延变短。

缺点:

  • 无法解决但表数据量太大的问题。

1.2 横向切分/水平切分

把原本存储于一个表的数据分块存储到多个表上。

当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表上。

例如:我们userDB中的userTable中数据量很大,那么可以把userDB切分为结构相同的多个userDB,以此类推,然后将这些表按照一定的规则存储到多个userDB上

优点:

  • 单表的并发能力提高了,磁盘的I/O性能也提高了
  • 如果出现高并发的话,总表可以根据不同的查询,将并发压力发到不同的小表里。

缺点:

  • 无法实现表连接查询

二、逻辑库-Schema

Mycat中定义的database是逻辑上存在的,但是物理上是不存在的。主要是针对纵向切分提供的概念。

三、逻辑表-Table

Mycat中定义的table逻辑上存在,物理上不存在的,主要是针对横向切分提供的概念。

四、默认端口

  • mysql:3306
  • mycat:8066
  • Tomcat:8080
  • Oracle:1521
  • nginx:80
  • http:协议默认端口80
  • redis:6379

五、数据主机-DataHost

物理Mysql存放的主机地址,可以使用主机名,IP,域名定义。

六、数据节点-DataNode

配置物理的database。数据保存的物理节点就是database

七、分片规则

当控制数据库的时候,如何访问database和table,就是访问dataHost和dataNode的算法。在Mysql处理CRUD时,如何访问datahost和datanode的算法?如:哈希算法,crc32算法等。

Mycat的使用

1.读写分离

原理:需要搭建主从模式,让主数据库处理增、删、改,而从数据库处理查操作。Mycat配合数据库本身的复制功能,可以解决读写分离的问题。

2.主从备份概念

主从备份:就是一种主备模式的数据库应用,主库(master)数据与备库(slave)数据完全一致,实现诗句的多重备份,保证数据的安全。可以在Master[InnoDB]和Slave[MyISAM]中使用不同的数据库引擎,实现读写分离。

主从备份目的:

  • 实现主备模式,保证数据安全,尽量避免数据丢失
  • 实现读写分离,使用不同的数据库引擎,实现读写分离,提高所有的操作效率。

Mycat配置文件

Mycat是代理,Mycat后面是物理数据库。和Web服务器的Nginx类似。对于使用者来说,访问的都是mycat。

Mycat的配置文件在conf目录下面,这里介绍几个常用的配置文件

文件 说明
server.xml Mycat的配置文件,设置账号,参数等
shema.xml Mycat对用的物理数据库和数据库表设置
rule.xml Mycat分片(分库分表)规则

server.xml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<property name="serverPort">8066</property> <!-- Mycat 服务端口号 -->
<property name="managerPort">9066</property><!-- Mycat 管理端口号 -->
<user name="root"><!-- mycat 用户名 -->
<property name="password">密码</property>
<property name="schemas">用户可访问逻辑库名</property>
<!-- 表级 DML 权限设置 -->
<!-- 不检查 SQL 语法结果
<privileges check="false">
<schema name="逻辑库名" dml="0110" >
<table name="逻辑表名" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
<user name="user"><!-- 其他用户名 -->
<property name="password">密码</property>
<property name="schemas">可访问逻辑库名</property>
<property name="readOnly">是否只读</property>
</user>

配置Mycat服务信息

如:Mycat中的用户,用户可以访问的逻辑库,可以访问的逻辑表,服务的端口号等:

schema.xml

最重要的配置文件,首先看默认的配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="t_user" dataNode="dn1,dn2,dn3" rule="crc32slot" />
</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="localhost:3306" user="root"
password="root">
<readHost host="hostS2" url="192.168.1.200:3306" user="root"
password="root" />
</writeHost>
</dataHost>
</mycat:schema>

用于定义逻辑库和逻辑表的配置文件,在配置文件中可以定义读写分离,逻辑库,逻辑表,dataHost,dataNode等信息:

节点与属性介绍:

  • 标签schema:配置逻辑库标签

    • 属性name:逻辑库名称
    • 属性checkSQLschema:是否检查sql语法中的schema信息
    • 属性sqlMaxLimit:Mycat在执行SQL的时候,如果SQL语句中没有limit字句,自动增加limit子句,避免一次性得到过多的数据,影响效率。limit子句的限制数量默认配置为100.如果SQL中有具体的limit子句,当前属性失效。
  • 标签table:定义逻辑表的标签

    • 属性name;逻辑表名
    • 属性dataNode:数据节点名称,即物理数据库中的database名称,多个名名称使用逗号分割
    • 属性rule:分片规则名称,具体的分片规则名称参考rule.xml配置文件
  • 标签dataNode:定义数据节点的标签

    • 属性name:数据节点名称,是定义的逻辑名称,对于具体的物理数据库database
    • 属性dataHost:引用dataHost标签的name值,代表使用的物理数据所在位置和配置信息
    • 属性database:在dataHost物理机中,具体的物理数据库database名称
  • dataHost标签:定义数据主机的标签

    • 属性name:定义逻辑上的数据主机名称
    • 属性maxCon/minCon:最大连接数和最小连接数
    • 属性dbType:数据库类型:mysql数据库
    • 属性dbDriver:数据库驱动类型,native,使用mycat提供的本地驱动
  • dataHost子标签writeHost:写数据的数据库定义标签,实现读写分离操作

    • 属性host:数据库命名
    • 属性url:数据库访问路径
    • 属性user:数据库访问用户名
    • 属性password:数据库访问密码

rule.xml

用于定义分片规则的配置文件

mycat默认分片规则:以500万为单位,实现分片规则

Author: zycode1561
Link: https://zycode1561.github.io/2020/02/15/Mycat%E7%AE%80%E5%8D%95%E5%AD%A6%E4%B9%A0/
Copyright Notice: All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
Donate
  • 微信
  • 支付宝

Comment