设为首页 加入收藏

TOP

应用集成mycat,实现mycat的高可用与mysql的读写分离(二)
2019-09-17 18:18:33 】 浏览:75
Tags:应用 集成 mycat 实现 可用 mysql 读写 分离
"/addUser") public Integer addUser(String name, Integer age) { return userService.insertUser(new User(name, age)); } } View Code

    UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.lee.mycat.mapper.UserMapper">

    <sql id="Base_Column_List">
        id,name,age
    </sql>

    <select id="getUserByNameFromMasterDb" resultType="User" parameterType="String">
        /*!mycat:db_type=master*/ SELECT
          <include refid="Base_Column_List" />
        FROM
            tbl_user
        WHERE name=#{name}
    </select>
    <select id="getUserByNameFromSlaveDb" resultType="User" parameterType="String">
        /*!mycat:db_type=slave*/ SELECT
          <include refid="Base_Column_List" />
        FROM
          tbl_user
        WHERE name=#{name}
    </select>
    <select id="getUserByName" resultType="User" parameterType="String">
        SELECT
          <include refid="Base_Column_List" />
        FROM
          tbl_user
        WHERE name=#{name}
    </select>
    <insert id="insertUser" parameterType="User"  useGeneratedKeys="true" keyProperty="id">
        INSERT INTO
          tbl_user(name, age)
        VALUES
          (#{name}, #{age})
    </insert>
</mapper>
View Code

    UserMapper.xml文件中会与我们平时的写法有些许不同,有时候需要明确指定强制走master还是slave节点。具体细节可查看:spring-boot-mycat

    测试结果

      如上图所示,我们一开始新增了一个用户:Jiraiye,其年龄是50,我们手动改了mysql slave中Jiraiye的年龄为52是为了更直观的验证SQL请求最终走的是mysql master还是mysql slave。从上图可知,一般的Select SQL走的是从库(DML SQL走主库这个就不用说了),如在mapper.xml中强制指定了db节点,那么就会在指定的mysql节点上来执行SQL。

      mysql的高可用就没进行测试了,应用其实是感知不到的;mysql master宕机了,mycat会按我们配置好的进行mysql db的切换,正常服务于我们的应用。

  Mycat的高可用

    mysql的读写分离与高可用我们是实现了,可mycat却存在高可用问题,一旦mycat宕机了,整个数据库层就相当于宕机了。可想而知,我们需要实现mycat的高可用。

    mycat的高可用搭建过程可参考:Mycat - 高可用与负载均衡实现,满满的干货!,此时的组件结构图如下

组件结构图三

    应用工程改动非常小,只需要将数据库连接配置的url改成VIP即可,如下

jdbc:mysql://192.168.1.212:8066/TESTDB?useSSL=false&useUnicode=true&characterEncoding=utf-8
改成
jdbc:mysql://192.168.1.200:8066/TESTDB?useSSL=false&useUnicode=true&characterEncoding=utf-8

    测试结果

      mysql的读写分离依然正常工作,当mycat master宕机后,mycat slave接管任务,进行sql的转发,实现了mycat的高可用;期间出现了非常短时间的异常提示,这是因为数据库连接池中都是212上的mycat连接,212现在已经宕机了,所以会出现一次异常提示,但连接池立马做出了反应,重新建立数据库连接,此时连接池中的连接都是连接的110。

  Mycat的负载均衡

    上述mycat的高可用中,绝大多数情况下,mycat slave一直处于等待状态,未提供任何服务,因为我们的mycat master一般而言是不会宕机的。那有没有什么做法可以让slave也处理SQL请求,而又和master互备实现mycat高可用呢?那就是实现Mycat的负载均衡,此时mycat不存在主从关系,而是它俩两两互备,此时的组件结构图就是组件结构图一。应用工程不用变,数据库连接还是配置VIP。具体就不演示了,大家自行去实践即可。

总结

  1、数据库中间件可以降低应用代码的复杂性,让其专职于业务代码的实现,而数据库层面的工作交给数据库中间件;mycat只是数据库中间件的一种实现,却也是比较优秀的实现,她是开源的。

  2、并发量不高的情况下,实现mycat的高可用即可,无需实现Mycat的负载均衡;实现mycat的负载均衡需要更多的硬件成本和维护成本,却没有带来质变的收益,就性价比而言,不升反降。

  3、具体需要部署成什么组件结构,需要看具体的需求,很多情况下根本用不到mycat中间件,如果用到了mycat中间件,个人认为最好还是实现mycat的高可用,至于需不需要实现mycat的负载均衡,就看具体的并发量了,这个也没个标准,就要结合实际情况来排查是不是mycat的负载过高了,如果确实是mycat负载过高,那么就有必要实现mycat的负载均衡来降低单个mycat的负载了。没有绝对的最优部署

首页 上一页 1 2 3 下一页 尾页 2/3/3
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇【MySQL】MySQL的执行计划及索引.. 下一篇非空校验在oracle和mysql中的用法

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目