前言
在生产实际应用过程中,存在一系列的问题。关于使用mycat 的几点使用建议:
1、mycat 是java程序,生产环境需设计虚机集群架构或使用docker 镜像实现集群。如果存在大量全库查询需要申请物理机,独占连接句柄。
2、mycat 是为了mysql 分库分表而生,对达梦sql语法适应性存风险, 上线前对sql的适配需做好完整的功能验证。
3、mycat 无法支持复杂sql查询,不能使用大量join等语句。
4、运维阶段,ddl变更表结构,索引等操作必须从mycat发起, 不能连实际库处理。
5、高并发sql语句需要带上分库键,否则会导致全库查询并汇总,性能低甚至拖垮实际库。确实需要全库查询的语句需要控制频率,分页查询不适合查询后几页。
一、schema.xml文件配置
1、<schema>标签
name属性
mycat逻辑库的数据库名称
checkSQLschema属性
校验SQL是否带了schema。默认为false;
当设置为true时,会自动去除SQL语句中的用户名。
eg:
select * from examdb.table1;
执行时会自动去除examdb用户名
--> select * from table1;
sqlMaxLimit属性
设置此属性后,若sql未携带limit,则mycat会自动添加limit对应的值
2、<table>标签
name属性
mycat逻辑表名称
dataNode属性
当前逻辑表所属的dataNode名称,可填写多个dataNode(逗号分隔),若填写的dataNode个数过多,可用简写的方式描述。此项可用于分库操作。
eg:
<table name="TABLE1" dataNode="testdn$0-99,testdn2$100-199"></table>
rule属性
指定当前逻辑表要使用的规则名称,名称取值于rule.xml配置文件中tableRule标签的name属性。
ruleRequired属性
设置当前逻辑表是否必须指定分片规则,若设置为true,则rule属性必填。
primaryKey属性
当前逻辑表对应真实表的主键。
特别说明:
若当前逻辑表绑定了非主键分片的规则时,那么使用主键进行查询时,mycat会发送SQL语句至所有配置的dataNode上。如果使用primaryKey属性配置真实表的主键,那么mycat会缓存主键与具体dataNode的信息,再次使用主键进行查询时就不会广播式查询,mycat会发送SQL语句至具体的dataNode上。
type属性
当前逻辑表的类型。默认为 普通表;设置仅可填global(全局表)。
autoIncrement属性
当前逻辑表主键自增长开关。默认为 false(禁用);设置为true时,mycat会取当前逻辑表对应的全局序列(存在分片的情况,故取全局序列)进行自增并给值。
subTables属性
设置当前逻辑表的分表规则,目前分表功能仅mycat1.6版本后支持,且dataNode在分表条件下时只能配置一个,分表条件下不支持各种条件的join语句。
eg:
<table name="TABLE1" subTables="TABLE$1-3,TABLE4"></table>
needAddLimit属性
指定当前逻辑表是否需要自动在每个SQL语句后添加limit限制。默认为true,可设置为false将其关闭。
3、childTable标签 (此标签用于定义E-R分片的子表)
name属性
子逻辑表的名称
joinKey属性
插入子表的时候回使用这个列的值查找父表存储的数据节点
parentKey属性
父逻辑表关联的列名。程序首先获取joinkey的值,再通过parentKey属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上。从而确定子表存储的位置。
primaryKey属性
当前逻辑表对应真实表的主键。
needAddLimit属性
指定当前逻辑表是否需要自动在每个SQL语句后添加limit限制。默认为true,可设置为false将其关闭。
4、<dataNode>标签
dataNode标签定义了mycat的数据分片,一个dataNode就是一个独立的数据分片。
name属性
数据节点的名称
dataHost属性
指定当前分片属于哪个数据库实例
dataBase属性
指定当前分片属于数据库实例的哪个具体库
5、<dataHost>标签
dataHost标签定义了具体的数据库实例、读写分离配置和心跳语句
name属性
dataHost标签的名称
maxCon属性
指定每个读写实例连接池的最大连接数
minCon属性
指定每个读写实例连接池的最小连接,初始化连接池的大小。
balance属性
负载均衡类型,目前的取值有3种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力,注意balance=3只在1.4及其以后版本有,1.3没有。
writeType属性
负载均衡类型,目前的取值有3种:
1. writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
2. writeType="1",所有写操作都随机的发送到配置的writeHost,1.5以后废弃不推荐。switchType属性
- -1
表示不自动切换。
- 1
默认值,自动切换。
- 2
基于MySQL主从同步的状态决定是否切换。
dbType属性
指定后端连接的数据库类型,目前支持二进制的mysql协议,还有其他使用JDBC连接的数据库。例如:mongodb、oracle、spark、dm等。
dbDriver 属性
指定连接后端数据库使用的Driver,目前可选的值有
native
和JDBC
。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb。其他类型的数据库则需要使用JDBC驱动来支持。从1.6版本开始支持postgresql的native原始协议。
如果使用JDBC的话需要将符合JDBC 4标准的驱动JAR包放到MYCAT\lib目录下,并检查驱动JAR包中包括如下目录结构的文件:
META-INF\services\java.sql.Driver
。在这个文件内写上具体的Driver类名,例如:com.mysql.jdbc.Driver
。
switchType属性
-1 表示不会自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换
心跳语句为 show slave status
3 基于MySQL galary cluster的切换机制(适合集群)(1.4.1)
心跳语句为 show status like ‘wsrep%’
6、<heartbeat>标签
heartbeat用于设置心跳语句
7、<writeHost>标签 和 <readHost>标签
host属性
用于标识不同实例,一般writeHost我们使用*M1,readHost我们用*S1。
url属性
数据库实例连接地址,如果是使用native的dbDriver,则一般为
address:port
这种形式。用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/
password属性
数据库实例密码
user属性
数据库实例用户
usingDecrypt属性
是否对密码进行加密,mycat1.4.1后支持。默认为0(不加密),1为加密。
加密命令为:
执行mycat jar 程序
java -cp Mycat-server-1.4.1-dev.jar org.opencloudb.util.DecryptUtil 1:host:user:password
Mycat-server-1.4.1-dev.jar 为mycat download 下载目录的jar
1:host:user:password 中 1 为db端加密标志,host为dataHost 的host 名称
二、server.xml文件配置
1、<user>标签
name属性
mycat启动后的登录用户名
defaultAccount属性
true/false,是否为默认用户
标签内关键配置展示
<user name="demo" defaultAccount="true">
<!-- Mycat启动后的登陆密码 -->
<property name="password">P@s5w0rd</property>
<!-- Mycat启动后的逻辑数据库,可设多个 逗号 分隔 -->
<property name="schemas">DEMO</property>
<!-- Mycat启动后的默认逻辑数据库-->
<property name="defaultSchema">DEMO</property>
<!-- 该用户是否只读 true/false-->
<property name="readOnly">true</property>
<!-- 该用户连接服务数量达到此数值,Mycat将降级处理连接该用户的请求,0表示不限制 -->
<property name="benchmark">9999</property>
<!-- 是否对密码加密默认0(否),如需要开启配置则设置为1 (是)-->
<property name="usingDecrypt">0</property>
</user>
如上配置含义:
登录用户demo,且用户仅有只读权限;登录密码P@s5w0rd,且不对密码进行加密处理;可访问的逻辑数据库有DEMO(逻辑库默认为DEMO)。