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

安装mysql过程略

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

mydb1 上:

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

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

  1. change master to master_host='192.168.2.134',
  2. master_port=3306,
  3. master_user='repl',
  4. master_password='root123',
  5. master_log_file='binlog.000004',
  6. master_log_pos=607;
  7. start slave;
  8. show slave status\G

在mysql1创建测试库

  1. create database db1;
  2. create database db2;
  3. create database db3;
  4. 可以看到已经 同步到 mysql2

4 安装、配置mycat

安装mycat(见 上一篇 基本部署 ,略)
配置mycat
  1. cd /usr/local/mycat/conf
  2. vi schema.xml
  3. <?xml version="1.0"?>
  4. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  5. <mycat:schema xmlns:mycat="http://org.opencloudb/">
  6. <schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  7. </schema>
  8. <schema name="db2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
  9. </schema>
  10. <schema name="db3" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
  11. </schema>
  12. <dataNode name="dn1" dataHost="mysqlserver" database="db1" />
  13. <dataNode name="dn2" dataHost="mysqlserver" database="db2" />
  14. <dataNode name="dn3" dataHost="mysqlserver" database="db3" />
  15. <!--######### TESTDB ########-->
  16. <dataHost name="mysqlserver" maxCon="1000" minCon="10" balance="1"
  17. writeType="0" dbType="mysql" dbDriver="native" switchType="-1" slaveThreshold="100">
  18. <heartbeat>select user()</heartbeat>
  19. <writeHost host="hostM1" url="192.168.2.134:3306" user="root" password="root123">
  20. </writeHost>
  21. <writeHost host="hostS1" url="192.168.2.135:3306" user="root" password="root123">
  22. </writeHost>
  23. </dataHost>
  24. </mycat:schema>
  25. #vi server.xml
  26. <user name="root">
  27. <property name="password">root123</property>
  28. <property name="schemas">db1,db2,db3</property>
  29. </user>

vi log4j.xml

  1. <root>
  2. <level value="debug" />
  3. <appender-ref ref="FILE" />
  4. <!--<appender-ref ref="FILE" />-->
  5. </root>
  6. </log4j:configuration>

几个关键配置的解释:

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

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

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

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

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

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

5 启动 mycat

  1. [root@localhost conf]# mycat start
  2. [root@localhost conf]# mycat status
  3. [root@localhost conf]# tail -800 /usr/local/mycat/logs/wrapper.log
  4. [root@localhost conf]# netstat -an|grep 9066



6.验证读写分离模式:

  1. [root@mycat ~]# mysql -uroot -proot123 -h192.168.2.136 -P8066
  2. mysql> show databases;

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

  1. #查询mycat
  2. mysql> select * from users;

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

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



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

7.验证自动切换的模式

  1. # 修改 mycat 配置 switch_type=1
  2. cd /usr/local/mycat/conf
  3. vi schema.xml
  4. <?xml version="1.0"?>
  5. <!DOCTYPE mycat:schema SYSTEM "schema.dtd">
  6. <mycat:schema xmlns:mycat="http://org.opencloudb/">
  7. <schema name="db1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
  8. </schema>
  9. <schema name="db2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn2">
  10. </schema>
  11. <schema name="db3" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn3">
  12. </schema>
  13. <dataNode name="dn1" dataHost="mysqlserver" database="db1" />
  14. <dataNode name="dn2" dataHost="mysqlserver" database="db2" />
  15. <dataNode name="dn3" dataHost="mysqlserver" database="db3" />
  16. <!--######### TESTDB ########-->
  17. <dataHost name="mysqlserver" maxCon="1000" minCon="10" balance="1"
  18. writeType="0" dbType="mysql" dbDriver="native" switchType="1" slaveThreshold="100">
  19. <heartbeat>show slave status</heartbeat>
  20. <writeHost host="hostM1" url="192.168.2.134:3306" user="root" password="root123">
  21. </writeHost>
  22. <writeHost host="hostS1" url="192.168.2.135:3306" user="root" password="root123">
  23. </writeHost>
  24. </dataHost>
  25. </mycat:schema>
  26. #重启 mycat
  27. #查看管理信息 检查心跳
  28. [root@mycat ~]# mysql -uroot -proot123 -h192.168.2.136 -P9066
  29. mysql> show @@heartbeat;
  30. mysql> show @@backend;

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

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

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

  1. #查看日志



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

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

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

  1. #查看管理信息
  2. 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. .SourceInsight添加.S文件

    在Option->Document Option添加配置.S然后再去添加文件

  2. bzero()函数

    原型:extern void bzero(void *s, int n);   用法:#include <string.h>   功能:置字节字符串s的前n个字节为零且包括‘\0’.   ...

  3. [Scala]Scala学习笔记一 基础

    1. 变量 val定义的值实际上是一个常亮,无法改变其内容 scala> val num = 0 num: Int = 0 scala> num = 2 <console>:1 ...

  4. canvas 绘制验证码

    注意: 真正项目中验证码图片都是由服务器端(PHP.JSP.Node.js)技术来生成. 最终效果: 代码: <!DOCTYPE html> <html> <head l ...

  5. Kali Linux破解wifi密码(WEP)

    WEP是无线路由器最初广泛使用的一种加密方式,这种加密方式非常容易被破解. 目前很少有人使用wep加密方式,但是还是会有. 建议:使用WPA/WPA2做为加密方式. 抓包和"破解wpa/wp ...

  6. kali学习

    kali视频学习 第二周 kali视频(1-5) 1.kali安装 2.基本配置 vmtools安装过程. 3.安全渗透测试一般流程 4.信息搜集之GoogleHack 5.信息搜集之目标获取 第三周 ...

  7. IOS Quartz 2D 学习(1)

    IOS提供两种创建图形的途径: 1.OpenGL. 2.Quartz.Core Animation.UIKit图形支持. UIKit的图形系统 1.视图绘画周期: DrawRect方法,在任何时候,当 ...

  8. BZOJ3632: 外太空旅行

    BZOJ1547: 周末晚会 https://lydsy.com/JudgeOnline/problem.php?id=1547 分析: 对于一个串旋转若干次会回到本身,旋转次数即是同构个数,这个东西 ...

  9. python操作RabbitMQ(不错)

    一.rabbitmq RabbitMQ是一个在AMQP基础上完整的,可复用的企业消息系统.他遵循Mozilla Public License开源协议. MQ全称为Message Queue, 消息队列 ...

  10. bootstrap table 兼容ie8 -- refreshOptions

    今天项目使用 bootstrap table 在ie8下发现 方法 refreshOptions 报错. 经过调试监控发现错误如下: 153 行 代码 Object.getOwnPropertyNam ...