从cobar到mycat的基本使用

时间:2022-06-05 04:12:38

Cobar 是由 Alibaba 开源的 MySQL 分布式处理中间件,它可以在分布式的环境下看上去像传统数据库一样提供海量数据服务。

其实公司本身并没有这方面的需求,单库单表就足够了,研究下纯是因为个人兴趣,对于数据库分别的原理,之前是有了解的,是采用一致性hash算法,这是个神奇的东西,它可以保证数据库或者其他架构中节点的删除与扩容,或者说跟普通hash算法做的分布式相比它可以把影响降到最低。原理也是蛮简单的,就是把按照hash可能计算出的结果排成一个圈,然后根据需求分成N份,每个hash出来的值都放在圈子范围以为,如果去除了某个节点那么就放在离当前hash值最近的下一个范围,详细介绍可以参考这里

下面继续说cobar,cobar的安装网上文章很多,而且基本是参考,呃不是复制,cobar的官方文档,文档本身讲得就很明了,而且cobar的目录结构,还有配置都是相当简单,基本是看一下就明白是怎么回事了,拷贝下网上的介绍

Cobar解压之后有四个目录:
bin/:可执行文件目录,包含启动(start)、关闭(shutdown)和重启(restart)脚本
lib/:逻辑类库目录,包含了Cobar所需的jar包
conf/:配置文件目录,下面会详细介绍
logs/:运行日志目录,最主要的log有两个:程序日志(stdout.log)和控制台输出(console.log)

配置文件的用法如下:
log4j.xml:日志配置,一般来说保持默认即可
schema.xml:定义了schema逻辑层次图中的所有元素,并利用这些元素以及rule.xml中定义的规则组建分布式数据库系统
rule.xml:定义了分库分表的规则
server.xml:系统配置文件


其中rule.xml是通过函数来做分片的,cobar本身提供了三个方法PartitionByString,PartitionByLong,PartitionByFileMap,也可以自己来重写,非常的人性化。

说下自己在启动时候碰到的一些问题,首先启动前要设置好JAVA_HOME,不然会直接报错,然后启动的时候要看下启动脚本中的关于JVM的参数设置,确保自己内存足够,我开始没注意在我自己的阿里云服务器上就报错了,主要是我内存太小,初始设置是

#set JAVA_OPTS
JAVA_OPTS="-server -Xms1024m -Xmx1024m -Xmn256m -Xss256k"
#performance Options
JAVA_OPTS="$JAVA_OPTS -XX:+AggressiveOpts"
JAVA_OPTS="$JAVA_OPTS -XX:+UseBiasedLocking"
JAVA_OPTS="$JAVA_OPTS -XX:+UseFastAccessorMethods"
JAVA_OPTS="$JAVA_OPTS -XX:+DisableExplicitGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseParNewGC"
JAVA_OPTS="$JAVA_OPTS -XX:+UseConcMarkSweepGC"
JAVA_OPTS="$JAVA_OPTS -XX:+CMSParallelRemarkEnabled"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSCompactAtFullCollection"
JAVA_OPTS="$JAVA_OPTS -XX:+UseCMSInitiatingOccupancyOnly"
JAVA_OPTS="$JAVA_OPTS -XX:CMSInitiatingOccupancyFraction=75"
启动之后首先要看下logs目录下的日志文件,根据不同类型会写的不同的文件中,console.log应该是总的输出,这个没有具体考究。

把虚拟机占用内存调小后,可以跑起来了,链接自己本地数据库是没问题,如果有报错首先多检查检查配置,还有数据库的访问权限,cobar这个跟客户端直连是不同的,cobar相当于一个代理,它会在其中做一些手脚,所以连起来没那么方便,经常出一些莫名的错误。

启动成功后在插入了几条数据,再到实际mysql库中去看,是成功的,根据配置进行了分片。

但是之后又发现一个问题,用SEQ,NAVICAT等软件连不上cobar呢,但是用命令可以,用命令链接时候需要注意,mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB,host很重要,用localhost就连不上,客户端连不上的问题网上也搜不到,后来看到了介绍mycat的文章中说,最新版的mycat已经修复了这个问题,所以就应该之前cobar存在这个bug。

转战mycat后真的是非常顺利。只要设置好权限怎么连都不会有问题,用工具也能连得上mycat了。而且用过了cobar后上手mycat也非常简单,搭建完成了下一步开始读mycat的源码,还有学习mysql的链接过程看看这些中间件到底是做了些什么。

附上之前的错误,很多次连接不上都是报这个,看代码是在获取字符集时候出错,但是为什么会出错呢??

18:24:45,717 WARN  dnTest1:0 init error.
java.util.concurrent.ExecutionException: java.lang.ArrayIndexOutOfBoundsException: 224
at java.util.concurrent.FutureTask.report(FutureTask.java:122)
at java.util.concurrent.FutureTask.get(FutureTask.java:206)
at com.alibaba.cobar.mysql.bio.MySQLChannel.connect(MySQLChannel.java:185)
at com.alibaba.cobar.mysql.MySQLDataSource.getChannel(MySQLDataSource.java:159)
at com.alibaba.cobar.mysql.MySQLDataNode.initSource(MySQLDataNode.java:357)
at com.alibaba.cobar.mysql.MySQLDataNode.init(MySQLDataNode.java:78)
at com.alibaba.cobar.CobarServer.startup(CobarServer.java:124)
at com.alibaba.cobar.CobarStartup.main(CobarStartup.java:36)
Caused by: java.lang.ArrayIndexOutOfBoundsException: 224
at com.alibaba.cobar.mysql.CharsetUtil.getCharset(CharsetUtil.java:134)
at com.alibaba.cobar.mysql.bio.MySQLChannel.handshake(MySQLChannel.java:329)
at com.alibaba.cobar.mysql.bio.MySQLChannel.access$000(MySQLChannel.java:66)
at com.alibaba.cobar.mysql.bio.MySQLChannel$1.call(MySQLChannel.java:180)
at com.alibaba.cobar.mysql.bio.MySQLChannel$1.call(MySQLChannel.java:176)
at java.util.concurrent.FutureTask.run(FutureTask.java:266)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)