MyCat 基础入门

Posted chun_soft

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MyCat 基础入门相关的知识,希望对你有一定的参考价值。

  • 官网:http://www.mycat.io/
  • Mycat 概要介绍:https://github.com/MyCATApache/Mycat-Server
  • 入门指南:https://github.com/MyCATApache/Mycat-doc/tree/master/%E5%85%A5%E9%97%A8%E6%8C%87%E5%8D%97

1、Mycat介绍与核心概念

1.1 基本介绍

历史:从阿里 cobar 升级而来,由开源组织维护,2.0 正在开发中。
定位:运行在应用和数据库之间,可以当做一个 mysql 服务器使用,实现对 MySQL 数据库的分库分表,也可以通过 JDBC 支持其他的数据库。

Mycat 的关键特性
1、可以当做一个 MySQL 数据库来使用;
2、支持 MySQL 之外的数据库,通过 JDBC 实现;
3、解决了我们提到的所有问题,多表 join、分布式事务、全局序列号、翻页排序;
4、支持 ZK 配置,带监控 mycat-web;
5、2.0 正在开发中。

1.2 核心概念


Mycat 解压以后有 5 个目录:

2、Mycat 配置详解

主要的配置文件 server.xml、schema.xml、rule.xml 和具体的分片配置文件。 坑非常多,配置错误会导致无法启动,这个时候要看日志!

2.1 server.xml

包含系统配置信息。
system 标签:例如字符集、线程数、心跳、分布式事务开关等等。
user 标签:配置登录用户和权限。

<user name="root" defaultAccount="true">
    <property name="password">123456</property> 
    <property name="schemas">root</property>
</user>

mycat 对密码加密:

java -cp Mycat-server-1.6.7.3-release.jar io.mycat.util.DecryptUtil 0:root:123456

2.2 schema.xml

schema 在 MySQL 里面跟数据库是等价的。
schema.xml 包括逻辑库、表、分片规则、分片节点和数据源,可以定义多个 schema。这里面有三个主要的标签(table、dataNode、dataHost):

表名和库名最好都用小写

定义了逻辑表,以及逻辑表分布的节点和分片规则:

<schema name="catmall" checkSQLschema="false" sqlMaxLimit="100"> 
    <!-- 范围分片 -->
    <table name="customer" primaryKey="id" dataNode="dn1,dn2,dn3" rule="rang-long-cust" /> 
    <!-- 取模分片 -->
    <table name="order_info" dataNode="dn1,dn2,dn3" rule="mod-long-order" >
    <!-- ER 表 -->
    <childTable name="order_detail" primaryKey="id" joinKey="order_id" parentKey="order_id"/> </table>
    <!-- 全局表 -->
    <table name="student" primaryKey="sid" type="global" dataNode="dn1,dn2,dn3" /> 
</schema>

<dataNode name="dn1" dataHost="host1" database="gpcat" />

数据节点与物理数据库的对应关系。

配置物理主机的信息,readhost 是从属于 writehost 的。

<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="localhost:3306" user="root" password="123456">
    <!-- can have multi read hosts -->
    <readHost host="hostS2" url="192.168.8.146:3306" user="root" password="xxx"/> </writeHost>
    <writeHost host="hostS1" url="localhost:3316" user="root" password="123456"/>
    <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>

balance:负载的配置,决定 select 语句的负载

writeType:读写分离的配置,决定 update、delete、insert 语句的负载

switchType:主从切换配置

2.3 rule.xml

定义了分片规则和算法

分片规则:

<tableRule name="rang-long-cust"> 
    <rule>
        <columns>id</columns>
        <algorithm>func-rang-long-cust</algorithm> 
    </rule>
</tableRule>

分片算法:

<function name="func-rang-long-cust" class="io.mycat.route.function.AutoPartitionByLong"> 
    <property name="mapFile">rang-long-cust.txt</property>
</function>

分片配置:rang-long-cust.txt

10001-20000=1 
0-10000=0 
20001-100000=2

2.4 ZK 配置

Mycat 也支持 ZK 配置(用于管理配置和生成全局 ID),执行 bin 目录下 init_zk_data.sh,会自动将 zkconf 下的所有配置文件上传到 ZK(先拷贝到这个目录)。

cd /usr/local/soft/mycat/conf
cp *.txt *.xml *.properties zkconf/ ​
cd /usr/local/soft/mycat/bin ./init_zk_data.sh

启用 ZK 配置: mycat/conf/myid.properties

loadZk=true
zkURL=127.0.0.1:2181
clusterId=010
myid=01001
clusterSize=1
clusterNodes=mycat_gp_01
#server booster ; booster install on db same server,will reset all minCon to 2 type=server
boosterDataHosts=dataHost1

注意如果执行 init_zk_data.sh 脚本报错的话,代表未写入成功,此时不要启用 ZK 配置并重启,否则本地文件会被覆盖。
启动时如果 loadzk=true 启动时,会自动从 zk 下载配置文件覆盖本地配置。
在这种情况下如果修改配置,需要先修改 conf 目录的配置,copy 到 zkconf,再执行上传。

2.5 启动停止

进入 mycat/bin 目录(注意要先启动物理数据库):

连接:
mysql -uroot -p123456 -h localhost -P8066 db

3、Mycat 全局 ID

Mycat 全局序列实现方式主要有 4 种:本地文件方式、数据库方式、本地时间戳算法、ZK。也可以自定义业务序列。
注意获取全局 ID 的前缀都是:MYCATSEQ_

3.1 文件方式

配置文件 server.xml sequnceHandlerType 值:
0 文件 1数据库 2 本地时间戳 3 ZK

<property name="sequnceHandlerType">0</property>

文件方式,配置 conf/sequence_conf.properties

CUSTOMER.HISIDS= 
CUSTOMER.MINID=10000001 
CUSTOMER.MAXID=20000000 
CUSTOMER.CURID=10000001

语法:select next value for MYCATSEQ_CUSTOMER

INSERT INTO `customer` (`id`, `name`) VALUES (next value for MYCATSEQ_CUSTOMER, 'qingshan');

优点:本地加载,读取速度较快。
缺点:当 Mycat 重新发布后,配置文件中的 sequence 需要替换。Mycat 不能做集群部署。

3.2 数据库方式

<property name="sequnceHandlerType">1</property>

配置: sequence_db_conf.properties
把这张表创建在 146 上,所以是 dn1

#sequence stored in datanode
GLOBAL=dn1 
CUSTOMER=dn1

在第一个数据库节点上创建 MYCAT_SEQUENCE 表:

DROP TABLE IF EXISTS MYCAT_SEQUENCE; 
CREATE TABLE MYCAT_SEQUENCE (
name VARCHAR(50) NOT NULL,
current_value INT NOT NULL,
increment INT NOT NULL DEFAULT 1, remark varchar(100),
PRIMARY KEY(name)) ENGINE=InnoDB;

注:可以在 schema.xml 配置文件中配置这张表,供外部访问。

<table name="mycat_sequence" dataNode="dn1" autoIncrement="true" primaryKey="id"></table>

创建存储过程——获取当前 sequence 的值:

DROP FUNCTION IF EXISTS `mycat_seq_currval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
DECLARE retval VARCHAR(64);
SET retval="-999999999,null";
SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTO retval FROM MYCAT_SEQUENCE WHERE name = seq_name;
RETURN retval ;
END
;;
DELIMITER ;

创建存储过程,获取下一个 sequence:

DROP FUNCTION IF EXISTS `mycat_seq_nextval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_nextval`(seq_name VARCHAR(50)) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = current_value + increment WHERE name = seq_name; RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;

创建存储过程,设置 sequence:

DROP FUNCTION IF EXISTS `mycat_seq_setval`;
DELIMITER ;;
CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_setval`(seq_name VARCHAR(50), value INTEGER) RETURNS varchar(64) CHARSET latin1
DETERMINISTIC
BEGIN
UPDATE MYCAT_SEQUENCE
SET current_value = value
WHERE name = seq_name;
RETURN mycat_seq_currval(seq_name);
END
;;
DELIMITER ;

插入记录:

INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('GLOBAL', 1, 100,''); INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('ORDERS', 1, 100,'订单表使 用');

测试:

select next value for MYCATSEQ_ORDERS

3.3 本地时间戳方式

ID= 64 位二进制 (42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) ,长度为 18 位。

<property name="sequnceHandlerType">2</property>

配置文件 sequence_time_conf.properties

#sequence depend on TIME
WORKID=01 
DATAACENTERID=01

验证:

select next value for MYCATSEQ_GLOBAL

3.4 ZK 方式

修改 conf/myid.properties
设置 loadZk=true(启动时会从 ZK 加载配置,一定要注意备份配置文件,并且先 用 bin/init_zk_data.sh,把配置文件写入到 ZK)

<property name="sequnceHandlerType">3</property>

配置文件:sequence_distributed_conf.properties

# 代表使用 zk
INSTANCEID=ZK
# 与 myid.properties 中的 CLUSTERID 设置的值相同 
CLUSTERID=010

复制配置文件

cd /usr/local/soft/mycat/conf
cp *.txt *.xml *.properties zkconf/ chown -R zkconf/
cd /usr/local/soft/mycat/bin 
./init_zk_data.sh

验证:select next value for MYCATSEQ_GLOBAL

3.5 使用

在 schema.xml 的 table 标签上配置 autoIncrement=“true”,不需要获取和指定序列的情况下,就可以使用全局 ID 了。

4、Mycat 监控与日志查看

4.1 监控

4.1.1 命令行监控

连接到管理端口 9066,注意必须要带 IP

mysql -uroot -h127.0.0.1 -p123456 -P9066

全部命令:

mysql>show @@help;

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-SnFqTcbQ-1631155495453)(media/15962740817242/15974615785435.jpg)]
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IUCkeLMF-1631155495453)(media/15962740817242/15974616232999.jpg)]

4.1.2 命令行监控 mycatweb 监控

https://github.com/MyCATApache/Mycat-download/tree/master/mycat-web-1.0
Mycat-eye 是 mycat 提供的一个监控工具,它依赖于 ZK。 本地必须要运行一个 ZK,必须先启动 ZK。
参考:https://gper.club/articles/7e7e7f7ff7g59gc3g64
下载 mycat-web

访问端口 8082
http://192.168.8.151:8082/mycat/

mycat server.xml 配置

<!-- 1 为开启实时统计、0 为关闭 --> 
<property name="useSqlStat">1</property>

重启 mycat 服务生效

4.2 日志

log4j 的 level 配置要改成 debug

4.2.1 wrapper.log 日志

wrapper 日志:mycat 启动,停止,添加为服务等都会记录到此日志文件,如果系统环境配置错误或缺少配置时,导致 Mycat 无法启动,可以通过查看 wrapper.log 定位具体错误原因。

4.2.2 mycat.log 日志

mycat.log 为 mycat 主要日志文件,记录了启动时分配的相关 buffer 信息,数据源连接信息,连接池,动态类加载信息等等。

在 conf/log4j2.xml 文件中进行相关配置,如保留个数,大小,字符集,日志文件大小等。

以上是关于MyCat 基础入门的主要内容,如果未能解决你的问题,请参考以下文章

MyCat 基础入门

MyCat 基础入门

《SQL与数据库基础》21. 分库分表

MyCAT+MySQL 搭建高可用企业级数据库集群——第2章 MyCat入门

Mycat入门教程

Mycat入门教程