MySQL搭建主从复制集群,实现读写分离

news2024/11/28 2:30:07

 目录

一、准备

二、配置

2.1 配置主库

修改配置文件/etc/my.cnf

重启服务

为主库再创建一个账户并授权

查看状态

2.2 配置从库

修改配置文件/etc/my.cnf

重启mysql服务

配置需要同步的主机

启动salve同步

查看是否同步

三、测试主从复制是否生效

四、读写分离案例

4.1 背景

4.2 Sharding-JDBC介绍

4.3 项目测试前期准备

数据库准备

导入依赖

配置文件

代码生成器

添加依赖

添加配置文件规则

4.4 验证

创建测试方法,包含增删改查

打上断点,以DEBUG的方式启动

发送请求测试

五、主从复制数据不同步的问题



一、准备

准备两台服务器,为每台都安装好mysql。

此时的两台服务器它们的mysql之间没有半毛钱关系,各自是独立的。

如果不会安装,后续我也会出一篇安装教程。请关注我的【编程环境安装】专栏。

二、配置

2.1 配置主库

修改配置文件/etc/my.cnf

追加如下:

[mysqld]
log-bin=mysql-bin
server-id=110

以后在进行增删改操作的时候,它都会进行记录日志。

重启服务

systemctl restart mysqld

为主库再创建一个账户并授权

CREATE USER '主库用户名'@'%' IDENTIFIED BY '主库用户名密码';
GRANT REPLICATION SLAVE ON *.* TO '主库名称'@'%';
ALTER USER '主库用户名'@'%' IDENDIFIED WITH mysql_native_password BY '主库用户名密码';
flush privileges;

 这一步是为主库创建一个用户,并为这个用户授予复制从库的权限。

查看状态

我们先记住这个File和Position的值

记得现在就不要再在主库操作了,否则这个位置就会发生变化。

2.2 配置从库

修改配置文件/etc/my.cnf

增加配置:服务器的唯一标识

server-id=111

 

重启mysql服务

systemctl restart mysqld

 

配置需要同步的主机

CHANGE MASTER TO
MASTER_HOST='主机的ip地址',
MASTER_USER='主机刚才创建的用户名',
MASTER_PASSWORD='主机用户名的密码',
MASTER_LOG_FILE='主机上记录的File值',
MASTER_LOG_POS=主机上记录的Position值;

 

启动salve同步

start slave;

查看是否同步

show slave status;

 很乱啊,我们把它复制到文本编辑器上来看看

至此,主从复制集群就搭建完成了!

三、测试主从复制是否生效

我们通过navicat连接上这两个数据库,通过操作看看,它们的变化。

在主库创建一个数据库。

四、读写分离案例

4.1 背景

如果系统的访问量增大,既要查询又要写入,单台数据库已经不能满足访问压力了。

这个时候就可以考虑主从复制。将数据库拆分成主库和从库。主库主要负责处理事务性的增删改操作,从库负责处理查询操作。

但是我们的系统怎么知道,我们的操作是查询操作,还是增删改操作?又怎么根据操作的类型选择主库还是从库呢?

这个时候就用到了Sharding-JDBC!

4.2 Sharding-JDBC介绍

Sharding-JDBC定位为轻量级的Java框架,在Java的jdbc层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可以理解为增强版的jdbc驱动,完全兼容jdbc和各种orm框架。

  • 适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybatis,Spring JDBC Template或直接使用JDBC。

  • 支持任何第三方的数据库连接池,如:DBCP,C3P0,Druid,HikariCP等。

  • 支持任意实现JDBC规范的数据库。目前支持Mysql,Oracle,SQL server,PostgreSQL以及任何遵顼SQL92标准的数据库。

4.3 项目测试前期准备

在使用分库分表之前,先要搭建好主从复制的数据库。

然后我们先创建一个web项目:

数据库准备

CREATE TABLE `user` (
  `id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `name` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '姓名',
  `age` tinyint DEFAULT NULL COMMENT '年龄',
  `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin DEFAULT NULL COMMENT '住址',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin COMMENT='用户'

 

导入依赖

作为web项目基本的一些依赖,没什么好讲的。

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

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

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

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>1.2.76</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-boot-starter</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>com.baomidou</groupId>
            <artifactId>mybatis-plus-generator</artifactId>
            <version>3.5.1</version>
        </dependency>

        <dependency>
            <groupId>org.apache.velocity</groupId>
            <artifactId>velocity-engine-core</artifactId>
            <version>2.1</version>
        </dependency>

        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>

        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid-spring-boot-starter</artifactId>
            <version>1.2.12</version>
        </dependency>

配置文件

目前只配置了端口号和mybatisplus的相关配置

连数据源连接我们都没有配置,这是因为后面要使用sharding-jdbc

server.port=8080

mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl
mybatis-plus.global-config.db-config.logic-delete-value=1
mybatis-plus.global-config.db-config.logic-not-delete-value=0
mybatis-plus.configuration.map-underscore-to-camel-case=true
mybatis-plus.global-config.db-config.id-type=assign_id

代码生成器

使用代码生成器,快速生成刚才创建的表的controller、entity、service、mapper等文件。

 

这些做好以后,下面开始使用到sharding-jdbc!

添加依赖

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
    <version>4.0.0-RC1</version>
</dependency>

添加配置文件规则

# 定义数据源的名字,有几个填写几个,通过.隔开,名字随便取,但是后面配置主从数据源需要根据此名字进行设置
spring.shardingsphere.datasource.names=master-haha,slave-haha
# 数据源1
spring.shardingsphere.datasource.master-haha.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.master-haha.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.master-haha.url=jdbc:mysql://192.168.17.110:3306/db_test1?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.shardingsphere.datasource.master-haha.username=root
spring.shardingsphere.datasource.master-haha.password=123456
# 数据源2
spring.shardingsphere.datasource.slave-haha.type=com.alibaba.druid.pool.DruidDataSource
spring.shardingsphere.datasource.slave-haha.driver-class-name=com.mysql.cj.jdbc.Driver
spring.shardingsphere.datasource.slave-haha.url=jdbc:mysql://192.168.17.111:3306/db_test1?characterEncoding=utf-8&serverTimezone=Asia/Shanghai
spring.shardingsphere.datasource.slave-haha.username=root
spring.shardingsphere.datasource.slave-haha.password=123456

# 配置从库负载均衡策略:轮询。就是说从库实际不一定只有一台,当每次查询操作进来的时候,轮询去查每台从库。
spring.shardingsphere.masterslave.load-balance-algorithm-type=round_robin
# 设置最终数据源的名称    其实就是spring中bean对象的名称
spring.shardingsphere.masterslave.name=dataSource
# 指定主库数据源名称
spring.shardingsphere.masterslave.master-data-source-name=master-haha
# 指定从库数据源名称     从库如果有多个,通过逗号隔开
spring.shardingsphere.masterslave.slave-data-source-names=slave-haha
# 开启控制台的sql显示,默认是false
spring.shardingsphere.props.sql.show=true

以上规则定义好了,它查询就会去从库(每台从库轮询查),增删改去主库。

但是,最后还需要修改一下spring的bean覆盖策略,默认是不允许同名bean的。

为什么要修改呢?因为我们定义的bean的名称和druid中定义的bean的名字重复了。

而spring中默认不允许同名的bean的。

所以需要在配置文件中再加上一段配置

# 允许bean定义覆盖,后创建的bean会覆盖前面的同名bean对象
spring.main.allow-bean-definition-overriding=true

否则启动项目会报错

 ok,下面我们创建一些测试方法来验证一下。

4.4 验证

创建测试方法,包含增删改查

注意这里引入了一个DataSource对象,虽然实际业务代码并没有使用到,但是我们只是想看看它到底是谁。

@RestController
@RequestMapping("/user")
@Slf4j
public class UserController {

    @Autowired
    private DataSource dataSource;

    @Autowired
    private UserService userService;

    @PostMapping
    public User save(User user){
        userService.save(user);
        return user;
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
        userService.removeById(id);
    }

    @PutMapping
    public User update(User user){
        userService.updateById(user);
        return user;
    }

    @GetMapping("/{id}")
    public User getById(@PathVariable Long id){
        User user = userService.getById(id);
        return user;
    }

    @GetMapping("/list")
    public List<User> list(User user){
        LambdaQueryWrapper<User> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(user.getId() != null,User::getId,user.getId());
        queryWrapper.eq(user.getName() != null,User::getName,user.getName());
        List<User> list = userService.list(queryWrapper);
        return list;
    }
}

打上断点,以DEBUG的方式启动

断点的位置我们如图

发送请求测试

我们可以通过postman来发送请求试试,我这里使用apifox来测试。

先来查询一下

 我们发现这个datasource是shardingjdbc提供的

接着放行该请求

我们通过控制台看到,这条sql是从库去查询的!

ok,再发送添加请求试试。

我们直接放行,发现添加操作是主库执行的。

ok,下面我们再检查一下数据库

ok,主库也同步到了从库了。

五、主从复制数据不同步的问题

案例:误操作向从库添加了数据。

我通过navicat向从库的user表中生成假数据1w条,这肯定不会同步到主库的。

因为是主库写,从库读。不能乱来。

这就导致从库出现问题。我们通过show slave status;命令查看从库是否同步,发现sql转储线程停掉了。那肯定就不能继续同步数据了。

这个时候解决办法就是重新同步。具体方法时间关系就不再赘述了。附上思维导图:

MySQL主从复制那些事儿| ProcessOn免费在线作图,在线流程图,在线思维导图

文章花费了我大量心血和时间,

吃水不忘挖井人,如果对你有帮助,别忘了三连,点赞收藏评论 ~ 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1028602.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【计算机毕业设计】基于SpringBoot+Vue热门网游推荐网站的设计与实现

博主主页&#xff1a;一季春秋博主简介&#xff1a;专注Java技术领域和毕业设计项目实战、Java、微信小程序、安卓等技术开发&#xff0c;远程调试部署、代码讲解、文档指导、ppt制作等技术指导。主要内容&#xff1a;毕业设计(Java项目、小程序等)、简历模板、学习资料、面试题…

C++之va_start、vasprintf、va_end应用总结(二百二十六)

简介&#xff1a; CSDN博客专家&#xff0c;专注Android/Linux系统&#xff0c;分享多mic语音方案、音视频、编解码等技术&#xff0c;与大家一起成长&#xff01; 优质专栏&#xff1a;Audio工程师进阶系列【原创干货持续更新中……】&#x1f680; 人生格言&#xff1a; 人生…

腾讯mini项目-【指标监控服务重构】2023-07-29

今日已办 根据导师代码评审的 comment 改进 修改命名 otelclient.otelExporterOtlpEndpoint to otelclient.endpoint禁用 TLS 加密&#xff0c;移除 otelclient.insecureMode避免命名缩写影响代码的阅读理解把两个函数&#xff08;createTraceExp和createTraceProvider&#…

Softing物联网(IoT)方案之OT/IT数据集成

一 利用数据提高效率和绩效 多年以来数据集成和工业物联网一直在推动着市场的发展&#xff0c;目前我们已经能够集成并成功使用先进的技术、大量的传感器和复杂的数据格式等。而在工业物联网或工业4.0中&#xff0c;还有运营技术&#xff08;OT&#xff09;和信息技术&#xf…

会C++还需要再去学Python吗?

提到的C、数据结构与算法、操作系统、计算机网络和数据库技术等确实是计算机科学中非常重要的基础知识领域&#xff0c;对于软件开发和计算机工程师来说&#xff0c;它们是必备的核心知识。掌握这些知识对于开发高性能、可靠和安全的应用程序非常重要。Python作为一种脚本语言&…

Spring Authorization Server入门 (十八) Vue项目使用PKCE模式对接认证服务

Vue单页面项目使用授权码模式对接流程说明 以下流程摘抄自官网 在本例中为授权代码流程。 授权码流程的步骤如下&#xff1a; 客户端通过重定向到授权端点来发起 OAuth2 请求。 对于公共客户端&#xff0c;此步骤包括生成code_verifier 并计算code_challenge&#xff0c;然后…

实验5 跨交换机实现VLAN

交换机端口隔离&#xff08;access模式&#xff09; 实验目的实验拓扑实验步骤&#xff08;1&#xff09;在未划分vlan前&#xff0c;配置pc1、pc2、pc3、pc4的地址&#xff0c;如图所示&#xff08;2&#xff09;测试两台pc机的连通性&#xff08;3&#xff09;在S1中创建vlan…

必看!S3File Sink Connector 使用文档

S3File 是一个用于管理 Amazon S3&#xff08;Simple Storage Service&#xff09;的 Python 模块。当前&#xff0c;Apache SeaTunnel 已经支持 S3File Sink Connector&#xff0c;为了更好地使用这个 Connector&#xff0c;有必要看一下这篇使用文档指南。 描述 将数据输出…

springboot druid多数据源配置,及druid监控

基础配置&#xff1a; springboot2.x版本 jdk1.8 依赖&#xff1a; <dependency><groupId>com.alibaba</groupId><artifactId>druid-spring-boot-starter</artifactId><version>${druid.version}</version> </dependency> &…

分享一个基于微信小程序的高校图书馆预约座位小程序 图书馆占座小程序源码 lw 调试

&#x1f495;&#x1f495;作者&#xff1a;计算机源码社 &#x1f495;&#x1f495;个人简介&#xff1a;本人七年开发经验&#xff0c;擅长Java、Python、PHP、.NET、微信小程序、爬虫、大数据等&#xff0c;大家有这一块的问题可以一起交流&#xff01; &#x1f495;&…

Linux高性能服务器编程 学习笔记 第五章 Linux网络编程基础API

我们将从以下3方面讨论Linux网络API&#xff1a; 1.socket地址API。socket最开始的含义是一个IP地址和端口对&#xff08;ip&#xff0c;port&#xff09;&#xff0c;它唯一表示了使用TCP通信的一端&#xff0c;本书称其为socket地址。 2.socket基础API。socket的主要API都定…

打开泰坦陨落提示msvcp120.dll丢失怎么办?三个解决方法快速解决

首先&#xff0c;我们来了解一下msvcr120.dll是什么文件。msvcr120.dll是一个动态链接库文件&#xff0c;它是Microsoft Visual C 2013 Redistributable中的一个组件。这个文件对于一些软件的运行是非常重要的&#xff0c;如果缺失或损坏&#xff0c;就会导致软件无法正常运行。…

从淘宝数据分析产品需求(商品销量总销量精准月销)

淘宝数据分析总体来说可以分为商品分析、客户分析、地区分析、时间分析四大维度(参考数据雷达的分析思路)。在这里我重点说商品分析。 在淘宝上开店的竞争还是非常激烈的&#xff0c;随便拿出一个单品就有很多竞品存在&#xff0c;所以做起来还是很难的&#xff0c;而想要在众…

Git:利用Git模拟企业级项目管理

文章目录 基础知识Git分支设计规范master分支release分支develop分支feature分支hotfix分支 模拟进行企业级项目管理 本篇主要总结的是企业级开发模型以及利用Git模拟企业级别的项目管理方式 基础知识 前面已经进行了全部的关于Git的各项操作&#xff0c;那么Git是作用于企业…

<Altium Designer>向PCB导入网表(.NET)

目录 01 AD PCB导入网表(.NET) 添加.NET文件到AD工程 通过show Differences操作导入器件 02 文章总结 大家好&#xff0c;这里是程序员杰克。一名平平无奇的嵌入式软件工程师。 硬件工程师使用的是Cadence的OrCAD画原理图&#xff0c;输出的是.NET网表&#xff0c;而杰克使…

自动化测试---选择框

radio框选择选项&#xff0c;直接用WebElement的click方法&#xff0c;模拟用户点击就可以了。 比如, 我们要在下面的html中&#xff1a; 1.先打印当前选中的老师名字 2.再选择 小雷老师 <div id"s_radio"><input type"radio" name"teach…

在静态方法中访问@Value注入的静态变量!!

一、 静态变量 static修饰的成员变量&#xff0c;称为静态成员变量&#xff0c;静态成员变量最大的特性&#xff1a;不属于某个具体的对象&#xff0c;是所有对象所共享的 简单来说&#xff1a;在某些类的对象中存在一些相同的成员变量&#xff0c;那么这种成员变量就可以设置…

解决VSCode下载速度很慢

这是VSCode的官网&#xff1a; Visual Studio Code - Code Editing. Redefined 按照官网的下载链接&#xff0c;速度实在是感人&#xff01; 解决办法也很简单&#xff0c;把链接换为CDN加速的链接 把下载链接中的az764295.vo.msecnd.net 替换为&#x1f449; vscode.cdn.azu…

MySQL数据库入门到精通1--基础篇(MySQL概述,SQL)

1. MySQL概述 1.1 数据库相关概念 目前主流的关系型数据库管理系统&#xff1a; Oracle&#xff1a;大型的收费数据库&#xff0c;Oracle公司产品&#xff0c;价格昂贵。 MySQL&#xff1a;开源免费的中小型数据库&#xff0c;后来Sun公司收购了MySQL&#xff0c;而Oracle又收…

压电换能器的工作原理和应用(功率放大器)

在日常生活中&#xff0c;可能会遇到很难测量的物理量&#xff0c;例如施加在金属上的机械应力、温度、压力水平等……对于所有这些应用&#xff0c;需要一种能够以我们熟悉的单位和校准来测量这些未知量的设备&#xff0c;而比较常用的设备是换能器。 换能器是一种电气设备&am…