schema标签
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
# schema标签用来定义mycat实例中的逻辑库,mycat可以有多个逻辑库,不同的逻辑库配置使用多个schema标签来定义。
-
name 逻辑库的名称
-
checkSQLschema 该字段就是用户执行sql语句时,是否检查表明的schema 。
当该值设置为 true 时,如果执行语句(select * from TESTDB.l_user)则 MyCat 会 schema 的字符去掉(select * from l_user)。如果执行执行语句(select * from DB.l_user)“DB没有定义”,则将执行语句还是(select * from DB.l_user)将会报错。
当该值设置为 false 时,即不检查schema,如果执行语句(select * from TESTDB.l_user)将会报错。
-
dataNode 指定默认数据节点,绑定到具体的database
-
sqlMaxLimit 给sql语句加上limit ,如果sql本身已经指定limit,则以sql指定的为准。如果table标签的needAddLimit属性配置为false,则不允许自动加上limit
-
table 标签
<table name="user" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2" rule="hash-int" /> # table标签用于定义Mycat的逻辑表,以及逻辑表的分片规则。
-
name 属性逻辑表的表名,同一个schema表名必须唯一。
-
dataNode 属性定义这个逻辑表所属的 dataNode,用英文逗号间隔,如:dataNode=“dn1,dn2”
-
rule 属性用于指定逻辑表要使用的规则名字,规则名字在 rule.xml 中定义,必须与 tableRule 标签中 name 属性属性值一一对应。
-
ruleRequired 属性用于指定表是否绑定分片规则,如果配置为 true,但没有配置具体 rule 的话 ,程序会报错
-
primaryKey 属性指定该逻辑表对应真实表的主键。MyCat会缓存主键(通过primaryKey属性配置)与具体 dataNode的信息。当分片规则使用非主键进行分片时,那么在使用主键进行查询时,MyCat就会通过缓存先确定记录在哪个dataNode上,然后再在该dataNode上执行查询。
如果缓存并没有命中的话,还是会发送语句给所有的dataNode。关于Mycat的主键缓存,其机制是:当根据主键查询的SQL语句第一次执行时,Mycat会对其结果进行分析,确定该主键在哪个分片上,并进行该主键到分片ID的缓存。通过连接MyCAT的9066管理端口,执行show@@cache,可以显示当前缓存的使用情况。可在sql执行前后的2个时间点执行show @@cache,通过结果信息中的LAST_PUT和LAST_ACCESS列,判断相应表的缓存是否有被更新过。
-
type 属性定义了逻辑表的类型,目前逻辑表只有“全局表”和”普通表”两种类型。对应的配置:
-
全局表:global。
-
普通表:不指定该值为 global 的所有表。
-
-
autoIncrement 属性
-
mysql 对非自增长主键,使用 last_insert_id()是不会返回结果的,只会返回 0。所以,只有定义了自增长主键的表才可以用 last_insert_id()返回主键值。
-
mycat 目前提供了自增长主键功能,但是如果对应的 mysql 节点上数据表,没有定义 auto_increment,那么在 mycat 层调用 last_insert_id()也是不会返回结果的。
-
由于 insert 操作的时候没有带入分片键,mycat 会先取下这个表对应的全局序列,然后赋值给分片键。这样才能正常的插入到数据库中,最后使用 last_insert_id()才会返回插入的分片键值。
-
如果要使用这个功能最好配合使用数据库模式的全局序列。
-
使用 autoIncrement=“ true” 指定这个表有使用自增长主键,这样 mycat 才会不抛出分片键找不到的异常。
-
使用 autoIncrement=“ false” 来禁用这个功能,当然你也可以直接删除掉这个属性。默认就是禁用的。
-
-
subTables 属性分表配置,mycat1.6之后开始支持,但dataNode 在分表条件下只能配置一个。
-
needAddLimit 属性与schema标签的sqlMaxLimit配合使用,如果needAddLimit值为false,则语句不会加上limit
-
childTable 标签用于定义 E-R 分片的子表。通过标签上的属性与父表进行关联。
-
name 属性定义子表的表名
-
joinKey 属性插入子表的时候会使用这个列的值查找父表存储的数据节点。
-
parentKey 属性指定的值一般为与父表建立关联关系的列名。Mycat首先获取 joinkey 的值,再通过 parentKey 属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上。从而确定子表存储的位置。
-
primaryKey 属性同 table 标签描述。
-
needAddLimit 属性同 table 标签所描述的。
-
-
dataNode标签
<dataNode name="dn1" dataHost="localhost" database="shop" />
# dataNode标签定义了 MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode标签就是一个独立的数据分片。
# 该节点指向的是localhost数据库实例,使用的是shop数据库
-
name 属性定义数据节点的名字,这个名字需要是唯一的,我们需要在 table 标签上应用这个名字,来建立表与分片对应的关系。
-
dataHost 属性定义该分片属于哪个数据库实例
-
database 属性用于定义该分片,使用的是数据库实例上,具体的哪一个数据库。
dataHost标签
# dataHost标签直接定义了具体数据库实例,读写分离配置和心跳语句。
<dataHost name="localhost" 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="192.168.0.140:3306" user="root"
password="123456">
<!-- can have multi read hosts -->
<readHost host="hostS1" url="192.168.0.141:3306" user="shop" password="123456" />
</writeHost>
</dataHost>
-
name 指定dataHost的名字
-
maxCon 指定每个读写实例连接池的最大连接数量。 writeHost、 readHost 标签都会使用这个属性的值来实例化出连接池的最大连接数。
-
minCon 指定每个读写实例连接池的最小连接,初始化连接池的大小。
-
balance 负载均衡类型
-
balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
-
balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
-
balance=“2”,所有读操作都随机的在 writeHost、 readhost 上分发。
-
balance=“3”,所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
-
-
writeType 负载均衡类型(自动切换数据库)
-
writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties.
-
writeType=“1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
-
-
dbType 指定后端连接的数据库类型,目前支持二进制的 mysql 协议,还有其他使用 JDBC 连接的数据库。例如:mongodb、 oracle、 spark 等。
-
dbDriver 指定连接后端数据库使用的 Driver,目前可选的值有 native 和 JDBC。使用native 的话,因为这个值执行的是二进制的 mysql 协议,所以可以使用 mysql 和 maridb。其他类型的数据库则需要使用 JDBC 驱动来支持。
-
switchType 控制自动切换
-1 表示不自动切换
1 默认值,自动切换
2 基于 MySQL 主从同步的状态决定是否切换
心跳语句为 show slave status
3 基于 MySQL galary cluster 的切换机制(适合集群)(1.4.1)
心跳语句为 show status like ‘wsrep%’.
-
writeHost 标签、 readHost 标签
-
host 属性用于标识不同实例,一般 writeHost 我们使用M1,readHost 我们用S1。
-
url 属性后端实例连接地址,如果是使用 native 的 dbDriver,则一般为 address:port 这种形式。用 JDBC 或其他的dbDriver,则需要特殊指定。当使用 JDBC 时则可以这么写:jdbc:mysql://localhost:3306/。
-
user 属性后端存储实例需要的用户名字
-
password 属性-后端存储实例需要的密码
-
weight 属性权重 配置在 readhost 中作为读节点的权重(1.4 以后)
-
usingDecrypt 属性是否对密码加密默认 0 否 如需要开启配置 1,同时使用加密程序对密码加密
-
特别感谢
https://www.bilibili.com/video/BV1WJ411x7bD?p=6
https://www.cnblogs.com/icebutterfly/p/9505624.html
https://www.jianshu.com/p/4e15cad5ce6a