1. 机器环境
192.168.2.136   mycat1
192.168.2.134 mydb1
192.168.2.135 mydb2
2在mysql1、mysql2上安装mysql 更改root用户密码

安装mysql过程略

#两台服务器都要
use mysql
GRANT ALL PRIVILEGES ON *.* TO root@"%" IDENTIFIED BY "root123";
update user set Password = password('root123') where User='root';
GRANT replication slave , replication client ON *.* TO 'repl'@'%' identified by 'root123';
flush privileges;
3 配置mysql复制ip

mydb1 上:

mysql> show master status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000004 | 607 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.00 sec)

在mysql2:向主库做同步操作,开启复制

change master to master_host='192.168.2.134',
master_port=3306,
master_user='repl',
master_password='root123',
master_log_file='binlog.000004',
master_log_pos=607; start slave; show slave status\G

在mysql1创建测试库

create database db1;
create database db2;
create database db3; 可以看到已经 同步到 mysql2上

4 安装、配置mycat

安装mycat(见 上一篇 基本部署 ,略)
配置mycat
cd /usr/local/mycat/conf
vi schema.xml <?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/"> <schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="db2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<schema name="db3" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
</schema>
<dataNode name="dn1" dataHost="mysqlserver" database="db1" />
<dataNode name="dn2" dataHost="mysqlserver" database="db2" />
<dataNode name="dn3" dataHost="mysqlserver" database="db3" /> <!--######### TESTDB ########-->
<dataHost name="mysqlserver" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM1" url="192.168.2.134:3306" user="root" password="root123">
</writeHost> <writeHost host="hostS1" url="192.168.2.135:3306" user="root" password="root123">
</writeHost>
</dataHost>
</mycat:schema> #vi server.xml
<user name="root">
<property name="password">root123</property>
<property name="schemas">db1,db2,db3</property>
</user>

vi log4j.xml

  <root>
<level value="debug" />
<appender-ref ref="FILE" />
<!--<appender-ref ref="FILE" />-->
</root> </log4j:configuration>

几个关键配置的解释:

writeType="0" : 写操作只写入一个节点

balance=0,1,2,3 --负载均衡类型。

0:不开启读写分离机制,所有读操作都发送到当前可用的writeHost上
1:启用读写分离,全部的readHost与stand by writeHost参与select语句的负载均衡,简单的说,当双主双从模式
(M1->S1,M2->S2,并且M1与 M2互为主备),正常情况下,M2,S1,S2都参与select语句的负载均衡。 (常用配置);
2:所有读操作都随机的在writeHost、readhost上分发。
3:所有读请求随机的分发到wiriterHost对应的readhost执行,writerHost不负担读压力

switchType="-1,1,2,3" --是否启用主从切换

 -1:表示不启用主从切换;
1:为默认值,自动切换;
2:基于主从同步的状态,决定是否切换,与show slave status心跳对应;
3:基于多住galary集群切换,与show status like 'wsrep%'对应;

因此,该配置文件中的balance="1"意味着作为stand by writeHost的hostS1 将参与select语句的负载均衡,这就实现了主从的读写分离,switchType='-1'意味着当主挂掉的时候,不会进行切换,此时无法写入,但是可以查询

5 启动 mycat

[root@localhost conf]# mycat start

[root@localhost conf]# mycat status

[root@localhost conf]# tail -800  /usr/local/mycat/logs/wrapper.log

[root@localhost conf]# netstat -an|grep 9066



6.验证读写分离模式:

[root@mycat ~]#  mysql -uroot -proot123  -h192.168.2.136 -P8066

mysql> show databases;

#主库上设置复制模式为STATEMENT
set session binlog_format='STATEMENT'; #插入数据时带入主机名 这样可以很直观的看出读写分离,由于刚才改成了 statement模式,所以这个方法可行,但如果是默认的 row模式,则不可行 use db1;
create table users (id int not null primary key,hostname varchar(100) ,name varchar(100));
insert into users(id,hostname,name) values(1,@@hostname,'fish'); #查询mydb mysql> select * from users;

#查询mycat

mysql> select * from users;

对比可以看出,查询出来的 hostname 全是mydb2 说明目前读写分离了!!

当然也可以通过日志来查看



可以看到读取都是读的从库

7.验证自动切换的模式

# 修改 mycat 配置 switch_type=1
cd /usr/local/mycat/conf
vi schema.xml <?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/"> <schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<schema name="db2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
</schema>
<schema name="db3" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
</schema>
<dataNode name="dn1" dataHost="mysqlserver" database="db1" />
<dataNode name="dn2" dataHost="mysqlserver" database="db2" />
<dataNode name="dn3" dataHost="mysqlserver" database="db3" /> <!--######### TESTDB ########-->
<dataHost name="mysqlserver" maxCon="1000" minCon="10" balance="1"
writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
<heartbeat>show slave status</heartbeat>
<writeHost host="hostM1" url="192.168.2.134:3306" user="root" password="root123">
</writeHost>
<writeHost host="hostS1" url="192.168.2.135:3306" user="root" password="root123">
</writeHost>
</dataHost>
</mycat:schema> #重启 mycat #查看管理信息 检查心跳 [root@mycat ~]# mysql -uroot -proot123 -h192.168.2.136 -P9066 mysql> show @@heartbeat; mysql> show @@backend;

#关闭主库
[mysql@mydb1 ~]$ mysqladmin shutdown --socket=/MySQL/my3306/run/mysql.sock --port=3306

#通过检查心跳发现主库的RS_CODE=-1

#测试插入数据是否成功
mysql> insert into users(id,name) values(2,'fish2');

#查看日志



可以看到 已经切换到 mydb2上执行insert

#查询数据
mysql> select * from users where id =2 ;

#查看日志:
10/19 06:40:56.375 DEBUG [$_NIOREACTOR-0-RW] (PhysicalDBPool.java:452) -select read source
hostS1 for dataHost:mysqlserver
10/19 06:40:56.381 DEBUG [$_NIOREACTOR-0-RW] (NonBlockingSession.java:229) -release connection
MySQLConnection [id=14, lastTime=1508409656368, user=root, schema=db1, old shema=db1,
borrowed=true, fromSlaveDB=false, threadId=9, charset=utf8, txIsolation=3, autocommit=true,
attachment=dn1{select * from users where id =2}, respHandler=SingleNodeHandler [node=dn1{select
* from users where id =2}, packetId=6], host=192.168.2.135, port=3306, statusSync=null,
writeQueue=0, modifiedSQLExecuted=false]

#查看管理信息
mysql> show @@backend;

可以看到 自动切换已经成功 只剩下 mydb2

Mycat主从模式下的读写分离与自动切换的更多相关文章

  1. Mycat搭建负载均衡,读写分离的Mysql集群

    Mycat搭建负载均衡,读写分离的Mysql集群 准备环境 1.mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz 2.Mycat-server-1.6.7.4-te ...

  2. Mycat安装并实现mysql读写分离,分库分表

    Mycat安装并实现mysql读写分离,分库分表 一.安装Mycat 1.1 创建文件夹 1.2 下载 二.mycat具体配置 2.1 server.xml 2.2 schema.xml 2.3 se ...

  3. MyCat教程四:实现读写分离

    本文我们来给大家介绍下通过MyCat来实现MySQL的读写分离操作 MyCat读写分离 一.读写分离配置   前面我们已经介绍过了mysql的主从同步和mycat的安装及相关配置文件的介绍,现在我们来 ...

  4. Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  5. net Core 使用MyCat分布式数据库,实现读写分离

    net Core 使用MyCat分布式数据库,实现读写分离 目录索引 [无私分享:ASP.NET CORE 项目实战]目录索引 简介 MyCat2.0版本很快就发布了,关于MyCat的动态和一些问题, ...

  6. 黄聪:Mysql主从配置,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器扛,如此多的数据库连接操作,数据库必然会崩溃,数据丢 ...

  7. mysql数据库的主从同步,实现读写分离 g

    https://blog.csdn.net/qq_15092079/article/details/81672920 前言 1 分别在两台centos 7系统上安装mysql 5.7 2 master ...

  8. mycat 1.6.6.1安装以及配置docker 安装mysql 5.7.24 双主多从读写分离主主切换

    mycat和mysql的高可用参考如下两个图 简介:应用程序仅需要连接HAproxy或者mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 服务器 ...

  9. mysql数据库的主从同步,实现读写分离

    大型网站为了软解大量的并发访问,除了在网站实现分布式负载均衡,远远不够.到了数据业务层.数据访问层,如果还是传统的数据结构,或者只是单单靠一台服务器来处理如此多的数据库连接操作,数据库必然会崩溃,特别 ...

随机推荐

  1. Flask 的 数据库连接 与 DBUtils 数据库连接池

    Flask 的 数据库连接 与 DBUtils 数据库连接池 本地线程:thread_local 为每个线程创建存储数据的空间,用于线程之间的数据隔离 否则多个线程同时访问,会使得数据混乱 1 Fla ...

  2. 《Drools7.0.0.Final规则引擎教程》第4章 4.2 ruleflow-group&salience

    ruleflow-group 在使用规则流的时候要用到ruleflow-group属性,该属性的值为一个字符串,作用是将规则划分为一个个的组,然后在规则流当中通过使用ruleflow-group属性的 ...

  3. grep 常用正则匹配

    1.或操作 grep -E '123|abc' filename // 找出文件(filename)中包含123或者包含abc的行 egrep '123|abc' filename // 用egrep ...

  4. Unity3D开发之Matrix4x4矩阵变换

    在Unity开发中时常会用到Matrix4x4矩阵来变换场景中对象的位置.旋转和缩放.但是很多人都不太理解这儿Matrix4x4变换矩阵.通过DX中的变换矩阵我来讲一讲在unity中这个变换矩阵是怎么 ...

  5. mysql数据库( 基础篇加破解)

    1.数据库(Database,DB)是按照数据结构来组织.存储和管理数据的,并且是建立在计算机存储设备上的仓库 2.什么是数据库:(用来存储数据的仓库) 数据库:(cs架构套接字) 数据库管理软件分类 ...

  6. HDU - 233 Matrix

    原题地址:http://acm.hdu.edu.cn/showproblem.php?pid=5015 解题思路:一看到题目,感觉是杨辉三角形,然后用组合数学做,不过没想出来怎么做,后来看数据+递推思 ...

  7. HihoCoder1620: 股票价格3 (单调队列 or DP)

    股票价格3 时间限制:10000ms 单点时限:1000ms 内存限制:256MB 描述 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 小Hi想知道,对于第 ...

  8. CTF学习资料总结

    网络攻防大作业学习方向思路 一直对CTF比赛有参与的兴趣,但由于课程比较多,一直没有足够的时间系统的去了解与训练.所以我想利用接下来的几周时间对CTF比赛经行练习.并找到自己所擅长或感兴趣的方向深入研 ...

  9. spring源码学习之:项目公共配置项解决方案

    一:项目中有一些key,value的简单配置 org.apache.commons.configuration.DatabaseConfiguration可以轻松解决 二:配置项目的xml中bean ...

  10. Python reload() 函数

    reload(module) 作用: 用于重新载入之前载入的模块. module -- 模块对象.返回模块对象. 实例:  重新载入 sys 模块,并设置默认编码为 utf8 >>> ...