Mycat读写分离
Mycat 是一个开源的数据库系统,但是由于真正的数据库需要存储引擎,而 Mycat 并没有存 储引擎,所以并不是完全意义的数据库系统。 那么 Mycat 是什么?Mycat 是数据库中间件,就是介于数据库与应用之间,进行数据处理与交互的中间服务。
MyCAT 是使用 JAVA 语言进行编写开发,使用前需要先安装 JAVA 运行环境(JRE),由于 MyCAT 中使用了 JDK7 中的一些特性,所以要求必须在 JDK7 以上的版本上运行。
环境部署(Java环境)
1、官网下载JDK
2、解压文件
[root@mycat ~]# tar -xf jdk-8u181-linux-x64.tar.gz -C /usr/local/ #解压java软件工具包
[root@mycat ~]# ln -s /usr/local/jdk1.8.0_91/ /usr/local/java #创建软连接路径
3、配置环境变量
[root@mycat ~]# cat >> /etc/profile<<EOF
>JAVA_HOME=/usr/local/java
>PATH=$JAVA_HOME/bin:$PATH
>export JAVA_HOME PATH
>EOF enter键
#通过cat命令在配置文件中插入三行
[root@mycat ~]# source /etc/profile #使环境变量生效
4、查询安装结果
[root@mycat ~]# java -version #查询到版本,说明jdk安装成功
部署Mycat
下载文件
下载mycat,官网下载 http://www.mycat.org.cn/
解压安装包
[root@mycat ~]# tar xf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz -C /usr/local/
[root@mycat ~]# ls /usr/local/mycat #检查解压是否成功
配置Mycat
认识配置文件
MyCAT 目前主要通过配置文件的方式来定义逻辑库和相关配置:
- /usr/local/mycat/conf/server.xml 定义用户以及系统相关变量,如端口等。其中用户信息是前端应用程序连接 mycat 的用户信息。
- /usr/local/mycat/conf/schema.xml 定义逻辑库,表、分片节点等内容。
配置mycat前端(配置文件server.xml)
以下为代码片段
下面的用户和密码是应用程序连接到 MyCat 使用的,可以自定义配置。而其中的schemas 配置项所对应的值是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。
[root@mycat ~]# vim /usr/local/mycat/conf/server.xml
<!--下面的用户和密码是应用程序连接到 MyCat 使用的.schemas 配置项所对应的值是逻辑数据库的名字,这个名字需要和后面 schema.xml 文件中配置的一致。-->
<user name="love" defaultAccount="true"> #love用户为前端使用的账户名,可以自定义设置
<property name="password">123456</property> #数字123456是用户love的密码,也是自定义
<property name="schemas">ddbb</property> #schemas 配置项所对应的testdb是逻辑数据库的名字,也可以自定义,但是这个名字需要和后面 schema.xml 文件中配置的一致。
<!-- 表级 DML 权限设置 -->
<!--
<privileges check="false">
<schema name="TESTDB" dml="0110" >
<table name="tb01" dml="0000"></table>
<table name="tb02" dml="1111"></table>
</schema>
</privileges>
-->
</user>
配置mycat后端(配置文件schema.xml)
先备份配置文件
[root@mycat ~]# cd /usr/local/mycat/conf && mkdir back && cp schema.xml back
然后编辑原文件
[root@mycat ~]# vim /usr/local/mycat/conf/schema.xml
属性介绍
balance 属性
负载均衡类型,目前的取值有 3 种:
- 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”, 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType 属性
负载均衡类型
- writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
- writeType=“1”,所有写操作都随机的发送到配置的 writeHost,1.5 以后废弃不推荐。
配置mysql集群
M-M-S-S 准备Mycat连接的用户及权限
双主双从架构
创建授权用户(在主库master上创建)
mysql > grant all on *.* to 'mycat'@'%' identified by 'Abcd@1234';
mysql > flush privileges;
在master1上创库创表
mysql>create database haha;
mysql>create table haha.t1 (id int);
启动mycat
[root@mycat ~]# /usr/local/mycat/bin/mycat start
Starting Mycat-server...
启动成功,否则就是配置Mycat后端语法错误。
#支持以下参数
start | restart |stop | status
[root@mycat ~]# netstat -nplt | grep java
tcp 0 0 127.0.0.1:32000 0.0.0.0:* LISTEN 3487/java
tcp6 0 0 :::1984 :::* LISTEN 3487/java
tcp6 0 0 :::8066 :::* LISTEN 3487/java
tcp6 0 0 :::59268 :::* LISTEN 3487/java
tcp6 0 0 :::9066 :::* LISTEN 3487/java
tcp6 0 0 :::44500 :::* LISTEN 3487/java
tcp6 0 0 127.0.0.1:31000 127.0.0.1:32000 ESTABLISHED 3487/java
#出现多个java进程且监听端口有8066则说明服务启动成功
友情提醒:如果修改完配置文件后mycat服务起不来,无法启动等问题,大概率配置文件修改出错,请回去修改配置文件,无法排错时就将备份的配置文件恢复,重新修改。
登录mycat
任选一台有mysql客户端的服务器,例如slave1
[root@slave1 ~]# mysql -hmycat -uroot -p123456 -P8066
mysql> show databases;
+----------+
| DATABASE |
+----------+
| haha |
+----------+
1 row in set (0.01 sec)
#这里看到的数据库haha是虚拟的,注意后方mysql群中应该创建该库
验证mycat代理结果
mycat使用后方数据库
mysql> select * from haha.t1;
mysql> insert into haha.t1 values(2);
在mysql集群(M-M-S-S)中能查到插入的数据,则说明mycat服务代理成功
验证读写分离策略
- 以balance=“3” writeType=“0”为例进行测试
balance=“3”, 所有读请求随机的分发到 writerHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有,1.3 没有。
writeType=“0”, 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准.
1、停止mysql集群(M-M-S-S)主从复制
在四台数据库中执行stop slave指令,停止主从复制
2、mycat虚拟数据库中创表
3、登录mycat
[root@slave1 ~]# mysql -hmycat -uroot -p123456 -P8066
mysql> uer ddbb;
mysql> show tables;
mysql> show tables;
mysql> show tables;
mysql> show tables;
#多次使用show tables命令查询表
在mycat中多次查询表,如果只能查到读库slave1、slave2创建的表test3、test4,则说明读写分离功能实现成功。