下面给出了大部分常用的配置及解释,按自己需要的配置,不需要就不要配
<?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="serverPort">3306</property>
<!-- 配置管理端口,mycat命令会走此端口,监控并管理mycat的运行-->
<property name="managerPort">9066</property>
<!-- 通过mycat登录时是否需要对进行用户密码验证 0:需要输入密码,1:不需要输入密码-->
<property name="nonePasswordLogin">0</property>
<!-- mycat监听哪些ip,如果你的服务器存在多ip,配置0.0.0.0则监听所有ip-->
<property name="bindIp">0.0.0.0</property>
<!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
<property name="subqueryRelationshipCheck">false</property>
<!-- 应用写队列的大小-->
<property name="frontWriteQueueSize">2048</property>
<!-- 默认字符集,注意:此字符集一定要和mysql设置的字符集一致-->
<property name="charset">utf8</property>
<!-- mycat连接到mysql时的隔离级别,3 为可重复读(即mysql默认隔离级别)-->
<property name="txIsolation">3</property>
<!-- mycat进程数,设置成cpu的核数就行-->
<property name="processors">6</property>
<!-- 超时时间,当应用超过该设置的时间没有访问的话,会将连接断开,单位:毫秒-->
<property name="idleTimeout">1200000</property>
<!-- sql执行时间,当sql在该时间内还没执行完,将会把连接断开,单位:秒-->
<property name="sqlExecuteTimeout">300</property>
<!-- 数据集限制,当查询时不指定查询多少条时,会默认加上此限制,下面配置200即为limit 200-->
<property name="defaultMaxLimit">200</property>
<!-- 数据包大小,需要和mysql保持一致,可通过show VARIABLES like '%max_allowed_packet%';查看,
如果设置的过小,大的插入和更新会受限制,1024为1kb,当前设置的是4M-->
<property name="maxPacketSize">4194304</property>
<!-- 开启实时统计,1:开启,0:关闭 -->
<property name="useSqlStat">0</property>
<!-- 开启全表班一致性检测,1:开启,0:关闭 -->
<property name="useGlobleTableCheck">0</property>
<!-- 全局序列号,分库分表情况下保证主键全局唯一,
0:使用本地文件方式,1:使用本地数据库方式,2:使用64位时间戳 -->
<property name="sequnceHandlerType">1</property>
<!--分布式事务开关,0:不过滤分布式事务,1:过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),
2:不过滤分布式事务,但是记录分布式事务日志-->
<property name="handleDistributedTransactions">0</property>
<!--是否采用zookeeper协调切换-->
<property name="useZKSwitch">false</property>
</system>
<!--配置Mycat的访问用户及权限 -->
<!-- 此处定义了一个root用户,可管理所有的逻辑库 ,defaultAccount为true表示默认的访问用户-->
<user name="root" defaultAccount="true">
<property name="password">123456</property>
<!--可访问的逻辑库,配置所有的逻辑库,即可拥有所有逻辑库的访问权限 -->
<property name="schemas">db1,db2,db3</property>
<!-- 是否是只读用户,即只有查询权限,false为非只读用户,true为只读用户-->
<property name="readOnly">false</property>
</user>
<user name="user">
<property name="password">123456</property>
<property name="schemas">db1</property>
<!--privileges标签为操作权限设置 check为是否启用下面定义的操作权限 -->
<privileges check="true">
<!--指定只能访问db1逻辑库,dml为该用户所拥有的操作权限,
数字按顺序分别代表insert,update,select,delete ,1为拥有权限,0为没有权限-->
<schema name="db1" dml="0110" >
<!--表级DML权限设置,dml为指定表的操作权限,
未指定dml的其他表,默认和逻辑库的dml权限保持一致(即上行的dml)-->
<table name="table1" dml="0000"></table>
<table name="table2" dml="1111"></table>
</schema>
</privileges>
</user>
</mycat:server>
<?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:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<!-- tableRule 为配置表的分片规则,name为分片规则的名字,
该名字最好具有可读性,如 hash-mod-10-id ,hash表示以hash方式取模,mod为分片基数,
10表示分成10个表,id表示以id进行切分。注意:该名字不可重复-->
<tableRule name="hash-mod-10-id">
<rule>
<!-- columns表示以哪一列进行切分 -->
<columns>id</columns>
<!-- algorithm为指定表的分片算法,取自下面定义的function标签中的name属性 -->
<algorithm>hash-mod-10</algorithm>
</rule>
</tableRule>
<!--比如,以名称划分比较适合字符串取模分片法 -->
<tableRule name="sharding-by-prefix-pattern-name">
<rule>
<columns>name</columns>
<algorithm>sharding-by-prefix-pattern</algorithm>
</rule>
</tableRule>
<!--比如,以区域划分比较适合枚举分片法 -->
<tableRule name="hash-int-areaId">
<rule>
<columns>areaId</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
<!--name为分片算法的名称,不可重复,class为实现分片算法的java类路径,
PartitionByHashMod为hash分片算法,支持多种数据类型,如整型,字符串,日期等-->
<function name="hash-mod-10" class="io.mycat.route.function.PartitionByHashMod">
<!--property为分片算法中所使用的参数,name属性为参数名,
这里的参数 count 为分片个数,即物理数据库节点数量,10表示分为10个
不同的算法可能需要不同的参数,所以property的个数和name可能都有不同 -->
<property name="count">10</property>
</function>
<!--PartitionByPrefixPattern为字符串取模分片算法(取模就是取余),根据前缀字符长度和取模基数来指定数据存储的位置
取模逻辑:先取前缀的各个字符对应的ASCII码值,然后对ASCII码值进行求和,然后在对得到的和与求模基数进行取模运算,
然后通过mapFile中取模范围与各个节点的对应关系,来确定存储的位置,如:
0-50=0 表示取模的值在范围0-50时,取节点0(即物理数据库编号为0的数据库)
51-100=1 表示取模的值在范围51-100时,取节点1
101-149=2 表示取模的值在101-149时,取节点2 -->
<function name="sharding-by-prefix-pattern"
class="io.mycat.route.function.PartitionByPrefixPattern">
<!--取模基数-->
<property name="patternValue">150</property>
<!--截取的取模前缀字符串长度,3即为截取字符串前3个字符-->
<property name="prefixLength">3</property>
<!--mapFile为指定取模范围与各个分片节点的对应关系文件的文件名,此文件位置在mycat的conf目录下,
如果没有需要在conf目录下新建一个,此文件中的对应关系需要自己修改指定-->
<property name="mapFile">prifix-partition-pattern.txt</property>
</function>
<!--PartitionByFileMap为枚举类型分片算法,可以根据枚举值来指定数据存储的位置-->
<function name="hash-int" class="io.mycat.route.function.PartitionByFileMap">
<!--mapFile为指定对应关系文件的文件名,此文件位置在mycat的conf目录下,
如果没有需要在conf目录下新建一个,此文件中的对应关系需要自己修改指定,
分片表是以0开始的,另外需要指定DEFAULT_NODE作为默认节点,当值找不到对应关系,
就会以默认节点作为指定的节点,如:
10000=0 表示该字段值为10000的,对应的是节点0中(即物理数据库编号为0的数据库)
10001=1 表示该字段值为10001的,对应的是节点1中
DEFAULT_NODE=0 表示以分片节点0作为默认节点-->
<property name="mapFile">partition-hash-int.txt</property>
<!--type为指定文件中枚举值的类型,0表示整型,其他值表示字符串类型-->
<property name="type">0</property>
<!--defaultNode为是否启用默认节点,大于等于0表示启用,小于0表示不启用
这里只是启用默认节点,具体哪一个是默认节点,是取partition-hash-int.txt中DEFAULT_NODE的配置-->
<property name="defaultNode">0</property>
</function>
<!-- 一致性hash分片算法 -->
<function name="murmur"
class="io.mycat.route.function.PartitionByMurmurHash">
<!-- 默认是0 -->
<property name="seed">0</property>
<!-- 要分片的数据库节点数量,必须指定,否则没法分片 -->
<property name="count">2</property>
<!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,
也就是虚拟节点数是物理节点数的160倍 -->
<property name="virtualBucketTimes">160</property>
<!-- 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,
以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。
所有权重值必须是正整数,否则以1代替 -->
<property name="weightMapFile">weightMapFile</property>
<!-- 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,
会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,
没有默认值,如果不指定,就不会输出任何东西 -->
<property name="bucketMapPath">/etc/mycat/bucketMapPath</property>
</function>
</mycat:rule>
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<!--name为逻辑库的名字,逻辑库的名字与物理数据库的名字不一定相同,也有可能一个逻辑库对应多个物理数据库。-->
<!--sqlMaxLimit为限制返回结果集的行数,-1表示关闭限制,
注意:server.xml中配置的sqlMaxLimit为整个mycat的默认值,
这里只是这个逻辑库的限制,如果查询时没有加limit,
则默认给该查询加上此限制,优先取此逻辑库sqlMaxLimit的限制。-->
<!--checkSQLschema为判断是否检查发送给mycat的sql是否含与数据库名,
false为不含库名,true含库名(到mycat时会把库名取掉)-->
<schema name="db1" checkSQLschema="false" sqlMaxLimit="100">
<!--name为逻辑表的名字,必须与物理数据库表名相同,并且此名字是唯一的 ,
primaryKey为逻辑表的主键,必须与物理表中的主键名相同,
dataNode为该表所在的物理数据库节点,值为下面定义的dataNode标签值,
这里写的顺序即为节点的顺序,下面的顺序即为0,1,2
rule为指定分片规则,即rule.xml中的tableRule,如果不用分片则rule这个属性不用定义-->
<table name="goods" primaryKey="id" dataNode="db1,db2,db3" rule="hash-mod-10-id" />
</schema>
<!--dataNode标签为定义逻辑表存储的物理数据库,name为定义数据节点的名称,唯一不可重复,
dataHost为主机组的名称,即下面定义的dataHost,主机组不是一台数据库,
而是具有相同数据的多台数据库的集群,database为物理数据库名称-->
<dataNode name="db1" dataHost="localhost1" database="database1" />
<dataNode name="db2" dataHost="localhost1" database="daatbase2" />
<dataNode name="db3" dataHost="localhost1" database="daatbase3" />
<!--dataHost标签为定义物理数据库主机信息,并且可以定义一组数据库集群信息,一般为主从复制集群
name为这一组数据库主机的名称,maxCon和minCon为定义数据库连接池的大小,具体是指mycat和后端数据库的连接,
maxCon为mycat连接到数据库的最大连接数,minCon为mycat连接到数据库的最小连接数(即初始化连接数)-->
<!--balance主要和读写分离和负载均衡相关,取值解释如下:
0:表示不开启读写分离,即所有的请求都会在主上执行,适合只有一个数据库服务的和对读写延迟比较敏感的
1:在多主多从情况下,第二个及以下的主数据库(第二个writeHost及以下的writeHost)
与所有的从数据库(所有的readHost),都对select进行负载均衡
2:所有的主数据库和所有的从数据库都对select进行负载均衡,适合写操作压力不大的情况
3:所有的从数据库对select进行负载均衡,一般一主多从集群都用这个-->
<!--writeType表示对写操作的处理方式,取值解释如下:
0:表示对第一台主数据库进行写操作,当第一台主数据挂了,会对第二台主数据库进行写操作
1:表示随机写入所有的主数据库,一般随机会有问题,所以不建议配置为1 -->
<!--dbType为数据库类型,现在指定的是mysql,dbDriver为所使用的驱动程序,native表示使用mysql原生的驱动程序
switchType表示写数据库如何进行高可用的切换,取值解释如下:
1:当第一个主数据库不可写时,会自动切换到第二个主数据库
-1:关闭自动切换功能,适用于一主多从集群机构,-->
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3"
writeType="0" dbType="mysql" dbDriver="native" switchType="1">
<!--心跳检测,检查是否能正常提供服务 -->
<heartbeat>select user()</heartbeat>
<!--writeHost为主数据库(master),主要负责写操作,
url为数据库ip和端口,user和password为数据库中真实存在的用户和密码 -->
<writeHost host="192.168.1.1" url="192.168.1.1:3306" user="root" password="123456">
<!--readHost为从数据库(slave),主要负责读操作-->
<readHost host="192.168.1.2" url="192.168.1.2:3306" user="root" password="123456" />
</writeHost>
<!--第二个主数据配置,可以看到该主机和上面的从主机是同一个,即当switchType=1时,
如果第一个主数据库挂了,会把写操作写到该数据库服务器上,同时还会负责读的请求,这样就满足了高可用 -->
<writeHost host="192.168.1.2" url="192.168.1.2:3316" user="root" password="123456" />
</dataHost>
</mycat:schema>
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="WARN">
<Appenders>
<Console name="Console" target="SYSTEM_OUT">
<PatternLayout pattern="%d [%-5p][%t] %m %throwable{full} (%C:%F:%L) %n"/>
</Console>
<RollingFile name="RollingFile" fileName="${sys:MYCAT_HOME}/logs/mycat.log"
filePattern="${sys:MYCAT_HOME}/logs/$${date:yyyy-MM}/mycat-%d{MM-dd}-%i.log.gz">
<PatternLayout>
<!--Pattern标签为配置Mycat日志格式 -->
<!--%d表示日志的时间格式,{}中的内容表示具体日期格式 -->
<!--%5p表示日志的输出级别,5表示固定输出5个字符,不足5个字符会右对齐 -->
<!--%t表示记录线程名称 -->
<!--%m表示输出代码中指定的消息 -->
<!--%n表示输出一个回车换行符 -->
<Pattern>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
</PatternLayout>
<Policies>
<OnStartupTriggeringPolicy/>
<SizeBasedTriggeringPolicy size="250 MB"/>
<TimeBasedTriggeringPolicy/>
</Policies>
</RollingFile>
</Appenders>
<Loggers>
<!--level为配置日志的输出级别-->
<!--日志的输出级别有8种,分别是:all、trace、debug、info、warn、error、fatal、off
这8种级别按照此顺序,输出日志信息依次减小,all为输出所有信息,off为关闭,即不输出-->
<asyncRoot level="info" includeLocation="true">
<AppenderRef ref="RollingFile"/>
</asyncRoot>
</Loggers>
</Configuration>