Mycat2 icon indicating copy to clipboard operation
Mycat2 copied to clipboard

mycat2连接后端mysql出错,连接重置

Open lichangjiang opened this issue 5 years ago • 4 comments

我用docker创建了两个mysql库准备测试一下mycat2但是总是连接出错: docker创建mysql命令如下:

docker run --name mycat-mysql2 -p13307:3306 -e MYSQL_ROOT_PASSWORD=changeme -d mysql:5.7
docker run --name mycat-mysql -p13306:3306 -e MYSQL_ROOT_PASSWORD=changeme -d mysql:5.7

上面创建数据库后,用mysql客户端和mycat1.6连接都是没问题的.

mycat.yml配置如下,就是按照mycatCore/main/resource/mycat.yml改了一下数据源的ip,密码等,本地ip试过127.0.0.1,0.0.0.0都会报错.

metadata:
  schemas: [{
              schemaName: 'mycat1' ,   targetName: 'defaultDs',
            },
            {
              schemaName: 'mycat2' ,   targetName: 'defaultDs2',
            }]
interceptors:
  [{
     user: {ip: '.', password: '123456', username: root},
     transactionType: proxy
   }]
datasource:
  datasources: [{name: defaultDs, ip: 0.0.0.0,port: 13306,user: root,password: changeme,maxCon: 10000,minCon: 0,
                 maxRetryCount: 3, #连接重试次数
                 maxConnectTimeout: 10000, #连接超时时间 毫秒
                 dbType: mysql, #
                 url: 'jdbc:mysql://127.0.0.1:13306/mycat1?useUnicode=true&characterEncoding=utf8mb4',
                 weight: 1, #负载均衡权重
                 initSqls: ['set names utf8mb4;']
                  , #建立连接后执行的sql,在此可以写上use xxx初始化默认database
                 instanceType: READ_WRITE, #READ,WRITE,READ_WRITE ,集群信息中是主节点,则默认为读写,副本则为读,此属性可以强制指定可写,
                 initSqlsGetConnection: true
                },
                {  name: defaultDs2, ip: 0.0.0.0,port: 13307,user: root,password: changeme,maxCon: 10000,minCon: 0,
                   maxRetryCount: 3,maxConnectTimeout: 10000,dbType: mysql,
                   url: 'jdbc:mysql://127.0.0.1:13307/mycat2?useUnicode=true&characterEncoding=utf8mb4',
                   weight: 1,
                   initSqls: ['set names utf8mb4;'],
                   instanceType: READ_WRITE, #READ,WRITE,READ_WRITE
                   initSqlsGetConnection: true
                }
  ]
  datasourceProviderClass: io.mycat.datasource.jdbc.datasourceprovider.AtomikosDatasourceProvider
  timer: {initialDelay: 10, period: 5, timeUnit: SECONDS}
cluster: #集群,数据源选择器,既可以mycat自行检查数据源可用也可以通过mycat提供的外部接口设置设置数据源可用信息影响如何使用数据源
  close: true  #关闭集群心跳,此时集群认为所有数据源都是可用的,可以通过mycat提供的外部接口设置数据源可用信息达到相同效果
  clusters: [
  {name: repli ,
   replicaType: MASTER_SLAVE , # SINGLE_NODE:单一节点 ,MASTER_SLAVE:普通主从 GARELA_CLUSTER:garela cluster
   switchType: SWITCH , #NOT_SWITCH:不进行主从切换,SWITCH:进行主从切换
   readBalanceType: BALANCE_ALL  , #对于查询请求的负载均衡类型
   readBalanceName: BalanceRoundRobin , #对于查询请求的负载均衡类型
   writeBalanceName: BalanceRoundRobin ,  #对于修改请求的负载均衡类型
   masters:[defaultDs , defaultDs2], #主节点列表,普通主从,当主失去连接后,依次选择列表中存活的作为主节点
   replicas:[ defaultDs2],#从节点列表
   maxCon:, #集群最占用大连接限制
   heartbeat:{maxRetry: 3, #心跳重试次数
              minSwitchTimeInterval: 120000 , #最小主从切换间隔
              heartbeatTimeout: 100000 , #心跳超时值,毫秒
              slaveThreshold: 0 , # mysql binlog延迟值
              requestType: 'mysql' #进行心跳的方式,mysql或者jdbc两种
   }}
  ]
  timer: {initialDelay: 0, period: 1, timeUnit: SECONDS} #心跳定时器 initialDelay一般为0,mycat会在开启集群心跳,一个initialDelay+1秒之后开启服务器端口
#负载均衡类型 BALANCE_ALL:所有数据源参与负载均衡 BALANCE_ALL_READ:所以非master数据源参与负载均衡 BALANCE_NONE:只有master(一个)参与负载
plug:
  sequence:
    sequences: [
    {name: 'db1_travelrecord', clazz: io.mycat.plug.sequence.SequenceMySQLGenerator ,args: "sql : SELECT db1.mycat_seq_nextval('GLOBAL') , targetName:defaultDs"},
    {name: 'db1_address', clazz: io.mycat.plug.sequence.SequenceSnowflakeGenerator ,args: 'workerId:1'},
    ]
server:
  ip: 0.0.0.0
  port: 8066
  reactorNumber: 1
properties:
  key: value

#lib start
#lib end

mycat2报错日志:

[main] INFO io.mycat.MycatWorkerProcessor - Mycat WorkerProcessor init by:ServerConfig.ThreadPoolExecutorConfig(corePoolSize=8, maxPoolSize=1024, keepAliveTime=1, taskTimeout=1, timeUnit=MINUTES, maxPendingLimit=65535)
[main] INFO io.mycat.MycatWorkerProcessor - Mycat TIME WorkerProcessor init by:ServerConfig.ThreadPoolExecutorConfig(corePoolSize=0, maxPoolSize=2, keepAliveTime=1, taskTimeout=1, timeUnit=MINUTES, maxPendingLimit=65535)
[main] INFO io.mycat.MycatCore - mycat starts successful
[Thread-1] INFO io.mycat.proxy.session.MycatSessionManager - MycatSessionManager is checking
[Thread-2] INFO io.mycat.proxy.reactor.NIOAcceptor - New Client connected:java.nio.channels.SocketChannel[connected local=/127.0.0.1:8066 remote=/127.0.0.1:37518]
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.proxy.session.MycatSession - set mycat session id:1 isolation:READ_UNCOMMITTED
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.commands.MycatdbCommand - /* mysql-connector-java-5.1.35 ( Revision: 5fb9c5849535c13917c2cf9baaece6ef9693ef27 ) */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'
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.commands.MycatdbCommand - /* mysql-connector-java-5.1.35 ( Revision: 5fb9c5849535c13917c2cf9baaece6ef9693ef27 ) */SELECT @@session.auto_increment_increment
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.commands.MycatdbCommand - SET NAMES latin1
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.commands.MycatdbCommand - SET autocommit=1
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.commands.MycatdbCommand - SET sql_mode='STRICT_TRANS_TABLES'
[Thread-1] INFO io.mycat.proxy.session.MySQLProxyServerSession - ------------has response--------------:1
[Thread-1] INFO io.mycat.commands.MycatdbCommand - select * from mycat1.teacher
[Thread-1] INFO io.mycat.proxy.handler.backend.BackendConCreateHandler - inetSocketAddress:/0.0.0.0:13306 
[Thread-1] INFO io.mycat.proxy.handler.backend.BackendConCreateHandler - backend mysql authPluginName:mysql_native_password 
[Thread-1] INFO io.mycat.proxy.handler.backend.BackendConCreateHandler - mycat set authPluginName:mysql_native_password 
[Thread-1] INFO io.mycat.proxy.handler.backend.BackendConCreateHandler - authPluginName:mysql_native_password 
[Thread-1] ERROR io.mycat.proxy.handler.MycatHandler - {}
java.io.IOException: 连接被对方重设
	at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
	at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
	at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
	at sun.nio.ch.IOUtil.read(IOUtil.java:197)
	at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
	at io.mycat.proxy.packet.FrontMySQLPacketResolver.readFromChannel(FrontMySQLPacketResolver.java:54)
	at io.mycat.proxy.handler.MycatHandler.onSocketRead(MycatHandler.java:52)
	at io.mycat.proxy.handler.MycatHandler.onSocketRead(MycatHandler.java:33)
	at io.mycat.proxy.reactor.ProxyReactorThread.processReadKey(ProxyReactorThread.java:148)
	at io.mycat.proxy.reactor.ProxyReactorThread.run(ProxyReactorThread.java:205)
[Thread-1] ERROR io.mycat.proxy.handler.MySQLPacketExchanger - {}
java.io.IOException: 连接被对方重设
	at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
	at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
	at sun.nio.ch.IOUtil.readIntoNativeBuffer(IOUtil.java:223)
	at sun.nio.ch.IOUtil.read(IOUtil.java:197)
	at sun.nio.ch.SocketChannelImpl.read(SocketChannelImpl.java:380)
	at io.mycat.proxy.packet.FrontMySQLPacketResolver.readFromChannel(FrontMySQLPacketResolver.java:54)
	at io.mycat.proxy.handler.MycatHandler.onSocketRead(MycatHandler.java:52)
	at io.mycat.proxy.handler.MycatHandler.onSocketRead(MycatHandler.java:33)
	at io.mycat.proxy.reactor.ProxyReactorThread.processReadKey(ProxyReactorThread.java:148)
	at io.mycat.proxy.reactor.ProxyReactorThread.run(ProxyReactorThread.java:205)
[Thread-1] INFO io.mycat.proxy.session.MycatSessionManager - MycatSessionManager is checking

lichangjiang avatar Oct 14 '20 07:10 lichangjiang

估计是jdbc客户端检查到某个mysql变量有问题关闭的,而不是后端mysql连接出错

junwen12221 avatar Oct 14 '20 08:10 junwen12221

你可以把后端连接改成jdbc再试试

junwen12221 avatar Oct 14 '20 08:10 junwen12221

你可以把后端连接改成jdbc再试试

是加上type:JDBC就行了吗,我之前试了一下,还是同样的报错.

lichangjiang avatar Oct 14 '20 08:10 lichangjiang

在jdbc的代码里面打断点才能看到断开的原因

junwen12221 avatar Oct 14 '20 09:10 junwen12221