MyCAT实现MySQL的读写分离
在MySQL中间件出现之前,对于MySQL主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。
引入MySQL中间件能很好的对程序端和数据库进行解耦,这样,程序端只需关注数据库中间件的地址,而无需知晓底层数据库是如何提供服务。
作为当前炙手可热的MySQL中间件,MyCAT实现MySQL主从集群的读写分离自是应有之义,其配置也相当简单。
在这里,我用三个实例组成MySQL主从集群,来验证MyCAT的读写分离功能,其实,一主一从就可以满足,之所以用三个,是为了验证MyCAT的分片功能。
集群组成如下:
角色 主机名 主机IP
master mysql-server1 192.168.244.145
slave mysql-server2 192.168.244.146
slave mysql-server3 192.168.244.144
在这里,还是使用Travelrecord表进行测试。
首先编辑MyCAT的配置文件schema.xml,关于dataHost的配置信息如下:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="localhost:3306" user="root"password="123456"></writeHost><writeHost host="hostS1" url="192.168.244.146:3306" user="root"password="123456" /><writeHost host="hostS2" url="192.168.244.144:3306" user="root" password="123456" /> </dataHost>
这里面,有两个参数需要注意,balance和 switchType。
其中,balance指的负载均衡类型,目前的取值有4种:
1. balance="0", 不开启读写分离机制,所有读操作都发送到当前可用的writeHost上。
2. balance="1",全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。
3. balance="2",所有读操作都随机的在writeHost、readhost上分发。
4. balance="3",所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力
switchType指的是切换的模式,目前的取值也有4种:
1. switchType='-1' 表示不自动切换
2. switchType='1' 默认值,表示自动切换
3. switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
4. switchType='3'基于MySQL galary cluster的切换机制(适合集群)(1.4.1),心跳语句为 show status like 'wsrep%'。
因此,该配置文件中的balance="1"意味着作为stand by writeHost的hostS1和hostS2将参与select语句的负载均衡,这就实现了主从的读写分离,switchType='-1'意味着当主挂掉的时候,不进行自动切换,即hostS1和hostS2并不会被提升为主,仍只提供读的功能。这就避免了将数据写进slave的可能性,毕竟,单纯的MySQL主从集群并不允许将数据读进slave中,除非配置的是双master。
验证读写分离
下面来验证一下,
创建Travelrecord表
create table travelrecord (id bigint not null primary key,user_id varchar(100),traveldate DATE, fee decimal,days int);
插入数据
mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(1,@@hostname,20160101,100,10); Query OK, 1 row affected, 1 warning (0.02 sec)mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(5000001,@@hostname,20160102,100,10); Query OK, 1 row affected, 1 warning (0.01 sec)
在这里,用了一个取巧的方法,即对user_id插入了当前实例的主机名,这样可直观的观察读写是否分离以及MyCAT的分片功能。能这样做的原因在于我当前的MySQL版本-5.6.26默认是基于statement的复制,如果是基于row的复制,则这个方法将不可取。
查询数据
mysql> select * from travelrecord; +---------+---------------+------------+------+------+ | id | user_id | traveldate | fee | days | +---------+---------------+------------+------+------+ | 1 | mysql-server2 | 2016-01-01 | 100 | 10 | | 5000001 | mysql-server3 | 2016-01-02 | 100 | 10 | +---------+---------------+------------+------+------+ 2 rows in set (0.01 sec)mysql> select * from travelrecord; +---------+---------------+------------+------+------+ | id | user_id | traveldate | fee | days | +---------+---------------+------------+------+------+ | 5000001 | mysql-server3 | 2016-01-02 | 100 | 10 | | 1 | mysql-server2 | 2016-01-01 | 100 | 10 | +---------+---------------+------------+------+------+ 2 rows in set (0.02 sec)mysql> select * from travelrecord; +---------+---------------+------------+------+------+ | id | user_id | traveldate | fee | days | +---------+---------------+------------+------+------+ | 5000001 | mysql-server3 | 2016-01-02 | 100 | 10 | | 1 | mysql-server3 | 2016-01-01 | 100 | 10 | +---------+---------------+------------+------+------+ 2 rows in set (0.01 sec)mysql> select * from travelrecord; +---------+---------------+------------+------+------+ | id | user_id | traveldate | fee | days | +---------+---------------+------------+------+------+ | 5000001 | mysql-server3 | 2016-01-02 | 100 | 10 | | 1 | mysql-server3 | 2016-01-01 | 100 | 10 | +---------+---------------+------------+------+------+ 2 rows in set (0.01 sec)mysql> select * from travelrecord; +---------+---------------+------------+------+------+ | id | user_id | traveldate | fee | days | +---------+---------------+------------+------+------+ | 1 | mysql-server2 | 2016-01-01 | 100 | 10 | | 5000001 | mysql-server2 | 2016-01-02 | 100 | 10 | +---------+---------------+------------+------+------+
从上面的输出结果,可以得出以下两点:
一、该配置已实现读写分离,读出来的数据没有master节点的。
二、MyCAT的随机分发不是基于statement的,即一个select语句查询其中一个节点,另外一个select语句查询另外一个节点。它分发针对的是片的,同一个select语句的结果是有不同dataNode返回的。
不仅如此,从MyCAT日志中也可以获取读写分离的相关信息,当然,前提是MyCAT的日志级别是debug。日志相关信息如下:
验证mater挂了,slave还能提供读的功能
对于MySQL主从集群,我们的需求是master挂了,slave还能提供读的功能。
下面来测试一下
首先,人为的关闭主库
[root@mysql-server1 ~]# /etc/init.d/mysqld stop
登录MyCAT
[root@mysql-server1 ~]# mysql -utest -ptest -h127.0.0.1 -P8066 -DTESTDB
插入数据
mysql> insert into travelrecord(id,user_id,traveldate,fee,days) values(10000001,@@hostname,20160103,100,10); ERROR 1184 (HY000): Connection refused mysql> select * from travelrecord; +---------+---------------+------------+------+------+ | id | user_id | traveldate | fee | days | +---------+---------------+------------+------+------+ | 1 | mysql-server2 | 2016-01-01 | 100 | 10 | | 5000001 | mysql-server3 | 2016-01-02 | 100 | 10 | +---------+---------------+------------+------+------+ 2 rows in set (0.02 sec)
可见无法插入数据,但不影响读取数据。
至此,MyCAT实现MySQL的读写分离部署测试完毕。
总结:
1. 其实,刚开始配置的是readHost节点,配置如下:
<dataHost name="localhost1" maxCon="1000" minCon="10" balance="1"writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100"><heartbeat>select user()</heartbeat><!-- can have multi write hosts --><writeHost host="hostM1" url="localhost:3306" user="root"password="123456"><!-- can have multi read hosts --><readHost host="hostS1" url="192.168.244.146:3306" user="root" password="123456" /></writeHost> </dataHost>
但这种方式有个问题,即master挂了以后,slave也不能提供服务,而这违反了MySQL主从集群的初衷。
2. 如果开启了事务模式,即set autocommit=0,则事务内的读走的是master节点,而不是从节点。
转载于:https://www.cnblogs.com/ivictor/p/5131480.html
MyCAT实现MySQL的读写分离相关推荐
- Mycat原理详解,Mycat 实现 MySQL 的读写分离(Mysql主从复制)
文章目录 1 Mycat 介绍 2 Mycat 安装 2.1下载安装JDK 2.2下载安装mycat 2.3启动和连接 3 Mycat 主要配置文件说明 4 利用 Mycat 实现 MySQL 的读写 ...
- 利用mycat实现mysql数据库读写分离
1.这里是在mysql主从复制实现的基础上,利用mycat做读写分离,架构图如下: 2.Demo 2.1 在mysql master上创建数据库创建db1 2.2 在数据库db1创建表student ...
- 基于mycat的mysql_基于mycat实现mysql的读写分离
需要具备以下环境 1 mysql主从复制 2 jdk安装以及环境变量配置 以下为我的演示参考: 192.168.142.26 master- mysql 具备主从主从复制条件 192.168.142 ...
- Mycat - 实现数据库的读写分离与高可用
前言 开心一刻 上语文课,不小心睡着了,坐在边上的同桌突然叫醒了我,并小声说道:"读课文第三段".我立马起身大声读了起来.正在黑板写字的老师吓了一跳,老师郁闷的看着我,问道:&qu ...
- mycat定时向mysql存储数据_【实战演练】Linux操作系统20-MyCat实现Mysql数据库读写分离与自动切换...
#本文欢迎转载,转载请注明出处和作者. 理论部分,详见:繁星亮与鲍包包:[理论研究]业务系统高可用及负载均衡zhuanlan.zhihu.com 本篇主要实现"8.Mysql读写分离&qu ...
- Mysql数据读写分离(多实例配置)
目录 一.读写分离概述 二. 读写分离实施maxscale 1.环境准备 2.maxscale服务器配置 一.读写分离概述 使用读写分离的原因 数据库写入效率要低于读取效率 一般来说,数据读取频率高于 ...
- SpringBoot下MySQL的读写分离
首页 博客 专栏·视频 下载 论坛 问答 代码 直播 能力认证 高校 会员中心 收藏 动态 消息 创作中心 02-下篇-SpringBoot下MySQL的读写分离 dusuanyun 2018-07- ...
- mysql查询并设置高亮_Thinkphp3.2.3设置MySql主从读写分离后,简单调用主数据库查询
图/文:迷神 Thinkphp是一款不错的国产框架,使用范围广,应用也比较多.随着网站访问增大往往需要使用mysql主从同步功能,本身Thinkphp自带了主从读写分离的功能了. 但是我们经常有一个场 ...
- Amoeba实现mysql主从读写分离
Amoeba实现mysql主从读写分离 这段在网上看了下关于amoeba的文章,总体感觉好像要比mysql-proxy好的多,也参考了不少的资料,此文章可能与其他文章作者会有雷同的地方,请谅解,但是此 ...
- Centos7源码安装mysql及读写分离,互为主从
Linux服务器 -源码安装mysql 及读写分离,互为主从 一.环境介绍: Linux版本: CentOS 7 64位 mysq版本: mysql-5.6.26 这是我安装时所使用的版本, ...
最新文章
- jQuery判断当前元素显示状态并控制元素的显示与隐藏
- 郑捷《机器学习算法原理与编程实践》学习笔记(第七章 预测技术与哲学)7.1 线性系统的预测...
- 杭电1000 A + B Problem
- 共享一个简单的 Javacript Helper library
- Virtualbox安装增强工具失败
- phpStudy下载安装+配置站点+You don't have permission to access / on this server错误解决
- [转]非模态对话框的特点与使用
- 7.Swoole的自定义协议功能的使用
- c语言可不可以不要.cpp文件,[求助]一个头文件和CPP文件的问题
- 罗技g402鼠标宏设置教程
- 网络安全实验七:防火墙实验
- 计算机应用u盘解释,U盘速度测试和参数解释
- ASA防火墙NAT发布失效
- stata最大值最小值命令_用Stata实现数据标准化
- ios 扫码枪外设 键盘模式_想把 iPad 当笔记本电脑用?可以试试这款外接键盘
- 挣值管理名词(EV、AC、PV等)与公式详解
- Layui动态渲染下拉框
- MPLS静态LSP部署
- Node.js中LTS和Current的两种版本有啥区别?
- 解密盛大和陈天桥:显娱乐帝国雏形 缺迪斯尼精神