首先说下,因为本身不怎么推荐中间件,所以我对这东西也只是了解,业内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吧不能实现分片,只能实现读写分离,简单的逻辑在业务里控制和在中间件没什么区别,复杂逻辑中间件也控制不了,反正不推荐中间件