系统开发中,数据库是很是重要的一个点。除了程序的自己的优化,如:SQL语句优化、代码优化,数据库的处理自己优化也是很是重要的。主从、热备、分表分库等都是系统发展早晚会遇到的技术问题问题。Mycat是一个广受好评的数据库中间件,已经在不少产品上进行使用了。但愿经过这篇文章的介绍,能学会Mycat的使用。php
安装
Mycat官网:http://www.mycat.io/
能够了解下Mycat的背景和应用状况,这样使用起来比较有信心。html
Mycat下载地址:http://dl.mycat.io/
官网有个文档,属于详细的介绍,初次入门,看起来比较花时间。java
下载:
建议你们选择 1.6-RELEASE 版本,毕竟是比较稳定的版本。node
安装:
根据不一样的系统选择不一样的版本。包括linux、windows、mac,做者考虑仍是很是周全的,固然,也有源码版的。(ps:源码版的下载后,只要配置正确,就能够正常运行调试,这个赞一下。)mysql
Mycat的安装其实只要解压下载的目录就能够了,很是简单。
安装完成后,目录以下:linux
目录 | 说明 |
---|---|
bin | mycat命令,启动、重启、中止等 |
catlet | catlet为Mycat的一个扩展功能 |
conf | Mycat 配置信息,重点关注 |
lib | Mycat引用的jar包,Mycat是java开发的 |
logs | 日志文件,包括Mycat启动的日志和运行的日志。 |
配置
Mycat的配置文件都在conf目录里面,这里介绍几个经常使用的文件:sql
文件 | 说明 |
---|---|
server.xml | Mycat的配置文件,设置帐号、参数等 |
schema.xml | Mycat对应的物理数据库和数据库表的配置 |
rule.xml | Mycat分片(分库分表)规则 |
Mycat的架构其实很好理解,Mycat是代理,Mycat后面就是物理数据库。和Web服务器的Nginx相似。对于使用者来讲,访问的都是Mycat,不会接触到后端的数据库。
咱们如今作一个主从、读写分离,简单分表的示例。结构以下图:shell
服务器 | IP | 说明 |
---|---|---|
Mycat | 192.168.0.2 | mycat服务器,链接数据库时,链接此服务器 |
database1 | 192.168.0.3 | 物理数据库1,真正存储数据的数据库 |
database2 | 192.168.0.4 | 物理数据库2,真正存储数据的数据库 |
Mycat做为主数据库中间件,确定是与代码弱关联的,因此代码是不用修改的,使用Mycat后,链接数据库是不变的,默认端口是8066。链接方式和普通数据库同样,如:jdbc:mysql://192.168.0.2:8066/数据库
server.xmlwindows
示例
<user name="test"> <property name="password">test</property> <property name="schemas">lunch</property> <property name="readOnly">false</property> <!-- 表级 DML 权限设置 --> <!-- <privileges check="false"> <schema name="TESTDB" dml="0110" > <table name="tb01" dml="0000"></table> <table name="tb02" dml="1111"></table> </schema> </privileges> --> </user>
重点关注下面这段,其余默认便可。
参数 | 说明 |
---|---|
user | 用户配置节点 |
--name | 登陆的用户名,也就是链接Mycat的用户名 |
--password | 登陆的密码,也就是链接Mycat的密码 |
--schemas | 数据库名,这里会和schema.xml中的配置关联,多个用逗号分开,例如须要这个用户须要管理两个数据库db1,db2,则配置db1,dbs |
--privileges | 配置用户针对表的增删改查的权限,具体见文档吧 |
我这里配置了一个帐号test 密码也是test,针对数据库lunch,读写权限都有,没有针对表作任何特殊的权限。
schema.xml
schema.xml是最主要的配置项,首先看个人配置文件。
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!-- 数据库配置,与server.xml中的数据库对应 --> <schema name="lunch" checkSQLschema="false" sqlMaxLimit="100"> <table name="lunchmenu" dataNode="dn1" /> <table name="restaurant" dataNode="dn1" /> <table name="userlunch" dataNode="dn1" /> <table name="users" dataNode="dn1" /> <table name="dictionary" primaryKey="id"