文章目录
- 前言
- 一、Mycat概念与配置
- 1. Mycat介绍与核心概念
- 1.1 基本介绍
- 1.2 核心概念
- 2. 下载、解压Mycat
- 2.1 下载
- 2.2 解压
- 2.3 目录
- 3. Mycat配置详解
- 3.1 server.xml
- 3.2 schema.xml
- 3.2.1 dataHost标签
- 3.2.2 dataNode标签
- 3.2.3 table标签
- 3.3 rule.xml
- 3.4 ZK配置
- 3.5 启动停止
- 4. MyCat全局ID
- 4.1 文件方式
- 4.1.1 配置
- 4.1.2 使用
- 4.1.3 优点
- 4.1.4 缺点
- 4.2 数据库方式
- 4.2.1 配置
- 4.2.1 使用
- 4.3 本地时间戳方式
- 4.3.1 配置
- 4.3.2 使用
- 4.4 ZK
- 4.4.1 配置
- 4.4.2 使用
- 4.5 使用
- 5. MyCat监控与日志查看
- 5.1 监控
- 5.1.1 命令行监控
- 5.1.2 mycatweb监控
- 5.2 日志
- 5.2.1 wrapper.log日志
- 5.2.2 mycat.log日志
- 6. MyCat实战案例
- 总结
前言
- 掌握Mycat特性与详细配置含义
- 了解Mycat监控与日志查看
一、Mycat概念与配置 1. Mycat介绍与核心概念 1.1 基本介绍
历史: 从阿里cobar升级而来,由开源组织维护。
定位:运行在应用和数据库之间,可以当做一个MySQL服务器使用。实现对MySQL数据库的分库分表,也可以通过JDBC支持其他的数据库。
特性:
- 可以当作一个MySQL数据库来使用
- 支持MySQL之外的数据库,通过JDBC实现
- 解决了多表Join、分布式事务、全局序列号、翻页排序
- 支持ZK配置,带监控mycat-web(已经停止维护)
- 主机: 物理主机,一台服务器,一个数据库服务,一个3306端口
- 物理数据库:真实的数据库
- 物理表:真实的表
- 分片:将原来单个数据库的数据切分后分散存储在不同的数据库节点
- 分片节点:分片以后数据存储的节点
- 分片键:分片依据的字段
- 分片算法:分片的规则,例如随机、取模、范围、哈希、枚举以及各种组合算法
- 逻辑表:相对于物理表,是分片表聚合后的结果,对于客户端来说跟真实的表没有区别
- 逻辑数据库:相对于物理数据库,是数据节点聚合后的结果
一个逻辑表可以映射到多个节点的一张表(分片表),也可以映射到一个节点的表(非分片表),也可以映射到一个节点的多张表(单库分表)
2. 下载、解压MycatMycat官网
2.1 下载wget http://dl.mycat.org.cn/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz2.2 解压
tar -xzvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz2.3 目录
| 目录 | 作用 |
|---|---|
| bin | 启动目录 |
| catlet | 空目录 |
| conf | 配置目录 |
| lib | jar包依赖 |
| logs | 日志目录 |
主要的配置文件server.xml、schema.xml、rule.xml和具体的分片配置文件。
3.1 server.xml包含系统配置信息
system标签: 例如字符集、线程数、心跳、分布式事务开关等等。
user标签:配置登录用户和权限。
123456 db1
mycat对密码加密
java -cp Mycat-server-1.6.7.3-release.jar io.mycat.util.DecryptUtil 0:root:1234563.2 schema.xml
schema在MySQL里面跟数据库是等价的。
schema.xml包括逻辑库、表、分片规则、分片节点和数据源,可以定义多个schema
这里面三个主要的标签(dataHost、dataNode、table):
3.2.1 dataHost标签配置物理主机的信息,readhost是从属于writehost的。
select user() select user()
balance:负载的配置,决定select语句的负载
| 值 | 作用 |
|---|---|
| 0 | 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上 |
| 1 | 所有读操作都随机发送到当前的writeHost对应的readHost和备用的writeHost |
| 2 | 所有读操作都随机发送到所有的writeHost,readHost上 |
| 3 | 所有读操作都只发送到writeHost的readHost上 |
writeType:读写分离的配置,决定update、delete、insert语句的负载
| 值 | 作用 |
|---|---|
| 0 | 所有写操作都发送到可用的writeHost上(默认第一个,第一个挂了以后发送到第二个) |
| 1 | 所有的写操作都随机发送到writeHost上 |
switchType:主从切换配置
| 值 | 作用 |
|---|---|
| -1 | 表示不自动切换 |
| 1 | 默认值,表示自动切换 |
| 2 | 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status |
| 3 | 基于MySQL galera cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%' |
一个Node节点就是一个schema,相当于MySQL中的一个库,数据节点与物理数据库的对应关系。
3.2.3 table标签
表名和库名最好都用小写
定义了逻辑表,以及逻辑表分布的节点和分片规则:
| 配置 | 作用 |
|---|---|
| checkSQLschema | 在查询SQL中去掉逻辑库名 |
| sqlMaxLimit | 自动加上limit控制数据的返回 |
| primaryKey | 指定改逻辑表对应真实表的主键。MyCat会缓存主键(通过primaryKey属性配置)与具体dataNode的信息。 当分片规则(rule)使用非主键进行分片时,那么会在使用主键进行查询时,MyCat就会通过缓存先确定记录在哪个dataNode上,然后再在该dataNode上执行查询。 如果没有缓存/缓存并没有命中的话,还是会发送语句给所有的dataNode。 |
| dataNode | 数据分片的节点 |
| autoIncrement | 自增长(全局序列),true代表主键使用自增长策略 |
| type | 全局表:global。其他:不配置 |
定义了分片规则和算法
分片规则:
id rang-long
分片算法:
autopartition-long.txt
分片配置:autopartition-long.txt
0-2000000=0 2000001-4000000=13.4 ZK配置
除了本地文件配置之外,MyCat也支持ZK配置(管理配置和全局ID),用于实现集群扩展。
启用ZK配置:mycat/conf/myid.properties
loadZk=false zkURL=127.0.0.1:2181 clusterId=mycat-cluster-1 myid=mycat_fz_01 clusterSize=3 clusterNodes=mycat_fz_01,mycat_fz_02,mycat_fz_04 type=server boosterDataHosts=dataHost1
复制conf目录下配置文件到zkconf下
cd /root/mycat/conf
cp *.txt *.xml *.preperties zkconf/
执行bin目录下init_zk_data.sh
cd /root/mycat/bin
./init_zk_data.sh
注意: 如果执行init_zk_data.sh脚本报错,代表未写入成功,此时不要启动ZK配置并重启,否则本地文件会被覆盖。
启动时如果loadzk=true启动时,会自动从ZK下载配置文件覆盖本地配置。
在这种情况下如果修改配置,需要先修改conf目录的配置,copy到zkconf,再执行上传。
3.5 启动停止检查环境变量配置:conf/wrapper.conf
wrapper.java.command=/usr/local/java/jdk1.8.0_181/bin/java
进入mycat/bin目录(注意要先启动物理数据库)
| 操作 | 命令 |
|---|---|
| 启动 | ./mycat start |
| 停止 | ./mycat stop |
| 重启 | ./mycat restart |
| 查看状态 | ./mycat status |
| 前台运行 | ./mycat console |
配置文件server.xml,修改以后需要重启mycat服务。
sequnceHandlerType:配置MyCat全局ID
| 值 | 作用 |
|---|---|
| 0 | 文件 |
| 1 | 数据库 |
| 2 | 本地时间戳 |
| 3 | ZK |
0
文件方式,配置conf/sequence_conf.properties
CUSTOMER.HISIDS= CUSTOMER.MINID=1001 CUSTOMER.MAXID=2000 CUSTOMER.CURID=10004.1.2 使用
获取全局ID语法:
select next value for MYCATSEQ_CUSTOMER;
在插入语句种使用:
INSERT INTO t1(id, name)VALUES(next value for MYCATSEQ_CUSTOMER, '张三');4.1.3 优点
本地加载,读取速度较快。
4.1.4 缺点当MyCat重新发布后,配置文件种的sequence需要替换(还原),MyCat不能做集群部署。
4.2 数据库方式 4.2.1 配置1
数据库方式,配置conf/sequence_db_conf.properties,需要一个表来存储当前ID和3个存储过程来生成ID,所以指定从哪个节点去读取。
GLOBAL=dn1 COMPANY=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配置文件种配置这张表,供外部访问。
创建存储过程——获取当前sequence的值
DROP FUNCTION IF EXISTS `mycat_seq_currval`; DELIMITER ;; CREATE DEFINER=`root`@`%` FUNCTION `mycat_seq_currval`(seq_name VARCHAr(50)) RETURNSvarchar(64) CHARSET latin1 DETERMINISTIC BEGIN DECLARE retval VARCHAr(64); SET retval="-999999999,null"; SELECT concat(CAST(current_value AS CHAR),",",CAST(increment AS CHAR) ) INTOretval FROMMYCAT_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)) RETURNSvarchar(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), valueINTEGER) 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 ;4.2.1 使用
数据库插入记录
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('T1', 1, 100, '表1');
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment,remark) VALUES ('T2', 1, 100, '表2');
获取全局ID语法:
select next value for MYCATSEQ_T1;4.3 本地时间戳方式 4.3.1 配置
2
ID=64位二进制(42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) ,长度为18位)
本地时间戳方式,配置conf/sequence_time_conf.properties
WORKID=014.3.2 使用
select next value for MYCATSEQ_GLOBAL;4.4 ZK
4.4.1 配置3
修改 conf/myid.properties
设置 loadzk=true(启动时会从 ZK 加载配置,一定要注意备份配置文件,并且先用bin/init_zk_data.sh,把配置文件写入到ZK)
ZK方式,配置conf/sequence_dis_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.sh4.4.2 使用
select next value for MYCATSEQ_GLOBAL4.5 使用
在schema.xml的table标签上配置autoIncrement="true",不选哟获取和指定序列的情况下,就可以使用全局ID了。
5. MyCat监控与日志查看 5.1 监控 5.1.1 命令行监控
连接到管理端口9066,注意必须要带IP
mysql -uroot -h172.26.215.126 -p123456 -P9066
| 命令 | 作用 |
|---|---|
| show @@help; | 查看所有命令 |
| show @@server; | 查看服务器状态,包括占用内存等 |
| show @@database; | 查看数据库 |
| show @@datanode; | 查看数据节点 |
| show @@datasource; | 查看数据源 |
| show @@connection; | 该命令用于获取Mycat的前端连接状态,即应用与mycat的连接 |
| show @@backend; | 查看后端连接状态 |
| show @@cache; | 查看缓存使用情况 SQLRouteCache: SQL路由缓存 TabelD2DataNodeCache:缓存表主键与分片对应关系 ER_SQL2PARENTID:缓存ER分片中子表与父表关系 |
| reload @@config; | 重新加载基本配置(热加载),使用这个命令时mycat服务不可用 |
| show @@sysparam; | 查询mycat服务的系统参数 |
| show @@sql.high; | 执行频率高的SQL |
| show @@sql.slow; | 慢SQL |
| reload @@sqlslow=5; | 设置慢SQL命令 |
| show @@syslog limit=50; | 查看最近50条系统日志 |
下载
wget http://dl.mycat.io/mycat-web-1.0/Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
tar -xzvf Mycat-web-1.0-SNAPSHOT-20170102153329-linux.tar.gz
启动
cd mycat-web
nohup ./start.sh &
停止
kill start.jar
mycat server.xml 配置, 重启生效
5.2 日志1
log4j的level配置为debug
5.2.1 wrapper.log日志wrapper 日志:mycat 启动,停止,添加为服务等都会记录到此日志文件,如果系统环境配置错误或缺少配置时,导致 Mycat 无法启动,可以通过查看wrapper.log定位具体错误原因。
5.2.2 mycat.log日志mycat.log 为 mycat 主要日志文件,记录了启动时分配的相关buffer 信息,数据源连接信息,连接池,动态类加载信息等等。
在 conf/log4j2.xml 文件中进行相关配置,如保留个数,大小,字符集,日志文件大小等。
6. MyCat实战案例待定……
总结



