Mycat安装教程

下载压缩包

[root@localhost ~]# wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.g

解压缩

[root@localhost ~]# tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz

拷贝软件到基础目录

[root@localhost ~]# mv mycat /usr/local/

配置Mycat

1、确认MySQL主从复制正常 在配置MyCat前,请确认MySQL的主从复制安装配置已完成并正常运行。MySQL主从数据的同步在MySQL中配置,MyCat不负责数据同步的问题。 补充: (1) MySQL主从复制配置中,如果涉及到函数或存储过程的同步复制,需要在/etc/my.cnf中的[mysqld]段中增加配置log_bin_trust_function_creators=true 或在客户端中设置 set global log_bin_trust_function_creators = 1; (2) 如果要做读写分离下的主从切换,那么从节点也有可能会变为写节点,因此从节点就不能设置为只读 read_only=1 。 (3) Linux版本的MySQL,需要设置为MySQL大小写不敏感,否则可能会发生找不到表的问题。可在/etc/my.cnf的[mysqld]段中增加lower_case_table_names=1 。

[root@localhost ~]# cd /usr/local/mycat/
[root@localhost mycat]# pwd
/usr/local/mycat
[root@localhost mycat]# vi /etc/profile
## mycat env
export MYCAT_HOME=/usr/local/mycat
export PATH=$PATH:$MYCAT_HOME/bin
[root@localhost mycat]# source /etc/profile
[root@localhost mycat]# cd /usr/local/mycat/conf

修改schema.xml

基础概念

schema 标签

逻辑库,与MySQL中的Database(数据库)对应,一个逻辑库中定义了所包括的Table。

<schema name="test" checkSQLschema="false" sqlMaxLimit="100">
</schema>

name:定义逻辑库名字(通过mycat访问看到的数据库名。逻辑库名和后端物理库名可能不同,也可能对应后端多个物理库。同一个实例下的物理数据库名称不能重复。同样schema的逻辑库名也不能重复)

sqlMaxLimit:限制每次查询数据所返回的最大行数(server.xml中的limit是整个mycat系统的默认值,这里则是当前逻辑库的默认值,默认先看schema.xml的限制数)

checkSQLschema(mysql中可以通过dbName.tableName的方式来访问指定库下的指定表。而mycat中却不推荐这样使用,因为mycat对应的逻辑库可能是在不同物理服务器上的,而mysql也不支持跨物理服务器的访问,其实想让mysql支持跨数据库访问也可以使用数据库连接的方式来实现,但也不推荐。mycat中dbName.tableName访问的方式可能会出错,checkSQLschema是用来检查是否通过dbName.tableName的方式来访问数据库中的表,默认false,即用户自己检测)

Table:逻辑表

即物理数据库中存储的某一张表,与传统数据库不同,这里的表格需要声明其所存储的逻辑数据节点DataNode。在此可以指定表的分片规则。

<table name="user" primaryKey="id" dataNode="dn1" />

name :逻辑表名和相应后端物理表名要一致.

primaryKey :定义的是后端物理表的真实主键.

dataNode :定义了表数据存储的实际物理节点名称(多个用逗号隔开,顺序一旦定义就不能修改,否则会出现混乱)

rule :定义了逻辑表分片规则 在rule.xml中的中定义(例如:rule=“auto-sharding-long” )

dataNode:数据节点

<dataNode name="dn1" dataHost="sulwan" database="test" />

name: 配置文件中必须唯一.

dataHost:数据库所在主机组的名字,物理数据库是存储在一组被命名为sulwan的数据库服务器之中的,之所以说是一组服务器,是因为sulwan所代表的的服务器不是一台数据库,而是一组具有相同的数据的多台数据服务器的集群,通常是一个mysql主从复制集群。其实sulwan10,sulwan11就是下面同样要在schema.xml中定义的dataHost的name的值.

database:定义物理数据库名.

dataHost

   <dataHost name="sulwan" maxCon="500" minCon="20" balance="0"
        writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="sulwan10" url="192.168.168.10:3306" user="root" password="123456" />
     			<readHost host="sulwan11" url="192.168.168.11:3306" user="root" password="123456"/>
     		</writeHost>
   </dataHost>

​ name:定义一组数据库服务器的名称(在配置文件中必须唯一).

​ maxCon:mycat连接mysql的最大连接数.

​ minCon:mycat连接mysql的最小连接数.

​ balance:mycat读写分离、读的负载均衡的工作方式.

​ 0.不开启读写分离机制.

​ 1.全部的readHost与stand by writeHost参与select语句的负载均衡.

​ 2.所有的readHost与writeHost都参与select语句的负载均衡.

​ 3.所有的readHost参与select语句的负载均衡.

​ writeType:

​ 0.所有写操作都是由writeHost标签配置的第一个写主机来执行,只有当第一个挂掉之后,写请求才会到第二个上

​ 1.随机发送到写请求的writeHost上定义的写主机执行

​ dbType:使用的数据库类型(mysql、mongodb等)

​ dbDriver:所使用数据库的驱动程序

​ natice:mysql原生的通讯协议

​ switchType:写数据库如何进行高可用切换

​ 1.当每一个writeHost不可访问的时候都会切换到第二个writeHost写服务器

​ -1.关闭自动切换功能

heartbeat: 检查数据库是否可用。

writeHost通常定义master服务器,readHost通常定义slave服务器。readHost必须镶嵌在writeHost内的(一个writeHost里可以定义多个readHost标签)

​ host属性定义了mysql实例的名称,通常是服务器名称或主机ip

​ url指定了ip和端口号(也可以用域名)

​ user、password同server.xml中定义的不同,这里是后端数据库真实存在的,并有相应的权限。目前这里不支持加密密码

完整配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
       <schema name="test" checkSQLschema="false" sqlMaxLimit="100">
            <table name="user" primaryKey="id" dataNode="dn1,dn2" rule="auto-sharding-long" />
       </schema>
       <dataNode name="dn1" dataHost="sulwan" database="user" />
        <dataHost name="sulwan" maxCon="500" minCon="20" balance="0"
                writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <writeHost host="sulwan10" url="192.168.168.10:3306" user="repl" password="123456" />
                        <readHost host="sulwan11" url="192.168.168.11:3306" user="repl" password="123456"/>
                    </writeHost>
        </dataHost>
</mycat:schema>

修改server.xml

vi 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="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 -->
	<property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 -->

		<property name="sequnceHandlerType">2</property>
      <!--  <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> 
	 -->
		<!--默认为type 0: DirectByteBufferPool | type 1 ByteBufferArena-->
		<property name="processorBufferPoolType">0</property>
		<!--默认是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> <property name="bindIp">0.0.0.0</property> 
			<property name="frontWriteQueueSize">4096</property> <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">1m</property>

		<!--
			单位为k
		-->
		<property name="spillsFileBufferSize">1k</property>

		<property name="useStreamOutput">0</property>

		<!--
			单位为m
		-->
		<property name="systemReserveMemorySize">384m</property>


		<!--是否采用zookeeper协调切换  -->
		<property name="useZKSwitch">true</property>


	</system>
	
	<!-- 全局SQL防火墙设置 -->
	<!-- 
	<firewall> 
	   <whitehost>
	      <host host="127.0.0.1" user="mycat"/>
	      <host host="127.0.0.2" user="mycat"/>
	   </whitehost>
       <blacklist check="false">
       </blacklist>
	</firewall>
	-->
	
	<user name="root"><!-- 连接mycat的用户名-->
		<property name="password">123456</property><!-- 连接mycat的密码-->
		<property name="schemas">test</property><!-- 逻辑数据库名,这里会和schema.xml中的配置关联,多个用逗号分开 -->
		
		<!-- 表级 DML 权限设置 -->
		<!-- 		
		<privileges check="false">
			<schema name="TESTDB" dml="0110" >
				<table name="tb01" dml="0000"></table>
				<table name="tb02" dml="1111"></table>
			</schema>
		</privileges>		
		 -->
	</user>
<!--
	<user name="user">
		<property name="password">user</property>
		<property name="schemas">TESTDB</property>
		<property name="readOnly">true</property>
	</user>
-->
</mycat:server>

修改log日志级别为debug

修改log日志级别为debug,以便通过日志确认基于MyCat的MySQL数据库集群读写分离的数据操作状态(可以在正式上生产前改成info级别)

设置log4j2的自身log级别为warn –> <!– OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL

vi log4j2.xml
<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="DEBUG">
    <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>%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>
        <!--<AsyncLogger name="io.mycat" level="info" includeLocation="true" additivity="false">-->
            <!--<AppenderRef ref="Console"/>-->
            <!--<AppenderRef ref="RollingFile"/>-->
        <!--</AsyncLogger>-->
        <asyncRoot level="info" includeLocation="true">

            <AppenderRef ref="Console" />
            <AppenderRef ref="RollingFile"/>

        </asyncRoot>
    </Loggers>
</Configuration>

启动

[root@localhost bin]# cd /usr/local/mycat/bin

[root@localhost bin]# ./mycat start

测试

mysql -usulwan -p123456 -P8066 -h192.168.168.10

如果整合Java中使用,注意驱动版本

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.34</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.48</version>
        </dependency>