这是只有一个数据库的情形,此时增删改查都是针对这个数据库而言
存在两个问题:所有压力都是由一台数据库承担,数据库压力很大
而且,一旦这个数据库发生故障,数据丢失,拿数据就全都没了
现在有两个数据库(当然有条件的话,可以使用更多的数据库)
这两个数据库,一个叫做主库,一个叫做从库
查询去“从库”中查,(光查询是不会对数据库进行更改的)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.shardingspheregroupId>
- <artifactId>sharding-jdbc-spring-boot-starterartifactId>
- <version>4.1.1version>
- 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