Mycat了解下

首先说下,因为本身不怎么推荐中间件,所以我对这东西也只是了解,业内mycat用的最好的应该顺风算一个,但是他们是做过二次开发的,咱菜鸡比不了,据说最近出来一个叫cetus的还不错,有空可以关注下

Ⅰ、Mycat安装走一走

这玩意就是一个jar包

cd /usr/local/src
yum install java-1.8.0-openjdk -y
wget http://dl.mycat.io/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz 
./mycat/bin/mycat start

默认启动8066端口,也就是说8066就是个中间件,它的通信协议就是mysql的,咱们是可以通过mysql的协议(用mysql的原生客户端)去访问的,也就是说直接连8066端口就行

连上去会发现Server version:是5.6.29,这不是说server是5.6.29,是指通信协议是5.6.29

和直接用mysql是一样的,这就是对业务透明,至于库里面的表是怎么分的,你并不知道

Ⅱ、Mycat配置

所有的配置文件都是xml,这是个不好的点,这个年代谁还用xml啊,改成json也好啊,而且是不持久化的,元数据不存在数据库中,是通过xml来存放的,比较差,吐槽一下

咱这里只看最重要的三个配置文件

2.1 server.xml——Mycat服务参数调整和用户授权的配置文件

配置mycat的账号密码

<user name="db_w">
		<property name="password">123456</property>
		<property name="schemas">db</property>
</user>   

<user name="db_r">
		<property name="password">123456</property>
		<property name="schemas">db</property>
		<property name="readOnly">true</property>
</user>

2.2 schema.xml——逻辑库定义和表以及分片定义的配置文件

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
	<schema name="db" checkSQLschema="false" sqlMaxLimit="100">
		<table name="whh" dataNode="dbdn$1-3" rule="mod-long-id" />
	</schema>
	
	<dataNode name="dbdn$1-3" dataHost="host_n127.0.0.1_3306" database="db_$1-3" />

	<dataHost name="host_n127.0.0.1_3306" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
		<heartbeat> select user() </heartbeat>
		<writeHost host="hostM" url="127.0.0.1:3306" user="root" password="123">
		</writeHost>
	</dataHost>
</mycat:schema>

这里我们把whh这张表分成三个分片放到3306这个实例的db_1、db_2、db_3三个库中

2.3 rule.xml——分片算法

<?xml version="1.0" encoding="UTF-8"?>
<!-- - - Licensed under the Apache License, Version 2.0 (the "License"); 
	- you may not use this file except in compliance with the License. - You 
	may obtain a copy of the License at - - http://www.apache.org/licenses/LICENSE-2.0 
	- - Unless required by applicable law or agreed to in writing, software - 
	distributed under the License is distributed on an "AS IS" BASIS, - WITHOUT 
	WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - See the 
	License for the specific language governing permissions and - limitations 
	under the License. -->
<!DOCTYPE mycat:rule SYSTEM "rule.dtd">
<mycat:rule xmlns:mycat="http://io.mycat/">
	<tableRule name="mod-long-id">
		<rule>
			<columns>a</columns>
			<algorithm>func1</algorithm>
		</rule>
	</tableRule>
...
<function name="func1" class="io.mycat.route.function.PartitionByLong">
		<property name="partitionCount">8</property>
		<property name="partitionLength">128</property>
	</function>

根据字段a来分片

2.4 验证一把

(db_w@127.0.0.1) [db]> explain select * from whh;
+-----------+-----------------------------+
| DATA_NODE | SQL                         |
+-----------+-----------------------------+
| dbdn1     | SELECT * FROM whh LIMIT 100 |
| dbdn2     | SELECT * FROM whh LIMIT 100 |
| dbdn3     | SELECT * FROM whh LIMIT 100 |
+-----------+-----------------------------+
3 rows in set (0.01 sec)

Ⅲ、题外话

复杂查询不要用中间件去实现,如果选出来的结果集有50g,这意味着什么?意味着中间件需要50g的内存来存数据,比如做个order by什么的捞出来到中间件的数据很大,你有这么大的内存吗?

其实中间件对你的限制还是很多的,Mycat可以尝试用一下,这是开源社区里比较靠谱的一个中间件,但是olap场景下数据量太大,千万别用中间件,很多表关联,估计mycat都不支持这种语句

唉,分布式数据库运维很麻烦,sharding-jdbc吧,基于jdbc驱动层来做的分库分表,只支持java,不推荐,太老了,proxy吧不能实现分片,只能实现读写分离,简单的逻辑在业务里控制和在中间件没什么区别,复杂逻辑中间件也控制不了,反正不推荐中间件

posted @ 2018-07-09 14:56  91洲际哥  阅读(507)  评论(0编辑  收藏  举报