使用

官网

mycat-server安装配置

  • 打开地址http://dl.mycat.io,下载对应版本的mycat-server安装文件,解压。修改配置server.xml,
  1. <!-- TESTDB为mycat对外提供的db名称,此db名称需与schema.xml中<schema name="TESTDB">对应 -->
  2. <user name="root">
  3. <property name="password">123456</property>
  4. <property name="schemas">TESTDB</property>
  5. </user>

schema.xml配置

<mycat:schema xmlns:mycat="http://io.mycat/">

        <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
        </schema>
        <!-- database为实体数据库中的数据库实例名 -->
        <dataNode name="dn1" dataHost="localhost1" database="testdb" />

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0"
                          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>

<!-- writeHost和readHost对应实体数据库连接的配置,以下配置是一个简单的读写分离, 数据库的主从配置需数据库自行配置 -->                
                <writeHost host="hostM1" url="localhost:3306" user="root"
                                   password="123456">
                        <readHost host="hostS2" url="localhost:13306" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>

配置完成后,执行mycat start,即可启动mycat服务。使用数据库工具连接8066端口,即可像使用普通mysql数据库一样使用mycat。

mycat-eye安装配置

  • 打开地址http://dl.mycat.io,下载对应版本的mycat-web安装文件,解压。修改配置mycat-web/mycat-web/WEB-INF/classes/mycat.properties,修改其中的zookeeper为自己的zookeeper服务地址。执行start.sh即可启动mycat-eye,登陆$SERVER_IP:8082/mycat,即可打开mycat-eye管理页面。
  • sql统计功能,需在mycat配置文件server.xml中开启sqlStat功能。

问题

  • 分库分表后,多个数据库中是允许存在相同的id的,如果业务不允许,需使用分布式全局唯一ID,或者使用id进行分片

分库分表问题

垂直拆分带来的问题:

  • 部分业务表无法join,只能通过接口方式,提高了系统复杂度
  • 存在单表性能瓶颈,不易扩展 1000w 10张表 1亿
  • 事务处理复杂

水平拆分带来的问题

  • 拆分规则难以抽象
  • 分片事务一致性难以解决
  • 维护难度变大
  • 跨库join性能差

共同问题

  • 分片规则和策略
  • 分布式全局唯一ID
  • 多数据源管理问题 多个datasource
  • 跨库跨表join问题
  • 跨节点合并排序分页问题
  • 事务复杂,带来了分布式事务问题
  • 数据管理难度加大,出问题不好定位

分库分表拆分原则

共同问题:

  • 能不拆分尽量不拆分
  • 如果要拆分一定要选择合适的拆分规则,提前规划好
  • 数据拆分尽量通过数据冗余或表分组来降低跨库join的问题
  • 跨库join是共同难题,所以业务读取尽量少使用多表join
  • 真的需要分库分表吗?