当前位置:网站首页>瑞吉外卖笔记——第08讲读写分离
瑞吉外卖笔记——第08讲读写分离
2022-08-02 14:01:00 【萧篱衣】
让项目读写分离,写走主库,读走从库,从单一的一台数据库到多台数据库,访问压力降低。将主库的数据同步到从库来这种结构叫Mysql主从复制。
一、Mysql主从复制
1.介绍
MySQL主从复制是一个异步的复制过程,底层是基于MySQL数据库自带的二进制日志功能。就是一台或多台MySQL数据库(slave,即从库)从另一台MySQL数据库(master,即主库)进行日志的复制然后再解析日志并应用到自身,最终实现从库的数据和主库的数据保持一致。MySQL主从复制是MySQL数据库自带功能,无需借助第三方工具。
MySQL复制过程分成三步:
● master将改变记录到二进制日志(binary log)
● slave将master的binary log拷贝到它的中继日志(relay log)
● slave重做中继日志中的事件,将改变应用到自己的数据库中
2.配置
2.1 前提条件
提前准备好两台服务器,分别安装MySQL并启动服务成功。我这里主库远程连接主库名字为localhost,另一个为从库。两台服务器可以通过克隆虚拟机实现,注意在克隆之前先快照,以防错误发生可以返回到原本状态。克隆安装mysql的虚拟机要改mysql的uuid,8.0版重新配置用户加密方式。
主库Master:192.168.72.131
从库Slave:192.168.72.132
2.2 配置——主库Master
第一步:修改Mysql数据库的配置文件 etc/my.cnf
启动MySQL( systemctl status mysqld )后输入口令( vim /etc/my.cnf )进入编辑,加入两行代码:
log-bin=mysql-bin #[必须]启用二进制日志
server-id=100 #[必须]服务器唯一id
第二步:重启MySql服务
systemctl restart mysqld
没有报错说明重启成功
第三步:登录 MySql数据库,执行以下SQL
mysql -uroot -proot
grant replication slave on *.* to 'xiaoming'@'%' identified by '[email protected]';
注:上面SQL的作用是创建一个用户xiaoming,密码为[email protected],并且给用户授予replication slave权限。常用于建立复制时所需要用到的用户权限,也就是slave必须被master授权具有该权限的用户,才能通过该用户复制。这里如果是mysql8版本的不要加 identified by 'password',会导致语法错误。我这里直接设置123456报错提示不安全建议设置复杂一些。
第四步:登录MySQL数据库,执行下面SQL,记录下结果中File和Position的值
show master status;
2.3 配置——从库Slave
第一步:修改MySQL数据库的配置文件 etc/my.cnf
server-id=101 #[必须]服务器唯一id
第二步:重启MySql服务
systemctl restart mysqld
第三步:登录 MySql数据库,执行以下SQL
记得先登录: mysql -uroot -proot
change master to master_host='192.168.72.131',master_user='xiaoming',master_password='[email protected]',master_log_file='mysql-bin.000001',master_log_pos=441;
start slave;
上面代码块中出现的master_log_file='mysql-bin.000001',master_log_pos=441;要和主库查出来的一一对应。
这里是第一次主从读写,如果之前有过slave可能会报错,使用 stop slave 停止后再次执行SQL口令即可成功。
使用 start slave; 口令让线程跑起来
第四步:登录MySQL数据库,执行下面SQL,查看从库的状态
show slave status;
我们会发现内容很乱,可以将返回的全部内容复制到文本编辑器查看。或者show slave status\G;这个可以查看很清楚。
3.测试
第一步:主库和从库都连接上Navicat,主机写两台虚拟机IP地址,我的用户名密码都为root
第二步:主库新建一个waimai数据库,从库进行刷新
二、读写分离案例
2.1 背景
面对日益增加的系统访问量,数据库的吞吐量面临着巨大瓶颈。对于同一时刻有大量并发读操作和较少写操作类型的应用系统来说,将数据库拆分为主库和从库,主库负责处理事务性的增删改操作,从库负责处理查询操作,能够有效的避免由数据更新导致的行锁,使得整个系统的查询性能得到极大的改善。
2.2 Sharding-JDBC介绍
Sharding-JDBC定位为轻量级Java框架,在Java的JDBC层提供的额外服务。它使用客户端直连数据库,以jar包形式提供服务,无需额外部署和依赖,可理解为增强版的JDBC驱动,完全兼容JDBC和各种ORM框架。
使用Sharding-JDBC可以在程序中轻松的实现数据库读写分离。
适用于任何基于JDBC的ORM框架,如:JPA,Hibernate,Mybatis,SpringJDBC Template或直接使用JDBC。
支持任何第三方的数据库连接池,如:DBCP,C3PO,BoneCP,Druid,HikariCP等。
支持任意实现JDBC规范的数据库。目前支持MySQL,Oracle,SQLServer,PostgreSQL以及任何遵循SQL92标准的数据库。
2.3 入门案例
第一步:数据库主库新建一张user表,字段为id,name,age,address
第二步:使用Sharding-JDBC实现读写分离步骤:
1. 导入maven坐标
<dependency>
<groupId>org.apache.shardingsphere</groupId>
<artifactId>sharding-jdbc-spring-boot-starter</artifactId>
<version>4.0.0-RC1</version>
</dependency>
2. 在配置文件中配置读写分离规则
spring:
shardingsphere:
datasource: #指定数据源
names:
master,slave #这里的master,slave可以改变,和下面的对应即可
# 主数据源
master:
type: com.alibaba.druid.pool.DruidDataSource
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://192.168.72.131: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://192.168.72.132: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
3. 在配置文件中配置允许bean定义覆盖配置项
main:
allow-bean-definition-overriding: true
4. 启动
VM克隆虚拟主机造成MySQL的UUID重复问题
第一步:进入到auto.cnf文件的上一级目录
cd /var/lib/mysql
ls
第二步:移除UUID
mv auto.cnf auto.cnf.bak
第三步:生成UUID
/usr/local/mysql/bin/mysqld_safe --defaults-file=/etc/my3306.cnf --user=mysql &
第四步:重启服务
最后回到从库界面再次进行查看
完整代码下载地址:稍后补充
边栏推荐
猜你喜欢
Supervision strikes again, what about the market outlook?2021-05-22
IDEA打包jar包
文件加密软件有哪些?保障你的文件安全
网络安全第五次作业
二极管及其应用
What are the file encryption software?Keep your files safe
Configure zabbix auto-discovery and auto-registration.
RKMPP 在FFmpeg上实现硬编解码
【Tensorflow】AttributeError: ‘_TfDeviceCaptureOp‘ object has no attribute ‘_set_device_from_string‘
瑞吉外卖笔记——第05讲Redis入门
随机推荐
2022-08-02日报:2022年7月最热的10篇AI论文
GTK:Gdk-CRITICAL **: IA__gdk_draw_pixbuf: assertion ‘GDK_IS_DRAWABLE (drawable)‘ failed
Minio文件上传
音频处理:浮点型数据流转PCM文件
EasyExcel 的使用
目标检测场景SSD-Mobilenetv1-FPN
世界上最大的开源基金会 Apache 是如何运作的?
SQL函数 $TSQL_NEWID
Raft协议图解,缺陷以及优化
期货具体是如何开户的?
一维卷积神经网络_卷积神经网络的基础知识「建议收藏」
OpenMMLab简介
FFmpeg AVPacket详解
Configure zabbix auto-discovery and auto-registration.
C语言提高篇(三)
如何解决mysql服务无法启动1069
Linux:CentOS 7 安装MySQL5.7
Interviewer: Can you talk about optimistic locking and pessimistic locking?
FreeBSD bnxt以太网驱动源码阅读记录三:
binary search && tree