基于Mycat实现读写分离
随着应用的访问量并发量的增加,应用读写分离是很有必要的。当然应用要实现读写分离,首先数据库层要先做到主从配置,本人前一篇文章介绍了mysql数据库的主从配置方式即:《mysql数据库主从配置》。
应用实现读写分离至少有两种方法:
- 应用本身通过代码实现,例如基于动态数据源、AOP的原理来实现写操作时用主数据库,读操作时用从数据库。
- 通过中间件的方式实现,例如通过Mycat,即中间件会分析对应的SQL,写操作时会连接主数据库,读操作时连接从数据库。
本篇文章是介绍通过Mycat中间件的方式实现读写分离。
1、Mycat
Mycat是一款开源的数据库中间件,其官网为http://www.mycat.io/,其中官方对它介绍为:
Mycat 是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的Mycat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。
Mycat的实现原理为:
Mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的SQL 语句,首先对SQL 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此SQL 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。
关于Mycat更多的介绍大家可以查看官网。
2、部署Mycat
应用是直接连接Mycat,然后Mycat管理了1个主数据库和1个从数据库,架构如下:

其中每个组件对应服务器地址为:
- Mycat:192.168.197.131
- 主库:192.168.197.135
- 从库:192.168.197.136
注意:对于mysql的主从配置方式请参考《mysql数据库主从配置》。
部署Mycat步骤为:
(1)、安装JDK,由于Mycat是基于Java语言来编写的,所以需要安装JDK,版本为1.8即可。
JDK安装包可以到官网下载,下载后解压,然后配置环境变量,即:
在/etc/profile文件中加入
export JAVA_HOME=/opt/jdk1.8.0_112
export PATH=$JAVA_HOME/bin:$PATH
(2)、下载Mycat安装包,版本为1.6-RELEASE,下载地址为http://dl.mycat.io/1.6-RELEASE/,选择linux环境的版本即可。
(3)、将Mycat安装包上传服务器后解压,即:
tar -zxvf Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
以上3步就相当于将Mycat部署好了,现在就需要配置Mycat了。
配置Mycat步骤为:
(1)、在主库和从库中分别创建用于Mycat连接的账号,即:
GRANT CREATE,DELETE,INSERT,SELECT,UPDATE ON jgyw.* TO 'jgywuser'@'192.168.197.131' IDENTIFIED BY 'jgyw@123';
以上语句的意思是创建一个jgywuser用户,该用户只有对jgyw模式下的表有增删改查的权限。
(2)、配置Mycat的schema.xml文件,该文件位于Mycat中conf文件夹下,配置如下:
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="TESTDB" checkSQLschema="false" sqlMaxLimit="100" dataNode="jgywnode">
</schema>
<dataNode name="jgywnode" dataHost="jgywhost" database="jgyw" />
<dataHost name="jgywhost" maxCon="1000" minCon="10" balance="3" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="192.168.197.135:3306" user="jgywuser" password="jgyw@123">
<readHost host="slave" url="192.168.197.136:3306" user="jgywuser" password="jgyw@123"/>
</writeHost>
</dataHost>
</mycat:schema>
其中:
schema 标签用于定义MyCat 实例中的逻辑库,MyCat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema 标签来划分这些不同的逻辑库。
dataNode 标签定义了MyCat 中的数据节点,也就是我们通常说所的数据分片。一个dataNode 标签就是一个独立的数据分片。
dataHost标签直接定义了具体的数据库实例、读写分离配置和心跳语句。其中有几个重要的属性:
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",所有读请求随机的分发到wiriterHost 对应的readhost 执行,writerHost 不负担读压
力,注意balance=3 只在1.4 及其以后版本有,1.3 没有。 writeType 属性
负载均衡类型,目前的取值有3 种:
writeType="0", 所有写操作发送到配置的第一个writeHost,第一个挂了切到还生存的第二个
writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType="1",所有写操作都随机的发送到配置的writeHost,1.5 以后废弃不推荐。
(3)、配置server.xml,即主要配置连接Mycat的用户账号信息,即:
<user name="jgyw">
<property name="password">jgyw</property>
<property name="schemas">TESTDB</property>
<property name="readOnly">false</property>
</user>
即配置一个用户名为jgyw,密码为jgyw的用户,同时具有TESTDB模式下的读写权限,注意该模式即是在schema.xml配置文件定义的模式名一样。
(4)、启动Mycat,即:
./mycat start
Mycat启动成功后,会开放两个端口,即数据端口8066,管理端口9066
3、测试
首先在主库的jgyw模式下创建一个comm_config表,即:
CREATE TABLE comm_config (configId varchar(200) NOT NULL ,configValue varchar(1024) DEFAULT NULL ,description varchar(2000) DEFAULT NULL ,PRIMARY KEY (configId)) ENGINE=InnoDB DEFAULT CHARSET=utf8 ;
应用的数据库连接配置信息为:
spring:
datasource:
url: jdbc:mysql://192.168.197.131:8066/TESTDB
username: jgyw
password: jgyw
driver-class-name: com.mysql.jdbc.Driver
用的是8066端口,同时用户也是server.xml配置文件中配置的用户。
测试的数据接口,即:
package com.swnote.common.controller;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RestController;
import com.swnote.common.domain.Config;
import com.swnote.common.service.IConfigService;
import lombok.extern.slf4j.Slf4j;
@Slf4j
@RestController
public class ConfigController {
@Autowired
private IConfigService configService;
@RequestMapping(value = "/config/save", method = RequestMethod.POST)
public Config save(@RequestBody Config config) throws Exception {
try {
configService.save(config);
return config;
} catch (Exception e) {
log.error("新增配置信息错误", e);
throw e;
}
}
@RequestMapping(value = "/config/list", method = RequestMethod.GET)
public List<Config> list() throws Exception {
try {
return configService.list();
} catch (Exception e) {
log.error("查询配置信息错误", e);
throw e;
}
}
}
进入Mycat的管理端,即:
mysql -h127.0.0.1 -ujgyw -pjgyw -P9066
然后执行命令:
show @@datasource;
可以查到:
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| DATANODE | NAME | TYPE | HOST | PORT | W/R | ACTIVE | IDLE | SIZE | EXECUTE | READ_LOAD | WRITE_LOAD |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
| jgywnode | master | mysql | 192.168.197.135 | 3306 | W | 0 | 10 | 1000 | 8959 | 0 | 42 |
| jgywnode | slave | mysql | 192.168.197.136 | 3306 | R | 0 | 10 | 1000 | 8937 | 22 | 0 |
+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+
2 rows in set (0.00 sec)
当调用读接口时READ_LOAD的值对应在slave上会加1说明是走从库;
当调用写接口时WRITE_LOAD的值对就在master上会加1说明是走主库。
关注我
以你最方便的方式关注我:
微信公众号:

基于Mycat实现读写分离的更多相关文章
- Mariadb 基于Mycat实现读写分离
环境:Mariadb主:192.168.200.129 Mariadb从:192.168.200.114 Mycat :192.168.200.112 (1) 安装jdk,先查看本机是 ...
- mysql主从之基于mycat实现读写分离
一 环境 1.1 结构 192.168.132.125 mycat 192.168.132.121 master 192.168.132.122 slave 主从已经配置完成 1.2 安装myca ...
- Mycat实现读写分离,主备热切换
实验环境:ubutu server 14 Master IP:172.16.34.212 Slave IP:172.16.34.34.156 Mycat server IP:172.16.34.219 ...
- mycat(读写分离、负载均衡、主从切换)
博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 1.环境准备 1.1新增两台虚拟机 mycat01:192.168.247.81 mycat02:192.168.247 ...
- SpringBoot 整合 MyCat 实现读写分离
MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量存储:提高了查询性能.文章介绍如何实现MyCat连接MySQL实现主从分离,并集成Sp ...
- Mycat的读写分离
1. Mycat实现读写分离的部署: https://www.cnblogs.com/softidea/p/5447566.html springboot动态数据源的原理以及配置: Spring内置了 ...
- 搭建基于MySQL的读写分离工具Amoeba
搭建基于MySQL的读写分离工具Amoeba: Amoeba工具是实现MySQL数据库读写分离的一个工具,前提是基于MySQL主从复制来实现的: 实验环境(虚拟机): 主机 角色 10.10.10.2 ...
- MySQL - MyCat 实现读写分离
前言 MyCat是一个彻底开源的,面向企业应用开发的大数据库集群,支持事务.ACID.可以替代MySQL的加强版数据库.其功能有可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群.融 ...
- Mycat分布式数据库架构解决方案--Mycat实现读写分离
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 安装完 ...
随机推荐
- Linux部署集群.NET网站
一.Linux下面安装需要软件 我们这里需要安装的软件有: 1) Mono 3.2.8 : C#跨平台编译器,能使.Net运行与Linux下,目前.net 4.0可以完美运行在该平台下 2) ngin ...
- [Java算法分析与设计]--顺序栈的实现
在程序的世界,栈的应用是相当广泛的.其后进先出的特性,我们可以应用到诸如计算.遍历.代码格式校对等各个方面.但是你知道栈的底层是怎么实现的吗?现在跟随本篇文章我们来一睹它的庐山真面目吧. 首先我们先定 ...
- Html5的表单元素
表单是HTML中获取用户输入的手段,,对于web应用系统及其重要,文字是不能说明问题的: 直接上代码把: <!DOCTYPE html><html lang="en&quo ...
- 学生管理系统_排序后通过name删除列表里的字典
l = [{'name': 'wangfan', 'age': 18, 'sex': 'nan'}, {'name': 'wangerfan', 'age': 10, 'sex': 'nan'}, { ...
- 页面标准文档流、浮动层、float属性(转)
CSS float 浮动属性介绍 float属性:定义元素朝哪个方向浮动. 1.页面标准文档流.浮动层.float属性 1.1 文档流 HTML页面的标准文档流(默认布局)是:从上到下,从左到右,遇块 ...
- Bagging与方差
在集成学习中,通常认为Bagging的主要作用是降低方差,而Boosting的主要作用是降低偏差.Boosting能降低偏差很好理解,因为其原理就是将多个弱学习器组合成强学习器.但Bagging为什么 ...
- php定时执行操作及ob_flush()与flush()的使用
版权声明:本文为博主原创文章,未经博主允许不得转载. http://blog.csdn.net/qq_38125058 一: 每隔30s执行一次,将字符串写入文件 // 30秒执行一次 ignore_ ...
- 设计模式的征途—22.中介者(Mediator)模式
我们都用过QQ,它有两种聊天方式:一是私聊,二是群聊.使用QQ群,一个用户就可以向多个用户发送相同的信息和文件,从而无需一一发送,节省大量时间.通过引入群的机制,极大地减少系统中用户之间的两两通信,用 ...
- 【转】java中equal与==的区别 其中有个缓冲区,需要注意
转自http://www.cnblogs.com/dolphin0520/p/3592500.html 在学Java时,可能会经常碰到下面的代码: 1 String str1 = new String ...
- ngnix 是什么
Nginx系列(一)--nginx是什么? 发表于2015/7/1 7:57:58 14347人阅读 分类: Nginx Java 一.介绍 Nginx是一个高性能的HTTP和反向代理服务器,也是一 ...