前言
用户浏览菜品,添加购物车,下单等操作最终都会反映成一个sql,操作数据库。
但是当前系统只部署了一台数据库,读和写所有压力都由一台数据库承担,压力大;如果数据库服务器磁盘损坏则数据丢失,单点故障。我们要从这两个方面来优化项目。
一、Mysql主从复制
1.介绍
2.配置
提前准备好两台服务器,分别安装Mysql并启动服务成功。我用windows上的mysql作为主库,linux上的mysql作为从库。
(1)配置Windows主库
①修改Mysql的配置文件
找到 my.ini文件
在[mysqld]下面增加配置:
[mysqld]
log-bin=mysql-bin #启用二进制日志
server-id=100 #服务器唯一ID(唯一即可)
②重启mysql服务
③创建用于同步的用户账号(用于master与slave通信)
登录mysql数据库
mysql -uroot -p
执行语句创建用户授权
CREATE USER 'xiaohei'@'%' IDENTIFIED BY '123456';
GRANT REPLICATION SLAVE ON *.* TO 'xiaohei'@'%';
FLUSH PRIVILEGES;
④查看主库状态,记录二进制文件名和位置
show master status;
二进制文件为 LAPTOP-2PQ440VH-bin.000118,位置为2726。
之后这里不要有任何操作,否则文件和文章会变。
(2)配置linux从库
①修改mysql的/etc/my.cnf文件
②重启mysql
③登录mysql数据库,执行下面的sql
change master to master_host='192.168.2.81',master_user='xiaohei',master_password='123456',master_log_file='LAPTOP-2PQ440VH-bin.000118',master_log_pos=2726;
start slave;
④查看从库的状态
show slave status;
复制下来看看
两个都为yes说明成功。
在Navicat中测试一下,也是成功的。
二、读写分离案例
1.SHarding-JDBC介绍
2.入门案例
<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://localhost:3306/rw?characterEncoding=utf-8
username: root
password: 123456
# 从数据源
slave:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.19.129:3306/rw?characterEncoding=utf-8
username: root
password: 123456
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:
# 引入的SpringBoot、DruidDataSource这两个框架里的配置类都要创建数据源这个对象,现在默认值为false,不允许覆盖,导致创建的bean是冲突的,我们来设为true,允许后创建的datasource覆盖前面的。
allow-bean-definition-overriding: true
主从复制的环境前面已经搭建好了,接下来在主库中创建我们原来的业务数据库并导入相关表结构和数据。导入依赖、配置文件即可了。