零、说在前面
书接前文,首先祭出前文中出现的几个配置文件,然后分别说明
其实大部分的配置标签及其属性,在官方的Mycat的说明文档中都有说明,我只选一些我觉得比较重要的说一下
一、开始配置
1、server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License");
- you may not use this file except in compliance with the License. - You
may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0
- - Unless required by applicable law or agreed to in writing, software -
distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT
WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the
License for the specific language governing permissions and - limitations
under the License. -->
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<!-- 字符集 -->
<property name="charset">utf8</property>
<!-- 处理线程数量,默认与cpu数量一致,具体情况根据服务器部署的其他服务的数量决定 -->
<property name="processors">1</property>
<!-- 1为开启实时统计、0为关闭 -->
<property name="useSqlStat">0</property>
<!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="useGlobleTableCheck">0</property>
<property name="sequnceHandlerType">2</property>
<property name="processorBufferPoolType">0</property>
<property name="handleDistributedTransactions">0</property>
<property name="useOffHeapForMerge">1</property>
<property name="memoryPageSize">1m</property>
<property name="spillsFileBufferSize">1k</property>
<property name="useStreamOutput">0</property>
<property name="systemReserveMemorySize">384m</property>
<property name="useZKSwitch">true</property>
</system>
<user name="root">
<!-- 这里的账号和密码与你的数据库一致即可 -->
<property name="password">987654</property>
<!-- 这里的TESTDB的名字可以随便写,只需与schema.xml中的一致即可 -->
<property name="schemas">TESTDB</property>
</user>
</mycat:server>
2、schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!-- 这里的name属性的值TESTDB与上面server.xml中的一致即可,
sqlMaxLimit属性代表每次只查询前n条符合条件的记录,避免全表扫描 -->
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- 下面名叫“t_a1”的表是在我的库中真实存在的一个表,
同时,下面的dataNode属性的值对应的是下面dataNode标签的name属性的值 -->
<table name="t_a1" primaryKey="ID" type="global" dataNode="dn1" />
</schema>
<!-- dataNode标签的主要作用是指明对哪一个数据库进行操作和管理,
其中的dataHost属性对应的下面dataHost标签的name属性的值 -->
<dataNode name="dn1" dataHost="localhost1" database="xxtest" />
<!-- 下面的localhost1的名字是随便取的,balance、writeType和switchType的含义在下面解释 -->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 检测心跳的方法,可以用下面的语句,也可以用其他的 -->
<heartbeat>select user()</heartbeat>
<!-- 下面是读和写的mysql的ip和端口,以及登录的账号和密码。
开始我被忽悠,把读与写的host属性的值写成一样的,注意,那是不可以的 -->
<writeHost host="hostM1" url="192.168.122.21:3306" user="root" password="987654">
<readHost host="hostS2" url="192.168.122.22:3306" user="root" password="987654" />
</writeHost>
</dataHost>
</mycat:schema>
先说一下<table>中各属性的含义,如下
primaryKey 主键字段名,据说自动生成主键时需要设置
autoIncrement 是否自增。若想在Mycat中使用这个参数,前提是需要在MySQL的表中定义了自增长的主键,
然后才可以使用last_insert_id获取主键返回值。此参数与表中的对应设置缺一不可。
rule 分片规则,见我dark下面的说明
type 逻辑表的类型,目前逻辑表只有全局表和普通表,前者取值为“global”,后者为空
同时,全局表查询任意节点,普通表查询所有节点,(我没懂具体区别在哪里)
needAddLimit 在分库分表的情况下,数据量会异常庞大,所以此参数是用来确定是否限制返回的数据条数
接着是字表<childTable>中的属性
当前标签是用于ER分片的字表使用,通过joinKey和parentKey与父表关联
joinKey 子表的某个字段,与父表关联
parentKey 父表的某个字段,与字表关联
再说一下上面<dataHost>中各属性的含义,如下
balance指的负载均衡类型,目前的取值有4种:
"0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
"1",全部的readHost与stand by writeHost参与select语句的负载均衡,
简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),
正常情况下,M2,S1,S2都参与select语句的负载均衡。
"2",所有读操作都随机的在writeHost、readhost上分发。
"3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
writeType值得是写入的模式
"0" 表示所有写操作发送到第一个writeHost上,若第一个挂了切换到存活的第二个writeHost上
重启后仍以切换后的在用那个为准,切换记录在配置文件"dnindex.properties"中
"1"表示所有写操作随机的发送到所有的writeHost上,1.5版本后1这个取值废弃不用
switchType指的是切换的模式,目前的取值也有4种:
"-1" 表示不自动切换
"1" 默认值,表示自动切换
"2" 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
"3"基于MySQL galary cluster的切换机制(适合集群)(1.4.1),
心跳语句为 show status like 'wsrep%'。