项目实现读写分离操作(mysql)

2023-11-16

读写分离

1.问题说明

在这里插入图片描述

2.读写分离

在这里插入图片描述

Master(主库)----(数据同步)—> Slave(从库) Mysql主从复制

  • mysql主从复制

    1. 介绍

      • mysql主从复制是一个异步的复制过程,底层是基于mysql数据库自带的二进制日志功能。就是一台或多台mysql数据库(Slave,即从库)从另一台mysql数据库(Master,即主库)进行日志的复制然后再解析日志并应用到自身,最终现实从库的数据和主库的数据保持一致。mysql主从复制是mysql数据库自带功能,无需借助第三方工具
      • mysql复制过程分成三步:
        • Master将改变记录二进制日志(binary log)
        • Slave将Master的binary log拷贝到它的中继日志(relay log)
        • Slave重做中继日志中的事件,将改变应用到自己的数据库中
        • 在这里插入图片描述
    2. 配置

      • 配置–前置条件

        提前准备好两台服务器,分别安装mysql并启动服务成功

        • 主库Master 服务器ip
        • 从库Slave 服务器ip
      • 配置-主库Master

        第一步:修改MySQL数据库的配置文件 /etc/my.cnf

        [mysqld]

        log-bin=mysql-bin #[必须]启用二进制日志

        server-id = 100 #[必须]服务器–ID

        第二步:重启mysql服务

        systemctl restart mysqld

        第三步:登录mysql数据库,执行下面sql

        GRANT REOLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
        
        • ==注:==上面sql的作用是创建一个用户xiaoming。密码Root@123456,并且给xiaoming用户授予REPLICATION SLAVE权限,常用于建立复制时所需要用到的用户权限,也就是Slave必须被Master授权具有该权限的用户,才能通过该用户复制。

        报错-----解决如下:

        mysql> GRANT REOLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
        ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'REOLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456'' at line 1
        
        mysql> create user xiaoming identified by 'Root@123456'
            -> ;
        Query OK, 0 rows affected (0.00 sec)
        
        mysql> grant replication slave on *.* to xiaoming
            -> ;
        Query OK, 0 rows affected (0.00 sec)
        

        第四步:登录mysql数据库,执行下面sql,记录下结果中File和Position的值

        show master status;
        

        在这里插入图片描述

        ==注意:==上面sql的作用是查看Master的状态,执行完此sql后不要再执行任何操作

      • 配置–从库Slave

        第一步:修改MySQL数据库的配置文件/etc/my.cnf

        server-id = 101  #[必须]服务器--ID
        

        第二步:重启mysql服务

        systemctl restart mysqld
        

        第三步:登录MySQL数据库,执行下面sql

        change master to 
        master_host='(主库ip地址)',master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000001',master_log_pos=603;
        
        start slave;
        

        ==注意:==如果报a running slave io thread的错!那么我们需要使用 stop slave;来停止这个异常

        第四步:登录mysql数据库,执行下面sql,查看从数据库的状态

        show slave status;
        

      在这里插入图片描述

  • 读写分离案例

    • 背景

      背景

      面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善

在这里插入图片描述

  • sharding-JDBC介绍

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

    使用sharding-JDBC可以在程序中轻松的实现数据库读写分离。

    • 适用于任何基于JDBC的ORM框架:JPA,Hibernate,MyBatis,Spring JDBC Template或直接使用JDBC。
    • 支持任何第三方的数据库连接池,如:DBCP,C3P0,BoneCP,Druid,HikariCP等。
    • 支持任意实现JDBC规范的数据库,目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库
    <dependency>
                <groupId>org.apache.shardingsphere</groupId>
                <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                <version>4.0.0-RC1</version>
    </dependency>
    
  • 入门案例

    使用sharding-JDBC实现读写分离步骤:

    1. 导入maven坐标

      <dependency>
                  <groupId>org.apache.shardingsphere</groupId>
                  <artifactId>sharding-jdbc-spring-boot-starter</artifactId>
                  <version>4.0.0-RC1</version>
              </dependency>
      
    2. 在配置文件中配置读写分离规则

      spring:
        shardingsphere:
          datasource:
            names:
              master,slave
            # 主数据源
            master:
              type: com.alibaba.druid.pool.DruidDataSource
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://(主库ip地址):3306/rw?characterEncoding=utf-8
              username: root
              password: root
            # 从数据源
            slave:
              type: com.alibaba.druid.pool.DruidDataSource
              driver-class-name: com.mysql.cj.jdbc.Driver
              url: jdbc:mysql://127.0.0.1:3306/rw?characterEncoding=utf-8
              username: root
              password: 12345678
          masterslave:
            # 读写分离配置
            load-balance-algorithm-type: round_robin #轮询
            # 最终的数据源名称
            name: dataSource
            # 主库数据源名称
            master-data-source-name: master
            # 从库数据源名称列表,多个逗号分隔
            slave-data-source-names: slave
          props:
            sql:
              show: true #开启SQL显示,默认false
        main:
          allow-bean-definition-overriding: true
      
    3. 在配置文件中配置允许bean定义覆盖配置项

      main:
          allow-bean-definition-overriding: true
      
  • 功能测试

    查询功能测试(操作Slave)

在这里插入图片描述

插入数据功能测试(操作Master)

在这里插入图片描述

  • 项目实现读写分离

    • 数据库环境准备(主从复制)
    • 代码改造
    • 功能测试
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

项目实现读写分离操作(mysql) 的相关文章

  • Laravel 5.4 升级 - 违反完整性约束 - 列不能为空

    奇怪的是 所有这些都在 5 2 中工作 但我不知道可以改变什么来实现这一点 下面是错误和正在插入的数组 SQLSTATE 23000 Integrity constraint violation 1048 Column gender can
  • MySQL 将表从 Latin1 转换为 utf8

    我需要将包含大量数据的表从 Latin1 转换为 utf8 以便它可以接受韩语字符 如何更改该表而不损坏其中的数据 我的 SQL 语句是什么 最好的方法是什么 ALTER TABLE database name table name CON
  • MySQL 左连接 WHERE table2.field = "X"

    我有以下表格 pages Field Type Null Key Default Extra page id int 11 NO PRI NULL auto increment type varchar 20 NO NULL
  • 使用“INSERT ... ON DUPLICATE KEY UPDATE”插入多条记录

    我的表结构 table marks 我的目标 我想用条件插入或更新多条记录 我目前正在通过此查询进行检查 第一步 SELECT FROM marks WHERE student 115 AND param 1 第二步 if records
  • 没有提示指令的直连接中表的顺序是否会影响性能?

    所有基于 SQL 的 RDBMS 10 年前的版本 直接连接查询 没有提示指令 中的表顺序是否会对最佳性能和内存管理产生影响 听说最后一个join应该是最大的表 您的数据库的查询优化器如何处理这种情况 回答你的问题 是的 表的顺序在连接中有
  • MVCC 如何与 MySql 中的 Lock 配合使用?

    我知道Mysql中使用锁或者MVCC可以实现并发控制 比如可重复读 但我不知道MVCC如何避免幻读 在其他地方了解到一般是通过MVCC和Gap Lock来实现的 但是目前我理解的是MVCC不需要锁 即更新和删除都是使用undo log来实现
  • JDBC 错误:在结果集开始之前[重复]

    这个问题在这里已经有答案了 我在 Java Eclipse 中收到错误消息 我在 MySql 中有一个数据库 它有列 String user name int id time int id desk int user password 我想
  • MySQL“列计数与第 1 行的值计数不匹配”是什么意思

    这是我收到的消息 ER WRONG VALUE COUNT ON ROW 列计数与第 1 行的值计数不匹配 这是我的全部代码 我的错误在哪里 DROP TABLE student CREATE TABLE employee emp id I
  • 使用 MYSQL 将 h:mm pm/am 时间格式插入数据库

    我正在尝试将以 h mm am pm 格式写入的时间插入到存储为标准 DATETIME 格式 hh mm ss 的数据库中 但我不知道如何将发布的时间转换为标准格式所以数据库会接受它 这是我到目前为止一直在尝试的 title POST in
  • 使用用户定义函数 MySql 时出错

    您好 请帮我解决这个问题 提前致谢 我在数据库中定义了这些函数 CREATE FUNCTION levenshtein s1 VARCHAR 255 s2 VARCHAR 255 RETURNS INT DETERMINISTIC BEGI
  • rake db 问题:迁移 -

    我无法为 Ruby on Rails 设置 MySQL 数据库 设置数据库并确保 config database yml 文件匹配后 我遇到了以下错误消息 U Rails alpha gt rake db migrate trace in
  • 防止 Propel 插入空字符串

    当未设置列时 如何防止 Propel ORM 插入空字符串 CREATE TABLE user uid INTEGER PRIMARY KEY AUTO INCREMENT email VARCHAR 255 NOT NULL UNIQUE
  • 使用什么框架来引导我的第一个生产 scala 项目?

    我正在第一次涉足 scala 的生产应用程序 该应用程序当前打包为 war 文件 我的计划是创建 scala 编译工件的 jar 文件 并将其添加到 war 文件的 lib 文件夹中 我的增强功能是通过 Jersey 公开的 mysql 支
  • mysql 如何将 varchar(10) 转换为 TIMESTAMP?

    我已将所有日期存储到数据库中varchar 10 现在我想将它们转换为 TIMESTAMP 当我运行sql时 ALTER TABLE demo3 CHANGE date date TIMESTAMP NOT NULL 它提醒 1292 In
  • MySQL:@@ 是什么意思?

    我正在阅读本页上的 MySQL 文档 http dev mysql com doc refman 5 1 en set statement html http dev mysql com doc refman 5 1 en set stat
  • 如何从 MySQL 数据查询创建 XML 文件?

    我想知道一种仅使用 MySQL 查询创建 XML 文件的方法 根本不使用任何脚本语言 有关于这个主题的书籍 教程吗 UPDATE 我想澄清一下 我想使用 sql 查询将 XML 数据转发到 php 脚本 Here s 关于从 MySQL S
  • 研究MySQL、SQLite源码了解RDBMS实现[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我知道实现数据库是一个很大的话题 但我想通过研究数据库系统的源代码来基本了解数据库系统的工作原理 例如
  • 奇怪的 MySQL Python mod_wsgi 无法连接到 'localhost' (49) 上的 MySQL 服务器问题

    StackOverflow上也有类似的问题 但我还没有发现完全相同的情况 这是在使用 MySQL 的 OS X Leopard 机器上 一些起始信息 MySQL Server version 5 1 30 Apache 2 2 13 Uni
  • 选择获取与 MySQL Group 中 max 对应的整行

    当我使用Max使用后查找特定 MySQL 组中字段的最大值GROUP BY 是否可以获取包含最大值的整行 我在处理一些论坛代码时偶然发现了这个线程 我想获取每个线程的最新帖子并将其显示在特定板的线程列表中 Quassnoi上面的回答对我非常
  • 使用 PHP 将 latin1_swedish_ci 转换为 utf8

    我有一个数据库 里面充满了类似的值 Dhaka 应该是 Dhaka 因为我在创建数据库时没有指定排序规则 现在我想修复它 我无法从最初获取数据的地方再次获取数据 所以我在想是否可以在 php 脚本中获取数据并将其转换为正确的字符 我已将数据

随机推荐

  • 可以解释一下什么是补码吗?

    补码是一种用来表示二进制数的方法 也是计算机中常用的数值表示方式之一 在补码中 正数的二进制表示与原码相同 而负数的二进制表示则是将对应正数的二进制表示按位取反后加上1 例如 在8位补码中 3的二进制表示为11111101 对应的正数是00
  • 输入3个整数,按从小到大的顺序输出

    include
  • mysql每秒最多能插入多少条数据 ? 死磕性能压测

    2019独角兽企业重金招聘Python工程师标准 gt gt gt 前段时间搞优化 最后瓶颈发现都在数据库单点上 问DBA 给我的写入答案是在1W 机械硬盘 左右 联想起前几天infoQ上一篇文章说他们最好的硬件写入速度在2W后也无法提高
  • MobileNet V3 网络结构的原理与 Tensorflow2.0 实现

    文章目录 介绍 MobileNet V3 的创新 1 SE模块的加入 2 修改尾部结构 3 修改通道数量 4 改变激活函数 SE 模块中 BottleNeck 模块中 MobileNet V3 网络结构 1 MobileNet V3 Lar
  • transformer包中的bert预训练模型的调用详解

    文章目录 Bert调用 安装transformers BertTokenizer BertModel Bert调用 2018年的10月11日 Google发布的论文 Pre training of Deep Bidirectional Tr
  • JS获取URL中的Query参数

    需求描述 获取 URL 中的 Query 参数 例如 https www example com test html a param1 b param2 代码片段 实现一 使用URLSearchParams对象 兼容性见Can I use
  • ov5640 PLL时钟、图像大小、帧率寄存器配置

    不同像素和时钟的ov5640摄像头寄存器配置方法 配置摄像头寄存器 网上没有明说的 参考正点原子的文档进行介绍 像素大小配置 0x3801 0x3807 设置ISP大小 0 0 2631 1951 0x3808 0x380B 设置输出图像大
  • 经验分享-前端与后端的接口、HTML分离

    在WEB项目中 前后端不分离多人开放效率还不及一个人开发效率来的高 今天分享一个概念 后端写一个同一个的接口 此接口用于前端根据自己放在服务器上的文件地址生成 但访问处此地址的时候加载相关的一个总的JS用于加载其他的JS CSS HTML文
  • 计算机中丢失msvcp140.dll无法启动此程序怎么办(修复教程)

    DLL是Dynamic Link Library的缩写 意为动态链接库 dll文件是电脑系统及软件运行的重要文件 电脑如果丢失dll文件 那么很多软件跟游戏都是无法运行的 msvcp140 dll丢失这个问题就有很多小伙伴遇到 小编今天就分
  • JS 实现body背景颜色切换

    使用JS点击按钮 实现背景颜色的切换 效果如下 代码实现
  • 使用 React 18 流式传输 SSR 的指南

    React 18 引入了许多令人兴奋的变化和特性 这可能是您已经听说过很多的事情 并且有充分的理由 尽管稍微不那么引人注目 但在 React SSR 架构中也有一些非常令人兴奋的发展 要了解 React 18 带来的突破 必须查看整个时间线
  • 参加2013年大连软件开发者大会

    昨天参加了东软和QClub合办的2013大连软件开发者大会 在此总结一下 这次活动是东软的攻城狮俱乐部主办的 本来是想要向大连的广大程序员朋友征集讲师 但是大家的响应不是特别积极 所以就改成了找讲师的形式 我报了个名 然后通过InfoQ找到
  • 任务6 学生宿舍信息管理系统

    系列文章 任务6 学生宿舍信息管理系统 已知宿舍的信息包括 宿舍楼号 宿舍号 床位号 对应床位号的学生学号 楼长姓名等 设计程序能实现以下功能 1 宿舍信息录入 可随时增加宿舍信息到数据文件中 2 宿舍信息浏览 宿舍的信息输出到屏幕 3 查
  • 【NoSQL数据库技术与应用】【课本代码】【课后题答案】【暂不更新了】

    文章目录 一 课本代码 第1章 初识NoSQL 第2章 文档存储数据库MongoDB 第3章 MongoDB数据库操作 3 8 使用Java操作MongoDB 1 搭建JAVA环境 1 Java配置 2 Maven配置 3 基于Java A
  • nginx进程监控(Keepalived)

    bin bash nginx 家目录 NG HOME xxx xxx nginx Keepalived家目录 HA HOME xxx xxx keepalived RE pid of nginx wc l if RE eq 0 then N
  • 语义熵:QoE-Aware Resource Allocation for Semantic Communication Networks

    目录 论文简介 语义熵的意义 语义熵的定义 论文简介 作者 Lei Yan Zhijin Qin Rui Zhang Yongzhao Li Geoffrey Ye Li 发表期刊or会议 GLOBECOM 发表时间 2022 12 语义熵
  • Python Selenium搭建UI自动化测试框架

    自动化测试是软件测试中非常重要的一部分 可以提高测试效率和测试覆盖率 在UI自动化测试中 Selenium是非常流行的工具 本文将介绍如何使用Python和Selenium搭建UI自动化测试框架 一 环境准备 在开始搭建UI自动化测试框架之
  • phpmyadmin版本对应的各php版本

    phpmyadmin支持的php版本如下 phpmyadmin4 0 PHP5 2 PHP5 3 PHP5 4 PHP5 5 PHP5 6 PHP7 0 PHP7 1 PHP7 2 PHP7 3 PHP7 4 phpmyadmin4 4 P
  • linux 之 内核实时性

    1 linux 实时性方案 单内核方案 主线软实时内核 打PREEMPT RT补丁 使内核成为硬实时内核 双内核方案 主线普通内核 实时内核 例如 RT linux RTAI Xenomai 2 实时性和抢占性 实时性 实时分为硬实时和软实
  • 项目实现读写分离操作(mysql)

    读写分离 1 问题说明 2 读写分离 Master 主库 数据同步 gt Slave 从库 Mysql主从复制 mysql主从复制 介绍 mysql主从复制是一个异步的复制过程 底层是基于mysql数据库自带的二进制日志功能 就是一台或多台