这是只有一个数据库的情形,此时增删改查都是针对这个数据库而言
存在两个问题:所有压力都是由一台数据库承担,数据库压力很大
而且,一旦这个数据库发生故障,数据丢失,拿数据就全都没了
现在有两个数据库(当然有条件的话,可以使用更多的数据库)
这两个数据库,一个叫做主库,一个叫做从库
查询去“从库”中查,(光查询是不会对数据库进行更改的)32
增加,删除,修改统一称为写操作,写操作去“主库”中进行
将数据库分成读库和写库,可以降低单个数据库的访问压力
完成写操作后,把数据库中的数据要同步到从库中去,这就叫主从复制
从库复制主库的日志,然后解析日志,就知道在主库中具体执行的是什么样的sql,再把这个sql在从库中执行一遍,这样就可以做到从库中的数据跟主库中保持一致
这个过程更具体而言:
主库先将自己的改变记录到二进制日志里面(binary log)
然后有一个I/O线程负责读这个日志文件,然后将读到的内容拷贝到从库的中继日志(relay log)里面
此时又有一个sql线程负责读取中继日志中发生的事件,然后将她应用到从数据库中
主从复制实现:
准备两台服务器((而且两台服务器里面都安装了mysql,而且都分别启动了mysql服务)
比如主库所在的服务器的Ip地址是192.168.138.100
从库所在的服务器的Ip地址是192.168.138.101
导入shardingjdbc依赖包
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.1.1</version>
</dependency>
在配置文件application.yml或者application.properties文件中配置读写分离规则
spring:
application:
#应用的名称,可选
name: reggie_take_out
shardingsphere:
datasource:
names:
master,slave1,slave2
# 主数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.100:3306/reggie?characterEncoding=utf-8
username: root
password: root
# 从数据源
slave1:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.101:3306/reggie?characterEncoding=utf-8
username: root
password: root
slave2:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.138.102:3306/reggie?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: slave1,slave2
props:
sql:
show: true #开启SQL显示,默认false