MyCat踩坑记(Mycat搭建,使用及配置)
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、坑记录
- rule.xml配置的分片规则,必须和表配置的节点数量一致。
- 对于varchar类型的主键,需要用特殊的分片算法。
- insert语句,必须要有列名。
- mycat不支持一些mysql语句的写法,会报错,如order by level = 5 desc,这种写法mycat会报错,然后关闭工作流,这时候navicat会报:[Err] 2013 - Lost connection to MySQL server during query,对于这种排序。把level = 5,写到select里面,就可以查询。
MyCat踩坑记(Mycat搭建,使用及配置)相关推荐
- 安装sql server踩坑记【sql2000程序安装配置服务器失败】
安装sql server踩坑记 安装程序配置服务器失败.参考服务器错误日志和 C:\WINDOWS\sqlstp.log 了解更多信息. 在C:\Program Files\Microsoft SQL ...
- EMQ踩坑之路-搭建/测试/nginx配置websocket的ws及wss/web页面测试连通性、微信小程序使用wss--MQTT推送
最近公司要做推送平台,我接手做这个任务.在使用过程中遇到一些坑,这里分享给大家. 一.MQTT协议介绍 推送平台一般是基于轻量级的mqtt协议搭建的.mqtt协议是物联网领域常用的,是实现长链接的一种 ...
- Vue + TypeScript + Element 搭建简洁时尚的博客网站及踩坑记
前言 本文讲解如何在 Vue 项目中使用 TypeScript 来搭建并开发项目,并在此过程中踩过的坑 . TypeScript 具有类型系统,且是 JavaScript 的超集,TypeScript ...
- 口罩、安全帽识别比赛踩坑记(一) 经验漫谈及随想
前言 因为疫情迎来的史无前例大假期,从开始理直气壮的天天划手机,到中间百无聊赖的躺尸,再到之后实在憋得慌,就想找点什么事搞一搞.恰好这时,一直关注的极视角联合 Intel 公司举办了一个对口罩和安全帽 ...
- python从入门到实践django看不懂_Python编程:从入门到实践踩坑记 Django
<>踩坑记 Django Django Python 19.1.1.5 模板new_topic 做完书上的步骤后,对主题添加页面经行测试,但是浏览器显示 服务器异常. 个人采用的开发环境是 ...
- 东八区转为0时区_踩坑记 | Flink 天级别窗口中存在的时区问题
❝ 本系列每篇文章都是从一些实际的 case 出发,分析一些生产环境中经常会遇到的问题,抛砖引玉,以帮助小伙伴们解决一些实际问题.本文介绍 Flink 时间以及时区问题,分析了在天级别的窗口时会遇到的 ...
- Spring @Transactional踩坑记
@Transactional踩坑记 总述 Spring在1.2引入@Transactional注解, 该注解的引入使得我们可以简单地通过在方法或者类上添加@Transactional注解,实现事务 ...
- 服务器重新部署踩坑记
服务器重新部署踩坑记 Intro 之前的服务器是 Ubuntu 18.04 ,上周周末想升级一下服务器系统,从 18.04 升级到 20.04,结果升级升挂了... 后来 SSH 始终连不上,索性删除 ...
- IdentityServer 部署踩坑记
IdentityServer 部署踩坑记 Intro 周末终于部署了 IdentityServer 以及 IdentityServerAdmin 项目,踩了几个坑,在此记录分享一下. 部署架构 项目是 ...
最新文章
- 对textfield的键盘改造成滚动选择器而不是输入键盘
- 苹果天气不显示_iPhone6开机不显示苹果售后维修案例
- 【java】 linux下利用nohup后台运行jar文件包程序
- 免费版最好用功能强大方便快捷的计算器Calculator#出炉~
- dnf超时空漩涡副本路线流程图_DNF:超时空漩涡开荒全攻略一览,你顺利通关了么?...
- python字典数组排序sorted_Python利用sorted进行字典排序
- Ultraedit 26.1安装教程
- VTK:几何对象之Circle
- VMware Workstation Pro通过ISO系统镜像安装ubuntu-18.04.2
- 和lua的效率对比测试_Unity游戏开发Lua更新运行时代码!
- 计算机基础word-常见问题
- Tree UVA - 548(二叉树递归遍历)
- KEIL软件安装教程
- libyuv 交叉编译
- 噪声dba是什么单位_请问:dBA是什么意思?和dB,dBm之类有什么关系?主要用... - 射频微波研发讨论区 - 52RD研发论坛...
- win10 win11睡眠后系统无法唤醒解决办法
- python输出间隔符_python print 使用分隔符 或行尾符
- 3.21 华丽丽的颜色渐变工具 [原创Ps教程]
- 小猿圈分享免费自学编程的10个网站
- 如何录制iPhone手机上的视频
热门文章
- html 查看更多,如何展开输出显示以查看更多列?
- 进制转换的思路分析与计算器的实现
- android 8 不更新,[已解决]您可能遇到的Android 8 Oreo更新问题
- 3D游戏编程与设计-《帝国时代》游戏元素分析
- 2022年顶级网络安全工具盘点!
- SRC,CRC,SQ_SRC,SQ_CRC,SQF_SRC,SQF_CRC
- jit 调试失败,出现以下错误:拒绝访问。jit调试由用户帐户NT AUTHORITY\NETWORK SERVICE 启动...
- 1.4 PhalApi 接口响应与在线调试
- 电脑调用 iPhone 摄像头全过程(iVCam)
- 软件显示获取服务器更新失败,闪耀暖暖获取更新服务器失败的解决方法