mycat介绍
MYCAT基于阿里开源的Cobar产品而研发的一个数据库中间件。使用NIO重构了网络模块,优化了Buffer内核,增强了聚合,Join等基本特性,同时兼容绝大多数数据库成为通用的数据库中间件。
mycat解决的问题
1.性能问题
应用发送sql语句会首先发送到Mycat上,再根据某中路由规则发送到不同数据库里面
2.数据库连接过多问题
在传统的数据库连接中需要应用于数据库直连,会造成过多的连接
使用mycat后,应用只需要与mycat连接,相当于mycat提供了一个中间层
mycat的安装
mycat资源已经托管在github上,可直接下载,建议下载1.5及以上版本 https://github.com/MyCATApache/Mycat-download
由于mycat是由纯Java实现,因此在运行之前需要Java运行环境。需要jdk 1.7 及以上版本支持,Java运行环境安装请参阅其他资料。
下载完成后解压缩即可。
mycat文件结构:解压缩后可看到如下目录
bin目录存放mycat的启动脚本
conf目录存放配置文件信息,后续章节会详细介绍
lib目录存放mycat运行依赖包
logs目录存放mycat运行日志文件,后续章节会详细介绍
mycat读写分离
读写分离利用的是mysql的主从复制。事务性的查询无法分离出去(会导致数据不一致),这样会导致无法做到真正的读写分离,因为有些场景可能大部分都是事物性的读。可以使用 galera for mysql 强一致性解决方案(在mycat 1.5以上版本已支持)
在conf目录下找到schema.xml 配置逻辑库TESTDB如下。假设有5个表分别是customer、product、order、order_detail和payment表
在schema.xml中
配置数据库表
配置数据节点dataNode
配置dataHost
在server.xml中
配置读写主机server
配置文件解释:
一、<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" >
这里TESTDB 就是我们对外声称的我们有数据库的名称,必须和server.xml中的用户指定的数据库名称一致
二、<dataNode name="dn1" dataHost="testdb_host" database="test" />
这里只需要改database的名字 test就是真实数据库服务上的数据库名 .
根据你自己的数据库名进行修改
三、<dataHost name="testdb_host" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
这里需要配置的有三个地方balance、writeType与switchType
1.balance属于负载均衡类型,目前有四种
a) balance=’0’ 表示不开启读写分离机制,所有的读操作都发送到可用的writeHost上
b) balance=’1’ 表示全部的readHost与stand by writeHost参与select语句的负载均衡。即假如当双主双从模式(M1 ->S1 , M2->S2,并且 M1 与 M2 互为主备),正常情况下M2,S1,S2 都参与 select 语句的负载均衡。
c) balance=’2’ 表示所有的读操作都随机在readHost和writeHost上分发。
d) balance=’3’ 表示所有的读操作请求都分发到wirteHost对应的readHost上执行。writeHost不承担读压力。(此选项只支持1.4及以后的版本)
2.writeType属性
a) writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
b) writeType="1",所有写操作都随机的发送到配置的 writeHost。
c) writeType="2",目前版本还没实现。
3.switchType属性
-1:表示不启用主从切换;
1:为默认值,自动切换;
2:基于主从同步的状态,决定是否切换;
3:基于多住galary集群切换均可配置多个读写库
四、<writeHost host="hostM1" url="127.0.0.1:3306" user="root" password="root">
<readHost host="hostS1" url="127.0.0.1:3307" user="user" password="user" />
这里是配置的我们的两台读写服务器IP地址访问端口和访问用户的用户名和密码