springbootmybatis读写分离,springboot redis读写分离

  springbootmybatis读写分离,springboot redis读写分离

  00-10101、MySQL主从复制1.1、二进制日志介绍:MySQL复制过程分为三步:1.2、主从库构建1.2.1、主库配置1.2.2、从库配置1.3、坑位置介绍1.3.1、UUID错误1.3.2、server_id错误1。

  

目录
但是仔细观察之后,我们会发现,当我们所有的项目都是单一数据库的时候,那么可能会存在以下问题:

  所有的读写压力都由一个数据库承担,压力大数据库服务器的磁盘损坏就是数据丢失,和单点故障。为了解决上面提到的两个问题,我们可以准备两台(多台)MySQL服务器和一台主(Master)服务器。一个从(Slave)服务器,主库的数据变更(写、更新、删除这些操作),需要同步到从库(主从拷贝)。用户访问我们的项目时,如果是写操作(插入、更新、删除),如果是主库(选择),就直接操作读操作;直接操作从库,这个结构就是读写分离.

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

  

1、MySQL主从复制

Mysql主从复制是一个异步复制过程,底层基于Mysql数据库的二进制日志函数。即一个或多个MySQL数据库(slave,从库)从另一个MySQL数据库(master,http://www . Sina.com/)复制日志,然后解析日志应用到自己身上,最终实现主库从库.的数据一致。MySQL的主从复制是MySQL数据库的原生功能,不需要借助第三方工具。

  00-1010 BINLOG记录所有DDL(数据定义语言)语句和DML(数据操作语言)语句,但不包括数据查询语句。该日志在灾难中的数据恢复中起着极其重要的作用,MySQL的主从复制就是通过该binlog实现的。MySQL默认不打开这个日志。

  

1.1、介绍

MySQL主服务器将数据更改写入二进制日志(主库)从服务器将主服务器的二进制日志复制到其中继日志(binary log)从服务器重做中继日志中的事件,并将数据更改反映到自己的数据中。

  00-1010环境搭建之前,我们需要准备两台服务器。如果你生活富裕,使用两台云服务器,记得打开安全组,也就是防火墙;如果是比狗命好的虚拟机,但是也用,记得不要分那么多内存启动蓝屏(别问你怎么知道的)

  这里就不展示数据库的安装和防火墙的操作了。感觉网上很多资源都能满足遇到的问题。在建立主从数据库的时候,我在网上看到MySQL版本应该是一致的。没怎么关注,只是在之前的MySQL上操作了一下。你可以自己验证一下。

  00-1010服务器:192.168.150.100(不能黑的不要尝试,这是虚拟机的ip)

  relay log

  在打开的文件中添加以下两行,其中server-ID不一定是100,而只是log-bin=mysql-bin #[ must]启用二进制日志server-id=100 #[ must]唯一服务器ID。

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

  这里有三种重启MySQL的方法,最简单的无疑是关闭再打开:

  net stop mysqlnet启动mysqlsystemctl重新启动mysqldservice mysqld重新启动

  p>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;

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

  

  

1.2.2、从库配置

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

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

  

  这里要注意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_runningSlave_SQL_running可以看出主从同步是否就绪,如果这两个参数全为Yes,表示主从同步已经配置完成。

  

show slave statusG;

  

  

1.3、坑位介绍

  

1.3.1、UUID报错

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

  

  

  

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 STATUSG;
在数据库中操作时,一定要注意当前所在的数据库是哪个,作为一个良好的实践:在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、测试跑路

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

  更新操作(写操作)

  查询操作(读操作)

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

  

  

总结

到此这篇关于SpringBoot项目中如何实现MySQL读写分离的文章就介绍到这了,更多相关SpringBootMySQL读写分离内容请搜索盛行IT以前的文章或继续浏览下面的相关文章希望大家以后多多支持盛行IT!

郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。

留言与评论(共有 条评论)
   
验证码: