Mycat安装测试使用
Mycat简介:
MyCAT 是一款开源的Mysql企业级集群应用,它是基于阿里的开源产品Cobar发展出来的。MyCAT提供了类似Mysql的接口,可以平滑的将单机Mysql迁移到Mysql集群上,解决数据存储和业务规模迅速增长情况下的数据瓶颈问题。
安装:
环境需要JDK1.8,mysql5.5-5.7版本之间(稳定版)
下载安装mycat安装包
Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar 解压mycat安装包
tar xvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
安装完成
测试修改配置文件
主要配置文件 :
schema.xml中定义逻辑库,表、分片节点等内容;
rule.xml中定义分片规则;
server.xml中定义用户以及系统相关变量,如端口等
wrapper.conf是控制mycat jvm的一些启动参数。
server.xml是Mycat服务器参数调整和用户授权的配置文件。
schema.xml是逻辑库定义和表以及分片定义的配置文件。
rule.xml是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启Mycat。
server.xml是MyCAT对外的“虚拟数据库”配置文件。所谓的“虚拟数据库”是说,MyCAT将多个Mysql集群整合起来对外提供服务,提供服务的接口仍然采用Mysql的形式,因此,通过仿造Mysql接口,让调用程序以为自己是在访问Mysql数据库,就是所谓的“虚拟数据库”。
<?xml version="1.0" encoding="UTF-8"?>
<!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为关闭 -->
<!--配置id(序列)的生成方式-->
<property name="sequnceHandlerType">1</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> -->
<property name="handleDistributedTransactions">0</property>
<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>
-->
<!-- 配置mycat服务连接用户名密码 ,在项目中的数据源的用户名密码则使用这个,不再直连mysql-->
<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>
<!-- <user name="user">
<property name="password">user</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">true</property>
</user> -->
</mycat:server>
表明该虚拟数据库有一个schema,TESTDB;
有2个用户test和user,密码分别是root和user,
user用户是只读的,root用户未设置只读,有增删改查权限;
默认的SQL解析器是druidparser。
schema.xml 逻辑库定义和表以及分片定义的配置文件
<mycat:schema xmlns:mycat=“http://io.mycat/”>
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100">
<!-- 配置物理表在mycat中的逻辑关系,这里指定了mycat中有一张逻辑表名为user,这张表的实际数据分散在dn1,dn2,dn3中对应的不同数>据库里面,且分片规则采用了mod-long,当然可以指定不同的分片规则,分片规则在rile.xml配置 -->
<table name="users" dataNode="dn1,dn2,dn3" rule="rule1">
<!-- userInfo表是user表的关联表,用于关联查询的情况下,mycat的分片采用er模型,joinKey="userId"为userInfo表的字段,联user表的id,当然也不定非得是id,通过parentKey="xx"可以指定关联user表的字段 -->
<childTable name="userInfo" joinKey="userId" parentKey="id"/>
</table>
</schema>
<!-- 配置3个节点,该节点的三个属性依次为:节点的名称,服务器ip,数据库实例(MySQL真正的实例) -->
<dataNode name="dn1" dataHost="bogon" database="db0" />
<dataNode name="dn2" dataHost="bogon" database="db1" />
<dataNode name="dn3" dataHost="bogon" database="db2" />
<!-- 配置连接的数据库,需配置好连接数据库的用户名和密码及ip,这个可以配置多个地址,且可分为读数据库和写数据库 -->
<dataHost name="bogon" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<!-- 心跳,mycat服务每隔一段时间会发出该sql语句,验证该服务器是否被停掉 -->
<heartbeat>select user()</heartbeat>
<!-- 指定自己mysql的地址及用户名密码 -->
<writeHost host="bogon" url="192.168.1.142:3306" user="root"
password="123456">
</writeHost>
</dataHost>
</mycat:schema>
Schema中主要配置 Mycat 数据库,MySQL表,分片规则,分片类型。
schema
第1块是schema块,主要描述了虚拟数据库的schemaTESTDB中有哪些表,每个表分布在哪些数据节点上,分布的方法采用哪种算法。例如
dataNode
第2块是dataNode,表示该数据库有哪些数据节点,以及这些数据节点实际对应的数据服务器和数据库名,这里配置了3个节点dn1,dn2,dn3,都是在bogon服务器上,数据库名分别是db0,db1,db2,其实,这也正是前面schema块中用到的。
dataHost
第3块是dataHost,这部分是实际的数据库服务器配置,这里测试配置了本地Mysql数据库,地址在“192.168.1.142:3306”,用户名都是root,密码是123456,并且指定了心跳是select user()。
这里面有两个参数需要注意,balance和 switchType。
balance指的负载均衡类型,目前的取值有4种:
balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
balance=“1”,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
balance=“2”,所有读操作都随机的在writeHost、readhost上分发。
balance=“3”,所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
switchType指的是切换的模式,目前的取值也有4种:
switchType=’-1’ 表示不自动切换
switchType=‘1’ 默认值,表示自动切换
switchType=‘2’ 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
switchType='3’基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like ‘wsrep%’。
rule.xml 定义分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件。
<?xml version="1.0" encoding="UTF-8"?><mycat:rule xmlns:mycat=“http://io.mycat/”>
id
mod-long
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
</mycat:rule>
数据切分中作为表切分规则中最重要的配置,表的切分方式决定了数据切分后的性能好坏,因此也是最重要的配置。
如上面例子配置了一个切分规则,名为rule1 对应的切分方式(function )是按日期切分,该配置中:
tableRule
name 为schema.xml 中table 标签中对应的 rule=“rule1” ,也就是配置表的分片规则,
columns 是表的切分字段: id 。
algorithm 是规则对应的切分规则:映射到function 的name。
function
function 配置是分片规则的配置。
name 为切分规则的名称,名字人员取,但是需要与tableRule 中匹配。
class 是切分规则对应的切分类,写死,需要哪种规则则配置哪种,例如本例是求模法:io.mycat.route.function.PartitionByMod
(上面columns 标识将要分片的表字段,algorithm 分片函数,
此种配置非常明确即根据id与count(你的结点数)进行求模预算,相比方式1,此种在批量插入时需要切换数据源,id不连续)。
property 标签是切分规则对应的不同属性,不同的切分规则配置不同。
登录演示mycat
登录方式类似于 mysql 的服务端登陆,目前 mycat 有两个端口,8066 数据端口,9066 管理端口。
mysql -h192.168.1.142 -uroot -p -P8066
-h 后面是主机,即当前 mycat 按照的主机地址,本地可用 127.0.0.1 远程需要远程 ip
-u Mycat server.xml 中配置的逻辑库用户
-p Mycat server.xml 中配置的逻辑库密码
-P 后面是端口 默认 9066,注意 P 是大写
-d Mycat server.xml 中配置的逻辑库
数据端口与管理端口的配置端口修改:
数据端口默认 8066,管理端口默认 9066 ,如果需要修改需要配置 serve.xml
登录查看真实数据库查看内容是否在db0,db1,db2库的users表中
成功!!!
注意:
启动MyCAT之前,需要先检查一些配置:
1、java的版本需要是1.7或以上;
2、Mysql的配置文件需要加一行lower_case_table_names = 1在[mysqld]栏目中,这个设置为Mysql大小写不敏感,否则可能会发生表找不到的问题;
3、ERROR 3009 (HY000): java.lang.IllegalArgumentException: Invalid DataSource:1
这个有可能是Mycat和MySQL部署在同一台机器上,而在schema.xml是使用了IP的,但是账号只能使用localhost登陆,所以会出现本地的Mycat无法连接MySQL
4、添加MYCAT_HOME环境变量指向解压的mycat目录,主要是为了一些bin目录下的脚本的使用。