什么是MySQL主从复制?
MySQL主从复制是一个异步的复制过程,底层是基于Mysql数据库自带的 二进制日志 功能,我们只需要在数据库中简单的配置即可,不需要借助于其他的技术
MySQL数据库默认是支持主从复制的,依靠的就是MySQL自带的二进制日志功能.
主从复制的作用?
解决一个数据库服务器查询高并发的时候读写压力大的问题,同时也防止数据库服务器磁盘损坏,造成数据的丢失。
主从复制的目的?
为了实现读写分离.
读写分离就是用户访问,查询时,操作主库,增删改时,操作从库,这种结构 我们成为读写分离.
注意:从库可以有多个,主库只有一个.
怎么开启二进制日志功能实现主从复制?
主数据库
1.修改Mysql数据库的配置文件/etc/my.cnf,增加配置: log-bin=mysql-bin 启用二进制日志 server-id=200 服务器唯一ID(唯一即可)
2登录Mysql,创建数据同步的用户并授权
3登录Mysql,查看master同步状态
执行show master status,记录下结果中**File**和**Position**的值
从库中
1.配置服务器唯一ID,设置完重启服务器
2.登录Mysql数据库,设置主库地址及同步位置
这样就开启了二进制日志功能,实现了主从复制功能.
如何通过java代码来完成读写分离呢,如何在执行select的时候查询从库,而在执行insert、update、delete的时候,操作主库呢?这个时候,我们就需要介绍一个新的技术 ShardingJDBC.
什么是ShardingJDBC?
定位为轻量级 Java 框架,在 Java 的 JDBC 层提供的额外服务。 它使用客户端直连数据库,以 jar 包形式提供服务,无需额外部署和依赖,可理解为增强版的 JDBC 驱动,完全兼容 JDBC 和各种 ORM 框架。简单来说就是和增强版的JDBC用来操作数据库的.
使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。
在springboot项目中的实现只需要两步:
1.在pom.xml中增加shardingJdbc的maven坐标
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2.在yml文件中加入数据源的配置
spring:
shardingsphere:
datasource:
names:
master,slave # 维护了两个数据源,一个名为master,另一个名为slave
master: # 配置名为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: # 配置名为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 原因是有一个同名的 dataSource 的bean在com.alibaba.druid.spring.boot.autoconfigure
包下的DruidDataSourceAutoConfigure类加载时已经声明了,而我们需要用到的是 shardingjdbc包下的
dataSource,所以我们需要配置上述属性,让后加载的覆盖先加载的。
这样就完成了在在springboot项目中的实现使用ShardingJDBC完成读写分离.