1、介绍

MyCat是目前最流行的基于Java语言编写的数据库中间件,是一个实现了MySql协议的服务器,其核心功能是分库分表。配合数据库的主从模式还可以实现读写分离

2、下载安装

下载地址:http://dl.mycat.org.cn/
将下载好的压缩包,放到服务器中解压就可以使用。mycat依赖Java环境,使用前确定是否配置好Java环境。

启动命令
#进入到mycat的bin目录,输入启动名称
./mycat start
#重启命令
#./mycat restart
#停止命令
#./mycat stop
验证是否启动成功
#mycat默认端口是8066,9066为管理端口。
netstat -anpt | grep 8066
tcp        0      0 0.0.0.0:8066            0.0.0.0:*               LISTEN      28400/java
netstat -anpt |grep 9066
tcp        0      0 0.0.0.0:9066            0.0.0.0:*               LISTEN      28400/java

3、目录结构

bin:程序目录
logs:日志目录
wrapper.log(wrapper启动日志,启动失败查看)
mycat.log(运行日志,运行中报错查看)
switch.log(数据库节点日志)
conf:配置文件目录,三个核心配置文件为schema.xml、server.xml、rule.xml

schema.xml介绍
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- name:你的逻辑库名字,最好和MySQL物理库一致checkSQLschema:表明是否检查并过滤 SQL 中包含 schema 的情况,如逻辑库为 test,则可能写为 select * from test.a,此 时会自动过滤 ty,SQL 变为 select * from a 。若不会出现上述写法,则可以关闭属性为 false。最好开启,避免sql自动拼写两个数据库,如test.test.asqlMaxLimit:默认返回最大条数,配置后,查询语句limit如果大于配置条数,返回的还是此参数配置的条数。table:配置逻辑库的表,和物理库表明保持一致,会根据name去物理库搜索表及数据,table也可以配置MySQL的视图。primaryKey:逻辑表主键,要和分片规则中的columns中的字段对应,和物理库的主键对应。joinKey:从表t_loginlog的外键字段,需要和物理库的字段名称一致。dataNode:物理库节点,配置表属于哪个节点,用于表的分片。rule:配置分片规则,对应rule.xml中的规则--><schema name="database" checkSQLschema="true" sqlMaxLimit="100"><!-- auto sharding by id (long) --><table name="user" primaryKey="id" joinKey="uid" dataNode="dn1,dn2" rule="mod-long" /><table name="v_user" primaryKey="id" dataNode="dn1,dn2" rule="mod-long" /></schema><!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743"/> --><!-- name:节点名称,用于在table标签里面调用dataHost:dataHost标签name值(<dataHost name="dtHost1">)database:物理数据库名,需要提前创建好实际存在的--><dataNode name="dn1" dataHost="localhost1" database="database" /><dataNode name="dn2" dataHost="localhost2" database="database" /><!-- name:节点名称,在上方dataNode标签中调用maxCon:底层数据库的链接最大数minCon:底层数据库的链接最小数balance:值可以为0,1,2,3,分别表示对当前datahost中维护的数据库们的读操作逻辑0:不开启读写分离,所有的读写操作都在最小的索引号的writeHost(第一个writeHost标签)1:全部的readHost和备用writeHost都参与读数据的平衡,如果读的请求过多,负责写的第一个writeHost也分担一部分2 :所有的读操作,都随机的在所有的writeHost和readHost中进行3 :所有的读操作,都到writeHost对应的readHost上进行(备用writeHost不参加了),在集群中没有配置ReadHost的情况下,读都到第一个writeHost完成writeType:控制当前datahost维护的数据库集群的写操作0:所有的写操作都在第一个writeHost标签的数据库进行1:所有的写操作,都随机分配到所有的writeHost(mycat1.5完全不建议配置了)dbtype:数据库类型(不同数据库配置不同名称,mysql)dbDriver:数据库驱动,native,动态获取switchType:切换的逻辑-1:故障不切换1:故障切换,当前写操作的writeHost故障,进行切换,切换到下一个writeHost;slaveThreshold:标签中的<heartbeat>用来检测后端数据库的心跳sql语句;本属性检查从节点与主节点的同步情况(延迟时间数),配合心跳语句show slave status; 读写分离时,所有的readHost的数据都可靠--><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="192.168.0.1:3306" user="root" password="123456"><!-- can have multi read hosts --><readHost host="192.168.0.1:3306" user="root" password="123456" /></writeHost><!-- <writeHost host="hostS1" url="localhost:3316" user="root"password="123456" /> --><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --></dataHost><dataHost name="localhost2" 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="192.168.0.2:3306" user="root" password="123456"><!-- can have multi read hosts --><readHost host="localhost2" url="192.168.0.2:3306" user="root" password="123456" /></writeHost><!-- <writeHost host="hostS1" url="localhost:3316" user="root"password="123456" /> --><!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --></dataHost><!--<dataHost name="" maxCon="1000" minCon="1" balance="0" dbType="sequoiadb" dbDriver="jdbc"><heartbeat>         </heartbeat><writeHost host="hostM1" url="sequoiadb://1426587161.dbaas.sequoialab.net:11920/SAMPLE" user="jifeng"     password="jifeng"></writeHost></dataHost><dataHost name="oracle1" maxCon="1000" minCon="1" balance="0" writeType="0"    dbType="oracle" dbDriver="jdbc"> <heartbeat>select 1 from dual</heartbeat><connectionInitSql>alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'</connectionInitSql><writeHost host="hostM1" url="jdbc:oracle:thin:@127.0.0.1:1521:nange" user="base"    password="123456" > </writeHost> </dataHost><dataHost name="jdbchost" maxCon="1000"  minCon="1" balance="0" writeType="0" dbType="mongodb" dbDriver="jdbc"><heartbeat>select     user()</heartbeat><writeHost host="hostM" url="mongodb://192.168.0.99/test" user="admin" password="123456" ></writeHost> </dataHost><dataHost name="sparksql" maxCon="1000" minCon="1" balance="0" dbType="spark" dbDriver="jdbc"><heartbeat> </heartbeat><writeHost host="hostM1" url="jdbc:hive2://feng01:10000" user="jifeng"    password="jifeng"></writeHost> </dataHost> --><!-- <dataHost name="jdbchost" maxCon="1000" minCon="10" balance="0" dbType="mysql"dbDriver="jdbc"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1"url="jdbc:mysql://localhost:3306" user="root" password="123456"> </writeHost></dataHost> -->
</mycat:schema>
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="nonePasswordLogin">0</property> <!-- 0为需要密码登陆、1为不需要密码登陆 ,默认为0,设置为1则需要指定默认账户--><property name="useHandshakeV10">1</property><property name="useSqlStat">0</property>  <!-- 1为开启实时统计、0为关闭 --><property name="useGlobleTableCheck">0</property>  <!-- 1为开启全加班一致性检测、0为关闭 --><property name="sequnceHandlerType">2</property><!--<property name="sequnceHandlerPattern">(?:(\s*next\s+value\s+for\s*MYCATSEQ_(\w+))(,|\)|\s)*)+</property>--><!--必须带有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="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>--><!--<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">0</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">false</property><!-- XA Recovery Log日志路径 --><!--<property name="XARecoveryLogBaseDir">./</property>--><!-- XA Recovery Log日志名称 --><!--<property name="XARecoveryLogBaseName">tmlog</property>--><!--如果为 true的话 严格遵守隔离级别,不会在仅仅只有select语句的时候在事务中切换连接--><property name="strictTxIsolation">false</property><property name="useZKSwitch">true</property></system><!-- 全局SQL防火墙设置 --><!--白名单可以使用通配符%或着*--><!--例如<host host="127.0.*" user="root"/>--><!--例如<host host="127.*" user="root"/>--><!--例如<host host="1*7.*" user="root"/>--><!--这些配置情况下对于127.0.0.1都能以root账户登录--><firewall><whitehost><host host="39.*.*.*" user="root"/><host host="127.*.*.*" user="root"/></whitehost><blacklist check="false"></blacklist></firewall><user name="root" defaultAccount="true"><property name="password">root</property><property name="schemas">123456</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>
rule.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:rule SYSTEM "rule.dtd"><!-- 当主键类型为varchar类型时,要使用此分片规则。配合下面function的name是member-murmur的配置使用columns配置为主键名称,如多个表使用改规则,每个表的主键都要配置,同名的配置一个就可以--><tableRule name="member-mid-murmur"><rule><columns>id</columns><algorithm>member-murmur</algorithm></rule>
</tableRule><tableRule name="sharding-by-intfile"><rule><columns>sharding_id</columns><algorithm>hash-int</algorithm></rule></tableRule><tableRule name="auto-sharding-long"><rule><columns>id</columns><algorithm>rang-long</algorithm></rule></tableRule><!-- 主键为int等整数类型时使用--><tableRule name="mod-long"><rule><columns>id</columns><algorithm>mod-long</algorithm></rule></tableRule><tableRule name="sharding-by-murmur"><rule><columns>id</columns><algorithm>murmur</algorithm></rule></tableRule><tableRule name="crc32slot"><rule><columns>id</columns><algorithm>crc32slot</algorithm></rule></tableRule><tableRule name="sharding-by-month"><rule><columns>create_time</columns><algorithm>partbymonth</algorithm></rule></tableRule><tableRule name="latest-month-calldate"><rule><columns>calldate</columns><algorithm>latestMonth</algorithm></rule></tableRule><tableRule name="auto-sharding-rang-mod"><rule><columns>id</columns><algorithm>rang-mod</algorithm></rule></tableRule><tableRule name="jch"><rule><columns>id</columns><algorithm>jump-consistent-hash</algorithm></rule></tableRule><function name="murmur"class="io.mycat.route.function.PartitionByMurmurHash"><property name="seed">1</property><!-- 默认是0 --><property name="count">2</property><!-- 要分片的数据库节点数量,必须指定,否则没法分片,指定的必须时对应的节点数量 --><property name="virtualBucketTimes">160</property><!-- 一个实际的数据库节点被映射为这么多虚拟节点,默认是160倍,也就是虚拟节点数是物理节点数的160倍 --><!-- <property name="weightMapFile">weightMapFile</property> 节点的权重,没有指定权重的节点默认是1。以properties文件的格式填写,以从0开始到count-1的整数值也就是节点索引为key,以节点权重值为值。所有权重值必须是正整数,否则以1代替 --><!-- <property name="bucketMapPath">/etc/mycat/bucketMapPath</property> 用于测试时观察各物理节点与虚拟节点的分布情况,如果指定了这个属性,会把虚拟节点的murmur hash值与物理节点的映射按行输出到这个文件,没有默认值,如果不指定,就不会输出任何东西 --></function><function name="crc32slot"class="io.mycat.route.function.PartitionByCRC32PreSlot"></function><function name="hash-int"class="io.mycat.route.function.PartitionByFileMap"><property name="mapFile">partition-hash-int.txt</property></function><function name="member-murmur"class="io.mycat.route.function.PartitionByMurmurHash"><property name="seed">0</property><property name="count">2</property><property name="virtualBucketTimes">160</property></function><function name="rang-long"class="io.mycat.route.function.AutoPartitionByLong"><property name="mapFile">autopartition-long.txt</property></function><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- how many data nodes --><property name="count">2</property></function><function name="func1" class="io.mycat.route.function.PartitionByLong"><property name="partitionCount">8</property><property name="partitionLength">128</property></function><function name="latestMonth"class="io.mycat.route.function.LatestMonthPartion"><property name="splitOneDay">24</property></function><function name="partbymonth"class="io.mycat.route.function.PartitionByMonth"><property name="dateFormat">yyyy-MM-dd</property><property name="sBeginDate">2015-01-01</property></function><function name="rang-mod" class="io.mycat.route.function.PartitionByRangeMod"><property name="mapFile">partition-range-mod.txt</property></function><function name="jump-consistent-hash" class="io.mycat.route.function.PartitionByJumpConsistentHash"><property name="totalBuckets">3</property></function>
</mycat:rule>

配置完重启mycat

./mycat restat

重启成功后,可以用navicat链接,用sql语句测试。对于数据库分表分库,可以根据每个表配置的节点进行分表分库。读写分离,可以通过配置节点的读写权限来实现。

4、坑记录

  1. rule.xml配置的分片规则,必须和表配置的节点数量一致。
  2. 对于varchar类型的主键,需要用特殊的分片算法。
  3. insert语句,必须要有列名。
  4. mycat不支持一些mysql语句的写法,会报错,如order by level = 5 desc,这种写法mycat会报错,然后关闭工作流,这时候navicat会报:[Err] 2013 - Lost connection to MySQL server during query,对于这种排序。把level = 5,写到select里面,就可以查询。

MyCat踩坑记(Mycat搭建,使用及配置)相关推荐

  1. 安装sql server踩坑记【sql2000程序安装配置服务器失败】

    安装sql server踩坑记 安装程序配置服务器失败.参考服务器错误日志和 C:\WINDOWS\sqlstp.log 了解更多信息. 在C:\Program Files\Microsoft SQL ...

  2. EMQ踩坑之路-搭建/测试/nginx配置websocket的ws及wss/web页面测试连通性、微信小程序使用wss--MQTT推送

    最近公司要做推送平台,我接手做这个任务.在使用过程中遇到一些坑,这里分享给大家. 一.MQTT协议介绍 推送平台一般是基于轻量级的mqtt协议搭建的.mqtt协议是物联网领域常用的,是实现长链接的一种 ...

  3. Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记

    前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...

  4. 口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想

    前言 因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞.恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽 ...

  5. python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django

    <>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...

  6. 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题

    ❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...

  7. Spring @Transactional踩坑记

    @Transactional踩坑记 总述 ​ Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...

  8. 服务器重新部署踩坑记

    服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...

  9. IdentityServer 部署踩坑记

    IdentityServer 部署踩坑记 Intro 周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目,踩了几个坑,在此记录分享一下. 部署架构 项目是 ...

最新文章

  1. 对textfield的键盘改造成滚动选择器而不是输入键盘
  2. 苹果天气不显示_iPhone6开机不显示苹果售后维修案例
  3. 【java】 linux下利用nohup后台运行jar文件包程序
  4. 免费版最好用功能强大方便快捷的计算器Calculator#出炉~
  5. dnf超时空漩涡副本路线流程图_DNF:超时空漩涡开荒全攻略一览,你顺利通关了么?...
  6. python字典数组排序sorted_Python利用sorted进行字典排序
  7. Ultraedit 26.1安装教程
  8. VTK:几何对象之Circle
  9. VMware Workstation Pro通过ISO系统镜像安装ubuntu-18.04.2
  10. 和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!
  11. 计算机基础word-常见问题
  12. Tree UVA - 548(二叉树递归遍历)
  13. KEIL软件安装教程
  14. libyuv 交叉编译
  15. 噪声dba是什么单位_请问:dBA是什么意思?和dB,dBm之类有什么关系?主要用... - 射频微波研发讨论区 - 52RD研发论坛...
  16. win10 win11睡眠后系统无法唤醒解决办法
  17. python输出间隔符_python print 使用分隔符 或行尾符
  18. 3.21 华丽丽的颜色渐变工具 [原创Ps教程]
  19. 小猿圈分享免费自学编程的10个网站
  20. 如何录制iPhone手机上的视频

热门文章

  1. html 查看更多,如何展开输出显示以查看更多列?
  2. 进制转换的思路分析与计算器的实现
  3. android 8 不更新,[已解决]您可能遇到的Android 8 Oreo更新问题
  4. 3D游戏编程与设计-《帝国时代》游戏元素分析
  5. 2022年顶级网络安全工具盘点!
  6. SRC,CRC,SQ_SRC,SQ_CRC,SQF_SRC,SQF_CRC
  7. jit 调试失败,出现以下错误:拒绝访问。jit调试由用户帐户NT AUTHORITY\NETWORK SERVICE 启动...
  8. 1.4 PhalApi 接口响应与在线调试
  9. 电脑调用 iPhone 摄像头全过程(iVCam)
  10. 软件显示获取服务器更新失败,闪耀暖暖获取更新服务器失败的解决方法