bboyjing's blog

Mysql分库分表之Mycat学习笔记二【配置初探】

本章节先了解下Mycat比较重要的部分,即配置文件,就是上一章节中说到的conf目录下的相关内容。

先看一下Mycat里几个重要的概念

  1. 用户
  2. 逻辑库(schema)
  3. 逻辑表(table)
  4. 分片节点(dataNode)
  5. 分片规则(rule)
  6. 全局序列号(sequence)

下面就逐个来讲讲,想一个场景,然后把配置都配好,最终要完整的运行起来。

用户

用户相关配置位于conf/server.xml中,server.xml包含了整个Mycat Server的配置情况,这里只截取针对性的内容来看下

1
2
3
4
5
<user name="root">
<property name="password">bboyjing</property>
<property name="schemas">OrderDB</property>
<!-- <property name="readOnly">true</property> -->
</user>

上述配置定义了连接Mycat Server的用户名和密码,以及能够访问的schema(schema下面再讲解),如果是只读用户可以加上readOnly属性为true。下面就把原有的user标签修改为上述内容。

逻辑库(schema)

schema的概念和Mysql中的DataBase概念是一样的,这样就容易理解了。其相关配置位于conf/schema.xml中,user标签中的schemas属性指向的就是schema标签的name属性。下面看下schema标签的内容:

1
2
<schema name="OrderDB" checkSQLschema="false" sqlMaxLimit="100">
</schema>

schema标签有四个属性

  1. name:schema的名称相当于数据库的名称
  2. dataNode:schema所在的分片(dataNode下面讲解),其实就是物理数据库。不过直接在schema上定义dataNode会略显粗糙,可能更多的还是由各个表自己定义分片规则来路由到相应的dataNode。
  3. checkSQLschema:当设置为true时,如果执行select * from OrderDB.order,Mycat会把语句修改为select * from order,即把表示schema的字符删掉,比较好的做法是关掉这个验证,发送SQL时不要带schema。
  4. sqlMaxLimit:当设置为某个数值时,即使执行SQL没有加上limit,Mycat也会自动加上对应的值。当SQL语句中指定了limit时,不受该值约束。官方文档上还说如果运行的schema为非拆分库的话,该属性不会生效,所以写SQL时还是严谨点好,该查多少条自己控制。

逻辑表(table)

table就是对应Mysql中的表,table标签是schema的子标签,所以依然是修改conf/schema.xml。

1
2
3
<schema name="OrderDB" checkSQLschema="false" sqlMaxLimit="100">
<table name="order" dataNode="dn1,dn2" rule="mod-long" />
</schema>

table标签有九个属性

  1. name:对应Mysql中的表名
  2. dataNode:逻辑表所在的分片,该属性值需要和dataNode标签的name属性对应,dateNode标签下面会讲解
  3. rule:逻辑表使用的分片规则名称,规则在conf/rule.xml中配置,该属性值必须与tableRule标签中的name属性对应
  4. ruleRequired:是否绑定分片规则,如果为true的话,就一定要配置rule
  5. primaryKey:逻辑表对应真实表的主键
  6. type:逻辑表类型,分为全局表和普通表,后面写例子时再详细说明该属性
  7. autoIncrement:是否启用自增主键,对应Mysql自增主键,默认时禁用的
  8. subTable:分表,1.6以后开始支持
  9. needAddLimit:是否允许自动添加schema标签中设置的limit,默认为true

table标签下还有个childTable子标签,用于定义E-R分片的字表,所谓E-R分片就是把两个有关系的路由到同一个分片,方便join操作,具体配置后面写示例时再看。

分片节点(dataNode)

dataNode定义了Mycat中的数据节点,也就是通常说的数据分片,其实就是指向了具体的数据库地址和名称。
dataNode标签和schema同级,依然修改conf/schema.xml

1
2
<dataNode name="dn1" dataHost="dockerhost1" database="order_db" />
<dataNode name="dn2" dataHost="dockerhost2" database="order_db" />

dataNode标签有三个属性

  1. name:分片名称,全局唯一
  2. dataHost:数据库实例地址,对应dataHost标签的name属性(下面讲解)
  3. dataBase:对应数据库实例上的具体数据库,要预先建好

节点主机(dataHost)

dataHost标签定义了具体的数据库实例、读写分离配置和心跳语句。
dataHost标签和schema同级,依然修改conf/schema.xml。

1
2
3
4
5
6
7
8
9
10
11
12
13
<dataHost name="dockerhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="bboyjing">
</writeHost>
</dataHost>
<dataHost name="dockerhost2" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3316" user="root" password="bboyjing">
</writeHost>
</dataHost>

dataHost标签有9个属性

  1. name:节点主机名称
  2. maxCon:指定每个读写实例连接池的最大连接
  3. minCon:指定每个读写实例连接池的最小连接,即初始化连接池的大小
  4. balance:读操作负载均衡类型,目前有三个可选值”0”、”1”、”2”、”3”。读写分离相关策略,后面再详细讲,例子中的”0”代表不开启读写分离,读操作都发到writeHost上
  5. writeType:写操作负载均衡类型,目前有三可选值”0”、”1”、”2”,具体后面再看,例子中的”0”表示所有写操作发送到第一个writeHost,第一个挂了切换到还生存的第二个writeHost。
  6. dbType:指定连接的数据库类型,目前支持二进制的Mysql协议,还有其他的JDBC连接的数据库。例如mongodb、oracle、spark等
  7. dbDriver:指定连接数据库的驱动,目前可选指为native和JDBC。native支持mysql和mariadb,其他数据库需要用JDBC驱动
  8. switchType:自动切换标识,”1”为默认值,表示不自动切换,其他可选指为”1”、”2”,暂不展开
  9. tempReadHostAvailable:writeHost失联后,其下面的readHost仍旧可用,默认0,可选值0、1

分片规则(rule)

分片规则位于conf/rule.xml中,其中定义了我们对表进行拆分所涉及到的规则定义,

1
2
3
4
5
6
7
8
9
10
11
<tableRule name="mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<function name="mod-long" class="org.opencloudb.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">2</property>
</function>

tableRule标签

  1. name属性:指定rule全局唯一的名字
  2. columns标签:拆分的列的名字
  3. algorithm标签:指向function标签的name属性,表示具体的算法

function标签

  1. name属性:指定算法名称
  2. class属性:指定路由算法具体的类名
  3. property标签:定义了算法具体的规则,此算法的含义是根据id mod2将数据路由到两个分片上。Mycat定义了一些算法规则,后面再讲

全局序列号后面章节再讲

至此,了解了下Mycat基本的配置,下面尝试下基于这些配置,将Mycat启动,并且成功插入数据。