数据中间件 - MyCat2 配置文件说明
本章内容基于 MyCat2 版本. 会对 Mycat 中的配置文件作用,以及结合 Mycat 的一些概念进行介绍,比起一上来就盲目的开始操作,然后遇到各种问题,先从全局进行了解对提高效率是有帮助的.
MyCat 的配置文件都存放在 conf
路径下.
server.json 服务器配置
server.json
是对 Mycat Server 的配置. ip , port , mycatId 之类的。
users 用户配置
users
路径下存放的是 Mycat Server 用户的配置. 也就是哪些账号可以访问 MyCat Server , 和 MySQL 的账号类似. 默认会存在一个 root.user.json
配置文件. ip
配置了值会限定访问 IP. transactionType
是事务类型, 默认为 proxy
(只支持本地事务) , 还支持 XA
事务.
{
"dialect":"mysql",
"ip":null,
"password":"123456",
"transactionType":"proxy",
"username":"root"
}
datasources 数据源配置
datasources
路径下存放了数据源配置文件, 可以配置多个数据源,名称需要唯一。默认会存在一个 prototypeDs.datasource.json
原型数据源配置。
{
"dbType":"mysql",
"idleTimeout":60000,
"initSqls":[],
"initSqlsGetConnection":true,
"instanceType":"READ_WRITE",
"maxCon":1000,
"maxConnectTimeout":3000,
"maxRetryCount":5,
"minCon":1,
"name":"prototypeDs",
"password":"root",
"type":"JDBC",
"url":"jdbc:mysql://127.0.0.1:3306/mycat?useUnicode=true&serverTimezone=Asia/Shanghai&characterEncoding=UTF-8",
"user":"root",
"weight":0
}
partition 包含了三部分组成 targetName
, schema
, table
, targetName
可以是集群也可以是数据源 (集群一会讲) , schema
是物理库层面的 schema
, table
是物理层面的 table
。简单的理解这个图就是, MyCat 端对逻辑表进行分区, 通过集群或者是数据源去访问物理库中的表。
clusters 集群配置
clusters
路径下存放了集群配置。默认会有一个 prototype.cluster.json
配置文件。 集群就是多个数据源所组成了一个数据源集群。在集群中可以做故障切换,负载均衡等。比数据源的可用性更高。集群中可以配置多个 masters
主节点,和多个 replicas
从节点。其中配置的值是 datasource
的名称。 这里再看上面的图就可以理解为什么 targetName
可以是 cluster
或 datasource
了,他们的作用都是用来访问物理库。
{
"clusterType":"MASTER_SLAVE",
"heartbeat":{
"heartbeatTimeout":1000,
"maxRetry":3,
"minSwitchTimeInterval":300,
"slaveThreshold":0
},
"masters":[
"prototypeDs"
],
"replicas":[//配置多个从节点
"xxxx"
],
"maxCon":200,
"name":"prototype",
"readBalanceType":"BALANCE_ALL",
"switchType":"SWITCH"
}
schemas 逻辑表和物理表的映射关系
schemas
路径下存放了逻辑表和物理表的映射关系。先来理解一下什么是逻辑表什么是物理表。
MyCat 端暴漏给客户端的都是逻辑表, 因为数据进行了水平拆分, 写入逻辑表的数据会经过分片策略最终被写入到对应的真是物理表当中.
例如我们现在有这样一张表(逻辑表和物理表结构要保持一致)
CREATE TABLE employee (
id INT PRIMARY KEY,
name VARCHAR(100) NOT NULL
);
现在我们两个物理库,每个库中有两个物理表,我们在客户端执行一条 insert 语句
INSERT INTO employee (id, name) VALUES (1, 'DevX');
我们采用根据 id 值取模 (%) 分片算法, 这时候分片过程是这样的
- 1 % 2 = 1 选择对应的物理库
- 1 % 2 = 1 选择对应的物理表
所以这条数据最终会被写入到 database_1
中的 employee_1
物理表当中。
用 information_schema.schema.json
文件举例
schemaName
物理库名称targetName
集群或数据源名称customTables
定义自定义表映射规则,可以将自定义的SQL语句映射到物理表上。此配置一般用于一些特殊的查询需求,例如多表关联查询、视图查询、存储过程等,在MyCAT中通过自定义表映射规则,可以将这些特殊需求转化为标准的SQL语句,从而实现对数据的查询和操作。globalTables
定义全局表规则,全局表是一种特殊的表,可以在不同的逻辑库之间进行数据共享,即可以在一个逻辑库中插入、更新、删除数据,并在另一个逻辑库中查询到这些数据。通过定义 globalTables ,可以将多个逻辑库中的表定义为全局表,从而实现数据共享的功能。normalProcedures
定义普通存储过程规则。普通存储过程是一种可以在MyCAT服务端上执行的SQL脚本,通过预编译和缓存操作可以提高SQL执行的效率。通过定义 normalProcedures ,可以将多个普通存储过程定义为一个逻辑库中的公共存储过程,从而方便SQL语句的调用和执行。normalTables
定义普通表规则。普通表是一种与MySQL实例中的物理表相对应的虚拟表,在MyCAT服务端上进行路由和转发操作。shardingTables
定义需要分片的表。
{
"customTables": {},
"globalTables": {},
"normalTables": {
"ROUTINES": {
"createTableSQL": "CREATE TABLE information_schema.ROUTINES (\n\tSPECIFIC_NAME varchar(192),\n\tROUTINE_CATALOG varchar(192),\n\tROUTINE_SCHEMA varchar(192),\n\tROUTINE_NAME varchar(192),\n\tROUTINE_TYPE varchar(27),\n\tDATA_TYPE varchar(1024),\n\tCHARACTER_MAXIMUM_LENGTH bigint(21),\n\tCHARACTER_OCTET_LENGTH bigint(21),\n\tNUMERIC_PRECISION bigint(3),\n\tNUMERIC_SCALE bigint(3),\n\tDATETIME_PRECISION bigint(3),\n\tCHARACTER_SET_NAME varchar(12),\n\tCOLLATION_NAME varchar(12),\n\tDTD_IDENTIFIER varchar(255),\n\tROUTINE_BODY varchar(255),\n\tROUTINE_DEFINITION varchar(255),\n\tEXTERNAL_NAME varchar(255),\n\tEXTERNAL_LANGUAGE varchar(255),\n\tPARAMETER_STYLE varchar(255),\n\tIS_DETERMINISTIC varchar(255),\n\tSQL_DATA_ACCESS char(64),\n\tSQL_PATH varchar(255),\n\tSECURITY_TYPE varchar(255),\n\tCREATED datetime,\n\tLAST_ALTERED datetime,\n\tSQL_MODE varchar(80),\n\tROUTINE_COMMENT varchar(12),\n\tDEFINER varchar(64),\n\tCHARACTER_SET_CLIENT varchar(64),\n\tCOLLATION_CONNECTION varchar(64),\n\tDATABASE_COLLATION varchar(64)\n)",
"locality": {
"schemaName": "information_schema",
"tableName": "ROUTINES",
"targetName": "prototype"
}
},
"PARAMETERS": {
"createTableSQL": "CREATE TABLE information_schema.parameters (\n\tSPECIFIC_CATALOG varchar(64),\n\tSPECIFIC_SCHEMA varchar(64),\n\tSPECIFIC_NAME varchar(64),\n\tORDINAL_POSITION bigint(11) UNSIGNED,\n\tPARAMETER_MODE varchar(5),\n\tPARAMETER_NAME varchar(64),\n\tDATA_TYPE longtext,\n\tCHARACTER_MAXIMUM_LENGTH bigint(21),\n\tCHARACTER_OCTET_LENGTH bigint(21),\n\tNUMERIC_PRECISION int(10) UNSIGNED,\n\tNUMERIC_SCALE bigint(11),\n\tDATETIME_PRECISION int(10),\n\tCHARACTER_SET_NAME varchar(64),\n\tCOLLATION_NAME varchar(64),\n\tDTD_IDENTIFIER mediumtext,\n\tROUTINE_TYPE enum('FUNCTION', 'PROCEDURE')\n)",
"locality": {
"schemaName": "information_schema",
"tableName": "PARAMETERS",
"targetName": "prototype"
}
},
"CHARACTER_SETS": {
"locality": {
"targetName": "prototype"
}
},
"COLLATIONS": {
"locality": {
"targetName": "prototype"
}
},
"COLLATION_CHARACTER_SET_APPLICABILITY": {
"locality": {
"targetName": "prototype"
}
}
},
"schemaName": "information_schema",
"shardingTables": {}
}
sequences 序列号配置
sequences
路径下存放的是对生成序列号规则的配置.
如果不需要使用mycat的自增序列,而使用mysql本身的自增主键的功能,需要在配置中更改对应的建表sql,不设置AUTO_INCREMENT关键字,这样,mycat就不认为这个表有自增主键的功能,就不会使用mycat的全局序列号.
建表sql可以自动在原型库对应的逻辑表的物理表获取,如果逻辑表的建表SQL与物理表的建表SQL不对应,则需要在配置文件中配置建表SQL.
DevX
会持续分享有趣的技术和见闻,如果你觉得本文对你有帮助希望你可以分享给更多的朋友看到。该文章会同步在微信公众号 【DevXJava】, 方便在微信客户端阅读。
DevX 不止于技术