MyCat 之 【server.xml】【log4j2.xml】【rule.xml】【schema.xml】四种配置文件的简述

在mycat中,我们基本使用的有四种配置文件,分别是【server.xml】【log4j2.xml】【rule.xml】【schema.xml】

下面分别简述四种配置文件中的配置,掌握mycat最基本的使用

一)server.xml:

作用:配置系统参数;配置用户访问权限;配置SQL防火墙以及SQL拦截功能

下面是详细的配置,主要针对标签【system】和【user】进行简单的配置讲解

1)首先是我们的系统参数配置,主要查看我们的【system】标签,下面是详细的配置(只展示了常用的部分而配置),注释都有详细说明

<system>
	<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
	<property name="serverPort">3306</property><!-- 设置的默认端口号-->
	<property name="managerPort">9066</property> <!-- 设置的管理端口号-->
	<property name="idleTimeout">300000</property> <!-- 前端应用多长时间没有对mycat进行访问的话,就会断开 ,单位毫秒---->
	<property name="bindIp">0.0.0.0</property>  <!-- 监控的网卡地址,设置0.0.0.0就是监听所有IP-->
	<property name="frontWriteQueueSize">2048</property>   <!-- 前端写队列的大小-->
	<property name="processors">4</property> <!-- mycat进程的数量,一般等于我们服务器CPU的核数-->
	<property name="txIsolation">2</property> <!-- mysql的隔离级别设置,2代表读已提交-->
	<property name="sqlExecuteTimeout">300</property> <!-- sql执行的时间,超过此设置时间断开 单位秒-->
	<property name="charset">utf-8</property> <!-- 设置的编码格式,一定要与mysql创建的数据库编码格式保持一致-->
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
	<property name="defaultMaxLimit">100</property><!-- 对mysqL查询返回的数据集做一个限制 -->
	<property name="maxPacketSize">104857600</property><!-- 默认mysqL 返回包的大小-->
    <property name="memoryPageSize">64k</property><!-- 单位为m-->
</system>

2)就是我们用户访问权限的设置了,主要配置在【user】标签中

2.1)若是我们现在需要对某一个用户配置只读权限,如何配置?

<user name="user">
		<property name="password">user</property> <!--用户的密码-->
		<property name="schemas">TESTDB</property><!--允许访问的逻辑库-->
		<!--
			对于一个用户授权于放翁多个数据库的配置
			<property name="schemas">TESTDB,test1,test2</property>
		-->
		<property name="readOnly">true</property><!--是否是只读用户-->
		
</user>

上面的配置意思是对【user】用户授权只读权限,允许访问逻辑库TESTDB

2.2)若是对某个用户授权可以访问某个库的某些表的某些权限如何设置?

<user name="root" defaultAccount="true">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
		
		<!-- 
        表级 DML 权限设置 
        说明:dml代表权限:insert,update,select,delete
        0代表没有此权限;1代表有此权限
        -->	
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 
</user>

上面配置代表root用户可以访问逻辑库【TESTDB】下的tb02表,并且拥有增,删,改,查的所有权限

2.3)一般我们不会将用户的密码以明文的形式配置在文件中,我们回使用加密方式对我们的密码做一个简单的加密,然后配置

进入我们的执行加密的jar包目录下:

/usr/local/mycat/lib

然后执行

java -cp Mycat-server-1.6.7.1-release.jar io.mycat.util.DecryptUtil 0:root:root

可以看到加密的密码已经输出

然后找到我们的配置文件进行修改

<user name="root" defaultAccount="true">
                <property name="usingDecrypt">1</property>
                <property name="password">CrjpLhvVJkHk0EPW35Y07dUeTimf52zMqClYQkIAN3/dqiG1DVUe9Zr4JLh8Kl+1KH1zd7YTKu5w04QgdyQeDw==</property>
                <property name="schemas">miaosha</property>
</user

记得一定要加上【 <property name="usingDecrypt">1</property>】我们的密文才可以生效

 

二)log4j2.xml

作用:配置日志展示的格式、日志级别等

 <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>%d{yyyy-MM-dd HH:mm:ss.SSS} %5p [%t] (%l) - %m%n</Pattern>
            </PatternLayout>
            <Policies>
                <OnStartupTriggeringPolicy/>
                <SizeBasedTriggeringPolicy size="250 MB"/>
                <TimeBasedTriggeringPolicy/>
            </Policies>
 </RollingFile>
 <asyncRoot level="info" includeLocation="true">
            <AppenderRef ref="RollingFile"/>
 </asyncRoot>

 

简述:

  • 【%d{yyyy-MM-dd HH:mm:ss.SSS}】表示日志的时间格式
  • 【%5p】表示日志的输出级别
  • 【%t】表示日志中记录线程的名称
  • 【%m】表示输出代码中指定的消息
  • 【%n】表示输出一个换行符
  • 【level="info"】:表示输出info级别的日志,共八种日志级别如下:

   All<Trace<Debug<Info<Warn<Error<Fatal<OFF

三)rule.xml

作用:配置水平分片的分片规则;配置分片规则对应的分片函数

例如我们需要对我们的数据库表进行水品切分的时候需要用到算法,我们这时候就可以在这里定义好分片函数,然后在我们的【schema.xml】文件中指定逻辑库配置的时候指定我们的分片函数

下面以常用的四种分片算法为例进行简单的讲解:

3.1)简单取模-PartitionByMod

<tableRule name="mod-long">
		<rule>
			<columns>id</columns>
			<algorithm>mod-long</algorithm>
		</rule>
</tableRule>
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
		<!-- how many data nodes -->
		<property name="count">3</property>
</function>

3.2)哈希取模-PartitionByHashMod

简单概述:对分片列的值进行hash运算,得出一个整数型的数值,然后对分片数量“count”进行取模,就可以得到分片位置

<tableRule name="hash-mod-2_login_name">
    <rule>
        <columns>login_name</columns>
        <algorithm>hash-mod</algorithm>
    </rule>
</tableRule>
<function name="hash-mod"
          class="io.mycat.route.function.PartitionByHashMod">
    <property name="count">2</property>
</function>

3.3)分片枚举-PartitionByFileMap

<tableRule name="hash-int_qy_id">
    <rule>
        <columns>qy_id</columns>
        <algorithm>hash-int</algorithm>
    </rule>
</tableRule>
<function name="hash-int"
          class="io.mycat.route.function.PartitionByFileMap">
    <!-- mapFile 文件名,位于config目录下 -->
    <property name="mapFile">partition-hash-int.txt</property>
    <!-- 指定mapFile中枚举的数据类型,0为整型;非0则为字符串类型 -->
    <property name="type">0</property>
    <!-- 是否启用默认节点,大于等于0为启用;小于等于0为不启用 -->
    <property name="defaultNode">0</property>
</function>

简单讲述场景:拿区域来划分数据,例如我们有三个地方的数据,北京--001,上海--002,深圳--003。

那么我们三个地区要存储在三个数据库表中。这时候我们会在【name="mapFile"】指定的txt文件中配置我们的规则:

001=0;002=1;003=2;而0,1,2分表代表我们的三个数据节点,这样就可以根据我们指定的规则对数据做一个分片处理

【注:枚举分片的规则文件要放在mycat的conf文件下面】

3.4)字符串范围取模-PartitionByPrefixPattern

如下图:

原理解释:例如我们对默认字符串截取前三个字母,然后分别获取三个字母的ascii码值进行相加的计算;

配置文件中我们会指定求模基数的ascii码值,对应上图的128,然后我们用计算得来的和和基数进行取模计算;

在我们的【prefix-partition-pattern.txt】文件中会指明计算结果的落库规则,例如上图:0-63之间的数据会存储在0数据节点,64-127的会存储在1数据节点

下面是详细的配置

<tableRule name="sharding-by-prefix-pattern_login_name">
    <rule>
        <columns>login_name</columns>
        <algorithm>sharding-by-prefix-pattern</algorithm>
    </rule>
</tableRule>
<function name="sharding-by-prefix-pattern"
          class="io.mycat.route.function.PartitionByPrefixPattern">
    <!-- mapFile 文件名,位于config目录下 -->
    <property name="mapFile">prefix-partition-pattern.txt</property>
    <!-- 求模基数 -->
    <property name="patternValue">128</property>
    <!-- 字符串范围,这里为前两位 -->
    <property name="prefixLength">2</property>
</function>

 四)schema.xml

作用:配置逻辑库及逻辑表;配置逻辑表所存储的数据节点;配置数据节点所对应的物理数据库服务器的信息

这个配置文件可以说是我们获取数据的核心,非常关键,下面先看一个简单版的完整配置:

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="MIAOSHA" checkSQLschema="false" sqlMaxLimit="100" >
        <table name="order" primaryKey="orderId" dataNode="mycat1,mycat2" rule="auto-sharding-long" splitTableNames="true"/>
    </schema>

    <dataNode name="mycat1" dataHost="myserver1" database="db1"/>
    <dataNode name="mycat2" dataHost="myserver1" database="db2"/>
    
    <dataHost name="myserver1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1" >
        <heartbeat>select user()</heartbeat>
        <writeHost host="192.168.124.34" url="192.168.124.34:3306" user="root" password="123456">
            <readHost host="192.168.124.35" url="192.168.124.35:3306" user="root" password="123456"/>
        </writeHost>
        <writeHost host="192.168.124.35" url="192.168.124.35:3306" user="root" password="123456"/>
    </dataHost>
</mycat:schema>

 

下面是简单的讲述:

4.1)【table】

  • name 属性定义逻辑表的名字,必须唯一不能重复且需要与数据库中的物理表名一致
  • primaryKey 属性指定逻辑表中的主键,也是需要与物理表的主键一致
  • dataNode 属性指定物理表所在数据节点的名称,配置多个数据节点时需按索引顺序并使用逗号分隔
  • rule 属性用于指定分片规则名称,对应rule.xml中的<tableRule>标签的name属性,如无需分片可以不指定
  • splitTableNames 属性定义是否允许多个表的定义

4.2)【dataNode】

  • name 属性定义数据节点的名称,必须唯一
  • dataHost 属性指定分片所在的物理主机
  • database 属性指定物理数据库的名称,就是我们真实存在的mysql数据库名称

4.3)【dataHost】

  • name 属性用于定义主机名称,必须唯一
  • maxCon 属性指定每个读/写实例连接池的最大连接数
  • minCon 属性指定每个读写实例连接池的最小连接数,即初始化连接池的大小
  • dbType 属性指定后端连接的数据库类型,还有其他使用JDBC连接的数据库
  • dbDriver 属性指定连接后端数据库使用的驱动,目前可选的值有native和JDBC
  • balance 属性指定读写分离的负载均衡类型,目前的取值有4 种:
  •     0:不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上
  •     1:全部的readHost与stand by writeHost参与select语句的负载均衡
  •     2:所有读操作都随机在writeHost、readhost 上分发
  •     3:所有readHost参与select语句的而负载均衡
  • writeType  也是设计负载均衡的标签,配置为0,指定是所有writeHost下只允许第一个写主机执行,只有当第一个写主机挂掉,
  • 才允许第二个写主机来执行;若是配置为1,那么要是有两个写主机,那么会随机将写请求发布到两个主机来去执行
  • switchType  开启自动切换的功能,两个写主机,当地一个写主机挂掉,可以自动切换到第二个;若是配置为-1,则代表关闭了自动这种切换

4.4)【heartbeat】

  • 表示如何检查后端数据库是否可用

4.5)【writeHost】【readHost】

  • writeHost标签配置写实例,即主从中的master节点;readHost 标签配置读实例,即主从中的salve节点
  • host 属性用于标识不同实例名称,一般writeHost名称使用M1作为后缀,readHost则使用S1作为后缀
  • url 属性用于配置数据库的连接地址,如果是使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。例如,当使用JDBC 时则可以这么写:jdbc:mysql://localhost:3306/
  • user 属性配置数据库用户名
  • password 属性配置数据库密码

 

 

 


 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章