MyCat学习笔记


一、MyCat简介
1.什么是MyCat

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

2.使用MyCat后的架构图
  image.png
3.使用MyCat的优势
3.1数据量级

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

3.2 开源性质

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

二、MyCat中的概念
1.切分

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

1.1 纵向切分/垂直切分

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

优点:
  • 减少增量数据写入时的锁对查询的影响。
  • 由于单表数量下降,常见的查询操作由于减少了需要扫描的记录,使得单表单次查询所需检索的行数变少,减少了磁盘IO、时延变短。
缺点:
  • 无法解决单表数据量太大的问题。
1.2 横向切分/水平切分

把原本存储于一个表的数据分块存储到多个表上
当一个表中的数据量过大时,我们可以把该表的数据按照某种规则,进行划分,然后存储到多个结构相同的表上。
例如:我们 userDB 中的 userTable 中数据量很大,那么可以把 userDB 切分为结构相同的多个 userDB:part0DB、part1DB 等,再将 userDB 上的 userTable,切分为很多 userTable:userTable0、userTable1 等,然后将这些表按照一定的规则存储到多个 userDB 上。

优点:
  • 单表的并发能力提高了,磁盘的I/O性能也提高了
  • 如果出现高并发的话,总表可以根据不同的查询,将并发压力发到不同的小表里。
缺点:
  • 无法实现表连接查询
2.逻辑库-Schema

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

3.逻辑表-Table

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

4.默认端口

MySql:3306
MyCat:8066
Tomcat:8080
Oracle:1521
nginx:80
http:协议默认端口80
redis:6379

5.数据主机-DataHost

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

6.数据节点-DataNode

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

7.分片规则

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

三、MyCat的使用
1.读写分离

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

2.主从备份概念

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

2.1 MySql5.5、5.6版本后本身支持主从备份

在旧版本的MySql数据库系统中,不支持主从备份,需要安装额外的RPM包,如果需要安装RPM,只能在一个位置节点安装。

2.2 主从备份目的
  • 实现主备模式
    保证数据安全,尽量避免数据丢失
  • 实现读写分离
    使用不同的数据库引擎,实现读写分离,提高所有的操作效率。
    InnoDB使用DML语法操作、MyISAM使用DQL语法操作。
2.3 主从备份效果
  • 主库操作同步到备库
    所有对Master的操作,都会同步到Slave中
    注意:如果 Master 和 Salve 天生上环境不同,那么对 Master 的操作,可能会在 Slave 中出现错误
    如:在创建主从模式之前,Master 有 database : db1、db2、db3。Slave 有 database: db1、db2
    创建主从模式.现在的情况 Master 和 Slave 天生不同
    主从模式创建成功后,在 Master 中 drop database db3. Slave 中抛出数据库 SQL 异常,后续所有的命令不能同步.
    一旦出现错误,只能重新实现主从模式
2.4 主从模式下的逻辑图
  image.png
3.MySql的主从模式搭建
3.1 安装MySql

主库:192.168.254.128
从库:192.168.254.140

3.2 主从备份配置
3.3 Master[主库]配置
  • 修改Master配置文件
    路径:/etc/my.cnf
    命令:vim /etc/my.cnf
  • server_id
    本环境中server_id是1
    MySql服务唯一标识
    配置要求
    server_id 任意配置,只要是数字即可
    server_id Master唯一标识数字必须小于Slave唯一标识数字
  • log_bin
    本环境中log_bin的值:master_log
    开启日志功能以及日志文件命名,log_bin=master_log
    变量的值就是日志文件名称,是日志文件名称的主体
    MySql数据库自动增加文件后缀和文件类型
  • 重启MySql
mysql -uusername -ppassword
  • 创建用户
    在MySql数据库中,为不存在的用户授权,就是同步创建用户并授权。
    此用户是从库访问主库使用的用户
    ip地址不能写%,因为主从备份中,当前创建的用户,是给从库(Slave)访问主库(Master)使用的。用户必须有指定的访问地址,不能是通用地址。
grant all privileges on *.* to 'myslave'@'192.168.254.140' identified by 'myslave' with grant option;
flush privileges;
  • 查看用户
show master status;
  image.png
  • 关闭防火墙或在防火墙中开放3306端口
3.4 Slave[从库]配置
  • 修改Slave配置文件
service mysqld restart
  • 配置Slave
    • 访问MySql
stop slave
  • 配置主从信息
    需要修改的数据是依据Master信息修改的,ip是Master所在物理机IP,用户名和密码是Master提供的Slave访问用户名和密码,日志文件是在Master中查看的主库信息提供的,在Master中使用命令show master status查看日志文件名称。
change master to
master_host='192.168.254.128',master_user='myslave',master_password='myslave',master_log_fil
e='master_log.000002';
  • 启动Slave功能
show slave status \G;
create database demo1 default character set utf8;

新建表:

insert into user values(1,‘admin’)
4.安装MyCat
4.1 安装环境

192.168.254.141

4.2 配置jdk
4.3 在主数据库和从数据库都需要完成
  • 放开 3306 端口
  • 保证 root 用户可以被 mycat 访问

在 Mycat 中通过 Master 数据库的 root 用户访问 Master 数据库

name="serverPort">8066> 
name="managerPort">9066>
name="root">
  name="password">密码>
  name="schemas">用户可访问逻辑库名>
  
  
 >
 name="user">
 name="password">密码>
 name="schemas">可访问逻辑库名>
 name="readOnly">是否只读>
 >
  • 配置MyCat服务信息
    如:MyCat中的用户,用户可以访问的逻辑库,可以访问的逻辑表,服务的端口号

      image.png
    注意:默认配置了一个账号root 密码是123456,针对数据库TESTDB,读写权限都有,没有针对表做任何特殊的权限
  • 配置权限


      image.png

    dml 权限顺序为:insert(新增),update(修改),select(查询),delete(删除),0000--> 1111,0 为禁止权限,1 为开启权限。

5.2 schema.xml

schema.xml 是最主要的配置文件,首先看默认的配置文件

name="rule1">
  >
  >id>
  >func1>
  >
>
  • tableRule


      image.png

function

<?xml version="1.0"?>

<mycat:schema xmlns:mycat="http://io.mycat/">

    name="suibian" checkSQLschema="false" sqlMaxLimit="100">
                
        name="user" dataNode="dn1" />
    >
        
    name="dn1" dataHost="localhost1" database="demo1" />
    name="localhost1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        >select user()>
        
        host="hostM1" url="192.168.254.128:3306" user="root"
                   password="root">
            
            host="hostS2" url="192.168.254.140:3306" user="root" password="root" />
        >
    >
mycat:schema>
  • Server.xml
bin/mycat start
  • 停止命令
bin/mycat restart
  • 查看 MyCat 状态
mysql -u 用户名 -p 密码 -hmycat 主机 IP -P8066

连接成功后,可以当做 MySQL 数据库使用,访问约束

  • 查看 Mycat 日志
create database demo1 default character set utf8;
create database demo2 default character set utf8;
create database demo3 default character set utf8;
创建t_user表
<?xml version="1.0"?>

<mycat:schema xmlns:mycat="http://io.mycat/">

    name="suibian" checkSQLschema="false" sqlMaxLimit="100">
        
name="users" dataNode="dn1,dn2,dn3" rule="crc32slot" /> > name="dn1" dataHost="localhost1" database="demo1" /> name="dn2" dataHost="localhost1" database="demo2" /> name="dn3" dataHost="localhost1" database="demo3" /> name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> >select user()> host="hostM1" url="192.168.254.128:3306" user="root" password="root"> host="hostS2" url="192.168.254.140:3306" user="root" password="root" /> > > mycat:schema>
7.4 注意

1)使用 MyCat 实现分库时,先在 MyCat 中定义逻辑库与逻辑表,然后在 MyCat 的链接中执行创建表的命令必须要在 MyCat 中运行。因为 MyCat 在创建表时,会在表中添加一个新的列,列名为_slot。
2)使用 MyCat 插入数据时,语句中必须要指定所有的列。即便是一个完全项插入也不允许省略列名。



作者:鲁毅_
链接:https://www.jianshu.com/p/c8973edc550a
来源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。