mycat是一个数据库中间件产品支持mysql集群,或者mariadb cluster,提供高可用性数据分片集群。你可以像使用mysql一样使用mycat。对于开发人员来说根本感觉不到mycat的存在。
mycat的主要功能:读写分离,分库分表。
mycat是中间件服务器,就是通过mycat来访问数据库而不是直接访问数据库。
JDK:要求jdk必须是1.7及以上版本
MySQL:推荐mysql是5.5以上版本
在网上下载Jdk和mycat的包。
[root@mycat ~]# tar zxf Jdk-8u131-linux-x64.tar.gz -C /usr/local/
[root@mycat /usr/local]# ln -s jdk1.8.0_131/ java
[root@mycat /usr/local]# vim /etc/profile
结尾添加
export JAVA_HOME=/usr/local/java
export CLASSPATH=.:$JAVA_HOME/lib/tools.jar:$JAVA_HOME/lib/dt.jar
export PATH=$JAVA_HOME/bin:$PATH
[root@mycat /usr/local]# . /etc/profile
校验:
[root@mycat /usr/local]# java -version
java version "1.8.0_131"
[root@mycat /usr/local]# ls $JAVA_HOME/lib/tools.jar
/usr/local/java/lib/tools.jar
[root@mycat /usr/local]# ls $JAVA_HOME/lib/dt.jar
/usr/local/java/lib/dt.jar
配置Java的环境变量。
配置mycat
[root@mycat ~]# tar zxf Mycat-server-1.6.tar.gz -C /usr/local/
[root@mycat /usr/local/mycat]# vim /etc/profile
export PATH=/usr/local/mycat/bin:$JAVA_HOME/bin:$PATH
添加环境变量
[root@mycat /usr/local/mycat]# . /etc/profile
[root@mycat ~]# echo $PATH
/usr/local/mycat/bin:/usr/local/java/bin:/usr/local/java/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
mycat的日志系统用的是log4j2
mycat的配置主要是修改两个配置文件:
1、server.xml
2、schema.xml
环境:
172.16.12.15 主从复制的从
172.16.12.50 主从复制的主
172.16.12.54 mycat
要做读写分离,从服务器做读,主服务器做写。
server.xml控制了mycat的用户名、密码及权限,分布式事务 等系统信息
schema.xml文件记录了逻辑库逻辑表,分片信息。
1、sevrver.xml
<user name="root">
<property name="password">000000</property>
<property name="schemas">qqfarm,db2</property>
</user>
root :用户名,访问mycat的用户。
password 密码
schmas,逻辑库,这个逻辑库是随便起的,但最好还是有点意义的,这个逻辑库一定要和schema.xml文件中的schema标签的名字能够匹配才行。
多个逻辑库之间用“,”逗号连接。
2、schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="qqfarm" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="db2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<dataNode name="dn1" dataHost="localhost1" database="qqfarm" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS" url="172.16.12.50:3306" user="root" password="000000">
<readHost host="hoseC" url="172.16.12.15:3306" user="root" password="000000" />
</writeHost>
<writeHost host="hostS" url="172.16.12.50:3306" user="root" password="000000">
<readHost host="hoseC" url="172.16.12.15:3306" user="root" password="000000" />
</writeHost>
</dataHost>
</mycat:schema>
A、schema标签
<schema name="qqfarm" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
schema,逻辑库,逻辑库和MySQL的database是一样的,在库下查询,查询2个库中 的表时要切换库。
一个mycat可以有多个逻辑库,没个逻辑库都有自己的属性信息。
如果不指定schema标签,name所有的表都会在同一个逻辑库中。
name属性,逻辑库的名字,要和server.xml文件的对应。
checkSQLschema 属性: 当该值为true时,例如我们执行语句
select * from qqfarm.company 。mycat会把语句修改为 select * from company 去掉qqfarm。
sqlMaxLimit 属性: 当该值设置为某个数值时,每条执行的sql语句,如果没有加上limit语句,Mycat会自动加上对应的值。不写的话,默认返回所有的值。
如果运行的schema为非拆分库的,那么该属性不会生效。需要自己sql语句加limit。
dataNode属性:指定了下边的dataNode 标签。
B、dataNode标签
<dataNode name="dn1" dataHost="localhost1" database="qqfarm" />
dataNode数据分片,这个标签是将具体的mysql数据库和分片绑定。
name属性:dataNode的名字。也是这个分片的唯一标识。
dataHost属性:数据库实例,对应下边的datahost标签。
database属性:数据库实例中真正存在的数据库。
C、datahost标签
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostS" url="172.16.12.50:3306" user="root" password="000000">
<readHost host="hoseC" url="172.16.12.15:3306" user="root" password="000000" />
</writeHost>
</dataHost>
这个标签有嵌套,里边包含了好多的数据库服务,每个服务中又有很多的database(将访问提供数据库服务的服务器简称为连接-连接也就是访问数据库的过程),每个连接都需要用户名和密码,就是我们直接访问数据库时要输入的用户名和密码,每一个连接就是一个数据库。
name属性:唯一标示dataHost标签,供上层使用
maxCon属性:指定每个读写实例连接池的最大连接。
minCon属性:指定每个读写实例连接池的最小连接,初始化连接池的大小
balance属性:负载均称类型
0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
1:全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1-S1,M2-S2 并且M1 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
2:所有读操作都随机的在writeHost、readHost上分发
3:所有读请求随机的分发到writeHst对应的readHost执行,writeHost不负担读写压力。(1.4之后版本有)
writeType属性:负载均衡类型
0:所有的写操作发送到配置的第一个writeHost,第一个挂了切换到第二个。切换记录在文件dnindex.properties
1:所有的鞋操作都随机的发送到配置的writeHost,1.5以后版本废弃不推荐。
dbType属性:数据类型
还有mongodb,oracle,spark等
dbDriver属性:
指定连接后段数据库使用的driver,目前可选的值有native和JDBC。
switchType属性:
-1不自动切换
1 默认值 自动切换
2 基于MySql主从同步的状态决定是否切换
心跳语句为 show slave status
3 基于mysql galary cluster 的切换机制(适合集群)1.4.1
心跳语句为 show status like ‘wsrep%’
heartbeat:心跳语句,每隔一段时间就执行一下,确定数据库是否连接
writeHost 和 readHost:
mycat一般搭在主从复制的上边,实现读写分离,写写在主库上,读,读取的是从库。
write就是主,read就是从。
mysql 主 从 授权用户:
mysql> grant all on qqfarm.* to root@'172.16.%' identified by '000000';
//让mycat能通过这个用户访问数据库
mysql> flush privileges;
启动mycat
[root@mycat ~]# mycat start
Starting Mycat-server...
[root@mycat ~]# mycat status
Mycat-server is running (1252).
测试读写分离:
首先开启通用查询日志。所有的操作都会被记录下来。
从上图可以看到。左边是主从复制的主,右边是主从复制的从。
创建一个表。两边都创建了。因为写入主时,从也在向主请求二进制日志,也就执行了创建表的操作。
然后查询它表,这个操作只有从有,主没有。
后边的添加操作,主上有,从服务器从主哪里获取了二进制文件然后执行的。
select user()是心跳语句,用来检验是否通畅的。