设为首页 加入收藏

TOP

应用集成mycat,实现mycat的高可用与mysql的读写分离(一)
2019-09-17 18:18:33 】 浏览:74
Tags:应用 集成 mycat 实现 可用 mysql 读写 分离

前言

  开心一刻

    一个女人自朋友圈写道:我家老公昨天和别人家的老婆出去旅游,迄今未归,我则被别人家的老公折腾了一天,好累哦!

    圈子下面,评论无数,老公在下面评论到:能不能好好说话,我只不过陪女儿去毕业旅游行,而你负责在家留守,照顾三岁儿子,要不要写的这么刺激、让人浮想联翩的? 你是不是有点虎?

诺维斯基:你往哪射了?

周子瑜:我只是个娱乐明星,射箭我不是专业的...

  路漫漫其修远兮,吾将上下而求索!

  github:https://github.com/youzhibing

  码云(gitee):https://gitee.com/youzhibing

前情回顾

  通过前面的两篇博文:Mycat - 实现数据库的读写分离与高可用Mycat - 高可用与负载均衡实现,满满的干货!,我们完成了如下图所示的组件部署

组件结构图一

  SQL请求发给VIP,keepalived完成VIP的映射,并通过lvs将请求转发mycat,mycat根据SQL请求类型(DML SQL还是SELECT SQL,亦或是强制指定db节点)将SQL分发到具体的db,完成由具体的数据库服务完成SQL的执行。

  但这还只是停留在数据库层面的部署,还没集成我们的应用,没有实际意义,那么我们如何集成我们的应用,实现mycat的使命呢?

应用集成

  如果mycat搭建好了,进行应用集成非常简单,下面我们一步一步来实现各种情况下的应用集成

  Mysql的读写分离与高可用

    数据库的读写分离可以在代码层面实现(可参考:spring集成mybatis实现mysql读写分离),但不推荐,代码的核心职责应该是业务的实现,如果将大篇的代码用来实现数据库的读写分离与高可用,那就背离了本意、南辕北辙了。

    计算机领域有句名言:“计算机科学领域的任何问题都可以通过增加一个间接的中间层来解决”。既然我们的代码直接对接数据库不好实现数据库的读写分离与高可用,那就在中间新增一层中间件来实现,从而产生了数据库中间件(mycat只是实现之一),应用代码直接与数据库中间对接,由数据库中间件来实现数据库的读写分离与高可用。此时的组件结构图如下

组件结构图二

    具体的部署过程可参考:Mycat - 实现数据库的读写分离与高可用,此时应用如何集成了?其实非常简单,只需要将我们的连接池配置中的数据库地址改成mycat的地址即可(将mycat看成数据库),具体如下

    application.yml

server:
  port: 8886
spring:
  #连接池配置
  datasource:
    type: com.alibaba.druid.pool.DruidDataSource
    druid:
      driver-class-name: com.mysql.jdbc.Driver
      url: jdbc:mysql://192.168.1.212:8066/TESTDB?useSSL=false&useUnicode=true&characterEncoding=utf-8
      username: root
      password: 123456
      initial-size: 1                     #连接池初始大小
      max-active: 20                      #连接池中最大的活跃连接数
      min-idle: 1                         #连接池中最小的活跃连接数
      max-wait: 60000                     #配置获取连接等待超时的时间
      pool-prepared-statements: true    #打开PSCache,并且指定每个连接上PSCache的大小
      max-pool-prepared-statement-per-connection-size: 20
      validation-query: SELECT 1 FROM DUAL
      validation-query-timeout: 30000
      test-on-borrow: false             #是否在获得连接后检测其可用性
      test-on-return: false             #是否在连接放回连接池后检测其可用性
      test-while-idle: true             #是否在连接空闲一段时间后检测其可用性
#mybatis配置
mybatis:
  type-aliases-package: com.lee.mycat.entity
  #config-location: classpath:mybatis/mybatis-config.xml
  mapper-locations: classpath:mybatis/*.xml
# pagehelper配置
pagehelper:
  helperDialect: mysql
  #分页合理化,pageNum<=0则查询第一页的记录;pageNum大于总页数,则查询最后一页的记录
  reasonable: true
  supportMethodsArguments: true
  params: count=countSql
logging:
  level:
    com.lee.mycat.mapper: DEBUG
View Code

    UserWeb.java

package com.lee.mycat.web;

import com.lee.mycat.entity.User;
import com.lee.mycat.service.IUserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
@RequestMapping("/mycat")
public class UserWeb {

    @Autowired
    private IUserService userService;

    @RequestMapping("/getUserByNameFromMasterDb")
    public User getUserByNameFromMasterDb(String name) {
        return userService.getUserByNameFromMasterDb(name);
    }

    @RequestMapping("/getUserByNameFromSlaveDb")
    public User getUserByNameFromSlaveDb(String name) {
        return userService.getUserByNameFromSlaveDb(name);
    }

    @RequestMapping("/getUserByName")
    public User getUserByName(String name) {
        return userService.getUserByName(name);
    }

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

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目