IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> SpringBoot项目中实现MySQL读写分离 -> 正文阅读

[大数据]SpringBoot项目中实现MySQL读写分离

1、MySQL主从复制

但我们仔细观察我们会发现,当我们的项目都是用的单体数据库时,那么就可能会存在如下问题:

  • 读和写所有压力都由一台数据库承担,?压力大
  • 数据库服务器磁盘损坏则?数据丢失?,单点故障

为了解决上述提到的两个问题,我们可以准备两 (多) 台MySQL,一台主(?Master?)服务器,一台从(?Slave?)服务器,主库的?数据变更?(写、更新、删除这些操作) ,需要?同步?到从库中 (主从复制) 。而用户在访问我们项目时,如果是?写操作?(insert、update、delete),则直接操作?主库?;如果是?读操作?(select) ,则直接操作从库,这种结构就是?读写分离?啦。

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-b1Di4XGO-1657800853974)(https://upload-images.jianshu.io/upload_images/28142708-48c8098f0912bbbb.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

在这种读写分离的结构中,从库是可以有多个的

1.1、介绍

MySQL主从复制是一个?异步?的复制过程,底层是基于Mysql数据库自带的?二进制日志?功能。就是一台或多台MySQL数据库(slave,即?从库?)从另一台MySQL数据库(master,即?主库?)进行日志的复制,然后再解析日志并应用到自身,最终实现?从库?的数据和?主库?的数据保持一致。MySQL主从复制是 MySQL数据库自带功能,无需借助第三方工具。

二进制日志:

二进制日志(BINLOG)记录了所有的 DDL(数据定义语言)语句和 DML(数据操纵语言)语句,但是不包括数据查询语句。此日志对于灾难时的数据恢复起着极其重要的作用,MySQL的主从复制, 就是通过该binlog实现的。默认MySQL是未开启该日志的。

MySQL复制过程分成三步:

  1. MySQL master 将数据变更写入二进制日志(?binary log?)
  2. slave将master的binary log拷贝到它的中继日志(?relay log?)
  3. slave重做中继日志中的事件,将数据变更反映它自己的数据

image.png

1.2、主从库搭建

在环境搭建之前,我们需要准备好两台服务器,如果生活富裕使用的是两台云服务器的时候记得要开放安全组,即防火墙;如果是比狗子我生活好点但也是用的虚拟机的话,记得别分这么多内存启动蓝屏了(别问怎么知道的)

这里就不给大家展示数据库的安装和防火墙的操作了,这个我感觉网上好多资源都能够满足遇到的问题,在搭建主从库的时候有在网上见到过说MySQL版本要一致的,我也没太留意直接就在之前的MySQL上操作了,大家可以自己去验证一下。

1.2.1、主库配置

服务器:192.168.150.100(别试了黑不了的,这是虚拟机的ip)

1、修改Mysql数据库的配置文件vim /etc/my.cnf

在打开的文件中加入下面两行,其中的server-id不一定是100,确保唯一即可log-bin=mysql-bin   #[必须]启用二进制日志server-id=100       #[必须]服务器唯一ID

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T5Zy83bF-1657800853979)(https://upload-images.jianshu.io/upload_images/28142708-bb07fee8309404b2.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

2、重启Mysql服务

这里有三个方法都能重启MySQL,最简单的无疑就是一关一开:

net stop mysql;net start mysql;systemctl restart mysqldservice mysqld restart

3、创建数据同步的用户并授权

登录进去MySQL之后才能够执行下面的命令,因为这是SQL命令,Linux不认识这玩意是啥。

GRANT REPLICATION SLAVE ON *.* to '用户名'@'开放的地址' identified by '密码';eg: GRANT REPLICATION SLAVE ON *.* to 'masterDb'@'%' identified by 'Master@123456';记得刷一下权限FLUSH PRIVILEGES;

4、查看master同步状态

这个时候还?不用退出MySQL?,因为下面的命令还是SQL命令,执行下面的SQL,可以拿到我们后面需要的两个重要参数。

show master status;

image.png

执行完这一句SQL之后,==不要再操作主库!不要再操作主库!不要再操作主库!==重要的事情说三遍,因为再操作主库之后可能会导致红框中的?两个属性值会发生变化?,后面如果发生了错误可能就和这里有那么两毛钱关系了。

1.2.2、从库配置

服务器:192.168.150.101(别试了黑不了的,这也是虚拟机的ip)

1、 修改Mysql数据库的配置文件vim /etc/my.cnf

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-djYxgYVr-1657800853981)(https://upload-images.jianshu.io/upload_images/28142708-5b3d1c243f4a2c50.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

这里要注意server-id和主库以及其他从库都不能相同,否则后面将会配置不成功。

2、重启Mysql服务

这里有三个方法都能重启MySQL,最简单的无疑就是一关一开:

net stop mysql;net start mysql;systemctl restart mysqldservice mysqld restart

3、设置主库地址及同步位置

登录进去MySQL之后才能够执行下面的命令,因为这是SQL命令

设置主库地址和同步位置change master to master_host='192.168.150.100',master_user='masterDb',master_password='Master@123456',master_log_file='mysql-bin.000010',master_log_pos=68479;记得记得开启从库配置start slave;

参数说明:

  • master_host: 主库的?IP地址
  • master_user: 访问主库进行主从复制的?用户名?( 上面在主库创建的 )
  • master_password: 访问主库进行主从复制的用户名对应的?密码
  • master_log_file: 从哪个?日志文件?开始同步 ( 即1.2.1中第4步获取的?File?)
  • master_log_pos: 从指定日志文件的哪个?位置?开始同步 ( 即1.2.1中第4步获取的?Position?)

4、查看从数据库的状态

这个时候还?不用退出MySQL?,因为下面的命令还是SQL命令,执行下面的SQL,可以看到从库的状态信息。通过状态信息中的?Slave_IO_running?和?Slave_SQL_running?可以看出主从同步是否就绪,如果这两个参数全为?Yes?,表示主从同步已经配置完成。

show slave status\G;

image.png

1.3、坑位介绍

1.3.1、UUID报错

这可能是由于linux 是复制出来的,MySQL中还有一个?server_uuid?是一样的,我们也需要修改。?vim /var/lib/mysql/auto.cnf

image.png

1.3.2、server_id报错

这应该就是各位大牛设置server_id的时候不小心设置相同的id了,修改过来就行,步骤在上面的配置中。

1.3.3、同步异常解决

这是狗子在操作过程中搞出来的一个错误……

出错的原因是在主库中删除了用户信息,但是在从库中同步的时候失败导致同步停止,下面记录自己的操作(是在进入MySQL的操作且是从库)。

MASTER_LOG_POS
STOP SLAVE;SET GLOBAL SQL_SLAVE_SKIP_COUNTER=1;START SLAVE;SHOW SLAVE STATUS\G;

在数据库中操作时,一定要注意当前所在的数据库是哪个,作为一个良好的实践:在SQL语句前加?USE dbname?。

操作不规范,亲人两行泪……

2、项目中实现

2.1、ShardingJDBC

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

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

Sharding-JDBC具有以下几个特点:

  • 适用于任何基于JDBC的ORM框架,如:JPA, Hibernate, Mybatis, Spring JDBC Template或直接使用JDBC。
  • 支持任何第三方的数据库连接池,如:DBCP, C3P0, BoneCP, Druid, HikariCP等。
  • 支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。

下面我们将用ShardingJDBC在项目中实现MySQL的读写分离。

2.2、依赖导入

在pom.xml文件中导入ShardingJDBC的依赖坐标

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

2.3、配置文件

在application.yml中增加数据源的配置

spring:  shardingsphere:    datasource:      names:        master,slave      # 主数据源      master:        type: com.alibaba.druid.pool.DruidDataSource        driver-class-name: com.mysql.cj.jdbc.Driver        url: jdbc:mysql://192.168.150.100:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false        username: root        password: 123456      # 从数据源      slave:        type: com.alibaba.druid.pool.DruidDataSource        driver-class-name: com.mysql.cj.jdbc.Driver        url: jdbc:mysql://192.168.150.101:3306/db_test?useUnicode=true&characterEncoding=utf-8&useSSL=false        username: root        password: 123456    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  # 覆盖注册bean,后面创建数据源会覆盖前面创建的数据源  main:    allow-bean-definition-overriding: true

2.4、测试跑路

这时我们就可以对我们项目中的配置进行一个测试,下面分别调用一个更新接口和一个查询接口,通过查看日志中记录的数据源来判断是否能够按照我们预料中的跑。

  • 更新操作(写操作)

image.png

  • 查询操作(读操作)

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-tvMB4V0E-1657800853988)(https://upload-images.jianshu.io/upload_images/28142708-18601ce75e915077.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)]

搞定!!!程序正常按照我们预期的成功跑起来了,成功借助ShardingJDBC在我们项目中实现了数据库的读写分离。

image.png

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2022-07-17 16:30:00  更:2022-07-17 16:33:56 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/19 22:40:47-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码