Mycat的基本介绍



前言

  • 掌握Mycat特性与详细配置含义
  • 了解Mycat监控与日志查看

一、Mycat概念与配置

1. Mycat介绍与核心概念

1.1 基本介绍

历史: 从阿里cobar升级而来,由开源组织维护。

定位:运行在应用和数据库之间,可以当做一个MySQL服务器使用。实现对MySQL数据库的分库分表,也可以通过JDBC支持其他的数据库。

特性:

  • 可以当作一个MySQL数据库来使用
  • 支持MySQL之外的数据库,通过JDBC实现
  • 解决了多表Join、分布式事务、全局序列号、翻页排序
  • 支持ZK配置,带监控mycat-web(已经停止维护)

1.2 核心概念

  • 主机: 物理主机,一台服务器,一个数据库服务,一个3306端口
  • 物理数据库:真实的数据库
  • 物理表:真实的表
  • 分片:将原来单个数据库的数据切分后分散存储在不同的数据库节点
  • 分片节点:分片以后数据存储的节点
  • 分片键:分片依据的字段
  • 分片算法:分片的规则,例如随机、取模、范围、哈希、枚举以及各种组合算法
  • 逻辑表:相对于物理表,是分片表聚合后的结果,对于客户端来说跟真实的表没有区别
  • 逻辑数据库:相对于物理数据库,是数据节点聚合后的结果

一个逻辑表可以映射到多个节点的一张表(分片表),也可以映射到一个节点的表(非分片表),也可以映射到一个节点的多张表(单库分表)

2. 下载、解压Mycat

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配置目录
libjar包依赖
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本地时间戳
3ZK

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实战案例


总结

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Mycat的心跳不正常可能导致一些问题。根据引用\[1\]中的描述,当一台主机宕机时,Mycat应该通过心跳判断出主机宕机,并将写操作转移到对应的备机上。然而,引用中提到的问题是,虽然Mycat能够快速检测到连接断开,但整体恢复速度较慢,并且导致了其他主从连接出现超时异常。 根据引用\[2\]中的解释,Mycat的读写分离是基于主从关系的。当一个从属于某个主时,如果该主宕机,从也将停止工作,因为此时从的数据已经不可靠。为了支持MySQL一主一从的标准配置,并且在主节点宕机的情况下,从节点仍能读取数据,需要在Mycat中配置两个writeHost并设置balance=1。 因此,如果Mycat的心跳不正常,可能是由于配置问题导致的。你可以检查Mycat的配置文件schema.xml(引用\[3\])中的逻辑库、表、分片规则、DataNode以及DataSource的配置是否正确。另外,确保正确配置了两个writeHost并设置了balance=1,以支持主从切换。 如果问题仍然存在,可能需要进一步检查Mycat的日志文件以获取更多详细信息,并考虑与Mycat的开发者或社区寻求帮助。 #### 引用[.reference_title] - *1* [Mycat 主机挂了心跳检测异常](https://blog.csdn.net/weixin_35662493/article/details/113936218)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] - *2* *3* [MyCat介绍和使用](https://blog.csdn.net/JackRen_Developer/article/details/108992385)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v91^insertT0,239^v3^insert_chatgpt"}} ] [.reference_item] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值