关于mycat:分布式-实战将业务从-MyCAT-平滑迁移到-dble

作者:肖亚洲 爱可生 DBA 团队成员,负责我的项目中数据库故障与平台问题解决,对数据库高可用与分布式技术情有独钟。 本文起源:原创投稿 *爱可生开源社区出品,原创内容未经受权不得随便应用,转载请分割小编并注明起源。 背景介绍客户环境近期呈现了几次问题,通过探讨后决定进行架构变更,要将 mycat 迁徙到 dble 。要求是:最小变动。 问题整顿联合客户状况与要求列举了下须要思考的事件: 参数设置分片函数数据节点的数据业务SQL问题解决1、参数设置 mycat 端参数如下: <system><property name="defaultSqlParser">druidparser</property><property name="processors">4</property><property name="processorBufferPool">20480000</property><property name="processorBufferLocalPercent">100</property><property name="frontSocketSoRcvbuf">10485760</property><property name="frontSocketSoSndbuf">41943040</property><property name="frontSocketNoDelay">1</property><property name="backSocketSoRcvbuf">41943040</property><property name="backSocketSoSndbuf">10485760</property><property name="backSocketNoDelay">1</property><property name="maxPacketSize">2048576000</property><property name="memoryPageSize">100m</property></system>针对该参数 DBLE 侧倡议如下: defaultSqlParser 、memoryPageSize 、processorBufferLocalPercent 已于 dble 中被废除,可不用配置processorBufferPool 参数名变更为 bufferPoolPageSize其余的参数在 dble 中可在 server.xml 中与 mycat 保持一致配置信息,局部参数信息详情可见:https://github.com/actiontech...留神:mycat 和 dble 的内存治理配置有较大不同。比方:没有 threadlocal 概念。倡议浏览以下文档:https://actiontech.github.io/... 2、分片函数 查看 mycat 分片规定: <function name="mod-long" class="io.mycat.route.function.PartitionByMod"><!-- how many data nodes --><property name="count">8</property></function>间接采纳 DBLE 的 hash 算法测试发现局部数据查问报错: 查看表内数据状况: 样例数据:20210810143211157000000000036 字段:user_code为varchar(32) 查看 mycat 环境分片规定:采纳的分片算法为 mod-long 。而 long 的取值范畴是 -9223372036854774808~9223372036854774807 ,查问出错的 20210810143211157000000000036 超过了 long 的取值范畴。所以能够得出 mycat 针对这一非凡状况做了非凡解决。 ...

July 25, 2022 · 1 min · jiezi

关于mycat:mycat-中间件安装与使用

一,什么是mycat 一个彻底开源的,面向企业应用开发的大数据库集群 反对事务、ACID、能够代替MySQL的加强版数据库 一个能够视为MySQL集群的企业级数据库,用来代替低廉的Oracle集群 一个交融内存缓存技术、NoSQL技术、HDFS大数据的新型SQL Server 联合传统数据库和新型分布式数据仓库的新一代企业级数据库产品 一个新鲜的数据库中间件产品 以上是官网阐明。其实就是数据库的连接池。mysql proxy也是一种连接池,然而效率很低。 二,mycat 装置 1,下载地址mycat http://dl.mycat.io/ 2,装置mycat # tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/三,配置mycat 1,配置server.xml # vim /usr/local/mycat/conf/server.xml //增加以下内容<user name= "user" > //mycat 用户名 <property name= "password" >user< /property > //mycat 明码 <property name= "schemas" >mytest< /property > //mycat 虚构数据库名 <property name= "readOnly" > true < /property > // 只读 < /user > <user name= "tankzhang" > <property name= "password" >admin< /property > <property name= "schemas" >mytest< /property > < /user >在这里要留神,默认的虚构数据名是TESTDB,如果schema.xml外面没有配置testdb,那就要把testdb改成schema.xml外面有的虚构数据名。这里定义的用户名和明码,虚构数据库名,并不是在mysql中实在存在的。 ...

February 14, 2022 · 3 min · jiezi

关于mycat:如何优雅的遍历Mycat分库表

Mycat作为数据库的中间件,被许多我的项目用来做关系型数据库的分库分表;我目前所在的我的项目因为业务和数据量的增长,也应用Mycat来进行分库分表。最近因为一个需要须要遍历一个分库表的数据,对数据进行相应的业务操作。 例如咱们有一个user表,该表被分为16个库,那么能够如何高效而优雅的实现对user表中所有数据的遍历呢? 应用表的主键ID分页遍历这种办法是最直接了当,也是最容易想到的;例如应用如下的sql语句分批查问表中的数据: select * from user order by id limit a, 10000; 该sql语句以每批1万条纪录的形式遍历user表,每次查问应用上次id的最大值替换a的值,直到没有纪录返回。 这种实现诚然可行,但其最大的问题在于效率,每次查问都会从所有的分库中各获取1万条纪录,那么Mycat总共失去16万行的数据,java培训再进行排序,取前1万条记录返回。如此遍历下来,总共查问了user表总记录数16倍的数据量,而且还进行排序,这种耗费无疑是微小的。如果分库数量更多,资源的耗费和节约更重大。此计划在性能上是不可承受的。 独自遍历每个分库Mycat提供了通过注解的形式指定从某个分库执行sql语句,注解语法为 /!mycat:dataNode = ${dn} / 其中,dn为分片节点的名称;这样,咱们就能够对上述的查问语句进行革新,指定分片节点进行查问遍历,如: /!mycat:dataNode = dn1 / select * from user order by id limit a, 10000; 应用以上的sql语句,先对名称为dn1分片节点的数据进行遍历,而后批改注解中的节点名称,持续遍历其余节点;把所有的节点都遍历实现后,user表的数据也就遍历结束。这种遍历形式大大提高了效率,不论user表被分成多少个分片,所有的数据都只被读取一次。 此办法的不足之处是必须当时获取所有分片节点的名称,写在代码或配置文件中;当分片进行扩容时,分片节点数量减少,配置文件或代码就必须做对应的批改,否则就获取不到表中所有的数据。 主动获取所有分片节点名称那么,有没有一种办法能够实时主动的取得分库表的所有分片节点名称呢? Mycat除了数据操作端口(默认8066)外,还提供了治理端口(默认9066),通过连贯该端口,能够查看Mycat的运行数据并做治理操作。通过治理端口登录Mycat后,能够通过show @@datanode命令查看分片节点信息,如下所示(后果已略去局部列):NAME列即为节点名称,只有获取到该列所有的值即可。然而治理端口有较高的操作权限,个别状况下出于平安起因,该端口仅运维有权限登录操作,利用无权拜访。 还有其余更好方法吗? 这时想到了执行打算, 对,执行打算! Mycat反对explain命令查看sql语句的执行打算,对于分库表,会返回sql语句执行须要查问哪些节点;这样咱们就能够通过结构一个须要查问所有节点的sql语句来获取全副节点信息,例如通过如下所示的语句:DATA_NODE列即为节点名称;节点取到之后,剩下的就简略了,无非是对各个节点独自遍历。这种形式通过查问一次Mycat就取得了所有分片节点的名称,java培训而且数据库的连贯也能够复用,真正做到了既高效又优雅。 当然,以上的解决方案是限定于Mycat与MySQL的范畴之内,如果数据能够同步到NoSQL中,那又是从另外的角度去解决了。

January 13, 2022 · 1 min · jiezi

关于mycat:数据库中间件Mycat-权威指南Mycat-实战笔记双管齐下

前阵子温习了一下音讯中间件MQ系列的知识点,突然想起还有个数据库中间件——MyCat! Mycat 是一个开源的分布式数据库系统,是一个实现了MySQL协定的服务器,前端用户能够把它看作是一个数据库代理,用MySQL客户端工具和命令行拜访,而其后端能够用MySQL原生协定与多个MySQL服务器通信,也能够用JDBC协定与大多数支流数据库服务器通信,其外围性能是分表分库,行将一个大表程度宰割为N个小表,存储在后端MySQL服务器里或者其余数据库里。 为了深刻学习一下Mycat数据库中间件,我从敌人那里整了两个文档:Mycat 权威指南 + Mycat 实战笔记,实践与技术联合,并行不悖! 全文所提及介绍的《Mycat 权威指南 + Mycat 实战笔记》是两份很不错的Mycat学习指南,因篇幅起因,大部分内容以图片展示,但都有整顿好的 原件pdf(点击下载)首先,学习一下数据库中间件:Mycat 权威指南 Mycat 权威指南分 四大类 内容:入门篇+ 高级进阶篇 + 生产实践篇 + 开发篇 Mycat 权威指南 入门篇 有以下 12 篇章节的内容: 第一章 概述第二章 Mycat前世今生第三章 Mycat中的概念第四章 疾速入门第五章 日志剖析第六章 Mycat防火墙配置第七章 Mycat的配置第八章 Mycat的分片join第九章 全局序列号第十章 Mycat 分片规定第十—章 常见问题与解决方案第十二章 Mycat性能测试指南 Mycat 权威指南 高级进阶篇 蕴含 11 篇章节的内容: 第一章 读写拆散第二章 高可用与集群第三章 事务反对第四章 Mycat SQL拦挡机制第五章 Mycat注解第六章 MyCAT反对的Catlet实现第七章 jdbc多数据库反对第八章 治理命令与监控第九章 压缩协定反对第十章 Mycat-Web第十—章 MyCAT对存储过程的反对 Mycat 权威指南 生产实践篇 有以下 8 篇章节的内容: ...

June 3, 2021 · 1 min · jiezi

关于mycat:93

February 17, 2021 · 0 min · jiezi

关于mycat:SpringMVCSpringSessionMycat-实现web项目的session共享和数据库高可用

现有零碎架构Springmvc+cas+nginx+nginx_upstream_jvm_route 插件实现负载并且实现session共享: 原理: 1:一开始申请过去,没有带session信息,jvm_route就依据round robin的办法,发到一台tomcat下面(依据cas信息初始化用 户信息存入session) 2:tomcat增加上session 信息,并返回给客户。 3. 用户再次申请,jvm_route看到session中有后端服务器的名称,它就把申请转到对应的服务器上 毛病: 1:并没有真正的实现负载,每次都负载到雷同机器上;当用户拜访时通过雷同的代理地址过去时会造成单节点压力 2:nginx_upstream_jvm_route 插件最高只反对到nginx1.14版本左右,nginx1.14版本有破绽,架构无奈降级。 新架构组成SpringMvc+SpringSession+mycat+mysql主主模式实现session共享和数据库高可用 SpringSession:把servlet容器实现的httpSession替换为spring-session;将session信息存入redis;Mysql:mysql主主模式,进行数据的实时双向同步Mycat:mysql中间件,治理mysql,能够做到mysql的读写拆散以及数据库故障时主动切换;利用直连mycat;Redis:应用哨兵模式,实现主从主动切换 备注:如果复用老的我的项目代码,而且旧我的项目应用httpSession 进行存储session信息的话,根本零革新。Spring-Session配置Spring-session及redis的依赖包Spring-session配置Redis单节点模式此配置是关键点,引了redis单 机依赖包; 设置了session在redis中的生效 工夫; 定义了cookie中session的名称Redis哨兵模式此配置是关键点,引了redis哨兵依赖包; 设置了session在redis中的生效工夫; 定义了cookie中session的名称Mysql主从配置第一个mysql配置; 此处参数重要的是MySQL主键自增的差值第二个MySQL配置,次要是起始值不一样Mycat根本信息mycat免装置,下载后间接解压即可Schema 配置的是数据库中的表, 有很多种属性且用处不一,此处比较简单Mycat注意事项:switchtype=2时,heartBeat节点值为show slave status,查看主从状态, writeHost中的user 必须具备 replicationclient 和super权限中的一种,不然会报错 调配权限:grant replicationclient , super on . to mas;

December 28, 2020 · 1 min · jiezi

关于mycat:MycatMycat核心开发者带你轻松掌握Mycat路由转发

写在后面相熟Mycat的小伙伴都晓得,Mycat一个很重要的性能就是路由转发,那么,这篇文章就带着大家一起来看看Mycat是如何进行路由转发的,好了,不多说了,咱们间接进入主题。环境筹备软件版本操作系统:CentOS-6.8 JDK版本:jdk1.8 Mycat版本:Mycat-server-1.6 MySQL:5.7 留神:这里,我将Mycat和MySQL装置在同一台虚拟机(IP:192.168.209.140 主机名为:binghe140),大家也能够将Mycat和MySQL装置到不同的主机上,测试成果是一样的。 创立物理库mysql -uroot -proot -h192.168.209.140 -P3306drop database if exists db1;create database db1;drop database if exists db2;create database db2;drop database if exists db3;create database db3;配置Mycatschema.xml配置<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://org.opencloudb/" > <schema name="binghe" checkSQLschema="false" sqlMaxLimit="100"> <table name="travelrecord" dataNode="dn1,dn2,dn3" rule="auto-sharding-long"></table> </schema> <!-- <dataNode name="dn1$0-743" dataHost="localhost1" database="db$0-743" /> --> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataNode name="dn2" dataHost="localhost1" database="db2" /> <dataNode name="dn3" dataHost="localhost1" database="db3" /> <!--<dataNode name="dn4" dataHost="sequoiadb1" database="SAMPLE" /> <dataNode name="jdbc_dn1" dataHost="jdbchost" database="db1" /> <dataNode name="jdbc_dn2" dataHost="jdbchost" database="db2" /> <dataNode name="jdbc_dn3" dataHost="jdbchost" 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> <!-- can have multi write hosts --> <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root"></writeHost> <writeHost host="hostM2" url="127.0.0.1:3306" user="root" password="root"></writeHost> <!--<writeHost host="hostS1" url="localhost:3316" user="root"--> <!--password="123456" />--> <!-- <writeHost host="hostM2" url="localhost:3316" user="root" password="123456"/> --> </dataHost></mycat:schema>server.xml配置<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:server SYSTEM "server.dtd"><mycat:server xmlns:mycat="http://org.opencloudb/"> <system> <property name="defaultSqlParser">druidparser</property> </system> <user name="binghe"> <property name="password">binghe.123</property> <property name="schemas">binghe</property> </user> <user name="test"> <property name="password">test</property> <property name="schemas">binghe</property> <property name="readOnly">true</property> </user></mycat:server>rule.xml配置<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE mycat:rule SYSTEM "rule.dtd"><mycat:rule xmlns:mycat="http://org.opencloudb/"> <tableRule name="rule1"> <rule> <columns>id</columns> <algorithm>func1</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> <tableRule name="auto-sharding-long"> <rule> <columns>id</columns> <algorithm>rang-long</algorithm> </rule> </tableRule> <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="sharding-by-month"> <rule> <columns>create_date</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="org.opencloudb.route.function.PartitionByMurmurHash"> <property name="seed">0</property> <property name="count">2</property> <property name="virtualBucketTimes">160</property> </function> <function name="hash-int" class="org.opencloudb.route.function.PartitionByFileMap"> <property name="mapFile">partition-hash-int.txt</property> </function> <function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong"> <property name="mapFile">autopartition-long.txt</property> </function> <function name="mod-long" class="org.opencloudb.route.function.PartitionByMod"> <!-- how many data nodes --> <property name="count">3</property> </function> <function name="func1" class="org.opencloudb.route.function.PartitionByLong"> <property name="partitionCount">8</property> <property name="partitionLength">128</property> </function> <function name="latestMonth" class="org.opencloudb.route.function.LatestMonthPartion"> <property name="splitOneDay">24</property> </function> <function name="partbymonth" class="org.opencloudb.route.function.PartitionByMonth"> <property name="dateFormat">yyyy-MM-dd</property> <property name="sBeginDate">2020-01-01</property> </function> <function name="rang-mod" class="org.opencloudb.route.function.PartitionByRangeMod"> <property name="mapFile">partition-range-mod.txt</property> </function> <function name="jump-consistent-hash" class="org.opencloudb.route.function.PartitionByJumpConsistentHash"> <property name="totalBuckets">3</property> </function></mycat:rule>登录Mycat登录Mycat命令行输出以下命令登录Mycat ...

November 14, 2020 · 4 min · jiezi

关于mycat:Mycat数据库中间件

1.非分片字段查问Mycat中的路由后果是通过分片字段和分片办法来确定的。例如下图中的一个Mycat分库计划: 依据 tt_waybill 表的 id 字段来进行分片分片办法为 id 值取 3 的模,依据模值确定在DB1,DB2,DB3中的某个分片 如果查问条件中有 id 字段的状况还好,查问将会落到某个具体的分片。例如: mysql>select * from tt_waybill where id = 12330;此时Mycat会计算路由后果 12330 % 3 = 0 –> DB1并将该申请路由到DB1下来执行。如果查问条件中没有 分片字段 条件,例如: mysql>select * from tt_waybill where waybill_no =88661;此时Mycat无奈计算路由,便发送到所有节点上执行: DB1 –> select * from tt_waybill where waybill_no =88661;DB2 –> select * from tt_waybill where waybill_no =88661;DB3 –> select * from tt_waybill where waybill_no =88661;如果该分片字段抉择度高,也是业务罕用的查问维度,个别只有一个或极少数个DB节点命中(返回后果集)。示例中只有3个DB节点,而理论利用中的DB节点数远超过这个,如果有50个,那么前端的一个查问,落到MySQL数据库上则变成50个查问,会极大耗费Mycat和MySQL数据库资源。 如果设计应用Mycat时有非分片字段查问,请思考放弃! 2.分页排序先看一下Mycat是如何解决分页操作的,如果有如下Mycat分库计划:一张表有30份数据分布在3个分片DB上,具体数据分布如下 DB1:[0,1,2,3,4,10,11,12,13,14]DB2:[5,6,7,8,9,16,17,18,19]DB3:[20,21,22,23,24,25,26,27,28,29](这个示例的场景中没有查问条件,所以都是全分片查问,也就没有假设该表的分片字段和分片办法) ...

October 20, 2020 · 2 min · jiezi

关于mycat:mycat分库分表初体验

一.Mycat分表配置导入mycat源码:如下 mycat有三个重要的配置文件 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="charset">utf8</property> <property name="nonePasswordLogin">0</property> <!-- 0是须要明码登陆、1则不须要明码登陆 .默认0,设置1则须要指定默认账户--> <property name="ignoreUnknownCommand">0</property><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 执行超时 单位:秒--> <!-- 0:文件形式 1:数据库形式 2:工夫戳形式 3:zk --> <property name="sequenceHandlerType">0</property> <!--<property name="sequnceHandlerPattern">(?:(s*nexts+values+fors*MYCATSEQ_(w+))(,|)|s)*)+</property> INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx"); --> <!--必须带有MYCATSEQ_或者 mycatseq_进入序列匹配流程 留神MYCATSEQ_有空格的状况--> <property name="sequnceHandlerPattern">(?:(s*nexts+values+fors*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><!--分布式事务开关,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> <property name="strictTxIsolation">false</property> <!--如果为0的话,波及多个DataNode的catlet工作不会跨线程执行--> <property name="parallExecute">0</property> </system> <user name="user"> <property name="password">user</property> <property name="schemas">TESTDB</property> <property name="readOnly">true</property> <property name="defaultSchema">TESTDB</property> </user>--> <!--增加root用户,拜访enjoyDB逻辑库--> <user name="root"> <property name="password">123456</property> <property name="schemas">enjoyDB</property> </user></mycat:server>2.schema.xml(逻辑库配置) ...

September 20, 2020 · 2 min · jiezi

Mycat安装与配置

一、准备工作3台CnetOS7服务器,我这里是安装在虚拟机上的三台服务器,ip地址分别为192.168.0.150,192.168.0.151,192.168.0.152。 150用来安装Mycat,151和152提前安装好Mysql(安装步骤可参考https://segmentfault.com/a/11...。 在两台MySQL服务器上分别创建school_151,school_152,并在这两个库中创建相同的表students。 DROP TABLE IF EXISTS `students`;CREATE TABLE `students` ( `id` int NOT NULL, `name` varchar(255) NOT NULL, PRIMARY KEY (`id`)) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;二、安装Mycat 1、从Mycat官网下载安装包:http://www.mycat.org.cn/ 2、主页往下翻选择下载版本,这里选择的是1.6.7.1版本 3、选择Linux版本,开始下载 4、将下载好的文件上传到服务器上,我这里的服务器是虚拟机上CentOS7系统 5、解压文件 tar -zxvf Mycat-server-1.6.7.4-test-20191022170541-linux.tar.gz 6、解压完毕,将解压后的文件转移到/usr/local目录下(这一步可做可不做) mv mycat/ /usr/local/ 三、配置Mycat 1、进入mycat目录下的conf目录 2、修改server.xml文件 vim server.xml server.xml里面配置了system、firewall和user,我们现在需要修改一下user里面的schemas,这是mycat的逻辑库名,需跟schema.xml里面的schema标签的name对应,如果需要配置多个schema,可以用,隔开。我们将schemas设置成school,保存并退出。 3、配置schema.xml vim schema.xml 首先配置dataHost,我们这里有两台Mysql服务器,所以需配置两个dataHost。 将两台Mysql服务器的url,user,password分别配置到dataHost下的writeHost,先将writeHost下的readHost注释掉。为了便于记忆这里将两个dataHost的name分别改为dh151,dh152。接下来配置dataNode。 我们配置两个dataNode,dataHost属性分别对应前面配置的两个dataHost的name,database属性对应两台Mysql服务器中的school_151,school_152,并将name分别设置为dn151,dn152。 最后配置schema。 schema的name属性对应server.xml中配置的schema,shcema下面的table标签的name属性与Mysql中的表名一致,dataNode属性对应上面配置的两个dataNode标签的name,rule属性表示的是分片规则,这里使用的是auto-sharding-long。这里只保留一个table标签,将其他的table标签注释掉。保存并退出。 4、修改autopartition-long.txt。因为我们配置的分片规则auto-sharding-long是根据id范围进行分片的,autopartition-long.txt默认配置了三个分片范围,我们只有两台Mysql进行分片,所以这里将最下面的1000M-1500M=2注销掉。 vim autopartition-long.txt 5、启动Mycat。进入mycat目录下的bin目录,输入以下命令。 ./mycat console console表示将启动信息显示在控制台,如果不需要显示启动信息,可以用: ./mycat start四、测试 ...

June 10, 2020 · 1 min · jiezi

MyCat踩坑记录

mycat在使用过程中觉得非常好,很实用,但使用过程中也碰到了不少问题,踩了不少坑,现做一些记录,历史的一些坑已经忘记了,从现在开始吧 全局表数据不同步这个问题比较常见,而且比较初级。现象为:连mycat的查询的时候多次执行SQL,返回的结果数量不一致或者数据不一致。一般原因为:查询的表中有全局表,且在全局表中的数据不一致造成 Unknown command重现现象为:项目中使用了mybatisplus(推荐,封装了mybatis的工具),在使用mybatisplus的saveOrUpdateBatch方法时,数据量超过一定的数据量时报 Unknown command,详细异常信息如下: 发生异常,org.apache.ibatis.exceptions.PersistenceException: ### Error flushing statements. Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unknown command### Cause: com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException: Unknown command at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:30) at org.apache.ibatis.session.defaults.DefaultSqlSession.flushStatements(DefaultSqlSession.java:254) at com.baomidou.mybatisplus.extension.service.impl.ServiceImpl.saveOrUpdateBatch(ServiceImpl.java:179) at com.baomidou.mybatisplus.extension.service.IService.saveOrUpdateBatch(IService.java:76) at com.gwall.core.service.impl.DstaskServiceImpl.saveOrUpdateCids(DstaskServiceImpl.java:148) at com.gwall.core.service.impl.DstaskServiceImpl$$FastClassBySpringCGLIB$$bf68f571.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:100) at com.gwall.core.common.aspects.GwallRequestIdAspect.requestIdHandle(GwallRequestIdAspect.java:46) at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.gwall.core.service.impl.DstaskServiceImpl$$EnhancerBySpringCGLIB$$e5a8ece4.saveOrUpdateCids(<generated>) at com.gwall.core.service.impl.base.AbstractServiceImpl.batchSaveCids(AbstractServiceImpl.java:727) at com.gwall.core.service.impl.base.AbstractServiceImpl$$FastClassBySpringCGLIB$$3afa95e6.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:100) at com.gwall.core.common.aspects.GwallRequestIdAspect.requestIdHandle(GwallRequestIdAspect.java:46) at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.transaction.interceptor.TransactionAspectSupport.invokeWithinTransaction(TransactionAspectSupport.java:295) at org.springframework.transaction.interceptor.TransactionInterceptor.invoke(TransactionInterceptor.java:98) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.gwall.base.service.impl.SuinServiceImpl$$EnhancerBySpringCGLIB$$946e8cf5.batchSaveCids(<generated>) at com.gwall.core.controller.AbstractController.batchSaveCids(AbstractController.java:500) at com.gwall.core.controller.AbstractController$$FastClassBySpringCGLIB$$9007052b.invoke(<generated>) at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:218) at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:749) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:163) at org.springframework.aop.aspectj.MethodInvocationProceedingJoinPoint.proceed(MethodInvocationProceedingJoinPoint.java:100) at com.gwall.core.common.aspects.GwallRequestIdAspect.requestIdHandle(GwallRequestIdAspect.java:46) at sun.reflect.GeneratedMethodAccessor83.invoke(Unknown Source) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethodWithGivenArgs(AbstractAspectJAdvice.java:644) at org.springframework.aop.aspectj.AbstractAspectJAdvice.invokeAdviceMethod(AbstractAspectJAdvice.java:633) at org.springframework.aop.aspectj.AspectJAroundAdvice.invoke(AspectJAroundAdvice.java:70) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:93) at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:186) at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:688) at com.gwall.base.controller.SuinController$$EnhancerBySpringCGLIB$$3fb28a8b.batchSaveCids(<generated>) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:497) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:190) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:138) at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:892) at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:797) at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:87) at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:1039) at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:942) at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:1005) at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:908) at javax.servlet.http.HttpServlet.service(HttpServlet.java:660) at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:882) at javax.servlet.http.HttpServlet.service(HttpServlet.java:741) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:231) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at com.dianping.cat.servlet.CatFilter.logTransaction(CatFilter.java:255) at com.dianping.cat.servlet.CatFilter.doFilter(CatFilter.java:93) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.RequestContextFilter.doFilterInternal(RequestContextFilter.java:99) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.FormContentFilter.doFilterInternal(FormContentFilter.java:92) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:93) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.session.web.http.SessionRepositoryFilter.doFilterInternal(SessionRepositoryFilter.java:151) at org.springframework.session.web.http.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:85) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:200) at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:109) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:166) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:202) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:96) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:490) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:139) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:92) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:343) at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:408) at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:66) at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:853) at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1587) at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:49) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) at java.lang.Thread.run(Thread.java:745)将数据库连接改为mysql 3306端口时,则正常,定位为mycat问题,咨询大佬后给出的方案是将 数据库连接字符串?后的部分去掉。具体如原数据库连接字符串:jdbc:mysql://host:8066/db?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=GMT%2B8&rewriteBatchedStatements=true&useAffectedRows=true&autoReconnect=true&failOverReadOnly=false修改后:jdbc:mysql://host:8066/db问题修复,暂时只做问题记录,未研究具体原因 ...

May 26, 2020 · 2 min · jiezi