Mysql 实现读写分离(主从复制)

搭建Mysql主从复制 MySQL主从复制是一种常用的数据库高可用性解决方案,可以提高数据库的可用性和性能。本教程将介绍如何搭建MySQL主从复制。基于语句的复制(STATEMENT):在主服务器上执行的 SQL 语句,在从服务器上执行同样的语句。MySQL 默认采用基于语句的复制,效率比较高。基于行的复制(ROW):不记录 SQL 语句上下文信息,仅保存哪条记录被修改。混合类型的复制(MIXED):默认采用基于语句的复制,一旦发现基于语句无法精确复制时,就会采用基于行的复制。 阅读详情

一、概念

系统读写操作比例为10:1,为了减轻数据库的读压力,将读写分开,主库用来写数据,多个从库用来读数据,为了保证数据读取的完整性,就要把主库的数据复制到从库(主从复制)

数据层面上来说是主从复制,业务上来说是读写分离

二、搭建主从复制

mysql版本:5.7
操作系统版本:centos7.6

这里以一台master,一台slave演示

1.修改配置文件

master节点添加以下内容

vim /etc/my.cnf

添加以下配置

server-id=1000

#开启binlog
log-bin=mysql-master-bin

#忽略哪些库
binlog-ignore-db=mysql

binlog_cache_size=1M

#主从复制的混合模式
binlog_format=mixed

slave节点配置文件添加以下内容

#同一局域网内 一定要唯一
server-id=1001


#开启binlog
log-bin=mysql-slave-bin


#中继日志文件
relay_log=mysql-relay-bin


##忽略哪些库
binlog-ignore-db=mysql


#如果需要同步函数和存储过程
log_bin_trust_function_creators=true


binlog_cache_size=1M


##主从复制的混合模式
binlog_format=mixed


#忽略主键重复的错误
slave_skip_errors=1062

2.在主库开启从库对主库的访问权限

grant replication slave,replication client on *.* to 'root'@'slave库ip' identified by '从库密码';

查看主库的binlog文件和复制的位置

show master status;

在这里插入图片描述

3.在从库配置连接主库的user,ip,密码,主库的binlog文件,复制的位置

change master to master_host='master库ip', master_user='root', master_password='密码', master_port=3306, master_log_file='mysql-master-bin.000001', master_log_pos=1884;

4.开启从库,查看从库状态

在从库执行 start slave; 开启从库
查看从库状态 show slave status\G;

在这里插入图片描述
如果两个都是yes,说明主从复制完成

报错可能原因
1:密码输错,导致从库没有访问权限
2:master的binlog文件名写错,positon复制位置写错

使用Sharding-jdbc结合springboot实现读写分离操作

1.创建项目,引入依赖

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.4.5</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.levi</groupId>
    <artifactId>sharding-jdbc</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>sharding-jdbc</name>
    <description>Demo project for Spring Boot</description>
    <properties>
        <java.version>1.8</java.version>
        <sharding-sphere.version>4.0.0-RC1</sharding-sphere.version>
    </properties>
  <dependencies>
      <!-- 依赖web -->
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-web</artifactId>
      </dependency>
      <!-- 依赖mybatis和mysql驱动 -->
      <dependency>
          <groupId>org.mybatis.spring.boot</groupId>
          <artifactId>mybatis-spring-boot-starter</artifactId>
          <version>2.1.4</version>
      </dependency>
      <dependency>
          <groupId>mysql</groupId>
          <artifactId>mysql-connector-java</artifactId>
          <scope>runtime</scope>
      </dependency>
      <!--依赖lombok-->
      <dependency>
          <groupId>org.projectlombok</groupId>
          <artifactId>lombok</artifactId>
          <optional>true</optional>
      </dependency>
      <dependency>
          <groupId>org.springframework.boot</groupId>
          <artifactId>spring-boot-starter-test</artifactId>
          <scope>test</scope>
      </dependency>
      <!--依赖sharding-->
      <dependency>
          <groupId>org.apache.shardingsphere</groupId>
          <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
          <version>${sharding-sphere.version}</version>
      </dependency>
      <dependency>
          <groupId>org.apache.shardingsphere</groupId>
          <artifactId>sharding-core-common</artifactId>
          <version>${sharding-sphere.version}</version>
      </dependency>
      <!--依赖数据源druid-->
      <dependency>
          <groupId>com.alibaba</groupId>
          <artifactId>druid-spring-boot-starter</artifactId>
          <version>1.1.21</version>
      </dependency>
      <dependency>
          <groupId>junit</groupId>
          <artifactId>junit</artifactId>
          <scope>test</scope>
      </dependency>
  </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <version>2.3.4.RELEASE</version>
            </plugin>
        </plugins>
    </build>

</project>

mapper接口

@Repository
public interface UserMapper {
    @Insert("insert into user (nickname,password,age,sex,birthday) values(#{nickname},#{password},#{age},#{sex},#{birthday})")
    void addUser(User user);
    @Select("select * from user")
    List<User> findUsers();
}

yml文件(最重要)

server:
  port: 8085
spring:
  main:
    allow-bean-definition-overriding: true
  shardingsphere:
    # 参数配置,显示sql
    props:
      sql:
        show: true
    # 配置数据源
    datasource:
      # 给每个数据源取别名,下面的ds1,ds2,ds3任意取名字
      names: ds1,ds2,ds3
      # 给master-ds1每个数据源配置数据库连接信息
      ds1:
        # 配置druid数据源
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://master库ip:3306/test?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT%2b8
        username: root
        password: 密码
        maxPoolSize: 100
        minPoolSize: 5
      # 配置ds2-slave
      ds2:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://slave库ip:3306/test?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT%2b8
        username: root
        password: 密码
        maxPoolSize: 100
        minPoolSize: 5
      # 配置ds3-slave
      ds3:
        type: com.alibaba.druid.pool.DruidDataSource
        driver-class-name: com.mysql.cj.jdbc.Driver
        url: jdbc:mysql://slave库ip:3306/test?useUnicode=true&characterEncoding=utf8&tinyInt1isBit=false&useSSL=false&serverTimezone=GMT%2b8
        username: root
        password: 密码
        maxPoolSize: 100
        minPoolSize: 5
    # 配置默认数据源ds1
    sharding:
      # 默认数据源,主要用于写,注意一定要配置读写分离 ,注意:如果不配置,那么就会把三个节点都当做从slave节点,新增,修改和删除会出错。
      default-data-source-name: ds1
#     配置数据源的读写分离,但是数据库一定要做主从复制
    masterslave:
      # 配置主从名称,可以任意取名字
      name: ms
      # 配置主库master,负责数据的写入
      master-data-source-name: ds1
      # 配置从库slave节点
      slave-data-source-names: ds2,ds3
      # 配置slave节点的负载均衡均衡策略,采用轮询机制   默认为随机(random)
      load-balance-algorithm-type: round_robin
# 整合mybatis的配置XXXXX
mybatis:
  mapper-locations: classpath:mapper/*.xml
  type-aliases-package: com.levi.shardingjdbc.entity

controller

@RestController
public class UserController {

    @Resource
    private UserMapper userMapper;

    @GetMapping("addUser")
    public Object addUser() {
//        User user = new User("levi","123456",1,"1995-8-11");
        User user = new User();
        user.setNickname("levi");
        user.setPassword("123456");
        user.setAge(20);
        user.setSex(1);
        user.setBirthday(LocalDateTime.now());
        userMapper.addUser(user);
        return "ok";
    }


    @GetMapping("findUsers")
    public Object findUsers() {
        return userMapper.findUsers();
    }
}

启动项目,调用接口
可以发现插入都是走ds1主库,查询从ds2和ds3轮训
在这里插入图片描述

总结

1.主库要开通bin-log,通过监听bin-log文件,把变更发送给从库,从库把变更记录到本地的中继日志文件,然后执行对应sql,保证与主库数据一致
2.sharding-jdbc通过管理数据库连接,解析应用执行的sql,根据sql的操作类型决定时打到主库还是从库,来实现读写分离操作
在这里插入图片描述
补充:
主从复制延迟问题
延迟原因:

  1. 网络传输需要时间,io操作
  2. 从库sql线程执行的同时,如果遇到比较大的select语句锁表,那么执行sql要等待

解决方案:强制走主库
注解+aop实现

注解定义

@Retention(value = RetentionPolicy.RUNTIME)
@Target(value = ElementType.METHOD)
public @interface ToMasterDB {
}

定义切面

@Aspect
@Slf4j
@Component
public class ToMasterAspect {

    /**
     * 定义切入点  注解
     */
    @Pointcut("@annotation(com.levi.shardingjdbc.annotation.ToMasterDB)")
    public void joinPoint(){

    }

    @Around("joinPoint()")
    public Object around(ProceedingJoinPoint pjp) throws Throwable {
        HintManager.getInstance().setMasterRouteOnly();
        log.info("sharding-jdbc强制走主库");
        Object result = pjp.proceed();
        HintManager.clear(); //一定要clear掉,不然其他的select操作也会走主库
        return result;
    }
}

controller再加一个方法测试 可见该方法一直都是走主库查询

    @GetMapping("findByMaster")
    @ToMasterDB
    public Object findByMaster() {
        return userMapper.findUsres();
    }
数据库集群、主从备份、读写分离 什么是主从复制、读写分离、为什么要使用 一、什么是主从复制、读写分离、为什么要使用 主从复制:是一种数据备份的方案。 简单来说,是使用两个或两个以上相同的数据库,将一个数据库当做主数据库,而另一个数据库当做从数据库。在主数据库中进行相应操作时,从数据库记录下所有主数据库的操作,使其二者一模一样。 读写分离:是一种让数据库更稳定的的使用数据库的方法。 是在有从数据库的情况下使用,当主数据库进行对数据... 阅读详情

相关推荐

SpringBoot+ShardingSphereJDBC 实现读写分离 + MySQL主从复制

本文讲述了如何使用+进行读写分离,以及利用MySQL进行一主一从的主从复制。MySQL主从复制环境准备(Docker)搭建++Druid环境测试数据库中间件可以简化对读写分离以及分库分表的操作,并隐藏底层实现细节,可以像操作单库单表那样操作多库多表,主流的设计方案主要有两种:服务端代理:需要独立部署一个代理服务,该代理服务后面管理多个数据库实例,在应用中通过一个数据源与该代理服务器建立连接,由该代理去操作底层数据库,并返回相应结果。

uuqaz的博客 1228

Mysql读写分离的四种方案

数据库写入效率要低于读取效率,一般系统中数据读取频率高于写入频率,单个数据库实例在写入的时候会影响读取性能,这是做读写分离的原因。以上四种方案各有优缺点,基于MySQL proxy代理的方式对于应用来说相对简单,但是在项目稳定性、事务支持性等方面还存在问题;而基于应用内路由的方式固然灵活度比较高,但是也增加了应用逻辑的复杂度;基于mysql-connector-java的jdbc驱动和sharding-jdbc的方式在使用上相对简单,但限制了需要使用java开发。

ZhaZha_Yi的博客 3589

MySQL 读写分离实例详解

MySQL 读写分离 MySQL读写分离又一好办法 使用 com.mysql.jdbc.ReplicationDriver 在用过Amoeba 和 Cobar,还有dbware 等读写分离组件后,今天我的一个好朋友跟我讲,MySQL自身的也是可以读写分离的,因为他们提供了一个新的驱动,叫 com.mysql.jdbc.ReplicationDriver 说明文档:http://dev.mysql.com/doc/refman/5.1/en/connector-j-reference-replication-connection.html  代码例子: import java.sql.Conn

【详解】Mycat在MySQL主从复制基础上实现读写分离

Mycat是一个开源的分布式数据库中间件,支持SQL解析、数据分片、读写分离等高级功能。它位于应用和数据库之间,对应用透明,可以有效地解决数据库的扩展性和性能问题。Mycat 通过配置文件和内部的 SQL 解析逻辑实现了读写分离。通过合理配置 ​​balance​​​、​​​、​​​ 和 ​​ 等属性,可以灵活地控制读写请求的路由策略,从而提高系统的性能和可用性。

牛肉胡辣汤 1258

图形学基础|球谐光照(Spherical Harmonics Lighting)

球谐光照(Spherical Harmonics Lighting) 文章目录球谐光照(Spherical Harmonics Lighting)一、前言二、球谐函数2.1 基函数2.2 投影与重建2.3 应用三、漫反射环境光3.1 IrradianceMap3.2 数学推导3.3 实践参考博文 一、前言 在学习图形渲染的过程中,一直對球谐函数(球谐光照)有一点了解,但没有亲手实现过。 关于球谐函数的数学概念是比较复杂的,笔者也实在无法完全理解,这篇文章只能从做东西的角度来说,公式是如何和代码进行对应的。

【黑键】 1万+

九齐NY8B062F单片机:12位ADC与4路PWM在智能家居控制中的实战应用

本文详细介绍了九齐NY8B062F单片机在智能家居控制中的实战应用,重点解析其12位ADC高精度传感器数据采集和4路PWM精准驱动技术。通过实际案例展示如何利用该单片机实现温湿度监测、灯光调节及电机控制,并分享低功耗设计与抗干扰方案,为低成本高可靠性的智能家居设备开发提供完整解决方案。

rnn9storyteller的博客 730

Mysql实现主从复制、读写分离

MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制,然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。二进制日志:二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。

LiuCJ_20000的博客 1792

SentEval学习笔记

SentEval allows you to evaluate your sentence embeddings as features for the followingdownstreamtasks: Task Type #train #test needs_train set_classifier MR movie review(影评) 11k 11k 1 1 CR product review(产品评述) ...

AlphaFinance 803

Mysql——基于主从复制实现读写分离(mysql-proxy)

一、读写分离的概念 什么是读写分离 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。因此,一般来说都是通过主从复制(Master-Slave)的方式来同步数据,再通过读写分离(MySQL-Proxy)来提升数据库的并发负载能力这样...

试试看吧。 322

激光除草技术原理与应用全解析

激光除草技术通过光热、光化学等效应精准破坏杂草组织,核心参数包括功率(20-6000W)、波长(400nm-10.6μm)和脉冲宽度。主要应用于大田作物(如玉米、棉花)、经济作物(烟草、果树)及城市绿化,具有环保(无化学污染)、高效(识别率≥95%)和非接触等优势,但存在设备成本高(20-50万元)、技术门槛高等局限。当前技术融合AI识别、多光谱协同等创新,国产设备如华工智耘已实现95.3%识别精度。虽短期投入较高,但长期可降低30%除草成本,并带来环境效益(每亩减排1.2吨CO₂)

start_up_go的博客 556

3D Slicer学习记录(4)-PLUSapp连接双目相机Intel Realsense

plusapp是基于openIGTLink协议的免费的开源库和应用程序API接口,用于数据采集、预处理、校准和实时流成像、位置跟踪和其他传感器数据。这里以intel realsense双目相机为例详细的演示整个图像流导入到3D Slicer的流程。

weixin_39090239的博客 1344

实现Mysql主从复制读写分离

实现Mysql主从复制读写分离记录本次研究是通过配置Mysql实现主从复制,使用Amoeba代理实现读写分离。参照资料:http://my.oschina.net/u/1169079/blog/390726Mysql主从复制:根据查资料发现,只需修改对应的mysql文件目录下的my.ini配置文件,之后在命令行界面执行相关命令后,即可实现主从复制。分工及工具如下主数据库:董胜燕  IP:192.1...

沉默的小蜗牛 2246

从零开始学习PX4源码20(遥控器模式切换如何执行)

本节主要学习PX4的手动遥控器切换模式,具体是如何实现的,具体改变了哪些变量,和模式管理有什么联系。

陌城烟雨 315

MySQL主从复制实现读写分离

MySQL主从复制(二进制日志)、 Sharding-JDBC实现读写分离

种一棵树最好的时间是十年前,其次是现在 1732

[27] cuda 应用之 核函数实现图像通道变换

[27] cuda 应用之 核函数实现图像通道变换

yohnyang的博客 201

Backtrader Web:开源量化交易全栈平台

Backtrader Web是一个基于Backtrader框架的现代化量化交易全栈平台,将专业回测引擎与Web技术结合,提供从策略开发到实盘交易的完整解决方案。平台采用FastAPI+Vue3技术栈,具有118个内置策略模板、专业可视化分析工具和完整的策略生命周期管理功能。支持策略版本控制、参数优化、模拟/实盘交易及监控告警,通过RESTful API和WebSocket实现前后端交互。系统采用模块化设计,包含策略服务、回测服务等核心模块,支持SQLite/PostgreSQL等多种数据库。安装简单,5分钟

云金杞 641

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

Sharding-JDBC定位为轻量级的Java框架,在Java的jdbc层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可以理解为增强版的jdbc驱动,完全兼容jdbc和各种orm框架。适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybatis,Spring JDBC Template或直接使用JDBC。支持任何第三方的数据库连接池,如:DBCP,C3P0,Druid,HikariCP等。支持任意实现JDBC规范的数据库。

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

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

实现在同一台linux主机上mysql主从复制与读写分离

环境情况:由于资源有限,仅在一台CentOS release 6.6上实现M-S主从复制与读写分离 一、mysql安装与配置 具体安装过程建议参考我的上篇一博客文章 二、mysql主从复制 主(m)   :172.30.204.111:3307 从1(s1):172.30.204.111:3308 从2(s2):172.30.204.111:3309 [root@ma

dmy_521的专栏 5427

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

docker 部署MySQL实现主从复制读写分离

详细阐述了通过Docker-Compose配置MySQL主架构,包括设置复制参数、配置用户权限等步骤。此外,并通过proxy SQL实现读写分离,旨在提高数据库系统的读取性能与可靠性。通过这一架构,系统能够自动将读请求分发到从节点,而写请求则保留在主节点,有效平衡了负载并增强了数据安全性,另介绍部署过程中的相关注意事项。。

sozee910的博客 1712

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

MySQL主从复制与读写分离的实现

MySQL主从复制与读写分离 MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践 Mysql作为目前世界上使用最广泛的免费数据库,相信所有从事系统运维的工程师都一定接触过。但在实际的生产环境中,由单台Mysql作为独立的数据库是完全不能满足实际需求的,无论是在安全性,高可用性以及高并发等各个方面。 因此,一般来说都是通过 主从复制(Master

ccrrt的专栏 2万+

Linux系统实现MySQL的主从复制及读写分离

在Linux部署Mysql,实现主从复制及读写分离

weixin_65607252的博客 581

实现mysql主从复制、读写分离

目录 1.1 为什么要做主从复制? 1.2 主从复制的原理是什么? 1.3 复制的基本原则 1.4 复制的最大问题 2. 实战MySQL主从复制 2.1 环境说明 2.2 MySQL主从复制的复制方式 2.2.1 SBR方式的优缺点 2.2.2 RBR方式的优缺点 2.2.3 混合方式 2.2.4 全局事务标识符 GTID 2.3 实现MySQL主从复制需要进行的配置 2.4 修改master配置 2.5 在主机上建立账户并授权slave 2.6 告知从服务器二进制文件名.

ChaoticNg的博客 602

SpringBoot环境-MySQL主从复制,读写分离的实现

记录sharding-jdbc框架的使用-主从复制,读写分离实现的步骤及测试。

maohe的博客 3456

分布式 MySQL - 读写分离与主从复制的实现

主从复制和读写分离不仅是提升 MySQL 性能的强力工具,也是迈向分布式架构的第一步。它们让你在处理海量数据时更加从容,同时为系统的扩展性和容灾能力提供了保障。如果说单实例是“赤手空拳”,那么分布式 MySQL 就是“十八般武器”!赶紧试试吧,不仅能让数据库更快,还能让自己更帅!毕竟,技术也需要“积累”,才会有“深度”!😎。

一名热衷于技术的全栈开发者,专注于前端与后端的全面技术探索。在这里,我将分享我在技术领域的学习与成长,助力更多开发者的进步。 907

MySQL主从复制+MyCat读写分离实现

作用: 主数据库损坏可以切到从数据库运行, 读写分离Mysql主从的底层实现是通过binlog日志方式来实现的,一个写请求发送到主mysql后会在binlog日志中追加相应的记录mysql中会通过一个中继日志的线程来同步从mysql来实现主从复制MySQL数据库自身提供的主从复制功能可以方便的实现数据的多处自动备份,实现数据库的拓展。多个数据备份不仅可以加强数据的安全性,通过实现读写分离还能进一步提升数据库的负载性能。

陌殇殇的博客 998
上一篇: seataAT模式实现分布式事务
下一篇: 布隆过滤器解决缓存穿透
livel_java
博客等级 码龄9年 2916粉丝 29原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值