数据库读写分离技术
一、概述
1.背景
- 所有读写操作都由一个数据库完成,使得数据库压力较大
- 数据库服务器磁盘损坏导致数据丢失,单点故障
2.解决
- Master(主库):主要完成写操作
- Slave(从库):主要完成读操作,数据由主库同步,也充当主库的备份
3.技术
Mysql
主从复制
二、Mysql
主从复制
1.介绍
异步复制,从库从主库进行二进制日志复制,再解析应用到自身,是Mysq
l自带的功能。
2.过程
- 主库修改,将修改信息存储在日志,发送修改事件给从库
- 从库读取主库日志文件,拷贝到自己的中继日志
- 从库重做中继日志事件,从而将改变应用于自身
3.配置
-
准备两台服务器创建数据库
-
配置主库:
-
修改数据库配置文件
my.cnf
[mysqld] # 开启数据库二进制日志 log-bin=mysql-bin # 服务器唯一id server-id=100
-
重启服务
systemctl restart mysqld
-
创建用户,授予权限与主库通信
GRANT REPLICATION SLAVE ON *.* to 'xiaoming'@'%' identified by 'Root@123456';
给
xiaoming
用户授权可以复制日志文件 -
记录数据库中的日志文件名和位置
show master status;
-
-
配置从库
-
修改数据库配置文件
my.cnf
[mysqld] # 服务器唯一id server-id=101
-
重启服务
-
与主库对接
change master to master_host='master.ip', master_user='xiaoming', master_password='Root@123456', master_log_file='mysql-bin.000001', master_log_pos=439; start slave;
-
三、Sharding-JDBC
1.介绍
- 增强版JDBC框架
- 适用于任何JDBC框架
- 支持任何第三方数据库连接池
- 支持任何实现JDBC规范的数据库
2.使用
- 依赖
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
-
配置
spring: shardingsphere: datasource: names: # 名字自定义 master,slave1, slave2 # 主数据源 master: type: 数据库连接池类型 driver-class-name: jdbc类全限定名 url: 数据库地址 username: password: # 从数据源 slave1: # 类似 slave2: # 类似 # 读写分离配置 masterslave: # 负载均衡算法 load-balance-algorithm-type: round-robin # 轮询算法 # 最终的数据源名称,数据源Bean对象 name: dataSource # 主库数据源名称 master-data-source-name: master # 从数据源名称列表,逗号分隔 slave-data-source-name: slave1,slave2 # 开启SQL日志显示,默认false props: sql: show: true
-
允许Bean定义覆盖
数据库连接池和
Sharding-JDBC
都会创建一个数据源的bean对象spring: main: allow-bean-definition-overriding: true
四、实现读写分离
- 导入maven坐标
- 在配置文件中配置读写分离规则
- 配置文件中允许bean定义覆盖