当读和写所有压力都集中在一台数据库上承担时,压力大。并且若是数据库服务器磁盘损坏则会数据丢失,单点故障,因为所有数据都放在这一台服务器上。所以优化方向针对这两部分进行。
Mysql主从复制
介绍
配置
前置条件
准备好两台服务器,可以使用本机加上一台虚拟机,在虚拟机上需要安装mysql。可以使用下面命令查看MySQL服务是否打开
systemctl status mysqld
配置主库master
首先需要其用二进制文件,并且给服务器一个唯一的标识,因为主从复制会涉及到多台的服务器,每个服务器需要有自己的唯一标识。通过vim /etc/my.cnf进入修改配置文件。
vim /etc/my.cnf
第二步:重启Mysql服务
systemctl restart mysqld
第三步:登录Mysql数据库,创建用户并给用户赋予权限
因为主从复制时会涉及到,从库slave会向主库master请求日志,因此主库和从库之间是需要通信的,所以需要认证身份和权限。在从库时会使用到这个用户。mysql8需要先创建用户再赋予权限。
CREATE USER 用户名 IDENTIFIED WITH 'mysql_native_password' BY '密码';
GRANT REPLICATION SLAVE ON *.* TO 用户名;
第四步
在MySQL数据库下执行
show master status
配置从库slave
第一步:首先配置服务器的id
vim /etc/my.cnf
第二步:重启MySQL服务
systemctl restart mysqld
第三步:根据主库的实际的用户的值以及日志的位置进行修改
第四步:查看数据库的状态
可能遇到的问题:
- 若一直显示connecting可能是密码输入问题,也可能是未关闭防火墙,或者开启防火墙的3306端口
- 若是使用的是两台虚拟机,采用了虚拟机克隆技术的话,则需要修改slave从数据库的uuid(75条消息) 克隆的虚拟机导致mysql主从UUID一致怎么修改_数据库主从同步修改uuid_WuYle的博客-CSDN博客。但是采用本机与虚拟机的数据库则不需要。(75条消息) 关于MySQL5.7修改auto.cnf中UUID的值,启动报异常的问题_StromNing的博客-CSDN博客_auto.cnf(75条消息) 解决MySQL主从复制时主机和从机UUID相同问题_海并不深的博客-CSDN博客_csdn搜索:克隆的虚拟机导致mysql主从uuid一致怎么修改
读写分离案例
背景
什么是ORM框架(75条消息) ORM框架简介_papima的博客-CSDN博客_orm框架
什么是JDBCJDBC详解 - ErBing - 博客园 (cnblogs.com)
入门案例
导入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://192.168.138.100:3306/rw?characterEncoding=utf-8#主库的ip及数据库rw
username: root
password: root
# 从数据源
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#从库的ip以及数据库rw
username: root
password: root
masterslave:
# 读写分离配置
load-balance-algorithm-type: round_robin#负载均衡,这里设置的是从库的负载均衡,因为查询的从库可以 #有多个,这里的策略是轮询查询从库
# 最终的数据源名称
name: dataSource#bean的名字
# 主库数据源名称
master-data-source-name: master
# 从库数据源名称列表,多个逗号分隔
slave-data-source-names: slave
props:
sql:
show: true #开启SQL显示,默认false
其中names表示的是数据源的名字,下面的名字与其对应,其中从库的数据源可以有多个,按照上面的格式定义好就行,后续就交由框架进行处理,若是查询操作会自动的调用从库,若是增删改会自动的使用主库。
在配置文件中配置允许bean定义覆盖配置项
因为在shardingspherejdbc配置类中要创建数据源对象,但是在DruidDataSourceAutoConfigure中也想创建数据源对象dataSource。在配置文件中加入最后两行