基于SpringBoot的MYSQL数据库读写分离(一)——基础环境搭建

一、目的

首先需要明确的是使用数据库读写分离的目的,它的主要应用场景是为了解决数据库“读”的瓶颈问题,在对数据库进行一定程度的优化后,任然不能满足“读”数据的业务需求,这样我们就需要引入数据库读写分离了。

二、技术介绍

一般的数据库读写分离分为两种。一种是通过中间件如Mycat,还有一种就是在应用程序中选择要操作哪个数据库。本文介绍的则是在Springboot中动态的进行选择操作哪台数据库。

三、读写分离介绍

在读写分离的数据库集群中,主库一般用来执行“写”操作,从库用来执行“读”操作,从库可以有多个,主库从库之间的数据同步则是通过数据库间的异步线程进行通信。下面的介绍摘选自网络:

  • 在主数据库中进行的事件操作(例如修改数据库的sql操作语句),都会存储到日志系统A中,在通过异步线程发送给从库。从库收到后,写入本地日志系统B,然后一条条的将数据库事件语句在从数据库中执行。
  • 日志系统A,是MYSQL的日志类型中的二进制日志,也就是专门用来保存修改数据库表的所有动作,即bin-log,注意MYSQL会在执行语句之后,释放锁之前,写入二进制日志,确保事务安全。
  • 日志系统B,不是二进制日志,由于它是从主库的二进制日志复制过来的,并不是自己的数据库变化产生的,有点接力的感觉,称为中继日志,即relay-log。
  • 通过上面的机制,可以保证主库和从库的数据库数据一致,但是时间上肯定有延迟,即从库的数据是滞后的。因此,会出现这样的问题,主库的数据库操作是可以并发的执行的,但是从库只能从relay-log中一条一条的读取执行。若主库的写操作很频繁,从库很可能就跟不上了。
  • 主从同步复制有以下几种方式:
    (1)同步复制,master的变化,必须等待slave-1,slave-2,…,slave-n完成后才能返回。
    (2)异步复制,master只需要完成自己的数据库操作即可,至于slaves是否收到二进制日志,是否完成操作,不用关心。MYSQL的默认设置。
    (3)半同步复制,master只保证slaves中的一个操作成功,就返回,其他slave不管。这个功能,是由google为MYSQL引入的。

四、基础环境的搭建

本文使用的基础环境是阿里云,数据库使用的是mysql,使用docker进行快速部署。
三台服务器通过内网通讯,在这里我们将其视为
192.168.0.100 (主节点)
192.168.0.101 (从节点1)
192.168.0.102 (从节点2)
先使用yum安装docker,然后下载mysql镜像,这里我就选用了默认的latest版本,你也可以指定mysql的版本。
而后,使用如下命令,启动mysql容器。–name是指定容器的名称,-p xx:xx是指定mysql映射的端口号,-v后面的是将本地的目录映射到mysql容器中的位置,-e MYSQL_ROOT_PASSWORD则是指定mysql的root账户的密码,最后的mysql:latest便是我们的镜像名称:镜像版本。

docker run -d --name=mysql -p 3306:3306 -v /data/mysql:/data/mysql -e MYSQL_ROOT_PASSWORD=123456  mysql:latest

然后通过docker ps假如能够看到如下图所示的容器,变表示启动成功了。
《基于SpringBoot的MYSQL数据库读写分离(一)——基础环境搭建》
同样的,在我们的三个库中都执行相同的操作。就可以在三个服务器中都启动起mysql了。
然后,我们需要将配置文件进行修改,在主库的配置文件中,添加以下两句话:

server-id=1			(必须)
log-bin=master-bin  (非必须)

《基于SpringBoot的MYSQL数据库读写分离(一)——基础环境搭建》
在从库中,我们只需要添加(多台从库需要指定不同server-id):

server-id=2	

而后,我们可以docker exec -it mysql bash进入到容器,使用mysql -uroot -p登录到mysql中进行操作,也可以在本地环境中,使用,如Navicat的软件进行远程连接操作。PS:在使用阿里云等服务器的时候,别忘了需要在阿里云中打开指定的端口,使其可以远程访问。

首先,我们在主节点中,运行如下代码,我们需要记录其File和Position的值。

show master status;

《基于SpringBoot的MYSQL数据库读写分离(一)——基础环境搭建》
而后,再在从节点1中,运行如下代码,将从节点的主节点指定好,并且指定好数据库的用户名密码,和刚才我们记录的两个值。

change master to master_host='192.168.0.100',MASTER_user ='root',MASTER_password='123456',master_log_file='master-bin.000003',master_log_pos=155;

再运行start slave;开启主从。再使用show slave status;查看目前的状态,Slave_IO_Running和Slave_SQL_Running都为Yes,则表示我们的主从搭建成功了。我们可以看到,Maset_Log_File和主节点的File的值是相同的,Read_Master_Log_Pos和主节点的Position也是相同的。而后,我们需要在从节点2中进行相同的操作,这里就不重复介绍了。
《基于SpringBoot的MYSQL数据库读写分离(一)——基础环境搭建》
然后我们在主节点中创建一个数据库,如dbtest,然后在其中创建一张测试表,如t_user表,表结构你可以随意创建,这不是本文的主题。然后,我们可以看到从节点中也有了这个在主库中创建的数据库,在这个数据库中也有了在主库中创建的那张表。至此,基础的mysql读写分离的环境就搭建完成了。

《基于SpringBoot的MYSQL数据库读写分离(一)——基础环境搭建》

PS:可以为从库建立只读的账户,来提高安全性

    原文作者:生死无尘
    原文地址: https://blog.csdn.net/mingwei_cheng/article/details/95222158
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞