iis服务器助手广告广告
返回顶部
首页 > 资讯 > 数据库 >mycat做Mysql的读写分离
  • 557
分享到

mycat做Mysql的读写分离

2024-04-02 19:04:59 557人浏览 薄情痞子
摘要

在Mysql中间件出现之前,对于mysql主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如

Mysql中间件出现之前,对于mysql主从集群,如果要实现其读写分离,一般是在程序端实现,这样就带来一个问题,即数据库和程序的耦合度太高,如果我数据库的地址发生改变了,那么我程序端也要进行相应的修改,如果数据库不小心挂掉了,则同时也意味着程序的不可用,而这对很多应用来说,并不能接受。

引入Mysql中间件能很好的对程序端和数据库进行解耦,这样,程序端只需关注数据库中间件的地址,而无需知晓底层数据库是如何提供服务。

作为当前炙手可热的MySQL中间件,MyCAT实现MySQL主从集群的读写分离自是应有之义,其配置也相当简单。

在这里,我用三个实例组成MySQL主从集群,来验证MyCAT的读写分离功能,其实,一主一从就可以满足,之所以用三个,是为了验证MyCAT的分片功能。

集群组成如下:

角色 主机名 主机IP

master mysql-server1 192.168.1.5

slave mysql-server2 192.168.1.6

slave mysql-server3 192.168.1.4

在这里,还是使用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="MYM1" url="192.168.1.5:3307" user="root"
                        passWord="lichao">
                </writeHost>
                <writeHost host="MYS1" url="192.168.1.6:3307" user="root"
                        password="lichao" />
                <writeHost host="MYS2" url="192.168.1.4:3307" user="root"                      
                        password="123456" />
</dataHost>

这里面,有两个参数需要注意,balance和 switchType。

其中,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不负担读压力

switchType指的是切换的模式,目前的取值也有4种:

  • switchType='-1' 表示不自动切换
  • switchType='1' 默认值,表示自动切换
  • switchType='2' 基于MySQL主从同步的状态决定是否切换,心跳语句为 show slave status
  • 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 |
+---------+---------------+------------+------+------+
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 |
+---------+---------------+------------+------+------+
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 |
+---------+---------------+------------+------+------+
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 |
+---------+---------------+------------+------+------+
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。日志相关信息如下:

mycat做Mysql的读写分离

验证mater挂了,slave还能提供读的功能

对于MySQL主从集群,我们的需求是master挂了,slave还能提供读的功能。

下面来测试一下

首先,人为的关闭主库

[root@mysql-server1 ~]# /etc/init.d/mysqld stop

登录MyCAT

[root@mysql-server1 ~]# mysql -utest -ptest -h227.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 |
+---------+---------------+------------+------+------+
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="MYM1" url="192.168.1.5:3307" user="root"
password="lichao">
<!-- can have multi read hosts -->
<readHost host="MYS1" url="192.168.1.6:3307" user="root" password="lichao" />
</writeHost>
</dataHost>

但这种方式有个问题,即master挂了以后,slave也不能提供服务,而这违反了MySQL主从集群的初衷。

  1. 如果开启了事务模式,即set autocommit=0,则事务内的读走的是master节点,而不是从节点。
您可能感兴趣的文档:

--结束END--

本文标题: mycat做Mysql的读写分离

本文链接: https://www.lsjlt.com/news/40565.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • mycat-3:读写分离
    利用mycat读写分离主库192.168.56.101,备库192.168.56.25.3个数据库db1,db2,db3.主从同步见之前数据库目录。 修改schema.xml balance="0"0:不开启读写分离机制,所有读操作都发送到...
    99+
    2023-01-31
    mycat
  • Mycat如何实现Mysql集群读写分离
    这篇文章给大家分享的是有关Mycat如何实现Mysql集群读写分离的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。MySQL 读写分离的概述MySQL 作为目前世界上使用最广泛的免...
    99+
    2024-04-02
  • Mycat读写分离配置实践
       工作这些年来,也去了一些地方,有了一些见闻,隐隐感觉很多文化和猫有着千丝万缕的联系。就拿IT行业来说吧,猫有着很高的曝光率,比如大名鼎鼎的 tomcat,是由SUN的软件构架...
    99+
    2024-04-02
  • 使用Mycat怎么实现MySQL读写分离
    今天就跟大家聊聊有关使用Mycat怎么实现MySQL读写分离,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。搭建环境操作系统:CentOS-6.5-x...
    99+
    2024-04-02
  • 怎么理解Mycat读写分离
    这篇文章主要介绍“怎么理解Mycat读写分离”,在日常操作中,相信很多人在怎么理解Mycat读写分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解Mycat读写分离”...
    99+
    2024-04-02
  • Mycat中间件实现Mysql主从读写分离
    环境规划: IP地址 主机名 角色 备注 10.4.132.50 k8s01 mycat,master 10.4.132.42 k8s02 slave ...
    99+
    2024-04-02
  • MyCat中怎么实现读写分离
    这期内容当中小编将会给大家带来有关MyCat中怎么实现读写分离,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、mycat实现读写分离这里没有用到mysql03主机,读写...
    99+
    2024-04-02
  • MyCat怎么实现MySQL一主两从读写分离
    这篇文章主要介绍“MyCat怎么实现MySQL一主两从读写分离”,在日常操作中,相信很多人在MyCat怎么实现MySQL一主两从读写分离问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大...
    99+
    2024-04-02
  • MyCat如何实现MySQL双主一从读写分离
    这篇文章给大家分享的是有关MyCat如何实现MySQL双主一从读写分离的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。1)配置server.xml<user nam...
    99+
    2024-04-02
  • 如何利用mycat实现mysql数据库读写分离
    这篇文章主要介绍了如何利用mycat实现mysql数据库读写分离,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。什么是MyCAT一个彻底开源的...
    99+
    2024-04-02
  • Linux如何使用 MyCat 实现 MySQL 主从读写分离
    目录Linux-使用 MyCat 实现 MySQL 主从读写分离 一、MySQL 读写分离1、MySQL 读写分离的概述2、读写分离工作原理3、为什么要读写分离3、实现读写分离的方式...
    99+
    2024-04-02
  • mysql服务器怎么做读写分离
    mysql服务器属性读写分离的有以下几种利用查询实现读写分离最简单的分离方法是将所有不能容忍脏数据的读和写查询分配到主动或主库服务器上;其他的读查询分配到备库或被动服务器上;该策略很容易实现,但事实上无法.有效地使用备库,因为只有很少的查询...
    99+
    2024-04-02
  • mongodb怎么做读写分离
    在MongoDB中实现读写分离可以通过复制集来实现。复制集是一组运行在不同服务器上的MongoDB进程,其中有一个主节点(Prima...
    99+
    2023-09-04
    mongodb
  • mysql数据库中怎么利用mycat实现读写分离
    这期内容当中小编将会给大家带来有关mysql数据库中怎么利用mycat实现读写分离,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。1、部署mycat下载 [root@myc...
    99+
    2024-04-02
  • SpringBoot中怎么利用MyCat实现读写分离
    SpringBoot中怎么利用MyCat实现读写分离,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。MySQL配置主从关系说明 192.168.0.10...
    99+
    2023-06-16
  • 对mycat读写分离主从切换策略的调研
        当从库宕机后,读请求会全部转移到主库上,对业务无影响。 2、当主库宕机后     目前,我们的writehost只设置了一个主库,当主库宕机后,通过myca...
    99+
    2024-04-02
  • 怎样实现Mycat读写分离与负载均衡
    怎样实现Mycat读写分离与负载均衡,很多新手对此不是很清楚,为了帮助大家解决这个难题,下面小编将为大家详细讲解,有这方面需求的人可以来学习下,希望你能有所收获。我们来学习读写分离与负载均衡先看一下bala...
    99+
    2024-04-02
  • Mycat中间件实现Percona Cluster集群读写分离
    Mycat实现读写分离架构图: Mycat主从自动切换架构图: Mycat下载地址:http://dl.mycat.io/1.6.7.3/20190828135747/Mycat-server...
    99+
    2024-04-02
  • mysql如何读写分离
    mysql 读写分离是一种数据库架构,将数据库分为主库和从库,主库负责写入操作,从库负责读操作,以降低主库负载和提高并发读能力。实现 mysql 读写分离需要:搭建主从复制环境、修改应用...
    99+
    2024-04-14
    mysql
  • 怎么做数据库读写分离
    这篇文章主要讲解了“怎么做数据库读写分离”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“怎么做数据库读写分离”吧!实现方式对于读写分离的使用,主要分为两种方式...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作