Code Monkey home page Code Monkey logo

mycat-server's Introduction

Mycat1

官网: http://mycatone.top

gitee github

提交代码,可以开issue,写清楚代码改动或者联系qq:1019100252

mycat1.6权威指南 yuque pdf

客户端连接配置 gitee github

Stargazers over time

Mycat志愿者开发群:332702697,106088787

GitHub issues GitHub forks GitHub stars MyCAT

MyCAT is an Open-Source software, “a large database cluster” oriented to enterprises. MyCAT is an enforced database which is a replacement for MySQL and supports transaction and ACID. Regarded as MySQL cluster of enterprise database, MyCAT can take the place of expensive Oracle cluster. MyCAT is also a new type of database, which seems like a SQL Server integrated with the memory cache technology, NoSQL technology and HDFS big data. And as a new modern enterprise database product, MyCAT is combined with the traditional database and new distributed data warehouse. In a word, MyCAT is a fresh new middleware of database.

Mycat’s target is to smoothly migrate the current stand-alone database and applications to cloud side with low cost and to solve the bottleneck problem caused by the rapid growth of data storage and business scale.

2020年1月1日合拼了一个PR,优化PartionByLong的分片算法,数据不均衡的问题,所以该分片算法与此前的PartionByLong的数据分布不一致,即1.675之后与之前的版本不兼容 MyCAT1.6不支持一个SQL包含多个语句

旧Mycat升级fastjson,把pom.xml中fastjson的版本更改即可

1.6的bug: 批处理插入,多语句,堆外合拼,请大家要避开这些功能

全局序列号语法

INSERT INTO `travelrecord` (`id`,user_id) VALUES ('next value for MYCATSEQ_GLOBAL',"xxx");

更新Druid 1.1.10版本的分支独立维护在 gitee github

Features

  • Supports SQL 92 standard
  • Supports MySQL cluster, used as a Proxy
  • Supports JDBC connection with ORACLE, DB2, SQL Server, simulated as normal MySQL Server connection
  • Supports MySQL cluster, percona cluster or mariadb cluster, providing high availability of data fragmentation clusters
  • Supports automatic failover and high availability
  • Supports separation of read and write, dual-master with multi-slave, single-master with multi-master of MySQL model
  • Supports global table, automatically fragment data into multiple nodes for efficient relational query
  • Supports the unique fragmentation strategy based on ER-relation for efficient relational query
  • Supports multiple platforms, easy deployment and implementation

Advantage

  • Based on Alibaba's open-source project Cobar github,gitee, whose stability, reliability, excellent architecture and performance, as well as many mature use-cases make MyCAT have a good starting. Standing on the shoulders of giants, MyCAT feels confident enough to go farther.
  • Extensively drawing on the best open-source projects and innovative ideas, which are integrated into the Mycat’s gene, make MyCAT be ahead of the other current similar open-source projects, even beyond some commercial products.
  • MyCAT behind a strong technical team whose participants are experienced more than five years including some senior software engineer, architect, DBA, etc. Excellent technical team to ensure the product quality of Mycat.
  • MyCAT does not rely on any commercial company. It’s unlike some open-source projects whose important features is enclosed in its commercial products and making open-source projects like a decoration.

Roadmap

  • On the basis of MySQL’s support, MyCAT add more support of commercial open-source database, including native support of PostgreSQL, FireBird and other open-source databases, as well as indirect support via JDBC of other non-open-source databases such as Oracle, DB2, SQL Server etc.
  • More intelligent self-regulating properties, such as automatic statistical analysis of SQL, automatic creating and adjusting indexes. Based on the frequency of read and write, MyCAT automatically optimizes caching and backup strategies
  • Achieve a more comprehensive monitoring and management
  • Integrated with HDFS, provide SQL commands, load databases into HDFS for rapid analysis
  • Integrated excellent open-source reporting tools to make MyCAT have data analysis capability

Download

There are some compiled binary installation packages in Mycat-download project on github at Mycat-download.

Document

There are some documents in Mycat-doc project on github at [Mycat-doc]

gitee

github

Mycat 简单demo,具体参考Mycat权威指南

Mycat前世今生

2013年阿里的Cobar在社区使用过程中发现存在一些比较严重的问题,及其使用限制,经过Mycat发起人第一次改良,第一代改良版——Mycat诞生。 Mycat开源以后,一些Cobar的用户参与了Mycat的开发,最终Mycat发展成为一个由众多软件公司的实力派架构师和资深开发人员维护的社区型开源软件。

2014年Mycat首次在上海的《中华架构师》大会上对外宣讲,更多的人参与进来,随后越来越多的项目采用了Mycat。

2015年5月,由核心参与者们一起编写的第一本官方权威指南《Mycat权威指南》电子版发布,累计超过500本,成为开源项目中的首创。

2015年10月为止,Mycat项目总共有16个Committer。

截至2015年11月,超过300个项目采用Mycat,涵盖银行、电信、电子商务、物流、移动应用、O2O的众多领域和公司。

截至2015年12月,超过4000名用户加群或研究讨论或测试或使用Mycat。

Mycat是基于开源cobar演变而来,我们对cobar的代码进行了彻底的重构,使用NIO重构了网络模块,并且优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。1.4 版本以后 完全的脱离基本cobar内核,结合Mycat集群管理、自动扩容、智能优化,成为高性能的中间件。我们致力于开发高性能数据库中间而努力。永不收费,永不闭源,持续推动开源社区的发展。

Mycat吸引和聚集了一大批业内大数据和云计算方面的资深工程师,Mycat的发展壮大基于开源社区志愿者的持续努力,感谢社区志愿者的努力让Mycat更加强大,同时我们也欢迎社区更多的志愿者,特别是公司能够参与进来,参与Mycat的开发,一起推动社区的发展,为社区提供更好的开源中间件。

Mycat还不够强大,Mycat还有很多不足,欢迎社区志愿者的持续优化改进。

关键特性

支持SQL92标准

遵守Mysql原生协议,跨语言,跨平台,跨数据库的通用中间件代理。

基于心跳的自动故障切换,支持读写分离,支持MySQL主从,以及galera cluster集群。

支持Galera for MySQL集群,Percona Cluster或者MariaDB cluster

基于Nio实现,有效管理线程,高并发问题。

支持数据的多片自动路由与聚合,支持sum,count,max等常用的聚合函数。

支持单库内部任意join,支持跨库2表join,甚至基于caltlet的多表join。

支持通过全局表,ER关系的分片策略,实现了高效的多表join查询。

支持多租户方案。

支持分布式事务(弱xa)。

支持全局序列号,解决分布式下的主键生成问题。

分片规则丰富,插件化开发,易于扩展。

强大的web,命令行监控。

支持前端作为mysq通用代理,后端JDBC方式支持Oracle、DB2、SQL Server 、 mongodb 、巨杉。

支持密码加密

支持服务降级

支持IP白名单

支持SQL黑名单、sql注入攻击拦截

支持分表(1.6)

集群基于ZooKeeper管理,在线升级,扩容,智能优化,大数据处理(2.0开发版)。

Mycat安装与使用

下载:

具体下载哪个版本以发布为准,推荐1.67.

安装:

下载的文件直接解压即可。

运行:

linux:

./mycat start 启动

./mycat stop 停止

./mycat console 前台运行

./mycat install 添加到系统自动启动(暂未实现)

./mycat remove 取消随系统自动启动(暂未实现)

./mycat restart 重启服务

./mycat pause 暂停

./mycat status 查看启动状态

win:

直接运行startup_nowrap.bat,如果出现闪退,在cmd 命令行运行,查看出错原因。

内存配置:

启动前,一般需要修改JVM配置参数,打开conf/wrapper.conf文件,如下行的内容为2G和2048,可根据本机配置情况修改为512M或其它值。 以下配置跟jvm参数完全一致,可以根据自己的jvm参数调整。

Java Additional Parameters

wrapper.java.additional.1=

wrapper.java.additional.1=-DMYCAT_HOME=.

wrapper.java.additional.2=-server

#wrapper.java.additional.3=-XX:MaxPermSize=64M

wrapper.java.additional.4=-XX:+AggressiveOpts

wrapper.java.additional.5=-XX:MaxDirectMemorySize=100m

wrapper.java.additional.6=-Dcom.sun.management.jmxremote

wrapper.java.additional.7=-Dcom.sun.management.jmxremote.port=1984

wrapper.java.additional.8=-Dcom.sun.management.jmxremote.authenticate=false

wrapper.java.additional.9=-Dcom.sun.management.jmxremote.ssl=false

wrapper.java.additional.10=-Xmx100m

wrapper.java.additional.11=-Xms100m

wrapper.java.additional.12=-XX:+UseParNewGC

wrapper.java.additional.13=-XX:+UseConcMarkSweepGC

wrapper.java.additional.14=-XX:+UseCMSCompactAtFullCollection

wrapper.java.additional.15=-XX:CMSFullGCsBeforeCompaction=0

wrapper.java.additional.16=-XX:CMSInitiatingOccupancyFraction=70

以下配置作废:

wrapper.java.initmemory=3

wrapper.java.maxmemory=64

Mycat连接测试:

测试mycat与测试mysql完全一致,mysql怎么连接,mycat就怎么连接。

推荐先采用命令行测试:

mysql -uroot -proot -P8066 -h127.0.0.1

如果采用工具连接,1.4,1.3目前部分工具无法连接,会提示database not selected,建议采用高版本,navicat测试。1.5已经修复了部分工具连接。

Mycat配置入门

配置:

--bin 启动目录

--conf 配置目录存放配置文件:

  --server.xml:是Mycat服务器参数调整和用户授权的配置文件。

  --schema.xml:是逻辑库定义和表以及分片定义的配置文件。

  --rule.xml:  是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件,也在这个目录下,配置文件修改需要重启MyCAT。

  --log4j.xml: 日志存放在logs/log中,每天一个文件,日志的配置是在conf/log4j.xml中,根据自己的需要可以调整输出级别为debug                           debug级别下,会输出更多的信息,方便排查问题。

  --autopartition-long.txt,partition-hash-int.txt,sequence_conf.properties, sequence_db_conf.properties 分片相关的id分片规则配置文件

  --lib	    MyCAT自身的jar包或依赖的jar包的存放目录。

  --logs        MyCAT日志的存放目录。日志存放在logs/log中,每天一个文件

下面图片描述了Mycat最重要的3大配置文件:

逻辑库配置:

配置server.xml

添加两个mycat逻辑库:user,pay
system 参数是所有的mycat参数配置,比如添加解析器:defaultSqlParser,其他类推
user 是用户参数。

<system>

	<property name="defaultSqlParser">druidparser</property>

</system>

<user name="mycat">

	<property name="password">mycat</property>

	<property name="schemas">user,pay</property>

</user>

编辑schema.xml

修改dataHost和schema对应的连接信息,user,pay 垂直切分后的配置如下所示:

schema 是实际逻辑库的配置,user,pay分别对应两个逻辑库,多个schema代表多个逻辑库。

dataNode是逻辑库对应的分片,如果配置多个分片只需要多个dataNode即可。

dataHost是实际的物理库配置地址,可以配置多主主从等其他配置,多个dataHost代表分片对应的物理库地址,下面的writeHost、readHost代表该分片是否配置多写,主从,读写分离等高级特性。

以下例子配置了两个writeHost为主从。

<schema name="user" checkSQLschema="false" sqlMaxLimit="100" dataNode="user" />
<schema name="pay"  checkSQLschema="false" sqlMaxLimit="100" dataNode="pay" >
   <table name="order" dataNode="pay1,pay2" rule="rule1"/>
</schema>

<dataNode name="user" dataHost="host" database="user" />
<dataNode name="pay1" dataHost="host" database="pay1" />
<dataNode name="pay2" dataHost="host" database="pay2" />

<dataHost name="host" maxCon="1000" minCon="10" balance="0"
   writeType="0" dbType="mysql" dbDriver="native">
   <heartbeat>select 1</heartbeat>
   <!-- can have multi write hosts -->
   <writeHost host="hostM1" url="192.168.0.2:3306" user="root" password="root" />
   <writeHost host="hostM2" url="192.168.0.3:3306" user="root" password="root" />
</dataHost>

Mycat逻辑库、系统参数配置

配置Mycat环境参数

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
   <system>
	  <property name="defaultSqlParser">druidparser</property>
    </system> 
 </mycat:server>

如例子中配置的所有的Mycat参数变量都是配置在server.xml 文件中,system标签下配置所有的参数,如果需要配置某个变量添加相应的配置即可,例如添加启动端口8066,默认为8066:

   <property name="serverPort">8066</property>

其他所有变量类似。

配置Mycat逻辑库与用户

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://org.opencloudb/">
<user name="mycat">
	<property name="password">mycat</property>
	<property name="schemas">TESTDB</property>
</user>
 </mycat:server>

如例子中配置的所有的Mycat连接的用户与逻辑库映射都是配置在server.xml 文件中,user标签下配置所有的参数,例如例子中配置了一个mycat用户供应用连接到mycat,同时mycat 在schema.xml中配置后了一个逻辑库TESTDB,配置好逻辑库与用户的映射关系。

逻辑库、表分片配置

配置逻辑库(schema)

Mycat作为一个中间件,实现mysql协议,那么对前端应用连接来说就是一个数据库,也就有数据库的配置,mycat的数据库配置是在schema.xml中配置,配置好后映射到server.xml里面的用户就可以了。

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">

<mycat:schema  xmlns:mycat="http://org.opencloudb/">
  <schema name="TESTDB" checkSQLschema="true" sqlMaxLimit="100" dataNode="dn1">
      <table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>
      <table name="ht_jy_login_log" primaryKey="ID" dataNode="dn1,dn2" rule="sharding-by-date_jylog"/>
  </schema>
  <dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/>
  <dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>
  
  <dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
    <heartbeat>show status like 'wsrep%'</heartbeat>
    <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
    </writeHost>  
  </dataHost>
</mycat:schema >

上面例子配置了一个逻辑库TESTDB,同时配置了t_user,ht_jy_login_log两个分片表。

逻辑表配置

      <table name="t_user" dataNode="dn1,dn2" rule="sharding-by-mod2"/>

table 标签 是逻辑表的配置 其中

name代表表名,

dataNode代表表对应的分片,

Mycat默认采用分库方式,也就是一个表映射到不同的库上,

rule代表表要采用的数据切分方式,名称对应到rule.xml中的对应配置,如果要分片必须配置。

配置分片(dataNode)

  <dataNode name="dn1" dataHost="localhost1" database="mycat_node1"/>
  <dataNode name="dn2" dataHost="localhost1" database="mycat_node2"/>

表切分后需要配置映射到哪几个数据库中,Mycat的分片实际上就是库的别名,例如上面例子配置了两个分片dn1,dn2 分别对应到物理机映射dataHost localhost1 的两个库上。

配置物理库分片映射(dataHost)

  <dataHost name="localhost1" writeType="0" switchType="1" slaveThreshold="100" balance="1" dbType="mysql" maxCon="10" minCon="1" dbDriver="native">
    <heartbeat>show status like 'wsrep%'</heartbeat>
    <writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root" >
    </writeHost>  
  </dataHost>

Mycat作为数据库代理需要逻辑库,逻辑用户,表切分后需要配置分片,分片也就需要映射到真实的物理主机上,至于是映射到一台还是一台的多个实例上,Mycat并不关心,只需要配置好映射即可,例如例子中:

配置了一个名为localhost1的物理主机(dataHost)映射。

heartbeat 标签代表Mycat需要对物理库心跳检测的语句,正常情况下生产案例可能配置主从,或者多写 或者单库,无论哪种情况Mycat都需要维持到数据库的数据源连接,因此需要定时检查后端连接可以性,心跳语句就是来作为心跳检测。

writeHost 此标签代表 一个逻辑主机(dataHost)对应的后端的物理主机映射,例如例子中写库hostM1 映射到127.0.0.1:3306。如果后端需要做读写分离或者多写 或者主从则通过配置 多个writeHost 或者readHost即可。

dataHost 标签中的 writeType balance 等标签则是不同的策略,具体参考指南。

Mycat 表切分规则配置

表切分规则

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">

<mycat:rule  xmlns:mycat="http://org.opencloudb/">
  <tableRule name="sharding-by-hour">
    <rule>
      <columns>createTime</columns>
      <algorithm>sharding-by-hour</algorithm>
    </rule>
  </tableRule>
  
  <function name="sharding-by-hour" class="org.opencloudb.route.function.LatestMonthPartion">
    <property name="splitOneDay">24</property>
  </function>
   
</mycat:rule >

数据切分中作为表切分规则中最重要的配置,表的切分方式决定了数据切分后的性能好坏,因此也是最重要的配置。

如上面例子配置了一个切分规则,名为sharding-by-hour 对应的切分方式(function )是按日期切分,该配置中:

tableRule

name 为schema.xml 中table 标签中对应的 rule="sharding-by-hour" ,也就是配置表的分片规则,

columns 是表的切分字段: createTime 创建日期。

algorithm 是规则对应的切分规则:映射到function 的name。

function

function 配置是分片规则的配置。

name 为切分规则的名称,名字任意取,但是需要与tableRule 中匹配。

class 是切分规则对应的切分类,写死,需要哪种规则则配置哪种,例如本例子是按小时分片:org.opencloudb.route.function.LatestMonthPartion

property 标签是切分规则对应的不同属性,不同的切分规则配置不同。

mycat-server's People

Contributors

abirdman avatar apachemycat avatar astonegod avatar bengong avatar brotherbin avatar coderczp avatar digdeep126 avatar fireflyhoo avatar funnyant avatar hashjang avatar huangyiminghappy avatar junwen12221 avatar kkzfl22 avatar lian88jian avatar linzhiqiang0514 avatar magicdoom avatar mycatmerger avatar quinnzhuang avatar runfriends avatar sohudo avatar songgw avatar songwie avatar stonelion avatar wdw1206 avatar xiaozhangwx avatar yanjunli avatar zagzhang avatar zhuam avatar zwyqz avatar zzzcrazypig avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

mycat-server's Issues

1.3.0.2 druid解析器,in语句多主键路由缓存命中错误

错误原因:循环处理多个主键时,命中一个就退出了循环,应该对所有主键都循环一遍,不管是否命中。
测试语句SELECT * from pd_info where pid in (40,1138,268,495);
表配置:
table name="pd_info" primaryKey="pid" dataNode="dn1,dn2,dn3,dn4,dn5,dn6,dn7,dn8" rule="rule1"
规则配置:PartitionByLong
property name="partitionCount">8</property
property name="partitionLength">128</property

Error happen when backend is jdbc connection.

Mysql jdbc driver at app side will send some packets like the following text, backend jdbc connection can not parse and execute it.

"/* mysql-connector-java-5.1.34 ( revision: [email protected] ) */show variables where variable_name ='language' or variable_name = 'net_write_timeout' or variable_name = 'interactive_timeout' or variable_name = 'wait_timeout' or variable_name = 'character_set_client' or variable_name = 'character_set_connection' or variable_name = 'character_set' or variable_name = 'character_set_server' or variable_name = 'tx_isolation' or variable_name = 'transaction_isolation' or variable_name = 'character_set_results' or variable_name = 'timezone' or variable_name = 'time_zone' or variable_name = 'system_time_zone' or variable_name = 'lower_case_table_names' or variable_name = 'max_allowed_packet' or variable_name = 'net_buffer_length' or variable_name = 'sql_mode' or variable_name = 'query_cache_type' or variable_name = 'query_cache_size' or variable_name = 'license' or variable_name = 'init_connect'"

mysql服务器autocommit设置为0时通过mycat命令行插入到表中的数据,在实际的物理节点没有数据 例如mysql> explain insert into pets(id,name,owner) values(1,'l','l'); +-----------+---------------------------------------------------+ | DATA_NODE | SQL | +-----------+---------------------------------------------------+ | dn1 | insert into pets(id,name,owner) values(1,'l','l') | +-----------+---------------------------------------------------+ 1 row in set (0.00 sec),insert into pets(id,name,owner) values(1,'l','l'); Query OK, 1 row affected (0.02 sec) 但是实际的物理库中,mysql> select * from pets; Empty set (0.00 sec)什么都没有,在mycat中commit也什么都没有,mysql> select * from pets; Empty set (0.00 sec),把实际物理库autocommit改为1就可以了

Mycat的使用情况统计汇总

目前非公开的结果,有电信行业、电商、移动互联网、内部企业项目等相关行业使用Mycat,最早的1.0版本截至2015年1月,已经稳定生产系统中使用1年,1.2版本也在生产环境中稳定运行半年以上,由于使用者没有公开使用情况,只能根据QQ群的消息,推测到2014年底,大概有30个项目使用Mycat,欢迎继续跟帖反馈使用情况。

mycat直接执行存储过程,一直处于执行中状态,无法显示结果

在mycat中直接执行mysql中的存储过程,一直处于执行中状态,无法显示结果。
目前可以通过/!mycat: sql=select * from base_user where id=1;_/CALL proc_test(); 这个注解的方式正常执行,但是需要把存储过程中的sql写到注解中,感觉有些不是很方便,不知道还有没有其他方式能正常执行!

ERROR 1003 (HY000): Reload config failure

mysql> reload @@config;
ERROR 1003 (HY000): Reload config failure

error log:
02/12 15:50:51.569 WARN $_NIOREACTOR-0-RW -register error
java.nio.channels.ClosedChannelException
at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSelectableChannel.java:194)
at org.opencloudb.net.NIOSocketWR.register(NIOSocketWR.java:27)
at org.opencloudb.net.NIOReactor$RW.register(NIOReactor.java:154)
at org.opencloudb.net.NIOReactor$RW.run(NIOReactor.java:86)
at java.lang.Thread.run(Thread.java:722)

命令行连接Mycat 中文显示乱码,windows环境

命令行连接Mycat 中文显示乱码,windows环境下运行mycat和mysql命令行工具
mysql> select id,name,vip from users order by id limit 5;
+----+-----------+--------------+
| id | name | vip |
+----+-----------+--------------+
| 1 | 濮氬埄钀? | 鏅€氱敤鎴? |
| 2 | 鍚村織鍑? | 鏅€氱敤鎴? |
| 3 | 寮犲皯绋? | 鏅€氱敤鎴? |
| 4 | 璋匠鏄? | 鏅€氱敤鎴? |
| 5 | 鍚村€? | 鏅€氱敤鎴? |
+----+-----------+--------------+
5 rows in set (0.01 sec)

JDBC连接mycat和命令行直接连接mysql 都正常

group by 语句跨分片查询结果不对

select user_id from sam_glucose group by user_id
实际只能查询出两个结果,但是这个语句查询出了3条结果,没有把两个分片的数据合并;

使用 select user_id,count(*) from sam_glucose group by user_id 这样的写法就自动合并为2条记录了。
跨分片的情况下,必须要加count关键字才可以正确分组,这块最好能优化一下。

group by date_format(inputdate, '%y-%m-%d') 报错

默认的SQL解析器和druidparser都报错
select date_format(inputdate, '%y-%m-%d') as inputdate, sum(requestid) as requestid, sum(factprice) as factprice from biaoben group by date_format(inputdate, '%y-%m-%d')
这个语句执行报错
02-05 17:23:32.343 WARN BusinessExecutor9 -caught exception
java.lang.NullPointerException
at org.opencloudb.mpp.DataMergeService.toColumnIndex(DataMergeService.java:304)
at org.opencloudb.mpp.DataMergeService.onRowMetaData(DataMergeService.java:148)

测试sequence报错

我在dn1上创建自增表MYCAT_SEQUENCE
CREATE TABLE MYCAT_SEQUENCE ( name VARCHAR(50) NOT NULL, current_value INT NOT NULL, increment INT NOT NULL DEFAULT 100, PRIMARY KEY (name) ) ENGINE=InnoDB;
INSERT INTO MYCAT_SEQUENCE(name,current_value,increment) VALUES ('GLOBAL', 0, 100);
按照文档中的设置创建了三个函数
启用了server.xml中的1
sequence_db_conf.properties 中增加了GLOBAL=dn1
schema.xml中增加了table name="MYCAT_SEQUENCE" primaryKey="name" dataNode="dn1"

在mycat中执行SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');报如下错误:
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo7.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo4.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo3.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo5.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo2.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo4.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo3.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
ERROR 1305 (42000): FUNCTION pdinfo2.MYCAT_SEQ_NEXTVAL does not exist
mysql> SELECT MYCAT_SEQ_NEXTVAL('GLOBAL');
+-----------------------------+
| MYCAT_SEQ_NEXTVAL('GLOBAL') |
+-----------------------------+
| 101,100 |
+-----------------------------+
1 row in set (0.05 sec)

v1.3.2 数据少的时候查询排序结果正常,当数据量多时则异常:(DataMergeService.java:274) -data Merge error: java.lang.NullPointerException

现象:
(1)把时间范围条件缩得很短时,数据量少时可以查出来结果,时段很长数据量多时就报如下错误,数据量应该也不是很大,分片1有47行汇总数据,分片2有469行汇总数据,分片3~12汇总数据没有。
(2)SQL格式:
select sum(...) As s,date_format(....) As dt,name
from T1
inner join T2 on ......
inner join T3 on....
where .....
group by dt
order by dt
去掉order by dt 后正常查出结果
(3)异常log:
01/27 18:42:42.383 DEBUG $_NIOREACTOR-0-RW -ServerConnection [id=2, schema=test01, host=192.168.1.18, user=root,txIsolation=3, autocommit=false, schema=test01]rollback
01/27 18:42:42.383 DEBUG $_NIOREACTOR-0-RW -no session bound connections found ,no need send rollback cmd
01/27 18:42:42.384 WARN BusinessExecutor0 -data Merge error:
java.lang.NullPointerException
at org.opencloudb.mpp.DataMergeService.handleRowData(DataMergeService.java:236)
at org.opencloudb.mpp.DataMergeService.access$200(DataMergeService.java:48)
at org.opencloudb.mpp.DataMergeService$2.run(DataMergeService.java:260)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
01/27 18:42:42.384 WARN BusinessExecutor4 -data Merge error:
java.lang.NullPointerException
at org.opencloudb.mpp.DataMergeService.handleRowData(DataMergeService.java:236)
at org.opencloudb.mpp.DataMergeService.access$200(DataMergeService.java:48)
at org.opencloudb.mpp.DataMergeService$2.run(DataMergeService.java:260)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

。。。。

}, respHandler=org.opencloudb.mysql.nio.handler.MultiNodeQueryHandler@270f009c, host=localhost, port=3307, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
01/27 18:59:35.182 DEBUG $_NIOREACTOR-3-RW -release channel MySQLConnection [id=3, lastTime=1422356375078, schema=db02, borrowed=true, fromSlaveDB=false, threadId=116, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=localhost, port=3310, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
01/27 18:59:35.185 WARN BusinessExecutor3 -caught exception
java.lang.ArrayIndexOutOfBoundsException: Array index out of range: 515
at java.util.Vector.get(Unknown Source)
at org.opencloudb.mpp.tmp.RowDataSorter.getSortedResult(RowDataSorter.java:78)
at org.opencloudb.mpp.DataMergeService.getResults(DataMergeService.java:125)
at org.opencloudb.mysql.nio.handler.MultiNodeQueryHandler.outputMergeResult(MultiNodeQueryHandler.java:284)
at org.opencloudb.mpp.DataMergeService$1.run(DataMergeService.java:93)
at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
01/27 18:59:35.186 DEBUG BusinessExecutor3 -error all end ,clear session resource
01/27 18:59:35.186 DEBUG BusinessExecutor3 -clear data
01/27 18:59:35.186 DEBUG BusinessExecutor3 -clear data

v1.3.0.2 节点通配符配置优化建议

关于通配符配置,可否改简单点,如:
< table name="..." type="global" datanode="dn$04,dn$59"/>
....
< table name="..." primaryKey="id" autoIncrement="TRUE" rule="..." dataNode="dn$04,dn$59"/>
....
< table name="..." type="global" dataNode="dn0"/>
.....
< table name="..." primaryKey="id" autoIncrement="TRUE" rule="..." dataNode="dn0,dn1"/>
....

< dataNode name="dn$04" dataHost="H3306" database="db$0105" />
< dataNode name="dn$59" dataHost="H3307" database="db$0610" />

数据库就是:db01、db02....db10

这样不受那么多限制,配置也灵活,也不会隐含很多东西在后面,用起来简单

when update/delete a child table, throws a NullPointerException.

java.lang.NullPointerException
at org.opencloudb.route.util.RouterUtil.ruleCalculate(RouterUtil.java:411)
at org.opencloudb.route.util.RouterUtil.findRouteWithcConditionsForTables(RouterUtil.java:703)
at org.opencloudb.route.util.RouterUtil.tryRouteForOneTable(RouterUtil.java:577)
at org.opencloudb.route.util.RouterUtil.tryRouteForTables(RouterUtil.java:466)
at org.opencloudb.route.impl.DruidMysqlRouteStrategy.routeNormalSqlWithAST(DruidMysqlRouteStrategy.java:48)
at org.opencloudb.route.impl.AbstractRouteStrategy.route(AbstractRouteStrategy.java:46)
at org.opencloudb.route.RouteService.route(RouteService.java:112)
at org.opencloudb.server.ServerConnection.routeEndExecuteSQL(ServerConnection.java:165)
at org.opencloudb.server.ServerConnection.execute(ServerConnection.java:154)
at org.opencloudb.server.ServerQueryHandler.query(ServerQueryHandler.java:125)
at org.opencloudb.net.FrontendConnection.query(FrontendConnection.java:250)
at org.opencloudb.net.handler.FrontendCommandHandler.handle(FrontendCommandHandler.java:56)
at org.opencloudb.net.FrontendConnection.handle(FrontendConnection.java:357)
at org.opencloudb.net.AbstractConnection.onReadData(AbstractConnection.java:276)
at org.opencloudb.net.AIOReadHandler.completed(AIOSocketWR.java:141)
at org.opencloudb.net.AIOReadHandler.completed(AIOSocketWR.java:1)
at sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:126)
at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finishRead(UnixAsynchronousSocketChannelImpl.java:430)
at sun.nio.ch.UnixAsynchronousSocketChannelImpl.finish(UnixAsynchronousSocketChannelImpl.java:191)
at sun.nio.ch.UnixAsynchronousSocketChannelImpl.onEvent(UnixAsynchronousSocketChannelImpl.java:213)
at sun.nio.ch.EPollPort$EventHandlerTask.run(EPollPort.java:293)
at sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:112)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)

1.2.2.1 java.nio.BufferOverflowException

Exception in thread "AIOExecutor2" java.nio.BufferOverflowException
at java.nio.Buffer.nextPutIndex(Buffer.java:513)
at java.nio.DirectByteBuffer.put(DirectByteBuffer.java:291)
at org.opencloudb.mysql.BufferUtil.writeUB3(BufferUtil.java:39)
at org.opencloudb.net.mysql.CommandPacket.write(CommandPacket.java:115)
at org.opencloudb.mysql.nio.MySQLConnection.sendQueryCmd(MySQLConnection.java:288)
at org.opencloudb.mysql.nio.MySQLConnection$StatusSync.execute(MySQLConnection.java:449)
at org.opencloudb.mysql.nio.MySQLConnection.doExecute(MySQLConnection.java:546)
at org.opencloudb.mysql.nio.MySQLConnection.execute(MySQLConnection.java:526)
at org.opencloudb.mysql.nio.handler.MultiNodeQueryHandler._execute(MultiNodeQueryHandler.java:144)
at org.opencloudb.mysql.nio.handler.MultiNodeQueryHandler.access$6(MultiNodeQueryHandler.java:137)
at org.opencloudb.mysql.nio.handler.MultiNodeQueryHandler$2.run(MultiNodeQueryHandler.java:159)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:745)

产生原因:
我自己写的定时器循环读取(select update) mycat中的数据时,会出现中断,mycat log报上面的异常,mycat 是在本地开发环境eclipse中启动,如果换成服务器上启动mycat,没出现过这种情况,这个会是什么问题产生的?
结果:这样会导致当前查询阻塞,需要重启tomcat服务器解决,但是不影响其他业务查询mycat,如系统登录等等。

最近测试MyCat时发现的几个问题

测试环境:

硬件:CPU E7500, 内存 4G
软件:WIN7 64位系统,JDK1.7.0_72 64位,MySQL Community 5.6.22.0单实例

测试使用的表按照《MyCat_In_Action_中文版》中快速上手部分使用的SQL进行创建,schema.xml使用默认设置,没有进行修改。

测试出现的问题:

一、普通表,以hotnews表为例

向hotnews表插入5条数据,其ID为1、2、3、4、5

1.1 查询SQL:SELECT * from hotnews where id > 1;
结果:只查到了ID为4的数据

同样,以id>1为条件执行update和delete时也只影响ID为4的数据。

1.2 查询SQL:select * from hotnews where id between 1 and 3;
结果:
java.lang.ClassCastException: com.alibaba.druid.sql.ast.expr.SQLIdentifierExpr cannot be cast to com.alibaba.druid.sql.ast.expr.SQLPropertyExpr
at org.opencloudb.parser.druid.MycatSchemaStatVisitor.getColumn(MycatSchemaStatVisitor.java:111)
at org.opencloudb.parser.druid.MycatSchemaStatVisitor.visit(MycatSchemaStatVisitor.java:23)
at com.alibaba.druid.sql.ast.expr.SQLBetweenExpr.accept0(SQLBetweenExpr.java:48)
at com.alibaba.druid.sql.ast.SQLObjectImpl.accept(SQLObjectImpl.java:40)
at com.alibaba.druid.sql.ast.SQLObjectImpl.acceptChild(SQLObjectImpl.java:62)
...

二、子表,以orders表为例

2.1 使用Insert语句向orders表中插入数据有一定概率5分钟后报ERROR 1064 can't find parent sharding node for sql,这个已经有人反映过了。

2.2 以customer_id以外的列作为条件进行update delete或者select时会报错,比如执行SQL:select * from orders where id = 1;
结果:
java.lang.NullPointerException
at org.opencloudb.route.util.RouterUtil.ruleCalculate(RouterUtil.java:411)
at org.opencloudb.route.util.RouterUtil.findRouteWithcConditionsForTables(RouterUtil.java:703)
at org.opencloudb.route.util.RouterUtil.tryRouteForOneTable(RouterUtil.java:577)
...

2.3 以customer_id为条件进行update delete或者select时会报错,比如执行SQL:update orders set note = "abc" where customer_id = 1;
结果:
java.lang.IllegalArgumentException: can't find datanode for sharding column:SHARDING_ID val:1
at org.opencloudb.route.util.RouterUtil.ruleCalculate(RouterUtil.java:415)
at org.opencloudb.route.util.RouterUtil.findRouteWithcConditionsForTables(RouterUtil.java:703)
at org.opencloudb.route.util.RouterUtil.tryRouteForOneTable(RouterUtil.java:577)

4台机器做了两个主从,把其中一个主的mysql服务关闭,mycat服务无法继续工作

配置如下:





<dataNode name="dn1" dataHost="mainHost" database="sam_test" />
<dataNode name="dn2" dataHost="submeterHost" database="sam_test" />

<dataHost name="mainHost" maxCon="1000" minCon="10" balance="1"
    writeType="0" dbType="mysql" dbDriver="native">
    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM1" url="192.168.18.78:3306" user="root" password="root">
        <!-- can have multi read hosts -->
        <readHost host="hostS1" url="192.168.18.74:3306" user="root" password="123456" />
    </writeHost>
</dataHost>

<dataHost name="submeterHost" maxCon="1000" minCon="10" balance="1"
    writeType="0" dbType="mysql" dbDriver="native">
    <heartbeat>select user()</heartbeat>
    <!-- can have multi write hosts -->
    <writeHost host="hostM2" url="192.168.18.59:3306" user="root" password="123456">
        <!-- can have multi read hosts -->
        <readHost host="hostS2" url="192.168.18.81:3306" user="root" password="123456" />
    </writeHost>
</dataHost>

望能得到哪些高手解答,目前mycat其他各项功能都测试通过了,打算把mycat应用到公司的正式环境下,希望能够搞清楚这个问题就比较放心了!

mycat系统崩溃

系统大概运行了1个礼拜左右,有天晚上凌晨系统突然停止服务,后台所有数据库操作都报错

分片查询排序结果不对

问题如下:
select * from t1 order by id_ desc limit 5
t1表是2个节点的分片,执行查询后,从两个节点上各取了5条结果,数据也是对的。但是在进行合并后输出的结果是按asc的排序输出的。

select last_insert_id()返回的值不是刚刚插入的那个

在jdbc标准里,这个select last_insert_id()与insert使用的是同一个连接,直接连mysql,返回的就是刚刚用那个连接插入的记录的主键,如果没有insert只有这个select 返回的是0。但是用mycat,返回的是所有insert之后的最后生成的id
mysql mycat二者的行为不同

直连mysql,自动提交事务也是一样的。自动提交的情况 下,直连mysql,mysql这一次访问是一个事务,就是insert 和后面的select last_insert_id()是在一上事务中的

distinct只在单个DataNode下生效,跨DataNode查询会查出多个重复的结果

测试环境:

硬件:CPU E7500, 内存 4G
软件:WIN7 64位系统,JDK1.7.0_72 64位,MySQL Community 5.6.22.0单实例

测试使用的表按照《MyCat_In_Action_中文版》中快速上手部分使用的SQL进行创建,schema.xml使用默认设置,没有进行修改。

测试使用的是hotnews这个比较简单的表,象棋中插入5条数据,ID分别是1到5,title全部为“123”,查询SQL:select distinct title from hotnews;
结果:三个123(因为数据保存在三个DataNode上)

select avg(id) from test ;

在没有分库字段情况下,avg函数会发到每个库去执行,解析每个库执行的sql也都是select avg(id) from test ,这样最终的结果是错误的。需要每个库返回count(id),sum(id),最后merge的时候重新计算avg

Insert into child table时,NIO会机率性卡死,revision 647 引入的问题。

更新

最近查了下原来的svn版本库,发现是647对NIO的更新引入的问题。

mycat:cpu: i3 4核心,os: ubuntu 14.04 64bit, jdk 1.7.0_02, 使用mysql协议连接mysql服务器。
mysql:cpu: i3 4核心,os: xp sp3, 单机双mysql实例配置

故障现象:
只要是对child table进行insert操作,就会机率性卡死,5分钟后返回,log中抛同样的异常。

初步跟踪了代码(版本与master同步):
SystemConfig中缺省已经有避免单核心的逻辑,所以可以排除单线程这个原因。
FetchStoreNodeOfChildTableHandler中的execute()函数,5分钟阀值在此处定义,卡死是因为dataNode始终为null,所以一直在循环等待直到超时。dataNode为空,是因为MySQLConnection中的handleData()函数没有进入handleRowPacket()触发上述Handler的rowResponse(),其实出错时连handleData()都没触发。
使用wireshark监听网络通信,mysql应答是正常的。
也就是说,mycat接受到了正常应答包,但没有触发handleData()函数。难道时NIOReactor的问题?

sequnce db方式很不稳定,我昨天测试的正常,下班后把测试机关了今天再启动,sequnce db就无法正常工作

问题描述:
第一天往mycat_sequence表中配置了相关表的sequence信息,同时把那三个function也都在数据库创建完成,sequence_db_conf.properties也做了配置。启动的时候,往数据库插入数据,提示:
java.lang.RuntimeException: can't fetch sequnce in db,sequnce :SAM_GLUCOSE
at org.opencloudb.sequence.handler.IncrSequenceMySQLHandler.getSeqValueFromDB(IncrSequenceMySQLHandler.java:101)
at org.opencloudb.sequence.handler.IncrSequenceMySQLHandler.nextId(IncrSequenceMySQLHandler.java:71)
at org.opencloudb.parser.ExtNodeToString4SEQ.nextSequenceNode(ExtNodeToString4SEQ.java:61)
at com.foundationdb.sql.unparser.NodeToString.toString(NodeToString.java:267)
at com.foundationdb.sql.unparser.NodeToString.maybeParens(NodeToString.java:1471)
at com.foundationdb.sql.unparser.NodeToString.resultColumn(NodeToString.java:737)
at com.foundationdb.sql.unparser.NodeToString.toString(NodeToString.java:95)
at com.foundationdb.sql.unparser.NodeToString.nodeList(NodeToString.java:1465)
at com.foundationdb.sql.unparser.NodeToString.nodeList(NodeToString.java:1453)
at com.foundationdb.sql.unparser.NodeToString.resultColumnList(NodeToString.java:726)
at com.foundationdb.sql.unparser.NodeToString.toString(NodeToString.java:93)
at com.foundationdb.sql.unparser.NodeToString.rowResultSetNode(NodeToString.java:707)
at com.foundationdb.sql.unparser.NodeToString.toString(NodeToString.java:125)
at com.foundationdb.sql.unparser.NodeToString.insertNode(NodeToString.java:605)
at com.foundationdb.sql.unparser.NodeToString.toString(NodeToString.java:85)
at org.opencloudb.route.MyCATSequnceProcessor.executeSeq(MyCATSequnceProcessor.java:76)
at org.opencloudb.route.MyCATSequnceProcessor.access$2(MyCATSequnceProcessor.java:66)
at org.opencloudb.route.MyCATSequnceProcessor$ExecuteThread.run(MyCATSequnceProcessor.java:101)

我在org.opencloudb.sequence.handler.IncrSequenceMySQLHandler.getSeqValueFromDB 方法中加断点debug后,自己恢复正常了,在2015-01-29一整天测试都正常。
29号下班时我把测试机关了。30号我上班后把测试机打开,启动mycat服务都正常,执行查询操作也都正常,但是插入数据的时候 sequence又报:
java.lang.RuntimeException: can't fetch sequnce in db,sequnce :SAM_GLUCOSE 同样的问题了。
这次加debug断点调试也不行了。好不稳定啊!求解?

mycat配置一主一从,主停掉以后,select语句都不能执行了

问题:mycat配置了一主一从,主使用service mysql stop停掉以后,select语句也无法执行了。

mycat服务端日志不停地报错:
01-26 14:04:11.416 INFO $_NIOConnector -close connection,reason:hearbeat connecterr ,[thread=$_NIOConnector,class=MySQLDetector,host=172.17.209.103,port=3306,localPort=0,schema=null]
01-26 14:04:12.417 INFO $_NIOConnector -close connection,reason:hearbeat connecterr ,[thread=$_NIOConnector,class=MySQLDetector,host=172.17.209.103,port=3306,localPort=0,schema=null]
01-26 14:04:13.417 INFO $_NIOConnector -close connection,reason:hearbeat connecterr ,[thread=$_NIOConnector,class=MySQLDetector,host=172.17.209.103,port=3306,localPort=0,schema=null]

执行select * from travelrecord语句报错
[Err] 1003 - Connection refused: no further information

mycat 1.3版本问题很多,希望开发团队注意

自1.2.3版本后,引入了aio,druid等等好多新的内容,但这些内容测试不够充分,问题很多。
希望开发团队在添加新特性的时候,还是要优先保证原有的功能动作正常。

希望能够追加1.2.x的分支,继续维护。目前该版本序列应该是比较稳定可靠的。

druidparser 分区字段会路由,like 情况下会报错

说明:
druid解析器会走自定义分片规则,导致分片字段like 情况下异常,
(RouterUtil.java:673) -can't find any valid datanode :

重现:
如sql 为 select * from table where 分区字段 like '%3233%'
会传递到路由函数导致,
Integer nodeIndex = tableConfig.getRule().getRuleAlgorithm().calculate(pair.colValue);//RouterUtil.java -line 669

解决意见:
1.不支持like,如果like 分区字段,直接跳过,全节点筛选。
2.支持like , Integer nodeIndex 应该返回 Integer[] nodeIndexs ,这个和路由规则有关。
3.让路由函数子定义自己处理,希望pair.colValue 去掉 %或者_

v1.3.2-druidparser解析,但报另外一个解析的org.opencloudb.parser.SQLParserDelegate.parse异常

1.解析器:druidparser
2.SQL:insert into test01(name,descs) values('sdf','sdf'),values('sdfdf','sdfdsgfdf')
3.备注:id使用db自增序列
5.异常信息:
01/29 16:48:40.105 DEBUG $_NIOREACTOR-3-RW -ServerConnection [id=1, schema=iems, host=192.168.1.208, user=root,txIsolation=3, autocommit=true, schema=tt]insert into test01(name,descs)
values('sdf','sdf'),values('sdfdf','sdfdsgfdf')
01/29 16:48:40.107 ERROR Thread-1 -MyCATSequenceProcessor.executeSeq(SesionSQLPair)
java.sql.SQLSyntaxErrorException: com.foundationdb.sql.StandardException: VALUES is empty
at org.opencloudb.parser.SQLParserDelegate.parse(SQLParserDelegate.java:70)
at org.opencloudb.route.MyCATSequnceProcessor.executeSeq(MyCATSequnceProcessor.java:74)
at org.opencloudb.route.MyCATSequnceProcessor.access$200(MyCATSequnceProcessor.java:22)
at org.opencloudb.route.MyCATSequnceProcessor$ExecuteThread.run(MyCATSequnceProcessor.java:101)
Caused by: com.foundationdb.sql.StandardException: VALUES is empty
at com.foundationdb.sql.parser.SQLGrammar.rowValueConstructorElement(SQLGrammar.java:8583)
at com.foundationdb.sql.parser.SQLGrammar.rowValueConstructor(SQLGrammar.java:8521)
at com.foundationdb.sql.parser.SQLGrammar.tableValueConstructorList(SQLGrammar.java:9824)
at com.foundationdb.sql.parser.SQLGrammar.tableValueConstructor(SQLGrammar.java:9805)
at com.foundationdb.sql.parser.SQLGrammar.simpleTable(SQLGrammar.java:4598)
at com.foundationdb.sql.parser.SQLGrammar.nonJoinQueryPrimary(SQLGrammar.java:4573)
at com.foundationdb.sql.parser.SQLGrammar.nonJoinQueryTerm(SQLGrammar.java:4462)
at com.foundationdb.sql.parser.SQLGrammar.queryExpression(SQLGrammar.java:4367)
at com.foundationdb.sql.parser.SQLGrammar.insertColumnsAndSource(SQLGrammar.java:8384)
at com.foundationdb.sql.parser.SQLGrammar.insertStatement(SQLGrammar.java:2449)
at com.foundationdb.sql.parser.SQLGrammar.preparableSQLDataStatement(SQLGrammar.java:2208)
at com.foundationdb.sql.parser.SQLGrammar.StatementPart(SQLGrammar.java:1948)
at com.foundationdb.sql.parser.SQLGrammar.Statement(SQLGrammar.java:1846)
at com.foundationdb.sql.parser.SQLGrammar.parseStatement(SQLGrammar.java:1832)
at com.foundationdb.sql.parser.SQLParser.parseStatement(SQLParser.java:104)
at org.opencloudb.parser.SQLParserDelegate.parse(SQLParserDelegate.java:68)
... 3 more

《MyCat_In_Action_中文版.doc》中示例,报错can't find (root) parent sharding node for sql:INSERT INTO orders (id, customer_id)

根据《MyCat_In_Action_中文版.doc》中的步骤在windows下面测试的时候,报标题所示错误,请各位帮忙分析下原因,具体环境如下:

windows7,64位
JDK1.7
MySQL5.0.45,Community Edition

具体错误信息如下:
2/31 14:15:53.700 WARN $_NIOREACTOR-0-RW -ServerConnection [id=1, schema=TESTDB, host=127.0.0.1, user=test,txIsolation=3, autocommit=true, schema=TESTDB]insert into orders(id,customer_id) values(2,2) err:java.sql.SQLNonTransientException: can't find (root) parent sharding node for sql:INSERT INTO orders (id, customer_id)
VALUES (2, 2)
java.sql.SQLNonTransientException: can't find (root) parent sharding node for sql:INSERT INTO orders (id, customer_id)
VALUES (2, 2)
at org.opencloudb.parser.druid.impl.DruidInsertParser.parserChildTable(DruidInsertParser.java:138)
at org.opencloudb.parser.druid.impl.DruidInsertParser.statementParse(DruidInsertParser.java:50)
at org.opencloudb.parser.druid.impl.DefaultDruidParser.parser(DefaultDruidParser.java:60)
at org.opencloudb.route.impl.DruidMysqlRouteStrategy.routeNormalSqlWithAST(DruidMysqlRouteStrategy.java:35)
at org.opencloudb.route.impl.AbstractRouteStrategy.route(AbstractRouteStrategy.java:46)
at org.opencloudb.route.RouteService.route(RouteService.java:112)
at org.opencloudb.server.ServerConnection.routeEndExecuteSQL(ServerConnection.java:162)
at org.opencloudb.server.ServerConnection.execute(ServerConnection.java:154)
at org.opencloudb.server.ServerQueryHandler.query(ServerQueryHandler.java:125)
at org.opencloudb.net.FrontendConnection.query(FrontendConnection.java:263)
at org.opencloudb.net.handler.FrontendCommandHandler.handle(FrontendCommandHandler.java:56)
at org.opencloudb.net.FrontendConnection.handle(FrontendConnection.java:370)
at org.opencloudb.net.AbstractConnection.onReadData(AbstractConnection.java:264)
at org.opencloudb.net.NIOSocketWR.asynRead(NIOSocketWR.java:186)
at org.opencloudb.net.AbstractConnection.asynRead(AbstractConnection.java:226)
at org.opencloudb.net.NIOReactor$RW.run(NIOReactor.java:97)
at java.lang.Thread.run(Thread.java:722)

ERROR 1003 (HY000): Reload config failure

Mcat:Mycat-server-1.3.0.2-20150105144205-linux.tar.gz
OS:CentOS release 6.4 (Final)
Mysql:5.5
Java:java version "1.7.0_67"

问题1:ERROR 1003 (HY000): Reload config failure
error log::
02/12 15:50:51.569 WARN $_NIOREACTOR-0-RW -register error
java.nio.channels.ClosedChannelException
at java.nio.channels.spi.AbstractSelectableChannel.register(AbstractSelectableChannel.java:194)
at org.opencloudb.net.NIOSocketWR.register(NIOSocketWR.java:27)
at org.opencloudb.net.NIOReactor$RW.register(NIOReactor.java:154)
at org.opencloudb.net.NIOReactor$RW.run(NIOReactor.java:86)
at java.lang.Thread.run(Thread.java:722)
+++++++++++++++++++++++++++++++++++++++++++++++
问题2:
create table orders (id int not null primary key ,customer_id int not null,sataus int ,note varchar(100) ); //正常执行

insert into orders(id,customer_id) values(1,1); //插入数据失败
insert into orders(id,customer_id) values(2,2); //插入数据失败

The dataNode attribute of global table.

A sql for a global table will be executed on all dataNodes of schema, not the table's.
If the value of TableConfig.getDataNodes() is not same as SchemaConfig.getAllDataNodes(), the operation should be executed on the table's dataNodes.

Getting Started 的url返回404

Getting Started: [zh-CN: https://github.com/MyCATApache/Mycat-doc/blob/master/MyCat_In_Action_%E4%B8%AD%E6%96%87%E7%89%88.doc]

另外,建议文档都改为md格式的,doc格式很少人愿意下载来看。而且版本变更也显示不出来。

schema.xml 非分片表配置问题及优化建议

现在碰到个问题,想请教下:schema.xml 将库里每张表,不管是不是分片,都要每个表都配置下。要是100多张表,只有10来张需要分片,其他90张只是普通表不需要,一一配置太麻烦了。有其他方法将这些90多张表不用配置,这个物理库需要分片的配置,不分片不用配?

我们现在应用较多,有的应用几百张表,有些可能要随时ddl加表什么的,一一个个表配置太麻烦了,有没有有效的方法?比如cobar的schema本身属性有个默认库,普通表不用配置全放在这个默认库里?

如果有这个属性,应用端就可以随意用ddl建普通表了,而schema.xml 无须任何配置。而不是建一张表,就得提前在schema.xml 配置好,这么繁琐了。

mysql连接后端连接vertica数据库报错。

mycat后端连接的是vertica数据。通过mysql客户端以后,可以正常的插入数据。
但是在java代码里面通过jdbc的方式插入程序报错。
java代码如下:

Class.forName("com.vertica.jdbc.Driver") ;
Class.forName("com.mysql.jdbc.Driver") ;
Connection con = DriverManager.getConnection(mycatUrl, mycatUser, mycatPW);
Statement stmt = con.createStatement();
stmt.execute(
"insert into tablea(name) values('myname')"
);

my.log的日志如下:

01/27 17:26:35.074 INFO $_NIOREACTOR-2-RW -ServerConnection [id=162, schema=realtimedata, host=113.106.251.85, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata]'realtime_mycat' login success
01/27 17:26:35.080 DEBUG $_NIOREACTOR-2-RW -ServerConnection [id=162, schema=test, host=127.0.0.1, user=test,txIsolation=3, autocommit=true, schema=test]/* mysql-connector-java-5.1.34 ( Revision: [email protected] ) /SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'license' OR Variable_name = 'init_connect'
01/27 17:26:35.080 DEBUG $_NIOREACTOR-2-RW -ServerConnection [id=162, schema=realtimedata, host=113.106.251.85, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata]/
mysql-connector-java-5.1.34 ( Revision: [email protected] ) /SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'license' OR Variable_name = 'init_connect', route={
1 -> realtime_vertica{/
mysql-connector-java-5.1.34 ( Revision: [email protected] ) */SHOW VARIABLES WHERE Variable_name ='language' OR Variable_name = 'net_write_timeout' OR Variable_name = 'interactive_timeout' OR Variable_name = 'wait_timeout' OR Variable_name = 'character_set_client' OR Variable_name = 'character_set_connection' OR Variable_name = 'character_set' OR Variable_name = 'character_set_server' OR Variable_name = 'tx_isolation' OR Variable_name = 'transaction_isolation' OR Variable_name = 'character_set_results' OR Variable_name = 'timezone' OR Variable_name = 'time_zone' OR Variable_name = 'system_time_zone' OR Variable_name = 'lower_case_table_names' OR Variable_name = 'max_allowed_packet' OR Variable_name = 'net_buffer_length' OR Variable_name = 'sql_mode' OR Variable_name = 'query_cache_type' OR Variable_name = 'query_cache_size' OR Variable_name = 'license' OR Variable_name = 'init_connect'}
} rrs
01/27 17:26:35.081 DEBUG $_NIOREACTOR-2-RW -select read source host_mastar_realtimedata for dataHost:realtime_vertica_db
01/27 17:26:35.085 WARN $_NIOREACTOR-2-RW -execute sql err : errno:4856 [Vertica]VJDBC ERROR: Syntax error at or near "WHERE" con:JDBCConnection [autocommit=true, txIsolation=0, running=false, borrowed=true, id=0, host=183.61.2.158, port=5433]
01/27 17:26:35.085 DEBUG $_NIOREACTOR-2-RW -release connection JDBCConnection [autocommit=true, txIsolation=0, running=false, borrowed=true, id=0, host=183.61.2.158, port=5433]
01/27 17:26:35.085 DEBUG $_NIOREACTOR-2-RW -release channel JDBCConnection [autocommit=true, txIsolation=0, running=false, borrowed=true, id=0, host=183.61.2.158, port=5433]
01/27 17:26:35.095 INFO $_NIOREACTOR-2-RW -close connection,reason:stream closed ,ServerConnection [id=162, schema=realtimedata, host=113.106.251.85, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata]
01/27 17:26:35.096 DEBUG $_NIOREACTOR-2-RW -ServerConnection [id=162, schema=realtimedata, host=113.106.251.85, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata] socket key canceled
01/27 17:31:49.405 INFO $_NIOREACTOR-3-RW -ServerConnection [id=163, schema=realtimedata, host=183.61.2.158, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata]'realtime_mycat' login success
01/27 17:31:49.407 DEBUG $_NIOREACTOR-3-RW -ServerConnection [id=163, schema=realtimedata, host=183.61.2.158, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata]show databases
01/27 17:31:49.414 DEBUG $_NIOREACTOR-3-RW -ServerConnection [id=163, schema=realtimedata, host=183.61.2.158, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata]show tables
01/27 17:31:49.417 DEBUG $_NIOREACTOR-3-RW -ServerConnection [id=163, schema=realtimedata, host=183.61.2.158, user=realtime_mycat,txIsolation=3, autocommit=true, schema=realtimedata]select @@version_comment limit 1

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.