Mycat简介
Mycat是一个数据库中间件,前身是阿里的cobar。
Mycat功能
读写分离
从机可以单独做写操作,可以删除库表,因为从机有root用户,root用户有写权限,所以可以,如果要让从机不能写,只需要赋予用户读的权限即可。
如果要用Java做读写分离,则需要配置两个数据源。
配完数据源之后,当要执行与数据库相关的操作时,还需要做判断,如果是要做C、U、D这些写操作,则需要发给主机的数据库,如果是R这种读操作,则需要发给从机的数据库。
一旦主机挂了、或者做切换的时候换别的机器了,则需要更改配置信息,而想要配置信息生效,则必须重启服务器,但是放到公网上的程序,尽量不要重启,保证7*24小时运行,所以这种方式不行!
在未分离的这种架构上,加一个数据库中间件Mycat,Java这边不需要关心Mycat后面有几个数据库,哪个是读,哪个是写,Java这边只配Mycat一个数据源,相当于把Mycat看成了一个数据库,至于Mycat后面有几个数据库、哪个是读、哪个是写、数据分片等操作都是Mycat的工作,这样还实现了Java与数据库的解耦。
数据分片
垂直+水平拆分
为了缓解数据库的压力,通常都会将数据库分散到多台机器,一张表拆分成多个表放到多台机器上。
多数据源整合
像Oracle、DB2这种关系型数据库都可以连接,甚至NoSQL数据库Redis也可以。
Mycat原理
拦截
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的 SQL 语句,首先对 SQL 语句做了
一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此 SQL 发往后端的真实数据库,
并将返回的结果做适当的处理,最终再返回给用户
export JAVA_HOME=/usr/local/jdk/jdk1.8.0_221
export CLASSPATH=$:CLASSPATH:$JAVA_HOME/lib/
export PATH=$PATH:$JAVA_HOME/bin
Mycat安装、启动
1. 先检查Linux下是否安装了jdk环境,使用java -version
确认,没安装需要先安装,否则最后在控制台环境无法启动。
-
将准备好的压缩文件放到
/opt
目录下,解压,然后复制到usr/local
目录下# 先解压 tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz # 后复制 cp -r mycat /usr/local/
-
修改
server.xml
,它负责定义用户以及系统相关变量,如端口等.vim /usr/local/mycat/conf/server.xml
-
修改
schema.xml
,它负责定义逻辑库,表,分片节点等内容vim /usr/local/mycat/conf/schema.xml
可以使用该模板替换原内容
<?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://io.mycat/"> <!--逻辑库 name名称, checkSQLschema sqlMaxLimit 末尾是否要加 limit xxx--> <schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"> </schema> <!--逻辑库 name名称, dataHost 引用的哪个dataHost database:对应mysql的database--> <dataNode name="dn1" dataHost="host1" database="mydb_indi" /> <dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100"> <heartbeat>select user()</heartbeat> <!-- 主机的url、user、password --> <writeHost host="hostM1" url="192.168.2.229:3306" user="root" password="123456"> <!-- 从机的url、user、password --> <readHost host="hostS1" url="192.168.2.190:3306" user="root" password="123456" /> </writeHost> </dataHost> </mycat:schema>
-
验证主从数据库访问情况
# 直接在从机上验证 # 验证主机 mysql -uroot -p123456 -h 192.168.2.229 -P 3306 # 验证从机 mysql -uroot -p123456 -h 192.168.2.130 -P 3306
-
启动
cd /usr/local/mycat/bin # 控制台启动 ./mycat console # 后台启动 ./mycat start # 停止 ./mycat s
-
成功
登录
mysql -umycat -p123456 -h192.168.2.190 -P 8066
读写分离
balance
负载均衡类型,目前的取值有4 种:
- balance=“0”, 不开启读写分离机制,所有读操作都发送到当前可用的 writeHost 上。
- balance=“1”,全部的 readHost 与 stand by writeHost 参与 select 语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且 M1 与 M2 互为主备),正常情况下,M2,S1,S2 都参与 select 语句的负载均衡。
- balance=“2”,所有读操作都随机的在 writeHost、readhost 上分发。
- balance=“3”,所有读请求随机的分发到 readhost 执行,writerHost 不负担读压力
生产环境通常使用使用1或3
测试
-
创建表
create table t_replica ( id int auto_increment , name varchar(200) );
-
修改
schema.xml
,将balance
改为2 -
往两个表中插入
insert into t_replica(name) values (@@hostname)
-
成功出现了
balance
为2的动态效果