5. 安装MyCat
5.1 配置JDK
5.2 在主数据库和从数据库都需要完成
- 开放3306端口
- 保证root用户可以被mycat访问
- 在mycat中通过Master数据库的root用户访问Master数据库
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
flush privileges;
5.3 安装Mycat
上传MyCat并且创建目录
mkdir -p /usr/local/mycat
下载mycat
http://dl.mycat.org.cn/1.6.7.4/Mycat-server-1.6.7.4-release/
解压
tar zxvf Mycat-server-1.6.7.4-release-20200105164103-linux.tar.gz -C /usr/local/mycat/
目录介绍
- bin 目录里是启动脚本
- conf 目录里是配置文件
- catlet 为Mycat的一个扩展功能
- lib 目录里是Mycat和它的依赖jar
- logs 目录里是console.log用来保存控制台日志,和mycat.log用来保存mycat的log4j日志
5.4Mycat结构图
Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx类似。对于使用者来说。访问的都是Mycat,不会接触到后端的数据库,我们现在做一个主从,读写分离。结构如下图:
Mycat的配置文件都在conf目录里面,这里介绍几个常用的文件
文件 | 说明 |
---|---|
server.xml | Mycat的配置文件,设置账号,参数等 |
schema.xml | Mycat对应的物理数据库和数据库表的配置 |
rule.xml | Mycat分片(分库分表)规则 |
5.3.1 server.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<property name="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户-->
<property name="ignoreUnknownCommand">0</property><!-- 0遇上没有实现的报文(Unknown command:),就会报错、1为忽略该报文,返回ok报文。
在某些mysql客户端存在客户端已经登录的时候还会继续发送登录报文,mycat会报错,该设置可以绕过这个错误-->
<property name="useHandshakeV10">1</property>
<property name="removeGraveAccent">1</property>
<property name="useSqlStat">0</property> <!-- 1为开启实时统计、0为关闭 -->
<property name="useGlobleTableCheck">0</property> <!-- 1为开启全加班一致性检测、0为关闭 -->
<property name="sqlExecuteTimeout">300</property> <!-- SQL 执行超时 单位:秒-->
<property name="sequnceHandlerType">1</property>
<!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");
-->
<!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 注意MYCATSEQ_有空格的情况-->
<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>
<property name="subqueryRelationshipCheck">false</property> <!-- 子查询中存在关联查询的情况下,检查关联字段中是否有分片字段 .默认 false -->
<property name="sequenceHanlderClass">io.mycat.route.sequence.handler.HttpIncrSequenceHandler</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 | type 2 NettyBufferPool -->
<property name="processorBufferPoolType">0</property>
<!--默认是65535 64K 用于sql解析时最大文本长度 -->
<!--<property name="maxStringLiteralLength">65535</property>-->
<!--<property name="sequnceHandlerType">0</property>-->
<!--<property name="backSocketNoDelay">1</property>-->
配置Mycat服务信息
如:Mycat中的用户,用户可以访问的逻辑库,可以访问的逻辑表,服务的端口号等
标签 | 释义 |
---|---|
–user | 用户配置节点 |
–name | 登录的用户名 ,也就是连接MyCat的用户名 |
–password | 登录密码 也就是连接MyCat的密码 |
–schemas | 逻辑库名,这里会和schema.xml 中的配置关联,多个用逗号分开,例如需要这个用户管理两个数据库db1, db2,则配置代表db1,db2 |
–privileges | 配置用户针对表的增删改查的权限 |
默认配置了一个账号root密码是123456,针对数据库TESTDB,读写权限都有,没有针对表做 任何特殊的权限。
配置权限
权限 | 内容 | 权限码 |
---|---|---|
dml | Insert update select delete | 0000 |
dml权限顺序为:insert(新增),update(修改),select(查询),delete(删除),0000–> 1111,0为禁 止权限,1为开启权限。
5.3.2 schema.xml配置文件
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" randomDataNode="dn1">
<table name="travelrecord,address" dataNode="dn1,dn2,dn3" rule="auto-sharding-long" splitTableNames ="true"/>
</schema>
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root"password="123456">
</writeHost>
</dataHost>
</mycat:schema>
用于定义逻辑库和逻辑表的配置文件
在配置文件中可以定义读写分离,逻辑库,逻辑表 dataHost dataNode 等信息
标签 | 释义 |
---|---|
schema | 配置逻辑库,name与server.xml 中 schema对应 |
dataHost | 物理数据库,真正存储数据的数据库 |
dataNode | 定义数据节点的标签,也就是分库相关配置 |
节点与属性介绍
-
标签schema配置逻辑库的标签
-
属性name:逻辑库名称
-
属性checkSQLschema:是否检查SQL语法中的schema信息
如:Mycat逻辑库名称A, dataNode名称B SQL:select * from A.table;
-
checkSQLschema值是true, Mycat发送到数据库的SQL是 select * from table;
-
checkSQLschema值是false,Mycat发送的数据库的SQL是 select * from A.table
-
sqlMaxLimit:Mycat在执行SQL的时候,如果SQL语句中没有limit子句.自动增加limit子句. 避免一次性 得到过多的数据,影响效率. limit子句的限制数量默认配置为100.如果SQL中有具体的limit子句,当前属 性失效.
-
SQL : select * from table . mycat 解析后: select * from table limit 100
-
SQL : select * from table limit 10 . mycat不做任何操作修改.
-
-
标签table:定义逻辑表的标签
- 属性name:逻辑表名
- 属性dataNode:数据节点名称. 即物理数据库中的 database 名称.多个名称使用逗号分隔
- 属性rule:分片规则名称.具体的规则名称参考 rule.xml 配置文件.
-
标签dataNode:定义数据节点的标签
- 属性name:数据节点名称, 是定义的逻辑名称,对应具体的物理数据库database
- 属性dataHost:引用dataHost标签的name值,代表使用的物理数据库所在位置和配置信息.
- 属性database:在dataHost物理机中,具体的物理数据库database名称.
-
标签dataHost:定义数据主机的标签
- 属性name:定义逻辑上的数据主机名称
- 属性maxCon/minCon:最大连接数, max connections,最小连接数, min connections
- 属性dbType:数据库类型 : mysql 数据库
- 属性dbDriver:数据库驱动类型, native,使用 mycat 提供的本地驱动.
- dataHost子标签writeHost:写数据的数据库定义标签. 实现读写分离操作.
- 属性host:数据库命名
- 属性url:数据库访问路径
- 属性user:数据库访问用户名
- 属性password:访问用户密码
- writeHost子标签readHost
- 属性host:数据库命名
- 属性url:数据库访问路径
- 属性user:数据库访问用户名
- 属性password: 数据库访问密码
rule.xml
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-date">
<rule>
<columns>createTime</columns>
<algorithm>partbyday</algorithm>
</rule>
</tableRule>
<tableRule name="rule2">
<rule>
<columns>user_id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
<tableRule name="sharding-by-intfile">
<rule>
<columns>sharding_id</columns>
<algorithm>hash-int</algorithm>
</rule>
</tableRule>
用于定义分片规则的配置文件.
mycat 默认的分片规则: 以500万为单位,实现分片规则. 逻辑库A对应dataNode-db1和db2. 1-500万保存在db1中, 500万零1到1000万保存在db2 中,1000万零1到1500万保存在db1中.依次类推.
<tableRule name="rule1">
<rule>
<columns>id</columns>
<algorithm>func1</algorithm>
</rule>
</tableRule>
tableRule
标签 | 释义 |
---|---|
name | 属性指定唯一的名字,用于标识不同的分片规则。内嵌的rule标签则指定对物理表中的那一列进行拆分和使用什么分片算法 |
columns | 指定要拆分的列名字 |
algorithm | 使用function标签中的name属性。连接表规则和具体分片算法。table标签内使用,让逻辑表使用这个规则进行分片 |
function
标签 | 释义 |
---|---|
name | 指定算法的名字 |
class | 制定分片算法具体类名字 |
property | 为具体算法需要用到的一些属性 |