编程入门到放弃之Mycat配置文件server.xml、rule.xml、schema.xml、log4j2.xml详解

mycat主要配置文件有server.xml、rule.xml、schema.xml、log4j2.xml,我们先看下这4个文件主要有什么作用

  • server.xml:主要用来配置系统相关参数,用户访问权限,SQL防火墙,SQL拦截。
  • rule.xml:主要用来配置水平分片的分片规则,分片规则所配置的分片函数。(需要进行水平分表时才需进行配置)
  • scheme.xml:主要用来配置逻辑库及逻辑表,配置逻辑表所存储的数据节点,配置数据节点所对应的物理数据库服务器信息。
  • log4j2.xml:主要用来配置日志输出的格式,输出的级别。

配置server.xml文件

  • 主要用来配置系统相关参数,用户访问权限,SQL防火墙,SQL拦截。

下面给出了大部分常用的配置及解释,按自己需要的配置,不需要就不要配

<?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%';查看,
		如果设置的过小,大的插入和更新会受限制,10241kb,当前设置的是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>

配置rule.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: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>

配置schema.xml文件

  • 主要用来配置逻辑库及逻辑表,配置逻辑表所存储的数据节点,配置数据节点所对应的物理数据库服务器信息。
<?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标签值,
                这里写的顺序即为节点的顺序,下面的顺序即为012
                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>

配置log4j2.xml文件

  • 主要用来配置日志输出的格式,输出的级别。
<?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>

你可能感兴趣的:(Mycat,mycat,数据库,分布式,分库分表,分布式数据库,mycat,数据库中间件)