Mycat配置之schema.xml
dataNode 该属性用于绑定逻辑库到某个具体的数据节点上
<schema name="USERDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
<!—配置需要分片的表-->
<table name=“temp” dataNode=”dn1”/>
</schema>
那么现在tuser就绑定到dn1所配置的具体database上,可以直接访问这个database,没有配置的表则会走默认节点dn2,这里注意没有配置在分片里面的表工具查看无法显示,但是可以正常使用。 该属性的值需要和dataNode标签中name属性的值相互对应
checkSQLschema 当该值设置为true时,如果我们执行语句select * from TESTDB.travelrecord;则MyCat会把语句修改为select * from travelrecord;。即把表示schema的字符去掉,避免发送到后端数据库执行时报(ERROR 1146 (42S02): Table ‘testdb.travelrecord’ doesn’t exist)。不过,即使设置该值为 true ,如果语句所带的是并非是schema指定的名字,例如:select * from db1.travelrecord;那么MyCat并不会删除db1这个字段,如果没有定义该库的话则会报错,所以在提供SQL语句的最好是不带这个字段。 当设置为false时,则会把语句原封不动的发往最终的MySQL执行
sqlMaxLimit 当该schema中有分片表时,才会生效 当该值设置为某个数值时。每条执行的SQL语句,如果没有加上limit语句,MyCat也会自动的加上所对应的值。例如设置值为100,执行**select * from TESTDB.travelrecord;的效果为和执行
select * from TESTDB.travelrecord limit 100;**相同。
比如配置如下:
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="node1" database="course2" />
<dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="10.0.0.210:3306" user="root" password="123456">
</writeHost>
</dataHost>
</mycat:schema>
重新启动Mycat之后
create user 'root'@'%' identified with mysql_native_password by '123456';
grant all on *.* to 'root'@'%';
连接Mycat:
[mysql@vmware1 bin]$ ./mysql -u root -p -P 8066 -h 127.0.0.1 --default-auth=mysql_native_password
(8.0需要加上默认加密方式)
table标签
<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" > </table>
Table 标签定义了MyCat中的逻辑表,所有需要拆分的表都需要在这个标签中定义。 rule属性 该属性用于指定逻辑表要使用的规则名字,规则名字在rule.xml中定义,必须与tableRule标签中name属性属性值一一对应。 type属性 该属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。对应的配置:
全局表:global。
普通表:不指定该值为globla的所有表。
dataNode标签
dataNode 标签定义了MyCat中的数据节点,用于绑定逻辑库到某个具体的database。
dataNode 标签定义了MyCat中的数据节点,也就是我们通常说所的数据分片。一个dataNode标签就是一个独立的数据分片。 例子中所表述的意思为:使用名字为lch3307数据库实例上的db1物理数据库,这就组成一个数据分片,最后,我们使用名字dn1标识这个分片。
name属性
定义数据节点的名字,这个名字需要是唯一的,我们需要在table标签上应用这个名字,来建立表与分片对应的关系。
dataHost属性
该属性用于定义该分片属于哪个数据库实例的,属性值是引用dataHost标签上定义的name属性。 database属性
该属性用于定义该分片属性哪个具体数据库实例上的具体库,因为这里使用两个纬度来定义分片,就是:实例+具体的库。因为每个库上建立的表和表结构是一样的。所以这样做就可以轻松的对表进行水平拆分。
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema> <schema name="TESTDB2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2">
</schema>
<dataNode name="dn1" dataHost="node1" database="course5" />
<dataNode name="dn2" dataHost="node1" database="course55" />
<dataHost name="node1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="192.168.237.128:3308" user="root" password="mysql"> </writeHost>
</dataHost>
</mycat:schema>
dataHost标签
作为Schema.xml中最后的一个标签,该标签在mycat逻辑库中也是作为最底层的标签存在,直接定义了具体的数据库实例、读写分离配置和心跳语句
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> </schema>
<schema name="TESTDB2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"> </schema>
<dataNode name="dn1" dataHost="node1" database="test" />
<dataNode name="dn2" dataHost="node1" database="test2" /> <dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="192.168.237.128:3308" user="root" password="mysql">
<readHost host="slave1" url="192.168.237.130:3308" user="root" password="mysql" />
</writeHost>
</dataHost>
</mycat:schema>
host属性
用于标识不同实例,一般writeHost我们使用M1,readHost我们用S1。
url属性
后端实例连接地址,如果是使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:
jdbc:mysql://localhost:3306/。
user属性 后端存储实例需要的用户名字
password属性 后端存储实例需要的密码
weight 属性 权重 配置在readhost 中作为读节点的权重
writeType属性
负载均衡类型,目前的取值有2种:
- writeType=“0”, 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
- writeType=“1”,所有写操作都随机的发送到配置的writeHost,但不推荐使用
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> </schema>
<schema name="TESTDB2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"> </schema>
<dataNode name="dn1" dataHost="node1" database="test" />
<dataNode name="dn2" dataHost="node1" database="test2" />
<dataHost name="node1" maxCon="10" minCon="5" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="192.168.237.128:3308" user="root" password="mysql"> </writeHost>
<writeHost host="salve1" url="192.168.237.130:3308" user="root" password="mysql">
</writeHost>
</dataHost>
</mycat:schema>
switchType属性
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL主从同步的状态决定是否切换 ,心跳语句为 show slave status
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="TESTDB2" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn2"> </schema>
<dataNode name="dn1" dataHost="node1" database="test" />
<dataNode name="dn2" dataHost="node1" database="test2" />
<dataHost name="node1" maxCon="10" minCon="5" balance="2" writeType="0" dbType="mysql" dbDriver="native" switchType="-1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="192.168.237.128:3308" user="root" password="mysql"> </writeHost>
<writeHost host="salve1" url="192.168.237.130:3308" user="root" password="mysql">
</writeHost>
</dataHost>
</mycat:schema>
```![在这里插入图片描述](https://img-blog.csdnimg.cn/2020082917044167.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTMyNzQw,size_16,color_FFFFFF,t_70#pic_center)
![在这里插入图片描述](https://img-blog.csdnimg.cn/20200829170502554.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzQwOTMyNzQw,size_16,color_FFFFFF,t_70#pic_center)
**tempReadHostAvailable属性**
如果配置了这个属性writeHost 下面的readHost仍旧可用,默认0,可配置(0、1)
```powershell
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1"> </schema>
<dataNode name="dn1" dataHost="node1" database="test" />
<dataHost name="node1" maxCon="10" minCon="5" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" tempReadHostAvailable="1">
<heartbeat>select user()</heartbeat>
<writeHost host="master1" url="192.168.237.128:3308" user="root" password="mysql"> <readHost host="salve1" url="192.168.237.130:3308" user="root" password="mysql" />
</writeHost>
</dataHost>
</mycat:schema>
server.xml中重点需要关注的标签是用于定义登录mycat的用户和权限
<user name="test">
<property name="password">test</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> <property name="benchmark">11111</property> <property name="usingDecrypt">1</property>
</user>
上面的例子中,我定义了一个用户,用户名为test、密码也为test,可访问的schema也只有TESTDB一个。 如果我在schema.xml中定义了多个schema,那么这个用户是无法访问其他的schema。在mysql客户端看来则是无法使用use切换到这个其他的数据库。
如果使用了use命令,则mycat会报出这样的错误提示: ERROR 1044 (HY000): Access denied for user ‘test’ to database ‘xxx’
这个标签嵌套的property标签则是具体声明的属性值,正如上面的例子。我们可以:
•修改user标签的name属性来指定用户名;
•修改password内的文本来修改密码;
•修改readOnly为true 或false来限制用户是否只是可读的;
•修改schemas内的文本来控制用户可放问的schema;
•修改schemas内的文本来控制用户可访问的schema,同时访问多个schema的话使用逗号隔开, 例如: TESTDB,db1,db2
目前Mycat对于中间件的连接控制并没有做太复杂的控制,目前只做了中间件逻辑库级别的读写权限控制。
<user name="mycat">
<property name="password">mycat
</property> <property name="schemas">order</property>
<property name="readOnly">true</property>
</user>
<user name="mycat2">
<property name="password">mycat</property>
<property name="schemas">order</property>
</user>
配置说明: 配置中name是应用连接中间件逻辑库的用户名。 mycat 中password是应用连接中间件逻辑库的密码。 schemas是应用当前连接的逻辑库,schemas中可以配置一个或多个。 readOnly是应用连接中间件逻辑库所具有的权限。true为只读,false为读写都有,默认为false
Mysql连接相关属性
初始化mysql前后端连接所涉及到的一些属性:
packetHeaderSize : 指定Mysql协议中的报文头长度。默认4。
maxPacketSize : 指定Mysql协议可以携带的数据最大长度。默认16M。
idleTimeout : 指定连接的空闲超时时间。某连接在发起空闲检查下,发现距离上次使用超过了空闲时间,那么这个连接会被回收,就是被直接的关闭掉。默认30分钟,单位毫秒。 charset : 连接的初始化字符集。默认为utf8。
txIsolation : 前端连接的初始化事务隔离级别,只在初始化的时候使用,后续会根据客户端传递过来的属性对后端数据库连接进行同步。默认为REPEATED_READ,设置值为数字默认3。
READ_UNCOMMITTED = 1;
READ_COMMITTED = 2;
REPEATED_READ = 3;
SERIALIZABLE = 4;
sqlExecuteTimeout:SQL执行超时的时间,Mycat会检查连接上最后一次执行SQL的时间,若超过这个时间则会直接关闭这连接。默认时间为300秒,单位秒。
服务相关的属性
bindIp : mycat服务监听的IP地址,默认值为0.0.0.0。
serverPort : 定义mycat的使用端口,默认值为8066
managerPort : 定义mycat的管理端口,默认值为9066。