准备工作
先说一下硬件:
- mycat服务器:阿里云ECS,centos7.4,2核2G1M带宽,外网带宽主要是为了yum安装方便;
- 数据库主库:阿里云RDS;
- 数据库读库:阿里云RDS只读实例;
登陆阿里云ECS之后,首先先进行如下操作:
1 | wget http://dl.mycat.io/1.6.5/Mycat-server-1.6.5-release-20180122220033-linux.tar.gz #下载1.6.5版本 |
然后登陆到阿里云RDS读库和写库,看一下大小写是否是“不敏感”,否则可能会发生表找不到的问题,阿里云的RDS默认是不敏感的:
1 | MySQL [(none)]> show global variables like '%lower_case%'; |
Mycat原理和文件结构
Mycat的原理跟Atlas查不多,都是用一个虚拟的数据库作为前端,后面是挂上真实的写库和读库。如图:
mycat文件夹的文件结构很简单:
- conf:配置文件;
- lib:服务依赖的一些jar文件.;
- logs:日志存储文件夹;
- bin:可执行命令的地方:
mycat的配置文件主要在/usr/local/mycat/conf
文件夹里,里面有很多文件,但是主要的配置文件是如下几个:
server.xml
用来配置虚拟数据库的信息;schema.xml
用来配置真实读库写库的信息;rule.xml
是分片规则的配置文件,分片规则的具体一些参数信息单独存放为文件;
注意!在这个目录下,配置文件修改,需要重启Mycat或者通过9066端口reload才会生效。
首先在打开server.xml
,在如下的地方做修改:
1 | <user name="root" defaultAccount="true"> <!-- 这里是给虚拟库设定一个账号叫root,并且作为默认账号 --> |
然后打开schema.xml
,编辑如下地方:
1 | <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> |
检查好格式并保存之后,就到mycat目录下的/bin/里./mycat start
就启动mycat了。启动成功之后,8066和9066都是被监听的,如图:
启动故障排错
如果启动mycat失败,可以去logs文件夹里看日志,这里举例几个有代表性的错误:
wrapper.log
日志:Caused by: io.mycat.config.util.ConfigException: SelfCheck### schema mycat refered by user test is not exist!
server.xml
里schema最好选择默认的TESTDB,而不是错误里的自己起名的mycat。wrapper.log
日志:org.xml.sax.SAXParseException; lineNumber: 23; columnNumber: 3; The content of elements must consist of well-formed character data or markup
去检查一下server.xml
的第23行,看一下是不是多了一个’<’或者’>’。wrapper.log
日志:Caused by: io.mycat.config.util.ConfigException: user root duplicated!
server.xml
里普通账号root,只读账号也叫root,冲突了。wrapper.log
日志:Caused by: org.xml.sax.SAXParseException; lineNumber: 16; columnNumber: 101; Element type "WriteHost" must be declared.
schema.xml
配置中writeHost写成了WriteHost导致报错。mycat.log
日志如下:1
2018-07-06 15:53:22.894 WARN [$_NIOREACTOR-8-RW] (io.mycat.backend.mysql.nio.MySQLConnectionAuthenticator.handle(MySQLConnectionAuthenticator.java:91)) - can't connect to mysql server ,errmsg:Access denied for user '数据库账号'@'本地IP' (using password: YES) MySQLConnection [id=8, lastTime=1530863602566, user=数据库账号, schema=db3, old shema=db3, borrowed=false, fromSlaveDB=false, threadId=4555911, charset=utf8, txIsolation=3, autocommit=true, attachment=null, respHandler=null, host=阿里云写库地址, port=3306, statusSync=null, writeQueue=0, modifiedSQLExecuted=false]
schema.xml
里把真实库的配置写错了。
mycat.log
日志:(io.mycat.net.NIOConnector.finishConnect(NIOConnector.java:155)) - error: java.net.ConnectException: Connection refused
schema.xml
的<dataHost>
字段是否写入了多余的数据库。
参考资料
http://valleylord.github.io/post/201601-mycat-install/
https://www.jianshu.com/p/f15d64fcb2f3