文章目录
前言
- 掌握Mycat特性与详细配置含义
- 了解Mycat监控与日志查看
一、Mycat概念与配置
1. Mycat介绍与核心概念
1.1 基本介绍
历史: 从阿里cobar升级而来,由开源组织维护。
定位:运行在应用和数据库之间,可以当做一个MySQL服务器使用。实现对MySQL数据库的分库分表,也可以通过JDBC支持其他的数据库。
特性:
- 可以当作一个MySQL数据库来使用
- 支持MySQL之外的数据库,通过JDBC实现
- 解决了多表Join、分布式事务、全局序列号、翻页排序
- 支持ZK配置,带监控mycat-web(已经停止维护)
1.2 核心概念
- 主机: 物理主机,一台服务器,一个数据库服务,一个3306端口
- 物理数据库:真实的数据库
- 物理表:真实的表
- 分片:将原来单个数据库的数据切分后分散存储在不同的数据库节点
- 分片节点:分片以后数据存储的节点
- 分片键:分片依据的字段
- 分片算法:分片的规则,例如随机、取模、范围、哈希、枚举以及各种组合算法
- 逻辑表:相对于物理表,是分片表聚合后的结果,对于客户端来说跟真实的表没有区别
- 逻辑数据库:相对于物理数据库,是数据节点聚合后的结果
一个逻辑表可以映射到多个节点的一张表(分片表),也可以映射到一个节点的表(非分片表),也可以映射到一个节点的多张表(单库分表)
2. 下载、解压Mycat
2.1 下载
wget http://dl.mycat.org.cn/1.6.7.3/20190927161129/Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
2.2 解压
tar -xzvf Mycat-server-1.6.7.3-release-20190927161129-linux.tar.gz
2.3 目录
目录 | 作用 |
---|---|
bin | 启动目录 |
catlet | 空目录 |
conf | 配置目录 |
lib | jar包依赖 |
logs | 日志目录 |
3. Mycat配置详解
主要的配置文件server.xml、schema.xml、rule.xml和具体的分片配置文件。
3.1 server.xml
包含系统配置信息
system标签: 例如字符集、线程数、心跳、分布式事务开关等等。
user标签:配置登录用户和权限。
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<property name="schemas">db1</property>
</user>
mycat对密码加密
java -cp Mycat-server-1.6.7.3-release.jar io.mycat.util.DecryptUtil 0:root:123456
3.2 schema.xml
schema在MySQL里面跟数据库是等价的。
schema.xml包括逻辑库、表、分片规则、分片节点和数据源,可以定义多个schema
这里面三个主要的标签(dataHost、dataNode、table):
3.2.1 dataHost标签
配置物理主机的信息,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="172.26.215.127:3306" user="root" password="123456"></writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
<dataHost name="host2" 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="172.26.215.128:3306" user="root" password="123456"></writeHost>
<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
</dataHost>
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%' |
3.2.2 dataNode标签
一个Node节点就是一个schema,相当于MySQL中的一个库,数据节点与物理数据库的对应关系。
<dataNode name="dn1" dataHost="host1" database="db1" />
<dataNode name="dn2" dataHost="host2" database="db1" />
3.2.3 table标签
表名和库名最好都用小写
定义了逻辑表,以及逻辑表分布的节点和分片规则:
<schema name="db1" checkSQLschema="false" sqlMaxLimit="100">
<!-- auto sharding by id (long) -->
<table name="t1" dataNode="dn1,dn2" rule="auto-sharding-long"/>
<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"/> -->
</schema>
配置 | 作用 |
---|---|
checkSQLschema | 在查询SQL中去掉逻辑库名 |
sqlMaxLimit | 自动加上limit控制数据的返回 |
primaryKey | 指定改逻辑表对应真实表的主键。MyCat会缓存主键(通过primaryKey属性配置)与具体dataNode的信息。 当分片规则(rule)使用非主键进行分片时,那么会在使用主键进行查询时,MyCat就会通过缓存先确定记录在哪个dataNode上,然后再在该dataNode上执行查询。 如果没有缓存/缓存并没有命中的话,还是会发送语句给所有的dataNode。 |
dataNode | 数据分片的节点 |
autoIncrement | 自增长(全局序列),true代表主键使用自增长策略 |
type | 全局表:global。其他:不配置 |
3.3 rule.xml
定义了分片规则和算法
分片规则:
<tableRule name="auto-sharding-long">
<rule>
<columns>id</columns>
<algorithm>rang-long</algorithm>
</rule>
</tableRule>
分片算法:
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
<property name="mapFile">autopartition-long.txt</property>
</function>
分片配置:autopartition-long.txt
# range start-end ,data node index
# K=1000,M=10000.
0-500M=0
500M-1000M=1
1000M-1500M=2
3.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 |
4. MyCat全局ID
配置文件server.xml,修改以后需要重启mycat服务。
sequnceHandlerType:配置MyCat全局ID
值 | 作用 |
---|---|
0 | 文件 |
1 | 数据库 |
2 | 本地时间戳 |
3 | ZK |
4.1 文件方式
4.1.1 配置
<property name="sequnceHandlerType">0</property>
文件方式,配置conf/sequence_conf.properties
CUSTOMER.HISIDS=
CUSTOMER.MINID=1001
CUSTOMER.MAXID=2000
CUSTOMER.CURID=1000
4.1.2 优点
本地加载,读取速度较快。
4.1.3 缺点
当MyCat重新发布后,配置文件种的sequence需要替换(还原),MyCat不能做集群部署。
4.2 数据库方式
<property name="sequnceHandlerType">1</property>
数据库方式,配置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配置文件种配置这张表,供外部访问。
<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)) 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.3 本地时间戳方式
<property name="sequnceHandlerType">2</property>
ID=64位二进制(42(毫秒)+5(机器 ID)+5(业务编码)+12(重复累加) ,长度为18位)
本地时间戳方式,配置conf/sequence_time_conf.properties
WORKID=01
DATAACENTERID=01
4.4 ZK
<property name="sequnceHandlerType">3</property>
修改 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.sh
4.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条系统日志 |
5.1.2 mycatweb监控
下载
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 配置, 重启生效
<!-- 1 为开启实时统计、0 为关闭 -->
<property name="useSqlStat">1</property>
5.2 日志
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实战案例
请参考MyCat实战案例