MyCat中间件:读写分离(转)
利用MyCat中间件实现读写分离
需要两步:
1、搭建MySQL主从复制环境
2、配置MyCat读写分离策略
一、搭建MySQL主从环境
参考上一篇博文:MySQL系列之七:主从复制
二、配置MyCat读写分离策略
本篇只讨论MyCat读写分离,有关的配置文件schema.xml 和 server.xml(暂且不谈分库分表、性能优化)。
1、schema.xml文件
MyCat作为中间件,它只是一个代理,本身并不进行数据存储,需要连接后端的MySQL物理服务器,此文件就是用来连接MySQL服务器的!~(当然分库分表策略、分片节点也在此文件中,暂且不谈)
先看一个完整配置的例子:【请注意修改自己的MySQL连接信息】
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">
<!-- 自动取模分片 -->
<table name="t_person" dataNode="dn1,dn2,dn3" rule="mod-long" />
<!-- 一致性hash分片,分片列不要使用MySQL原生函数 -->
<table name="t_user" primaryKey="id" dataNode="dn1,dn2" rule="sharding-by-murmur" />
<!-- 全局表 -->
<table name="province" type="global" dataNode="dn1,dn2,dn3" />
<!-- E-R关系分片 -->
<table name="customer" dataNode="dn1,dn2,dn3" rule="auto-sharding-long-customer">
<childTable name="orders" joinKey="customer_id" parentKey="id"/>
</table>
<!-- E-R关系分片,多表 -->
<table name="user" primaryKey="id" dataNode="dn1,dn2" rule="mod-long-test">
<childTable name="cell" joinKey="user_id" parentKey="id"/>
<childTable name="note" joinKey="user_id" parentKey="id"/>
<childTable name="lit" joinKey="user_id" parentKey="id"/>
<childTable name="lit_usr" joinKey="user_id" parentKey="id"/>
</table>
</schema>
<!-- 分片节点信息 -->
<dataNode name="dn1" dataHost="localhost1" database="db1" />
<dataNode name="dn2" dataHost="localhost1" database="db2" />
<dataNode name="dn3" dataHost="localhost1" database="db3" />
<!-- 本篇重点来了 !!! -->
<!-- 连接MySQL的信息 && 读写分离策略 -->
<dataHost name="localhost1" maxCon="500" minCon="100" balance="0"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>select user();</heartbeat>
<writeHost host="hostM1" url="localhost:3306" user="root" password="abcdef">
<readHost host="hostS1" url="localhost:3306" user="root" password="123456" />
</writeHost>
</dataHost>
</mycat:schema>
此处有三点需要注意:
balance=”1”,writeType=”0” ,switchType=”1”
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", 所有读请求随机的分发到 wiriterHost 对应的 readhost 执行,writerHost 不负担读压力,注意 balance=3 只在 1.4 及其以后版本有, 1.3 没有。
writeType 属性,负载均衡类型,目前的取值有 3 种:
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
writeType="1",所有写操作都随机的发送到配置的 writeHost。
writeType="2",没实现。
switchType 属性
-1 表示不自动切换
1 默认值,自动切换
2 基于MySQL 主从同步的状态决定是否切换
以上为最简单的配置,一主一从结构。
MyCat支持双主多从,配置两个writeHost兄弟节点,多个readHost节点即可,请自行摸索。
也可以有多台MySQL服务器,或者SQL Server、Oracle等,配置多个dataHost节点就可以~
2、server.xml文件
此文件其实跟读写分离策略关系不大,但是需要用此文件来配置连接MyCat的用户及权限等,因此在这里简单说明。
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mycat:server SYSTEM "server.dtd">
<mycat:server xmlns:mycat="http://io.mycat/">
<system>
<!-- SQL解析器 -->
<property name="defaultSqlParser">druidparser</property>
</system>
<user name="root">
<property name="password">123456</property>
<property name="schemas">mycatdb</property>
</user>
<user name="mycat">
<property name="password">mycat</property>
<property name="schemas">mycatdb</property>
</user>
<user name="user">
<property name="password">user</property>
<property name="schemas">mycatdb</property>
<property name="readOnly">true</property>
</user>
</mycat:server>
以上配置文件启动MyCat服务,查看8066端口:
[root@dras-test conf]# lsof -i:8066
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
java 48021 root 122u IPv6 9441156 0t0 TCP *:8066 (LISTEN)
说明mycat成功启动!
使用MySQL客户端,或者使用如下命令行即可连接MyCat:
# mysql -uroot -p123456 -h127.0.0.1 -P8066 -Dmycatdb
三、验证
1、主从复制验证
master端:
mysql> create database db1;
Query OK, 1 row affected (0.00 sec)
mysql> create database db2;
Query OK, 1 row affected (0.00 sec)
mysql> create database db3;
Query OK, 1 row affected (0.00 sec)
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| db3 |
| mysql |
| performance_schema |
| sys |
+--------------------+
8 rows in set (0.00 sec)
slave端:
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| db1 |
| db2 |
| db3 |
| mysql |
| performance_schema |
| sys |
+--------------------+
8 rows in set (0.00 sec)
主从复制成功!
2、读写分离验证
我们在mycat中想t_person插入5条数据:
insert into t_person(id,name,uuid,lastime) values(1,'moxiao1',uuid(), now());
insert into t_person(id,name,uuid,lastime) values(2,'moxiao2',uuid(), now());
insert into t_person(id,name,uuid,lastime) values(3,'moxiao3',uuid(), now());
insert into t_person(id,name,uuid,lastime) values(4,'moxiao4',uuid(), now());
insert into t_person(id,name,uuid,lastime) values(5,'moxiao5',uuid(), now());
这里我们注意一点,因为t_person是按照id列进行分片,可以正常分片。
如果是按照uuid列进行分片,则在mycat里插入时uuid列不能直接使用mysql的原生函数,否则mycat直接把uuid()函数作为列值传入分片函数进行运算,导致值是一样的,从而不能达到分片的效果。
然后,因为balance=‘2’,读操作会随机在master和slave上进行,
所以为了测试,我在slave上再插入一条:
MySQL连接slave:
【注意:此条是在slave上插入,会导致slave上数据比master多一条。为了验证读写分离,实际环境不应该在slave进行写操作。】
insert into t_person(id,name,uuid,lastime) values(8,'moxiao8',uuid(), now());
然后连接mycat,进行查询,发现读时是随机到master和slave上的,
也就是说balance=‘2’读写分离成功了!
(当然也可以设置balance=‘1’,读操作只在readHost指定的mysql上进行。)
mysql> select * from t_person;
+----+---------+--------------------------------------+---------------------+
| id | name | uuid | lastime |
+----+---------+--------------------------------------+---------------------+
| 3 | Moxiao3 | Cf399053-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 2 | Moxiao2 | Bf399052-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 5 | Moxiao5 | Ef399055-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 8 | Moxiao8 | 22e7e8dc-23d4-11e7-9181-b8aeed3a0524 | 2017-04-18 09:12:42 |
| 1 | Moxiao1 | Af399051-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 4 | Moxiao4 | Df399054-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
+----+---------+--------------------------------------+---------------------+
6 rows in set (0.01 sec)
mysql> select * from t_person;
+----+---------+--------------------------------------+---------------------+
| id | name | uuid | lastime |
+----+---------+--------------------------------------+---------------------+
| 3 | Moxiao3 | Cf399053-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 1 | Moxiao1 | Af399051-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 4 | Moxiao4 | Df399054-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 2 | Moxiao2 | Bf399052-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
| 5 | Moxiao5 | Ef399055-20c2-11e7-a5ef-000c293fed8e | 2017-04-14 14:03:28 |
+----+---------+--------------------------------------+---------------------+
5 rows in set (0.01 sec)
OK, 尽情折腾吧!~
MyCat中间件:读写分离(转)的更多相关文章
- mycat(读写分离、负载均衡、主从切换)
博主本人平和谦逊,热爱学习,读者阅读过程中发现错误的地方,请帮忙指出,感激不尽 1.环境准备 1.1新增两台虚拟机 mycat01:192.168.247.81 mycat02:192.168.247 ...
- 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. Mycat实现读写分离的部署: https://www.cnblogs.com/softidea/p/5447566.html springboot动态数据源的原理以及配置: Spring内置了 ...
- MySQL - MyCat 实现读写分离
前言 MyCat是一个彻底开源的,面向企业应用开发的大数据库集群,支持事务.ACID.可以替代MySQL的加强版数据库.其功能有可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群.融 ...
- Mycat分布式数据库架构解决方案--Mycat实现读写分离
echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! 安装完 ...
- mycat 实现读写分离
mycat 实现读写分离 配置mysql实现主从复制 安装jdk 安装mycat实现读写分离 tar zxf Mycat-server-1.6-RELEASE-20161028204710-sangn ...
- springboot2.0+mycat实验读写分离
声明:用户到达一定程度,架构就必须要考虑,因为在这个前提下,读写分离,尤为重要. 1.搭建mysql主从复制 https://www.cnblogs.com/ywjfx/p/10264383.html ...
- SpringBoot 整合 MyCat 实现读写分离
MyCat一个彻底开源的,面向企业应用开发的大数据库集群.基于阿里开源的Cobar产品而研发.能满足数据库数据大量存储:提高了查询性能.文章介绍如何实现MyCat连接MySQL实现主从分离,并集成Sp ...
- MySQL主从复制 + Mycat实现读写分离
说明:两台MySQL服务器都是使用CentOS6.5系统,MySQL版本为mysql-5.7.17 MySQL一主一被实现主从复制 注意:写包括insert,delete,update 操作:读只有s ...
- 基于Mycat实现读写分离
随着应用的访问量并发量的增加,应用读写分离是很有必要的.当然应用要实现读写分离,首先数据库层要先做到主从配置,本人前一篇文章介绍了mysql数据库的主从配置方式即:<mysql数据库主从配置&g ...
随机推荐
- Vue 全局过滤和局部过滤
局部过滤器(放在组件里) filters: { //局部过滤器 FormattingMoney:value=>{ return value==null? '0' : value/100 } }, ...
- 【Django】ORM操作#2
目录 必知必会的13条查询方法 单表查询之神奇的双下划线 一对多 ForeignKey 多对多 ManyToManyField 在Python脚本中调用Django环境 Django终端打印SQL语句 ...
- 36Kr众筹项目比呀比biyabi,调查分析研究报告,背后资方势力的关系梳理
36Kr众筹项目比呀比biyabi调查报告 个层次的评价. 变革家-比呀比拆解报告:http://biangejia.com/archives/12653 8.其它 没有通过微信,参加路演,有点遗 ...
- [Python] Read and Parse Files in Python
This lesson will teach you how to read the contents of an external file from Python. You will also l ...
- CSS 类、伪类和伪元素差别具体解释
CSS中的类(class)是为了方便过滤(即选择)元素,以给这类元素加入样式,class是定义在HTML文档树中的. 可是这在一些情况下是不够用的,比方用户的交互动作(悬停.激活等)会导致元素状态发生 ...
- POJ 1006 Biorhythms (数论-中国剩余定理)
Biorhythms Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 111285 Accepted: 34638 Des ...
- php 图片局部打马赛克
php 图片局部打马赛克 原理: 对图片中选定区域的每一像素,添加若干宽度及高度,生成矩型.而每一像素的矩型重叠在一起.就形成了马赛克效果. 本例使用GD库的imagecolorat获取像素颜色,使用 ...
- Springboot优化
https://www.cnblogs.com/chen110xi/p/6198481.html
- pidof---查找指定名称的进程的进程号id号。
pidof命令用于查找指定名称的进程的进程号id号. 语法 pidof(选项)(参数) 选项 -s:仅返回一个进程号: -c:仅显示具有相同“root”目录的进程: -x:显示由脚本开启的进程: -o ...
- sleep---暂停指定的时间
sleep命令可以用来将目前动作延迟一段时间. 使用权限:所有使用者. 语法 sleep [--help] [--version] number[smhd] 参数说明: --help : 显示辅助讯息 ...