Mycat系列—Mysql读写分离+强制走写节点+根据主从延时的读写分离
来源:互联网 发布:桌面美化软件哪个好 编辑:程序博客网 时间:2024/06/05 00:24
数据库读写分离对于大型系统或者访问量很高的互联网应用来说,是必不可少的一个重要功能。对于MySQL来说,标准的读写分离是主从模式,一个写节点Master后面跟着多个读节点,读节点的数量取决于系统的压力,通常是1-3个读节点的配置。
Mycat读写分离和自动切换机制,需要mysql的主从复制机制配合。
- MyCat的安装请参考:Mycat系列—Linux下Mycat的安装配置
- Mysql主从复制的配置请参考:MySQL系列—主从复制的配置
一、MyCat 的配置
从 Mycat 1.4 开始支持MySQL主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
配置文件的意思是:
- 逻辑库:small。逻辑表:tb_item;
- Master服务器上创建了一个数据库:db1;
- Slave服务器同步Master服务器的 db1 数据库;
- 写请求都发送到Master服务器;
- 读请求都发送到Slave服务器。
[root@mycat-server conf]# vim schema.xml<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="small" checkSQLschema="false" sqlMaxLimit="100"> <table name="tb_item" dataNode="dn1" /> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="hostM" url="mysql-server-01:3306" user="root" password="888888"> <readHost host="hostS" url="mysql-server-02:3306" user="root" password="888888" /> </writeHost> </dataHost></mycat:schema>
二、测试
1、我们使用 Navicat 连接 MyCat 服务器:
2、创建表
执行如下建表语句,执行之后可以看到Master服务器上的数据库 db1 中存在了 tb_item 表。再看看Slave服务器上的 db1 数据库中也存在了 tb_item 表。
-- ------------------------------ Table structure for tb_item-- ----------------------------DROP TABLE IF EXISTS `tb_item`;CREATE TABLE `tb_item` ( `id` bigint(20) NOT NULL COMMENT '商品id,同时也是商品编号', `title` varchar(100) NOT NULL COMMENT '商品标题', `sell_point` varchar(500) DEFAULT NULL COMMENT '商品卖点', `price` bigint(20) NOT NULL COMMENT '商品价格,单位为:分', `num` int(10) NOT NULL COMMENT '库存数量', `barcode` varchar(30) DEFAULT NULL COMMENT '商品条形码', `image` varchar(500) DEFAULT NULL COMMENT '商品图片', `cid` bigint(10) NOT NULL COMMENT '所属类目,叶子类目', `status` tinyint(4) NOT NULL DEFAULT '1' COMMENT '商品状态,1-正常,2-下架,3-删除', `created` datetime NOT NULL COMMENT '创建时间', `updated` datetime NOT NULL COMMENT '更新时间', PRIMARY KEY (`id`), KEY `cid` (`cid`), KEY `status` (`status`), KEY `updated` (`updated`)) COMMENT='商品表';
3、从插入数据
INSERT INTO TB_ITEM ( ID, TITLE, SELL_POINT, PRICE, NUM, BARCODE, IMAGE, CID, STATUS, CREATED, UPDATED)VALUES ( '15000000', '夏普(SHARP)LCD-52DS51A 52英寸 日本原装液晶面板 内置WIFI智能全高清液晶电视', '要好屏,选夏普!日本原装面板,智能电视,高画质高音质!<a target=\"blank\" href=\"http://item.jd.com/1278664.html\">还有升级版安卓智能新机52DS52供您选择!</a>', '549900', '99999', NULL, 'http://image.taotao.com/jd/63af01c37a18454ab2fef4670046272e.jpg', '76', '1', '2015-03-08 21:27:45', '2015-03-08 21:27:45' );
4、测试读写分离
附 1、读写分离的第二种配置方式
1、读写分离的第二种配置方式
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="small" checkSQLschema="false" sqlMaxLimit="100"> <table name="tb_item" dataNode="dn1" /> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native"> <heartbeat>select user()</heartbeat> <writeHost host="hostM1" url="mysql-server-01:3306" user="root" password="888888"></writeHost> <writeHost host="hostS1" url="mysql-server-02:3306" user="root" password="888888"></writeHost> </dataHost></mycat:schema>
以上两种配置方式,第一种当写挂了读不可用,第二种可以继续使用。另外,事务内部的一切操作都会走写节点,所以读操作不要加事务。
2、强制走写或读节点
如果读延时较大,我们可以使用MyCat注解的方式强制走写节点。
继续上面测试部分的第四小节:测试读写分离。接下来测试MyCat的注解方式。
图中可能看不清楚,强制走写节点的语句如下:
/*#mycat:db_type=master*/ SELECT * FROM tb_item ;
另外,测试时发现强制走读节点失败,不知道为什么,也没有深究(实在没有多少时间):
/*#mycat:db_type=slave*/ SELECT * FROM tb_item ;
附 2、根据主从延时切换
1、根据主从延时切换的配置
1.4 开始支持 MySQL 主从复制状态绑定的读写分离机制,让读更加安全可靠,配置如下:
- MyCAT 心跳检查语句配置为 show slave status ;
- dataHost 上定义两个新属性:
switchType="2"
和slaveThreshold="100"
,此时意味着开启 MySQL 主从复制状态绑定的读写分离与切换机制;
Mycat 心跳机制通过检测 show slave status 中的 "Seconds_Behind_Master"
,"Slave_IO_Running"
,"Slave_SQL_Running"
三个字段来确定当前主从同步的状态以及 Seconds_Behind_Master 主从复制时延。当 Seconds_Behind_Master > slaveThreshold
时,读写分离筛选器会过滤掉此 Slave 机器,防止读到很久之前的旧数据。而当主节点宕机后,切换逻辑会检查 Slave 上的 Seconds_Behind_Master 是否为 0,为 0 时则表示主从同步,可以安全切换,否则不会切换。
<?xml version="1.0"?><!DOCTYPE mycat:schema SYSTEM "schema.dtd"><mycat:schema xmlns:mycat="http://io.mycat/"> <schema name="small" checkSQLschema="false" sqlMaxLimit="100"> <table name="tb_item" dataNode="dn1" /> </schema> <dataNode name="dn1" dataHost="localhost1" database="db1" /> <dataHost name="localhost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native" switchType="2" slaveThreshold="100"> <heartbeat>show slave status </heartbeat> <writeHost host="hostM1" url="mysql-server-01:3306" user="root" password="888888"></writeHost> <writeHost host="hostS1" url="mysql-server-02:3306" user="root" password="888888"></writeHost> </dataHost></mycat:schema>
2、测试
将主节点(写节点)停止,再插入一条数据,可以看到是可以插入的,此时写节点已经关闭,读节点出现了俩条数据:
另外,注意:将主节点重新启动,MyCat 不会重新将其加入进来。(已亲自试验)
官方文档中有这么一段:
writeType="0", 所有写操作发送到配置的第一个 writeHost,第一个挂了切到还生存的第二个writeHost,重新启动后已切换后的为准,切换记录在配置文件中:dnindex.properties .
- Mycat系列—Mysql读写分离+强制走写节点+根据主从延时的读写分离
- Mysql主从复制,读写分离中间件--mycat
- mysql主从复制及mycat读写分离
- mysql主从复制和mycat读写分离
- 利用MyCAT实现MySQL的读写分离和主从切换
- mysql+mycat读写分离
- mysql主从读写分离
- MyCAT实现MySQL的读写分离
- MyCAT实现MySQL的读写分离
- mycat配置mysql简单的读写分离
- Mycat之Mysql读写分离的实现
- 基于MyCat实现的MySQL读写分离
- mycat实现简单的mysql读写分离
- 基于Mycat的MySQL读写分离
- MyCAT实现MySQL的读写分离
- 使用mycat 读写分离mysql
- mycat实现mysql读写分离
- mysql+mycat 实现读写分离
- 学习记录
- 向邮箱发送验证码去验证邮箱或者密码等等
- 平衡二叉树 之 AVL树
- CSS+ DIV布局
- 数据挖掘模型效果评估方法汇总
- Mycat系列—Mysql读写分离+强制走写节点+根据主从延时的读写分离
- 常见水平垂直居中问题
- MT6752/32平台 KK和L版本支持的虚拟sensor类型有哪些
- Rxjava2.0问题集
- 在非MFC环境中使用CString、使用_bstr_t
- 数据可视化
- pytorch-basic tutorial
- ubuntu 16.04软件中心升级软件异常导致无桌面
- POJO