Mycat安装和配置文件

Mycat安装需要JDK;

    官网下载然后解压:http://www.mycat.io/   (备注Mycat库:http://dl.mycat.io/)

    启动和关闭Mycat命令:

        在bin目录下输入命令:  ./mycat start 和 ./mycat stop

配置:(个人理解一些重要的配置文件)

Mycat目录格式参照常见格式(bin/conf/logs/lib)

server.xml: Mycat服务器参数调整和用户授权

schema.xml:逻辑库定义和表以及分片定义的配置文件(设置逻辑库,表,数据节点信息)

rule.xml:分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件

日志文件:日志存放在logs/log,每天一个文件,日子的配置是在conf/log4j.xml中,可以根据需要调整输出级别(建议debug,可以输出更多信息)

三.Mycat使用:(配置文件解析)

3.1 server.xml:

3.1.1 <system>标签:

配置所有mycat参数设置(解析器,端口(默认8066)等),使用<property>标签配置

注意:q开头被划掉的为个人解读版,待验证

<system>
        <property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0-->
	<property name="useHandshakeV10">1</property><!-- q:发送握手数据包 -->
	<property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->
	<property name="sequnceHandlerType">2</property><!--q:"0"表示使用本地文件的方式配置mycat全局序列号,对应sequence_conf.properties文件;"1"表示使用数据库表的方式配置mycat全局序列号-->
    <!--  <property name="useCompression">1</property>--> <!--1为开启mysql压缩协议-->
    <!--  <property name="fakeMySQLVersion">5.6.20</property>--> <!--设置模拟的MySQL版本号-->
	<!-- <property name="processorBufferChunk">40960</property> -->
	<!-- 
	<property name="processors">1</property> 
	<property name="processorExecutor">32</property> -->
	<property name="processorBufferPoolType">0</property>
    <!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena | type 2 NettyBufferPool-->		
	<!--默认是65535 64K 用于sql解析时最大文本长度 -->
	<!--<property name="maxStringLiteralLength">65535</property>-->
	<!--<property name="sequnceHandlerType">0</property>-->
	<!--<property name="backSocketNoDelay">1</property>-->
	<!--<property name="frontSocketNoDelay">1</property>-->
	<!--<property name="processorExecutor">16</property>-->
	<!--
		<property name="serverPort">8066</property>
		<property name="managerPort">9066</property> 
		<property name="idleTimeout">300000</property> 
		<!-- 指定连接的空闲超时时间默认30分钟,配置时,数据源超时时间要小于 mycat的空闲超时时间-->
		<property name="processors">32</property> -->		<!--分布式事务开关,0为不过滤分布式事务,1为过滤分布式事务(如果分布式事务内只涉及全局表,则不过滤),2为不过滤分布式事务,但是记录分布式事务日志-->
	<property name="handleDistributedTransactions">0</property>
	<!--
		off heap for merge/order/group/limit      1开启   0关闭
	-->
	<property name="useOffHeapForMerge">1</property>
	<!--单位为m-->
    <property name="memoryPageSize">64k</property>
	<!--单位为k-->
	<property name="spillsFileBufferSize">1k</property>
	<property name="useStreamOutput">0</property>
	<!--单位为m-->
	<property name="systemReserveMemorySize">384m</property>
	<!--是否采用zookeeper协调切换  -->
	<property name="useZKSwitch">true</property>
	<!-- XA Recovery Log日志路径 -->
	<!--<property name="XARecoveryLogBaseDir">./</property>-->
	<!-- XA Recovery Log日志名称 -->
	<!--<property name="XARecoveryLogBaseName">tmlog</property>-->
	<!-- 其他属性:
		charset :连接的初始化字符集,默认utf8
		txlsolation:前端连接的初始化事务隔离级别,默认是和mysql的repeated_read可重复读隔离级别一致
		sqlExecuteTimeout:sql执行超时时间,默认是300秒
	-->
</system>

3.1.2<user>

配置用户参数

 
 
        <user name="root">
		<property name="password">123456</property>
		<property name="schemas">TESTDB</property>
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>

3.1.3其他标签

防火墙:

<!-- 全局SQL防火墙设置 -->
	<!--白名单可以使用通配符%或着*-->
<!--
	<firewall>
	   <whitehost>
	      <host host="1*7.0.0.*" user="root"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
-->
3.2 schema.xml

3.2.1 <schema>标签

    逻辑库配置,可以有多个;如果不配置该标签,所有表的配置都会属于一个默认的逻辑库.

    <shceme>属性:

        name属性:定义逻辑库名,需要跟server.xml中的引用对应

    checkSQLschema属性:当该值设置为true时,执行SQL语句时,Mycat会去掉schema的字符(eg:"select * from TTESTDB.travelrecord"会被Mycat修改成"select * from travelrecord"),当SQL语句没有schema指定的名字,则不会更改SQL语句, 如果将存在schema字符的sql语句发往数据库会报"(ERROR 1146 (42S02): Table 'testdb.travelrecord' doesn’t exist)."错误

        sqlMaxLimit属性:设置每天sql语句自动加上limit属性

        dataNode属性:绑定逻辑库到某个具体的dataNode上,如果定义了这个属性,这个逻辑库就不能工作在分库分表模式下,这个逻辑库的所有操作都会直接作用到绑定的dataNode上,这个schema就可以用作读写分离和主从切换,可以直接方法,注意该属性只能配置一个databas

     子标签<table>标签:定义逻辑表,所有需要拆分的表都必须在这个标签下定义.

    <table>属性:

            name属性:逻辑表表名,同一个schema标签中table标签name属性唯一;

            dataNode属性:定义这个逻辑表所属的dataNode,跟后面dataNode标签name属性对应(多个对应时可以使用如下方式);

  1. <table name="testdb" dataNode="dn$0-2,multipleDn2$100-199" rule="auto-sharding- long" ></table>
 
  
  1. <dataNode name="dn" dataHost="localhost1" database="db$0-99" ></dataNode>
  2. <dataNode name="dn2" dataHost="localhost1" database=" db$0-99" ></dataNode>

            rule属性:指定逻辑表使用的规则名,需要在rule.xml中有对应<tableRule>标签.

            ruleRequired属性:指定是否绑定分片规则,为true时必须配置具体rule.

            primaryKey属性标记了逻辑表对应真实表的主键(例如:分片的规则是使用非主键进行分片的,那么在使用主键查询的时候,就会发送查询语句到所有配置的DN上,如果使用该属性配置真实表的主键,那么mycat会缓存主键与具体DN的信息,那么再次使用非主键进行查询的时候就不会进行广播式的查询,就会直接发送语句给具体的DN,但是尽管配置该属性,如果缓存并没有命中的话,还是会发送语句给具体的DN 来获取数据)

            type属性: 定义逻辑表类型,global(全局表)&无(普通表)

            autoIncrement属性mysql对非自增长主键,使用last_insert_id() 是不会返回结果的,只会返回0.所以,只有定义了自增长主键的表,才可以用last_insert_id()返回主键值。 mycat提供了自增长主键功能,但是对应的mysql节点上数据表,没有auto_increment,那么在mycat层调用last_insert_id()也是不会返回结果的。如果使用这个功能,最好配合使用数据库模式的全局序列。

            needAddLimit属性:指定表是否需要自动给sql语句加上limit,这个属性默认为true,默认100条,可以设置false关闭这个功能

           

 
 
        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
		<!-- auto sharding by id (long) -->
		<table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" />


		<!-- global table is auto cloned to all defined data nodes ,so can join
			with any table whose sharding node is in the same data node -->
		<table name="company" primaryKey="ID" type="global" dataNode="dn1,dn2,dn3" />
		<table name="goods" primaryKey="ID" type="global" dataNode="dn1,dn2" />
		<!-- random sharding using mod sharind rule -->
		<table name="hotnews" primaryKey="ID" autoIncrement="true" dataNode="dn1,dn2,dn3"
			   rule="mod-long" />
		<!-- <table name="dual" primaryKey="ID" dataNode="dnx,dnoracle2" type="global"
			needAddLimit="false"/> <table name="worker" primaryKey="ID" dataNode="jdbc_dn1,jdbc_dn2,jdbc_dn3"
			rule="mod-long" /> -->
		<table name="employee" primaryKey="ID" dataNode="dn1,dn2"
			   rule="sharding-by-intfile" />
		<table name="customer" primaryKey="ID" dataNode="dn1,dn2"
			   rule="sharding-by-intfile">
			<childTable name="orders" primaryKey="ID" joinKey="customer_id"
						parentKey="id">
				<childTable name="order_items" joinKey="order_id"
							parentKey="id" />
			</childTable>
			<childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"
						parentKey="id" />
		</table>
		<!-- <table name="oc_call" primaryKey="ID" dataNode="dn1$0-743" rule="latest-month-calldate"
			/> -->
</schema>

<ChildTable>标签:  childTable标签用于定义E-R分片的子表。通过标签上的属性与父表进行关联。

    joinKey属性: 插入子表的时候会使用这个列的值查找父表存储的数据节点。

    parentKey属性:属性指定的值一般为与父表建立关联关系的列名。程序首先获取joinkey的值,再通过**parentKey**属性指定的列名产生查询语句,通过执行该语句得到父表存储在哪个分片上。从而确定子表存储的位置。

        <table name="customer" primaryKey="ID" dataNode="dn1,dn2"  
            rule="sharding-by-intfile">  
            <childTable name="orders" primaryKey="ID" joinKey="customer_id"  
                parentKey="id">  
                <childTable name="order_items" joinKey="order_id"  
                    parentKey="id" />  
            </childTable>  
            <childTable name="customer_addr" primaryKey="ID" joinKey="customer_id"  
                parentKey="id" />  
        </table>  

3.2.2 <dataNode>标签

配置分片,表切分后需要配置映射到哪几个数据库,mycat的分片其实是库的别名.

    name属性:定义数据节点名,唯一.

    dataHost属性: 定义该分片属于哪个物理库,与<datahost>标签上的name属性对应

    dataBase属性:定义该分片属于数据库实例上的物理库

        <dataNode name="dn1" dataHost="localhost1" database="db1" />
	<dataNode name="dn2" dataHost="localhost1" database="db2" />
	<dataNode name="dn3" dataHost="localhost1" database="db3" />

3.2.3 <dataHost>标签

定义了物理库分片映射,可配置读写分离,单库和心跳语句

    name属性:标识dataHost标签,唯一.

    maxCon属性:指定每个读写实例连接池最大连接.

    minCon属性:指定每个读写实例连接池最小链接,初始化连接池大小.

    balance属性:指定负载均衡类型

        {"0" : 不开启读写分离,所有操作由发往writeHost--"1" : 所有readHost和stand by writeHost参与select语句的负载均衡,即所有写操作由第一个writeHost执行,读操作由其他所有可用host参与-- "2" : 所有select操作随机分发所有host--"3" : 1.4版本后新加入,所有select操作由writeHost对应的readHost执行,}

    writeType属性: 配置主从相关属性

        {"-1" : 不自动切换--"1" 默认值,自动切换--"2": 基于MySql主从同步状态决定是否切换,心跳语句为show slace status -- "3" : 1.4.1,基于mysql galary cluster 的切换机制(集群状态下) ,心跳语句为show status like 'wsrep%'}.

    dbType属性:指定后端连接的数据库目前支持二进制的mysql协议,还有其他使用jdbc链接的数据库.

    DBDriver属性: 指定连接后段数据库使用的driver,目前可选的值有native和JDBC。使用native的话,因为这个值执行的是二进制的mysql协议,所以可以使用mysql和maridb,其他类型的则需要使用JDBC驱动来支持。如果使用JDBC的话需要符合JDBC4标准的驱动jar 放到mycat\lib目录下,并检查驱动jar包中包括如下目录结构文件 META-INF\services\java.sql.Driver。  在这个文件写上具体的driver类名,例如com.mysql.jdbc.Driver

    connectionInitSql属性:主要是当使用Oracla数据库时,需要执行的初始化SQL语句就这个放到这里面来

<heartbeat>: 指定用于物理库进行心跳检测的语句

<writeHost> <readHost>

指定后端数据库的相关配置给mycat,用于实例化后端连接池。

host属性:用于标识不同实例,一般writeHost我们使用*M1,readHost我们用*S1。
url属性:后端实例连接地址,如果是使用native的dbDriver,则一般为address:port这种形式。用JDBC或其他的dbDriver,则需要特殊指定。当使用JDBC时则可以这么写:jdbc:mysql://localhost:3306/。
user属性:后端存储实例需要的用户名字
password属性:后端存储实例需要的密码


        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
			  writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat>select user()</heartbeat>
		<!-- can have multi write hosts -->
		<writeHost host="hostM1" url="localhost:3306" user="root"
				   password="123456">
			<!-- can have multi read hosts -->
			<readHost host="hostS2" url="192.168.1.200:3306" user="root" password="xxx" />
		</writeHost>
		<writeHost host="hostS1" url="localhost:3316" user="root"
				   password="123456" />
		<!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> -->
	</dataHost>
3.3 rule.xml

配置具体的表分片规则


猜你喜欢

转载自blog.csdn.net/huaixianglant/article/details/80105470
今日推荐