• 【MySQL | 运维篇】04、MySQL 分库分表之 MyCat 入门与配置


    目录

    一、MyCat入门

    1.1 需求

    ​1.2 环境准备

    1.3 配置

    1). schema.xml

    2). server.xml

    1.4 测试

    1 启动

    2 连接MyCat

    3 数据测试

    二、MyCat配置

    2.1 schema.xml

    2.1.1 schema标签

    1). schema 定义逻辑库 

    2). schema 中的table定义逻辑表 

    2.1.2 datanode标签 

    2.1.3 datahost标签

    2.2 rule.xml

    2.3 server.xml

    1). system标签 

    2). user标签


     

    一、MyCat入门

    1.1 需求

            由于 tb_order 表中数据量很大,磁盘IO及容量都到达了瓶颈,现在需要对 tb_order 表进行数
    据分片,分为三个数据节点,每一个节点主机位于不同的服务器上, 具体的结构,参考下图:

    1.2 环境准备

    准备3台服务器: 

    • 192.168.78.139:MyCat中间件服务器,同时也是第一个分片服务器。
    • 192.168.78.140:第二个分片服务器。
    • 192.168.78.141:第三个分片服务器。

    并且在上述3台数据库中创建数据库 db01 。

    1.3 配置

    1). schema.xml

    在schema.xml中配置逻辑库、逻辑表、数据节点、节点主机等相关信息。具体的配置根据自己的实际情况修改:

    1. [root@sql-master ~]# vim /usr/local/mycat/conf/schema.xml
    2. <?xml version="1.0"?>
    3. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
    4. <mycat:schema xmlns:mycat="http://io.mycat/">
    5. <schema name="DB01" checkSQLschema="true" sqlMaxLimit="100">
    6. <table name="TB_ORDER" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />
    7. </schema>
    8. <dataNode name="dn1" dataHost="dhost1" database="db01" />
    9. <dataNode name="dn2" dataHost="dhost2" database="db01" />
    10. <dataNode name="dn3" dataHost="dhost3" database="db01" />
    11. <dataHost name="dhost1" maxCon="1000" minCon="10" balance="0"
    12. writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    13. <heartbeat>select user()</heartbeat>
    14. <writeHost host="master" url="jdbc:mysql://192.168.78.139:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="Qwe123456." />
    15. </dataHost>
    16. <dataHost name="dhost2" maxCon="1000" minCon="10" balance="0"
    17. writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    18. <heartbeat>select user()</heartbeat>
    19. <writeHost host="master" url="jdbc:mysql://192.168.78.140:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="Qwe123456." />
    20. </dataHost>
    21. <dataHost name="dhost3" maxCon="1000" minCon="10" balance="0"
    22. writeType="0" dbType="mysql" dbDriver="jdbc" switchType="1" slaveThreshold="100">
    23. <heartbeat>select user()</heartbeat>
    24. <writeHost host="master" url="jdbc:mysql://192.168.78.141:3306?useSSL=false&serverTimezone=Asia/Shanghai&characterEncoding=utf8" user="root" password="Qwe123456." />
    25. </dataHost>
    26. </mycat:schema>

    2). server.xml

    需要在server.xml中配置用户名、密码,以及用户的访问权限信息,在文件内容最下面找到,具体的配置如下: 

    1. [root@sql-master ~]# vim /usr/local/mycat/conf/server.xml
    2. <user name="root" defaultAccount="true">
    3. <property name="password">Qwe123456.</property>
    4. <property name="schemas">DB01</property>
    5. <!-- 表级 DML 权限设置 -->
    6. <!--
    7. <privileges check="false">
    8. <schema name="TESTDB" dml="0110" >
    9. <table name="tb01" dml="0000"></table>
    10. <table name="tb02" dml="1111"></table>
    11. </schema>
    12. </privileges>
    13. -->
    14. </user>
    15. <user name="user">
    16. <property name="password">123456</property>
    17. <property name="schemas">DB01</property>
    18. <property name="readOnly">true</property>
    19. </user>

    设置 MyCat 管理员root 用户密码: 

            上述的配置表示,定义了两个用户 root 和 user ,这两个用户都可以访问 DB01 这个逻辑库,访问密码分别是Qwe123456. 和 123456,但是root用户访问DB01逻辑库,既可以读,又可以写,但是 user用户访问DB01逻辑库是只读的。 

    1.4 测试

    1 启动

            配置完毕后,先启动涉及到的3台分片服务器,然后启动MyCat服务器。切换到Mycat的安装目录,执行如下指令,启动Mycat:

    1. # 启动
    2. bin/mycat start
    3. # 停止
    4. bin/mycat stop

    Mycat启动之后,占用端口号 8066。

    启动完毕之后,可以查看logs目录下的启动日志wrapper.log,查看Mycat是否启动完成。

    2 连接MyCat

    通过如下指令,就可以连接并登陆MyCat。 

    mysql -h 192.168.78.139 -P 8066 -uroot -pQwe123456.

            可以看到我们是通过MySQL的指令来连接的MyCat,因为MyCat在底层实际上是模拟了MySQL的协议。

    3 数据测试

    然后就可以在MyCat中来创建表,并往表结构中插入数据,查看数据在MySQL中的分布情况。

    1. CREATE TABLE TB_ORDER (
    2. id BIGINT(20) NOT NULL,
    3. title VARCHAR(100) NOT NULL ,
    4. PRIMARY KEY (id)
    5. ) ENGINE=INNODB DEFAULT CHARSET=utf8 ;
    6. INSERT INTO TB_ORDER(id,title) VALUES(1,'goods1');
    7. INSERT INTO TB_ORDER(id,title) VALUES(2,'goods2');
    8. INSERT INTO TB_ORDER(id,title) VALUES(3,'goods3');
    9. INSERT INTO TB_ORDER(id,title) VALUES(5000000,'goods5000000');
    10. INSERT INTO TB_ORDER(id,title) VALUES(10000000,'goods10000000');
    11. INSERT INTO TB_ORDER(id,title) VALUES(10000001,'goods10000001');
    12. INSERT INTO TB_ORDER(id,title) VALUES(15000000,'goods15000000');
    13. INSERT INTO TB_ORDER(id,title) VALUES(15000001,'goods15000001');

    经过测试,我们在数据库中发现,在往 TB_ORDER 表中插入数据时:

    • 如果id的值在1-500w之间,数据将会存储在第一个分片数据库中。
    • 如果id的值在500w-1000w之间,数据将会存储在第二个分片数据库中。
    • 如果id的值在1000w-1500w之间,数据将会存储在第三个分片数据库中。
    • 如果id的值超出1500w,在插入数据时,将会报错。

            为什么会出现这种现象,数据到底落在哪一个分片服务器到底是如何决定的呢? 这是由逻辑表配置时的一个参数 rule 决定的,而这个参数配置的就是分片规则。

    二、MyCat配置

    2.1 schema.xml

            schema.xml 作为MyCat中最重要的配置文件之一 , 涵盖了MyCat的逻辑库 、 逻辑表 、 分片规则、分片节点及数据源的配置。 

    主要包含以下三组标签:

    • schema 标签
    • datanode 标签
    • datahost 标签 

    2.1.1 schema标签

    1). schema 定义逻辑库 

            schema 标签用于定义 MyCat实例中的逻辑库 , 一个MyCat实例中, 可以有多个逻辑库 , 可以通过 schema 标签来划分不同的逻辑库。MyCat中的逻辑库的概念,等同于MySQL中的database概念, 需要操作某个逻辑库下的表时, 也需要切换逻辑库(use xxx)。

    核心属性:

    • name:指定自定义的逻辑库库名
    • checkSQLschema:在SQL语句操作时指定了数据库名称,执行时是否自动去除;true:自动去除,false:不自动去除
    • sqlMaxLimit:如果未指定limit进行查询,列表查询模式查询多少条记录 

    2). schema 中的table定义逻辑表 

            table 标签定义了MyCat中逻辑库schema下的逻辑表 , 所有需要拆分的表都需要在table标签中定义 。 

    核心属性:

    • name:定义逻辑表表名,在该逻辑库下唯一
    • dataNode:定义逻辑表所属的dataNode,该属性需要与dataNode标签中name对应;多个dataNode逗号分隔
    • rule:分片规则的名字,分片规则名字是在rule.xml中定义的
    • primaryKey:逻辑表对应真实表的主键
    • type:逻辑表的类型,目前逻辑表只有全局表和普通表,如果未配置,就是普通表;全局表,配置为 global 

    2.1.2 datanode标签 

    核心属性:

    • name:定义数据节点名称
    • dataHost:数据库实例主机名称,引用自 dataHost 标签中name属性
    • database:定义分片所属数据库 

    2.1.3 datahost标签

     

            该标签在MyCat逻辑库中作为底层标签存在, 直接定义了具体的数据库实例、读写分离、心跳语句。

    核心属性:

    • name:唯一标识,供上层标签使用
    • maxCon/minCon:最大连接数/最小连接数
    • balance:负载均衡策略,取值 0,1,2,3
    • writeType:写操作分发方式(0:写操作转发到第一个writeHost,第一个挂了,切换到第二个;1:写操作随机分发到配置的writeHost)
    • dbDriver:数据库驱动,支持 native、jdbc 

    2.2 rule.xml

            rule.xml中定义所有拆分表的规则, 在使用过程中可以灵活的使用分片算法, 或者对同一个分片算法使用不同的参数, 它让分片过程可配置化。主要包含两类标签:tableRule、Function。 

    2.3 server.xml

    server.xml配置文件包含了MyCat的系统配置信息,主要有两个重要的标签:system、user。

    1). system标签 

    主要配置MyCat中的系统配置信息,对应的系统配置项及其含义,简单了解下:

    属性取值含义
    charsetutf8

    设置Mycat的字符集, 字符集需要与MySQL的字符集

    保持一致

    nonePasswordLogin0,1

    0为需要密码登陆、1为不需要密码登陆 ,默认为0,

    设置为1则需要指定默认账户

    useHandshakeV100,1

    使用该选项主要的目的是为了能够兼容高版本的jdbc驱

    动, 是否采用HandshakeV10Packet来与client进行通信,

    1:是, 0:否

    useSqlStat0,1

    开启SQL实时统计, 1 为开启 , 0 为关闭 ; 开启之后, My

    Cat会自动统计SQL语句的执行情况 ; mysql -h 127.0.0.

    1 -P 9066 -u root -p 查看MyCat执行的SQL, 执行效率

    比较低的SQL , SQL的整体执行情况、读写比例等 ;

    show @@sql ; show @@sql.slow ; show @@sql.sum ;

    useGlobleTableCheck0,1

    是否开启全局表的一致性检测。1为开启 ,0为关闭 。

    sqlExecuteTimeout1000SQL语句执行的超时时间 , 单位为 s ;
    sequnceHandlerType0,1,2

    用来指定Mycat全局序列类型,0 为本地文件,1 为数据

    库方式,2 为时间戳列方式,默认使用本地文件方式,

    文件方式主要用于测试

    sequnceHandlerPattern正则表达式

    必须带有MYCATSEQ或者 mycatseq进入序列匹配流程

    注意MYCATSEQ_有空格的情况

    subqueryRelationshipChecktrue,false

    子查询中存在关联查询的情况下,检查关联字段中是否有

    分片字段 .默认 false

    useCompression0,1开启mysql压缩协议 , 0 : 关闭, 1 : 开启
    fakeMySQLVersion5.5,5.6设置模拟的MySQL版本号
    defaultSqlParser 

    由于MyCat的最初版本使用了FoundationDB的SQL解析

    器, 在MyCat1.3后增加了Druid解析器, 所以要设置

    defaultSqlParser属性来指定默认的解析器; 解析器有两

    个 : druidparser 和 fdbparser, 在MyCat1.4之后,默认是

    druidparser, fdbparser已经废除了

    processors1,2....

    指定系统可用的线程数量, 默认值为CPU核心 x 每个核

    心运行线程数量; processors 会影响

    processorBufferPool, processorBufferLocalPercent,

    processorExecutor属性, 所有, 在性能调优时, 可以适当

    地修改processors值

    processorBufferChunk 

    指定每次分配Socket Direct Buffer默认值为4096字节,

    也会影响BufferPool长度, 如果一次性获取字节过多而导

    致buffer不够用, 则会出现警告, 可以调大该值

    processorExecutor 

    指定NIOProcessor上共享 businessExecutor固定线程

    池的大小; MyCat把异步任务交给 businessExecutor线

    程池中, 在新版本的MyCat中这个连接池使用频次不高,

    可以适当地把该值调小

    packetHeaderSize 指定MySQL协议中的报文头长度, 默认4个字节
    maxPacketSize 

    指定MySQL协议可以携带的数据最大大小, 默认值为

    16M

    idleTimeout30

    指定连接的空闲时间的超时长度;如果超时,将关闭资源

    并回收, 默认30分钟

    txIsolation1,2,3,4

    初始化前端连接的事务隔离级别,默认为

    REPEATED_READ , 对应数字为3

    READ_UNCOMMITED=1; READ_COMMITTED=2;

    REPEATED_READ=3; SERIALIZABLE=4;

    sqlExecuteTimeout300

    执行SQL的超时时间, 如果SQL语句执行超时,将关闭连

    接; 默认300秒;

    serverPort8066定义MyCat的使用端口, 默认8066
    managerPort9066定义MyCat的管理端口, 默认9066

    2). user标签

            配置MyCat中的用户、访问密码,以及用户针对于逻辑库、逻辑表的权限信息,具体的权限描述方式及配置说明如下: 

            在测试权限操作时,我们只需要将 privileges 标签的注释放开。 在 privileges 下的schema标签中配置的dml属性配置的是逻辑库的权限。 在privileges的schema下的table标签的dml属性中配置逻辑表的权限。 

  • 相关阅读:
    计算机网络第4章(网际层)----总结1
    Linux命令大总结,一篇就够了(建议收藏)
    【深度学习】ONNX模型多线程快速部署【基础】
    MyBatis bind标签起什么作用呢?
    个人如何用时间管理软件提升效率
    理解并解决Maven版本冲突
    本周四晚19:00知识赋能第八期第1课丨ArkUI框架整体设计
    Go简单实现协程池
    时间复杂度讲解(数据结构)
    C++STL——string类与模拟实现
  • 原文地址:https://blog.csdn.net/weixin_46560589/article/details/127845343