ICode9

精准搜索请尝试: 精确搜索
首页 > 数据库> 文章详细

SpringBoot-整合-MyCat-实现读写分离,mongodb视频教程

2021-09-20 11:36:37  阅读:256  来源: 互联网

标签:SpringBoot mongodb org upload mycat 数据源 import MyCat png


+----------------------------------+--------+
4 rows in set (0.00 sec)


#### 修改表存储引擎

如果是slave数据库的表是MyISAM,master数据库的表是InnoDB。直接覆盖master数据库来同步数据的话,slave数据库表的存储引擎也将会同步变成InnoDB。扩展:[InnoDB一棵B+树可以存放多少行数据?](

)

#### 更换存储引擎遇到的问题

`This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled (you might want to use the less safe log_bin_trust_function_creators variable)`

#### 出现的原因

在function里面,只有 DETERMINISTIC, NO SQL 和 READS SQL DATA 被支持。
如果我们开启了 bin-log, 我们就必须为我们的function指定一个参数。

#### 解决方案

mysql>?set?global?log_bin_trust_function_creators=TRUE;


`Specified key was too long; max key length is 1000 bytes`

#### 出现的原因

1.  DB的 engine 是 MyISAM

2.  字符集是 utf8 ,1个 utf8=3bytes

3.  (索引长度总和) * 3 > 1000。

#### 解决方案

1.  修改DB engine 至 innodb

2.  更改字符集

3.  减小字段长度

> 注意:一定不要手动去修改slave数据库中的数据,需要给slave的用户设置只读。

至此,mysql的数据库主从设置已经配置成功。在master中修改数据库,会同步到slave中。

## Mycat基于MySQL的读写分离

Mycat不负责数据的同步,所以要还是要基于[MySQL的主从配置来实现读写分离](

)。

### 安装Mycat

由于github限制,所以以后新版本从以下地址下载 http://dl.mycat.io

Linux创建文件夹/usr/local/mycat,进入文件夹,下载安装包

$ wget http://dl.mycat.io/1.6.7.5/2020-3-3/Mycat-server-1.6.7.5-test-20200303154735-linux.tar.gz
$ tar -zxvf Mycat-server-1.6.7.5-test-20200303154735-linux.tar.gz
$ cd mycat
$ useradd mycat
$ chown -R mycat:mycat /usr/local/mycat/mycat
$ passwd mycat

// 配置hostname,添加以下配置
[root@localhost mycat] vim /etc/sysconfig/network
HOSTNAME=localhost(主机名)

// 查看是否配置主机
$ vim /etc/hosts


将Mycat配置到环境变量中

$ vim /etc/profile
// 在最后添加
MYCAT_HOME=/usr/local/mycat/mycat
PATH=$MYCAT_HOME/bin:$PATH
export PATH

// 使配置生效
$ source /etc/profile


在master数据库中添加user1(写)、user2(只读)两个账户,并配置权限。

配置mycat的schema.xml

<mycat:schema xmlns:mycat="http://io.mycat/">

<schema name="itools_simple" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
</schema>
<dataNode name="dn1" dataHost="localhost" database="itools_simple" />
<dataHost name="localhost" maxCon="1000" minCon="10" balance="0"
          writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
    <heartbeat>select user()</heartbeat>
    <writeHost host="hostM1" url="192.168.0.105:3306" user="user1" password="Root@123">
        <!-- 可以配置多个从库 -->
        <readHost host="hostS2" url="127.0.0.1:3306" user="user2" password="Root@123" />
    </writeHost>
</dataHost>

</mycat:schema>


配置mycat的server.xml,增加两个用户

Root@123 itools_simple itools_simple Root@123 itools_simple true itools_simple ```

启动Mycat

启动mycat

$ mycat start
Starting Mycat-server...

查看启动日志

$ cat wrapper.log
MyCAT Server startup successfully. see logs in logs/mycat.log

使用客户端连接mycat

使用SQLyog连接(使用此方式连接,不能直接通过点击表查看数据)

使用Navicat连接

可通过客户端直接查看master数据,也可通过修改mycat数据,查看master和slave的数据是否会同步

SpringBoot 整合 MyCat 实现读写分离

  • 首先需要配置好数据库的主从关系。

  • 配置好MyCat服务。

  • 实现MyCat与MySQL读写分离。

添加依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-aop</artifactId>
</dependency>

<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.0.23</version>
</dependency>

创建数据源

package com.muycode.itoolsimple.datasource;

import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.boot.jdbc.DataSourceBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

@Configuration
public class DataSourceConfig {

    /**
     * 创建可读数据源
     *
     * @return
     */
    @Bean(name = "selectDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.select")
    public DataSource dataSource1() {
        return DataSourceBuilder.create().build();
    }

    /**
     * 创建可写数据源
     *
     * @return
     */
    @Bean(name = "updateDataSource")
    @ConfigurationProperties(prefix = "spring.datasource.update")
    public DataSource dataSource2() {
        return DataSourceBuilder.create().build();
    }
}

设置数据源

package com.muycode.itoolsimple.datasource;

import org.springframework.context.annotation.Lazy;
import org.springframework.stereotype.Component;

@Component
@Lazy(false)
public class DataSourceContextHolder {

    /**
     * 采用ThreadLocal 保存本地多数据源
     */
    private static final ThreadLocal<String> contextHolder = new ThreadLocal<>();

    /**
     * 设置数据源类型
     *
     * @param dbType
     */
    public static void setDbType(String dbType) {
        contextHolder.set(dbType);
    }

    /**
     * 获取数据源类型
     */
    public static String getDbType() {
        return contextHolder.get();
    }

    public static void clearDbType() {
        contextHolder.remove();
    }
}

返回数据源

package com.muycode.itoolsimple.datasource;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Primary;
import org.springframework.jdbc.datasource.lookup.AbstractRoutingDataSource;
import org.springframework.stereotype.Component;

import javax.sql.DataSource;
import java.util.HashMap;
import java.util.Map;

@Component
@Primary
public class DynamicDataSource extends AbstractRoutingDataSource {

    @Autowired
    @Qualifier("selectDataSource")
    private DataSource selectDataSource;

    @Autowired
    @Qualifier("updateDataSource")
    private DataSource updateDataSource;

    /**
     * 返回生效的数据源名称
     */
    @Override
    protected Object determineCurrentLookupKey() {
        return DataSourceContextHolder.getDbType();
    }

    /**
     * 配置数据源信息
     */
    @Override
    public void afterPropertiesSet() {
        Map<Object, Object> map = new HashMap<>(16);
        map.put("selectDataSource", selectDataSource);
        map.put("updateDataSource", updateDataSource);
        setTargetDataSources(map);
        setDefaultTargetDataSource(updateDataSource);
        super.afterPropertiesSet();
    }
}

创建切面,动态设置数据源

package com.muycode.itoolsimple.datasource;

import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Before;
import org.springframework.context.annotation.Lazy;
import org.springframework.core.annotation.Order;
import org.springframework.stereotype.Component;

@Aspect
@Component
@Lazy(false)
@Order(0) // Order设定AOP执行顺序 使之在数据库事务上先执行
public class DataSourceOptionAop {

    /**
     * 可读数据源
     */
    private final static String DATASOURCE_TYPE_SELECT = "selectDataSource";
    /**
     * 可写数据源
     */
    private final static String DATASOURCE_TYPE_UPDATE = "updateDataSource";

    /**
     * 创建切面,根据方法类型选择不同的数据源
     *
     * @param joinPoint
     */
    @Before("execution(* com.muycode.itoolsimple.service.*.*(..))")
    public void process(JoinPoint joinPoint) {
        String methodName = joinPoint.getSignature().getName();
        System.out.print("=========== " + methodName);
        if (methodName.startsWith("get") || methodName.startsWith("count") || methodName.startsWith("find")
                || methodName.startsWith("list") || methodName.startsWith("select") || methodName.startsWith("check")
                || methodName.startsWith("query")) {
            DataSourceContextHolder.setDbType(DATASOURCE_TYPE_SELECT);
            System.out.println("-----------------使用selectDataSource数据源-------------------");
        } else {
            DataSourceContextHolder.setDbType(DATASOURCE_TYPE_UPDATE);
            System.out.println("-----------------使用updateDataSource数据源-------------------");
        }
    }
}

输出结果

=========== getByUsername-----------------使用selectDataSource数据源-------------------
=========== getPermissionStringByUserId-----------------使用selectDataSource数据源-------------------
=========== getPermissionByUserId-----------------使用selectDataSource数据源-------------------


### 最后

小编在这里分享些我自己平时的学习资料,由于篇幅限制,pdf文档的详解资料太全面,细节内容实在太多啦,所以只把部分知识点截图出来粗略的介绍,每个小节点里面都有更细化的内容!

**[CodeChina开源项目:【一线大厂Java面试题解析+核心总结学习笔记+最新讲解视频】](https://ali1024.coding.net/public/P7/Java/git)**

**程序员代码面试指南 IT名企算法与数据结构题目最优解**

这是” 本程序员面试宝典!书中对IT名企代码面试各类题目的最优解进行了总结,并提供了相关代码实现。针对当前程序员面试缺乏权威题目汇总这一-痛点, 本书选取将近200道真实出现过的经典代码面试题,帮助广“大程序员的面试准备做到万无一失。 “刷”完本书后,你就是“题王”!

![image.png](https://upload-images.jianshu.io/upload_images/24616006-044ac41e86c7e493.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**《TCP-IP协议组(第4版)》**

本书是介绍TCP/IP协议族的经典图书的最新版本。本书自第1版出版以来,就广受读者欢迎。

本书最新版进行」护元,以体境计算机网络技不的最新发展,全书古有七大部分共30草和7个附录:第一部分介绍一些基本概念和基础底层技术:第二部分介绍网络层协议:第三部分介绍运输层协议;第四部分介绍应用层协议:第五部分介绍下一代协议,即IPv6协议:第六部分介绍网络安全问题:第七部分给出了7个附录。

![image.png](https://upload-images.jianshu.io/upload_images/24616006-8976158861edfbc1.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


**Java开发手册(嵩山版)**

这个不用多说了,阿里的开发手册,每次更新我都会看,这是8月初最新更新的**(嵩山版)**

![image.png](https://upload-images.jianshu.io/upload_images/24616006-430c0003ec00a5c5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

**MySQL 8从入门到精通**

本书主要内容包括MySQL的安装与配置、数据库的创建、数据表的创建、数据类型和运算符、MySQL 函数、查询数据、数据表的操作(插入、更新与删除数据)、索引、存储过程和函数、视图、触发器、用户管理、数据备份与还原、MySQL 日志、性能优化、MySQL Repl ication、MySQL Workbench、 MySQL Utilities、 MySQL Proxy、PHP操作MySQL数据库和PDO数据库抽象类库等。最后通过3个综合案例的数据库设计,进步讲述 MySQL在实际工作中的应用。

![image.png](https://upload-images.jianshu.io/upload_images/24616006-6685821f0213dcf8.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


**Spring5高级编程(第5版)**

本书涵盖Spring 5的所有内容,如果想要充分利用这一领先的企业级 Java应用程序开发框架的强大功能,本书是最全面的Spring参考和实用指南。

本书第5版涵盖核心的Spring及其与其他领先的Java技术(比如Hibemate JPA 2.Tls、Thymeleaf和WebSocket)的集成。本书的重点是介绍如何使用Java配置类、lambda 表达式、Spring Boot以及反应式编程。同时,将与企业级应用程序开发人员分享一些见解和实际经验,包括远程处理、事务、Web 和表示层,等等。

![image.png](https://upload-images.jianshu.io/upload_images/24616006-108fc1f48cad048d.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


**JAVA核心知识点+1000道 互联网Java工程师面试题**

![image.png](https://upload-images.jianshu.io/upload_images/24616006-cfe84191535fdfbf.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


![image.png](https://upload-images.jianshu.io/upload_images/24616006-9401b4bc5fed51f5.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)


**企业IT架构转型之道 阿里巴巴中台战略思想与架构实战**

本书讲述了阿里巴巴的技术发展史,同时也是-部互联网技 术架构的实践与发展史。

![image.png](https://upload-images.jianshu.io/upload_images/24616006-a5c5b06191e73819.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

标签:SpringBoot,mongodb,org,upload,mycat,数据源,import,MyCat,png
来源: https://www.cnblogs.com/hgysvadavvc/p/15313941.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有