数据库教程:Mycat实现读写分离

随着应用的访问量并发量的增加,应用读写分离是很有必要的。当然应用要实现读写分离,首先数据库层要先做到主从配置。 应用实现读写分离至少有两种方法: 应用本身通过代码实现,例如基于动态数据源、AOP的原理来实现写操作时用主数据库,读操作时用从数据库。 通过中间件的方式实现,例如通过Mycat,即中间件会 …

随着应用的访问量并发量的增加,应用读写分离是很有必要的。当然应用要实现读写分离,首先数据库层要先做到主从配置。

应用实现读写分离至少有两种方法:

  • 应用本身通过代码实现,例如基于动态数据源、aop的原理来实现写操作时用主数据库,读操作时用从数据库。
  • 通过中间件的方式实现,例如通过mycat,即中间件会分析对应的sql,写操作时会连接主数据库,读操作时连接从数据库。

本篇文章是介绍通过mycat中间件的方式实现读写分离。

1、mycat

mycat是一款开源的数据库中间件,其官网为,其中官方对它介绍为:

mycat 是一个强大的数据库中间件,不仅仅可以用作读写分离、以及分表分库、容灾备份,而且可以用于多租户应用开发、云平台基础设施、让你的架构具备很强的适应性和灵活性,借助于即将发布的mycat 智能优化模块,系统的数据访问瓶颈和热点一目了然,根据这些统计分析数据,你可以自动或手工调整后端存储,将不同的表映射到不同存储引擎上,而整个应用的代码一行也不用改变。

mycat的实现原理为:

mycat 的原理中最重要的一个动词是“拦截”,它拦截了用户发送过来的sql 语句,首先对sql 语句做了一些特定的分析:如分片分析、路由分析、读写分离分析、缓存分析等,然后将此sql 发往后端的真实数据库,并将返回的结果做适当的处理,最终再返回给用户。

关于mycat更多的介绍大家可以查看官网。

2、部署mycat

应用是直接连接mycat,然后mycat管理了1个主数据库和1个从数据库,架构如下:

Mycat实现读写分离

其中每个组件对应服务器地址为:

  • mycat:192.168.197.131
  • 主库:192.168.197.135
  • 从库:192.168.197.136

部署mycat步骤为:

(1)、安装jdk,由于mycat是基于java语言来编写的,所以需要安装jdk,版本为1.8即可。

jdk安装包可以到官网下载,下载后解压,然后配置环境变量,即:

在/etc/profile文件中加入

export java_home=/opt/jdk1.8.0_112  export path=$java_home/bin:$path

(2)、下载mycat安装包,版本为1.6-release,下载地址为https://dl.mycat.io/1.6-release/,选择linux环境的版本即可。

(3)、将mycat安装包上传服务器后解压,即:

tar -zxvf mycat-server-1.6-release-20161028204710-linux.tar.gz

以上3步就相当于将mycat部署好了,现在就需要配置mycat了。

配置mycat步骤为:

(1)、在主库和从库中分别创建用于mycat连接的账号,即:

grant create,delete,insert,select,update on jgyw.* to 'jgywuser'@'192.168.197.131' identified by 'jgyw@123';

以上语句的意思是创建一个jgywuser用户,该用户只有对jgyw模式下的表有增删改查的权限。

(2)、配置mycat的schema.xml文件,该文件位于mycat中conf文件夹下,配置如下:

<mycat:schema xmlns:mycat="https://io.mycat/">      <schema name="testdb" checksqlschema="false" sqlmaxlimit="100" datanode="jgywnode">      </schema>        <datanode name="jgywnode" datahost="jgywhost" database="jgyw" />        <datahost name="jgywhost" maxcon="1000" mincon="10" balance="3" writetype="0" dbtype="mysql" dbdriver="native">            <heartbeat>select user()</heartbeat>                    <writehost host="master" url="192.168.197.135:3306" user="jgywuser" password="jgyw@123">              <readhost host="slave" url="192.168.197.136:3306" user="jgywuser" password="jgyw@123"/>          </writehost>     </datahost>  </mycat:schema>

其中:

  • schema 标签用于定义mycat 实例中的逻辑库,mycat 可以有多个逻辑库,每个逻辑库都有自己的相关配置。可以使用schema 标签来划分这些不同的逻辑库。

  • datanode 标签定义了mycat 中的数据节点,也就是我们通常说所的数据分片。一个datanode 标签就是一个独立的数据分片。

  • datahost标签直接定义了具体的数据库实例、读写分离配置和心跳语句。其中有几个重要的属性:

    balance属性  负载均衡类型,目前的取值有3 种:  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,1.5 以后废弃不推荐。

(3)、配置server.xml,即主要配置连接mycat的用户账号信息,即:

<user name="jgyw">      <property name="password">jgyw</property>      <property name="schemas">testdb</property>      <property name="readonly">false</property>  </user>

即配置一个用户名为jgyw,密码为jgyw的用户,同时具有testdb模式下的读写权限,注意该模式即是在schema.xml配置文件定义的模式名一样。

(4)、启动mycat,即:

./mycat start

mycat启动成功后,会开放两个端口,即数据端口8066,管理端口9066

3、测试

首先在主库的jgyw模式下创建一个comm_config表,即:

create table comm_config (configid varchar(200) not null ,configvalue varchar(1024) default null ,description varchar(2000) default null ,primary key (configid)) engine=innodb default charset=utf8 ;

应用的数据库连接配置信息为:

spring:    datasource:       url: jdbc:mysql://192.168.197.131:8066/testdb      username: jgyw      password: jgyw      driver-class-name: com.mysql.jdbc.driver

用的是8066端口,同时用户也是server.xml配置文件中配置的用户。

测试的数据接口,即:

package com.swnote.common.controller;    import java.util.list;    import org.springframework.beans.factory.annotation.autowired;  import org.springframework.web.bind.annotation.requestbody;  import org.springframework.web.bind.annotation.requestmapping;  import org.springframework.web.bind.annotation.requestmethod;  import org.springframework.web.bind.annotation.restcontroller;    import com.swnote.common.domain.config;  import com.swnote.common.service.iconfigservice;    import lombok.extern.slf4j.slf4j;    @slf4j  @restcontroller  public class configcontroller {        @autowired      private iconfigservice configservice;        @requestmapping(value = "/config/save", method = requestmethod.post)      public config save(@requestbody config config) throws exception {          try {              configservice.save(config);              return config;          } catch (exception e) {              log.error("新增配置信息错误", e);              throw e;          }      }        @requestmapping(value = "/config/list", method = requestmethod.get)      public list<config> list() throws exception {          try {              return configservice.list();          } catch (exception e) {              log.error("查询配置信息错误", e);              throw e;          }      }  }

进入mycat的管理端,即:

mysql -h127.0.0.1 -ujgyw -pjgyw -p9066

然后执行命令:

show @@datasource;

可以查到:

+----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+  | datanode | name   | type  | host            | port | w/r  | active | idle | size | execute | read_load | write_load |  +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+  | jgywnode | master | mysql | 192.168.197.135 | 3306 | w    |      0 |   10 | 1000 |    8959 |         0 |         42 |  | jgywnode | slave  | mysql | 192.168.197.136 | 3306 | r    |      0 |   10 | 1000 |    8937 |        22 |          0 |  +----------+--------+-------+-----------------+------+------+--------+------+------+---------+-----------+------------+  2 rows in set (0.00 sec)

当调用读接口时read_load的值对应在slave上会加1说明是走从库;

当调用写接口时write_load的值对就在master上会加1说明是走主库。

需要了解更多数据库技术:Mycat实现读写分离,都可以关注数据库技术分享栏目—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/dtteaching/830664.html

(0)
上一篇 2021年9月18日
下一篇 2021年9月18日

精彩推荐