[瑞吉外卖]-09数据库优化
MySql主从复制
介绍
当前项目中, 数据库的读和写都由一台数据库承担,压力大, 数据库服务器磁盘损坏则数据丢失,造成单点故障
MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的二进制日志功能。
- 就是一台或多台MySOL数据库(slave,即从库)从另一台MySOL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。
- MySQL主从复制是MySOL数据库自带功能,无需借助第三方工具。
MySQL复制过程分成三步:
- master将改变记录到二进制日志(binary log)
- slave将master的binary log拷贝到它的中继日志(relaylog)
- slave重做中继日志中的事件,将改变应用到自己的数据库中
配置
提前准备好两台服务器, 分别安装mysql并启动服务
- 主库Master 192.168.138.100
- 从库slave 192.168.138.101
配置主库Master
第一步: 修改Mysql数据库的配置文件 /etc/my.cnf
- 修改的内容:
- [mysqld]
- log-bin=mysql-bin #[必须]启用二进制日志
- server-id=100 #[必须]服务器唯一ID
- 注意:
- 服务器id可以随便写, 只要是唯一的就行
- vim /etc/my.cnf
第二步: 重启Mysql服务, 因为修改了数据配置
- systemctl restart mysqld
第三步: 登录Mysql数据库,执行下面SQL
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
- 上面SQL的作用是创建一个用户xiaoming,密码为Root@123456,并且给xiaoming用户授予REPLICATION SLAVE权限。
- 该命令常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。
- 登录数据库: mysql -uroot -proot
第四步: 登录Mysql数据库,执行下面SQL,记录下结果中File和Position的值, 后面有用
- 命令: show master status;
- 上面SOL的作用是查看Master的状态,执行完此SOL后不要再执行任何操作
配置从库Slave
第一步: 修改Mysql数据库的配置文件 /etc/my.cnf
- [mysqld]
- server-id=101 #[必须]服务器唯-ID
第二步: 重启Mysql服务
- systemctl restart mysqld
第三步: 登录Mysql数据库,执行下面SQL
- 命令1:
change master to
master_host='192.168.138.100',master_user='xiaoming',master_password='Root@123456',master_log_file='mysql-bin.000001',master_log_pos=439;
- 命令2:
start slave;
第四步: 登录Mysql数据库,执行下面SQL,查看从数据库的状态
- 命令: show slave status;
测试
连接两台数据库, 主库的增删改操作, 从库都会自动同步
Sharding-JDBC
背景
面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。
- 对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,
- 将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,
- 从库负责处理查询操作,
- 能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。
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规范的数据库。目前支持MySOL,Oracle,SOLServer,PostgreSQL 以及任何遵循SQL92标准的数据库。
入门案例
环境准备: 新建数据库和user表, 打开rw_demo工程
- user表id字段的类型要用bigint
导入maven坐标
<dependency>
<groupld>org.apache.shardingsphere</groupId)
<artifactId>sharding-jdbc-spring-boot-starter</artifactId)
<version>4.0.0-RC1</version>
</dependency>
在配置文件中配置读写分离规则
server:
port: 8080
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.138.100: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://192.168.138.101:3306/rw?characterEncoding=utf-8
username: root
password: root
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
在配置文件中配置允许bean定义覆盖配置项
server:
port: 8080
spring:
shardingsphere:
... ...
main:
allow-bean-definition-overriding: true
功能测试
使用了Sharding-JDBC之后, 操作数据时, 读操作就会查询从数据库, 写操作就会操作主数据库,实现读写分离
项目改造
数据量库环境准备(主从复制)
直接使用我们前面在虚拟机中搭建的主从复制的数据库环境即可
在主库中创建瑞吉外卖项目的业务数据库reggie并导入相关表结构和数据
代码改造
新建分支
在项目中加入Sharding-JDBC实现读写分离步骤
1、导入maven坐标
<dependency>
<groupld>org.apache.shardingsphere</groupId)
<artifactId>sharding-jdbc-spring-boot-starter</artifactId)
<version>4.0.0-RC1</version>
</dependency>
2、在配置文件中配置读写分离规则
server:
port: 8080
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.138.100: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://192.168.138.101:3306/rw?characterEncoding=utf-8
username: root
password: root
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定义覆盖配置项
server:
port: 8080
spring:
shardingsphere:
... ...
main:
allow-bean-definition-overriding: true
功能测试
项目启动时会初始化两个数据源
查询操作会操作从数据库
更新操作会操作主数据库
提交代码后, 合并分支