schema.xml的作用
- 配置逻辑库和逻辑表
- 配置逻辑表的数据节点
- 配置数据节点的对应的mysql物理服务器的信息(ip、port、user、password)
- 应用程序用sql通过mycat获取mysql数据,mycat是通过schema配置的逻辑库和逻辑表信息找到对应的mysql节点以及节点中的数据库和数据表,然后连接mysql,让mysql执行sql,得到结果,再转发给应用程序
定义逻辑库-schema标签
mycat会定义逻辑库和物理数据库的对应关系,所以,逻辑库的名字可以自定义,不要求和物理数据库同名
<schema name="project1db1" checkSQLschema="false" sqlMaxLimit="100">
</schema>
如上定义了一个名为project1db1的逻辑库,
sqlMaxLimit设置默认的查询结果返回100条记录,
checkSQLschema设置是否要检查sql中包含数据库名字,默认false不检查,要求程序员写sql时不要使用库名.表明的写法(select * from project1db1.orders where …,),直接不带库名访问(select from orders),因为会跨数据库服务器访问,操作很麻烦
定义逻辑表-table标签
mycat不会定义逻辑表和物理数据表的对应关系,只是通过逻辑表声明存在的物理数据表,所以要求逻辑表和物理表的要同名
<table name="bill" primaryKey="Fbid" dataNode="db01,db02" rule="bill" >
</table>
如上定义了名字是bill的逻辑表,跟物理表名一致,
primaryKey属性设置主键是Fbid也跟物理表中一致,但是主键和水平切分用的分片键(字段)可能不一致,mycat会缓存这个自定义的主键和分片节点的关系(这样就可以将通过分片键的查询转化成对主键的查询,因为主键查询效率最快)
dataNode属性定义了存在db01、db02两个物理节点上,值来源于标签
rule属性是定义使用的水平切分规则,值来源于rule.xml中配置的某个tableRule标签的name属性值,不是进行水平切分的可以不设置这个属性值
定义逻辑表存储的物理数据库节点-dataNode标签
<dataNode name="db1" dataHost="mysqlcluster1" database="project1">
</dataNode>
如上定义了名字是db1的数据节点,
dataHost属性定义使用的Mysql集群mysqlcluster1,值来源于dataHost标签的name
database 定义使用的(mysqlcluster1集群)物理节点上真实存在的数据库名字
定义节点使用的集群机器信息-dataHost标签
<dataHost name="mysqlcluster1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.5.10" url="192.168.5.10:3306" user="root" password="123456" >
<readHost host="192.168.5.11" url="192.168.5.11:3306" user="root" password="123456" />
<readHost host="192.168.5.12" url="192.168.5.12:3306" user="root" password="123456" />
</writeHost>
</dataHost>
如上定义了mysql集群名称mysqlcluster1,
因为对应用程序来说,MyCat可以当做数据库连接池的作用,所以有maxCon、minCon等属性配置,控制mycat和mysql之间(也就等于用户和mysql之间)连接数大小
maxCon属性定义最大连接数
minCon属性定义默认初始化的最小连接数
balance属性定义读写分离和查询负载均衡的工作方式,
- balance=0时,不开启读写分离,无负载均衡,适合单机数据库使用
- balance=1时,集群中所有readHost和备用的writeHost参与查询负载均衡,只有那些正在负责写的主节点不参与
- balance=2时,集群中所有机器无论负责读写的都参与查询负载均衡,适合写压力不大时writeHost帮readHost分担查询压力
- balance=3时,适合一主多从,所有readHost参与查询负载均衡,writeHost不负责查询
writeType属性集群中定义写数据的方式
- writeType=0时(一般默认这个值),写操作只由第一个writeHost负责,其他writeHost做备用机,前面的writeHost挂了才切换成写操作
- writeType=1时,所有wirteHost都参与写,随机执行,可能出现写错乱
dbType属性定义使用mysql这种数据库
dbDriver属性,值native表示使用原生驱动,jdbc表示使用JDBC驱动
switchType属性定义高可用切换主服务器方式
- switchType=1表示让mycat实现高可用切换,当第一个writeHost挂了,切换到后面可用的writeHost作为主节点进行写操作
- switchType=-1时表示集群已经使用其他工具进行高可用切换,mycat不作操作
heartbeat标签定义mysql心跳检测,通过执行一段简单的查询语句,测试mysql是否可以正常工作
writeHost 标签定义主服务器,负责写或者备用写
readHost 标签定义从服务器,负责读,xml结构中处在writeHost标签内
- host属性定义mysql服务器名称(自定义)
- url属性定义mysql服务器访问地址
- user属性定义访问mysq服务器的用户
- password属性定义访问mysql服务器的密码
完整的文件内容
下面是将mysql的project数据库中的users表依据project_users_rule定义的切分规则,将users表水平切分到mysqlcluster1集群中的3台mysql服务器中存储,每台服务器都有3个数据库project_db1、project_db2、project_db3,一台(192.168.5.10)负责写两台负责读(其中slave=192.168.5.11还作为备用切换的机器),3个db都有t_users表,同一台mysql中的3个db中的t_users表分别存储了一部分用户,合起来就是所有用户集了
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="project_schema_db" checkSQLschema="false" sqlMaxLimit="100" >
<table name="t_users" primaryKey="Fid" dataNode="db1,db2,db3" rule="project_users_rule">
</table>
</schema>
<dataNode name="db1" dataHost="mysqlcluster1" database="project_db1" />
<dataNode name="db2" dataHost="mysqlcluster1" database="project_db2" />
<dataNode name="db2" dataHost="mysqlcluster1" database="project_db3" />
<dataHost name="mysqlcluster1" maxCon="1000" minCon="10" balance="1" >
<heartbeat>select user()</heartbeat>
<writeHost host="192.168.5.10" url="192.168.5.10:3306" user="mycatuser1" password="123456" >
<readHost host="192.168.5.11" url="192.168.5.11:3306" user="mycatuser1" password="123456" />
<readHost host="192.168.5.12" url="192.168.5.12:3306" user="mycatuser2" password="123456" />
</writeHost>
<writeHost host="192.168.5.11" url="192.168.5.11:3306" user="mycatuser1" password="123456" />
</dataHost>
</mycat:schema>