1、mycat 简介
Mycat 是一个开源的分布式数据库系统,是由阿里开源Cobar演化而来,解决之前cobar存在的问题。比如:假死(cobar的前端使用NIO,后端采用阻塞模式并未实现NIO,一旦数据库当前线程池占用后,即便再简单的SQL,或者试图建立新链接,数据库都会无法响应。)、数据一致性?(一旦cobar假死之后,如果实现了cobar高可用,并配置了心跳检测。心跳检测失败后cobar会进行主从切换 ,这就导致cobar,认为数据库宕机了,切换其他节点进行数据库操作,但实际上只是因为数据库阻塞。这就可能多个节点数据库都在进行写操作,从而严重影响数据库的数据的一致性。)等等一系列的问题。 mycat实现了 MySQL 协议的的Server,前端用户可以把它看作是一个数据库代理,用 MySQL 客户端工具和命令行访问,而其后端可以用MySQL 原生(Native)协议与多个 MySQL 服务器通信,也可以用 JDBC 协议与大多数主流数据库服务器通信,其核心功能是分表分库。
简单的说,MyCAT就是:
1、一个彻底开源的,面向企业应用开发的“大数据库集群”
2、支持事务、ACID、可以替代Mysql的加强版数据库
3、一个融合内存缓存技术、Nosql技术、HDFS大数据的新型SQL Server
4、结合传统数据库和新型分布式数据仓库的新一代企业级数据库产品
5、一个新颖的数据库中间件产品
2、原理
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
3、准备
本次测试在ubuntu环境下,打算使用四个数据库,做两个分片,并且每个分片上实现读写分离,所有需要四个数据库。
我们本机启动一个postgresql数据库,推荐大家使用docker官方安装三个postgresql的镜像,比较简单,也不怕出错。安装 docker。并执行一下两条命令:
1、docker pull postgres
2、docker run --name postgres -e POSTGRES_PASSWORD=123456 -p 54321:5432 \ -v /etc/data/pgdata:/var/lib/postgresql/data-d postgres
3、 启动以上的四个数据库。
到此准备工作已经ok。注意在步骤2中修改密码,主机映射地址。
4|、开始
1、在mycat的conf目录下修改server.xml; 这里是配置访问分布式数据库统一的数据库、用户名、密码。当然也可以配置权限。步骤4里面所有的配置的意义以及更多意义更多配置方式请参考mycat 官网权威指南
<user name="postgresmycat">
<property name="password">postgresmycat</property>
<property name="schemas">postgresmycats</property>
</user>
2、在mycat的从conf目录下修改schema.xml;这里主要是进行分片,暂时不考虑主从复制,只是做了分布式和读写分离。这一块很庞杂,比如全局表、E-R关系分片等。都是围绕分片展开。另外本次测试数据库id并不是自增的。修改至如下:其中配置细节请参考官网权威指南
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/"><!-- 自动取模分片 -->
<schema name="postgresmycats" checkSQLschema="false" sqlMaxLimit="100">
<!-- primarykey="id" autoIncrement="true" -->
<table name="tb_user" dataNode="mydn3,mydn4" rule="sharding-by-murmur" primaryKey="id" />
<table name="tb_student" dataNode="mydn3,mydn4" rule="user-mod-long" /><!-- 全局表 -->
<!-- <table name="province" type="global" dataNode="mydn3,mydn4" /> -->
<!-- E-R关系分片
<table name="customer" dataNode="dn1,dn2,dn3" rule="auto-sharding-long-customer">
<childTable name="orders" joinKey="customer_id" parentKey="id"/>
</table> --></schema>
<dataNode name="mydn3" dataHost="myhost3" database="IIOSS_IoT"/>
<dataNode name="mydn4" dataHost="myhost4" database="IIOSS_IoT"/>
<dataHost name="myhost3" maxCon="100" minCon="10" balance="3" writeType="0" dbType="postgresql"
dbDriver="jdbc" slaveThreshold="100" switchType="1">
<heartbeat>select user</heartbeat><!-- 注意这里的心跳检测命令跟mysql的有点不同 -->
<writeHost host="hostM3" url="jdbc:postgresql://localhost:54321/IIOSS_IoT" user="postgres" password="123456">
<readHost host="hostS3" url="jdbc:postgresql://localhost:5432/IIOSS_IoT" user="postgres" password="123456"/>
</writeHost>
</dataHost>
<dataHost name="myhost4" maxCon="100" minCon="10" balance="3" writeType="0" dbType="postgresql" dbDriver="jdbc"slaveThreshold="100" switchType="1">
<heartbeat>select user</heartbeat>
<writeHost host="hostM4" url="jdbc:postgresql://192.168.0.112:5432/IIOSS_IoT" user="postgres" password="123123">
<readHost host="hostS4" url="jdbc:postgresql://192.168.0.122:5432/IIOSS_IoT" user="postgres" password="123123"/>
</writeHost>
</dataHost></mycat:schema>
3、设置分片规则,修改mycat的conf目录下的rule.xml,添加如下内容:
<tableRule name="user-mod-long">
<rule>
<columns>id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
<tableRule name="student-mod-long">
<rule>
<columns>user_id</columns>
<algorithm>mod-long</algorithm>
</rule>
</tableRule>
4、启动mycat,进行测试,mycat配置后的完整实例。测试代码springboot做的简单测试代码,下载,运行,其实就是给数据库insert,之后我们分别在配置的各个数据库中查看,会发现数据取余分散在这些数据库中。
5、 也可以省略4步骤,使用命令插入数据,根据1步骤中配置的mycat连接方式:mysql -upostgresmycat -ppostgresmycat -h127.0.0.1 -P8066