所有的数据库表都放在一台服务器上的缺点:
- 单台服务器压力大。
- 若磁盘损坏(单点故障),则数据丢失。
读写分离:主库负责增删改,从库负责读。
MySQL主从复制
MySQL主从复制是一个异步的复制过程,底层是基于MySQL自带的二进制日志功能。一台或多台从数据库从一台主数据库进行日志复制,再解析日志并应用到自身,从而实现从库和主库的数据保持一致。 MySQL主从复制是MySQL数据库自带的功能。
具体步骤分为三步:
- master将改变记录到二进制日志(binary log)。
- slave将master的binary log拷贝到它的中继日志(relay log),拷贝由IO线程负责。
- slave重做中继日志中的事件,将改变应用到自己的数据库中,重做由SQL线程负责。
开启主从复制(数据库版本:8.0)
前提:确保主服务器和从服务器都已经安装了MySQL数据库。
主库配置
- 修改配置文件
/etc/mysql/my.cnf
(或者在/etc/my.cnf
),添加以下三行即可:
-
重启mysql服务,命令:
systemctl restart mysql
。 -
创建一个新用户,并授予同步复制权限,后面从数据库就会以这个新用户的身份读取二进制日志文件。
创建用户命令:
create user 'xiaoming'@'%' identified by '123456';
,其中xiaoming
是用户名,%
表示任意主机都可远程登录,123456
表示密码。授予权限:
GRANT REPLICATION SLAVE ON *.* TO 'xiaoming'@'%';
-
执行
show master status
命令,查看主数据库状态,记录下前两列的数据后,不再执行其他命令。
从库配置
- 修改配置文件
/etc/mysql/my.cnf
- 重启mysql服务,命令:
systemctl restart mysql
。 - 执行代码:
change master to master_host='主数据库IP地址', master_user='xiaoming', master_password='123456', master_log_file='mysql-bin.000001', master_log_pos=690;
注意mysql-bin.000001
和690
需要改成自己的。
start slave;
- 执行
show slave status\G
查看状态。
确保两个线程的状态为Yes,大功告成。
如果出错了,可以参考一下博客: Mysql主从同步情况故障排除
验证是否成功
在主库上新建一个数据,如果从库也出现了新建的数据库,证明配置成功。
Sharding-JDBC
Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务,它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完美兼容JDBC和各种ORM框架。
ORM框架简介
ORM框架是对象关系映射(Object-Relational Mapping)的缩写,是一种编程技术,用于在面向对象的编程语言和关系数据库之间建立映射关系。它将数据库中的表和记录映射到面向对象编程语言中的类和对象,使得开发人员可以使用面向对象的方式进行数据库操作。ORM框架的主要目标是简化数据库操作,并提供更高级别、更抽象的接口,使开发人员能够使用更少的代码来完成数据库的增、删、改、查等操作。通过使用ORM框架,开发人员可以使用面向对象的思维来操作数据库,而不必直接编写SQL语句。
Sharding-JDBC案例
导入maven坐标
<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,slave
# 主数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://101.200.121.97: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://182.92.168.224: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: # 允许bean定义覆盖
allow-bean-definition-overriding: true