首页 技术 正文
技术 2022年11月18日
0 收藏 707 点赞 3,151 浏览 3867 个字

看了好久的SpringBoot结合MyBatista实现读写,但是一直没有勇气实现他,今天终于接触到了读写分离的东西,读写分离就是讲读操作执行在Slave数据库(从数据库),写操作在Master数据库执行(主数据库),将每次在Master执行的记录同步到各个Slave上去,实现数据库主从同步的操作,这也是构建数据库集群的看了好久的SpringBoot结合MyBatista实现读写,但是一直没有勇气实现他,今天终于接触到了读写分离的东西,读写分离就是讲读操作执行在Slave数据库(从数据库),写操作在Master数据库执行(主数据库),将每次在Master执行的记录同步到各个Slave上去,实现数据库主从同步的操作,这也是构建数据库集群的基本。

当然实现数据库集群不仅仅这么简单,我们有更好的选择,在MYSQL数据库中官方推出了MySqlProxy代理工具,他可以自动的实现数据脚本分析,然后自动的负载到各个数据库上,更方便的搭建数据库集群,完成读写分离的操作,这里我们处于学习的目的,暂时不去了解学习MySqlProxy,从基本的做起。

[

安装Docker和编排工具

这个每个操作系统都不一样,暂时不做过多的解释,可以在网络找到大量的文章讲解,这里不在重复。镜像编排工具下载后,加载到环境变量即可,可以参考Docker镜像编排工具构建SpringBoot应用

编写镜像构建文件

主要是编写镜像文件以及配置主从数据库和数据库的初始化操作

创建编排文件

配置文件docker-compose.ymal中主要注意文件的设置,设置如下:

master配置(Slave数据也是同样的配置):

  • ./data/db1 存放master的数据库文件
  • ./data/init_1 存放Master的数据库初始化脚本
  • ./data/db1_config 存放Master的配置信息为
version: '2'
services:
master:
container_name: master
volumes:
- ./data/db1/:/var/lib/mysql/
- ./data/init_1/:/docker-entrypoint-initdb.d/
- ./data/db1_config:/etc/mysql/conf.d/
ports:
- "4406:3306"
image: hub.c.163.com/library/mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yse Slave:
container_name: slave_1
volumes:
- ./data/db2/:/var/lib/mysql/
- ./data/init_2/:/docker-entrypoint-initdb.d/
- ./data/db2_config:/etc/mysql/conf.d/
ports:
- "5506:3306"
image: hub.c.163.com/library/mysql
environment:
MYSQL_ALLOW_EMPTY_PASSWORD: yse

数据库配置文件

在不同的配置文件下创建my.cnf文件,文件内容如下,其中需要注意的是

  • server_id 表示的服务标示,每个数据库都必须保持不同
  • binlog-do-db 标示需要同步的数据库,因此此处的参数需要根据你的实际数据库更改
  • replicate-ignore-db 表示忽略的数据库

Master数据库配置

[mysqld]
server_id = 1
log-bin= mysql-bin
read-only=0
binlog-do-db=test_data_base
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

Slave数据库配置

[mysqld]
server_id = 2
log-bin= mysql-bin
read-only=1
binlog-do-db=test_data_base
replicate-ignore-db=mysql
replicate-ignore-db=sys
replicate-ignore-db=information_schema
replicate-ignore-db=performance_schema

初始化脚本

在初始化数据库脚本中主要是为了保持两个数据库相同,当然你也可以创建后手动执行SQL使得主从数据库保持一致。

将下面的文件分别放到init_1和init_2文件夹下,分别创建init.sql保存

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTITY BY 'root' WITH GRANT OPTION ;
flush privileges;-- 创建数据库,注意:测试时候,这里的数据库需要和你上面配置的同步的数据库名称一样
CREATE DATABASE IF NOT EXISTS test_data_base DEFAULT CHARSET utf8 COLLATE utf8_general_ci;USE `test_data_base`;-- 创建数据表,用于演示操作
CREATE TABLE IF NOT EXISTS table_1(
`id` VARCHAR (32) NOT NULL PRIMARY KEY ,
`name` VARCHAR(255) NOT NULL DEFAULT "SMITH"
);

启动镜像,查看是否启动完成以及数据库是否初始化完成.

开启数据库同步

检查无误之后,这里可以使用第三方的数据库可视化工具或者其他工具,配置主从数据库,过程如下

进入Master数据库

打开Master的命令行脚本之后执行一下SQL,以获取日志信息

SHOW MASTER STATUS;

获得以下执行结果

File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set
mysql-bin.000003 4109 test_data_base

需要记录的是File和Position的名称,后面配置Slave的时候需要用到;

进入Slave数据库

在Slave数据中需要配置的信息主要有Maste数据库的地址信息,以及账户信息,以及日志信息,其中日志信息就是我们上一个操作的FIle和Position,内容如下:

CHANGE MASTER TO
MASTER_HOST='master',
MASTER_PORT=3306,
MASTER_USER='root',
MASTER_PASSWORD='root',
MASTER_LOG_FILE='mysql-bin.000003',
MASTER_LOG_POS=154;

其中主机名是因为我使用docker镜像编排工具,因此可以使用容器名称直接访问,如果没有的话可以使用IP地址或者其他形式,端口,账户名和密码,例外MASTER_LOG_FILE就是文件的名称对应上面的File,MASTGER_LOG_POS 对应Position.

配置完成之后,执行


-- 开启Slave同步
START SLAVE ;-- 查看Slave状态
SHOW SLAVE STATUS;

如查看状态的结果中SALVE_IO_STATUS=’Waiting for master to send event’ 表示设置成功,这个时候,可以在Master数据库执行增删改操作,在查看Slave数据库是否自动同步完成,如果没有的话,请仔细检查数据库的同步设置,可以合理使用下面的命令重置或者修改Slave配置.

-- 停止同步
STOP SLAVE;-- 更新配置
CHANGE MASTER TO
MASTER_HOST='**',
MASTER_PORT=**,
MASTER_USER='**',
MASTER_PASSWORD='***',
MASTER_LOG_FILE='***',
MASTER_LOG_POS=**;-- 重置配置
RESET SLAVE ALL;

测试

在Master执行操作之后,观察数据库日志,可以简略的看到以下信息,表示Slave在IO线程连接到Master数据库,并且请求日志文件.


slave_1 | 2018-07-22T14:27:54.185065Z 4 [Note] Slave I/O thread for channel '': connected to master 'root@master:3306',replication started in log 'mysql-bin.000004' at position 154
slave_1 | 2018-07-22T14:27:54.190412Z 5 [Warning] Slave SQL for channel '': If a crash happens this configuration does not guarantee that the relay log info will be consistent, Error_code: 0
slave_1 | 2018-07-22T14:27:54.190453Z 5 [Note] Slave SQL thread for channel '' initialized, starting replication in log 'mysql-bin.000004' at position 154, relay log './c5cce2a08871-relay-bin.000001' position: 4
相关推荐
python开发_常用的python模块及安装方法
adodb:我们领导推荐的数据库连接组件bsddb3:BerkeleyDB的连接组件Cheetah-1.0:我比较喜欢这个版本的cheeta…
日期:2022-11-24 点赞:878 阅读:9,000
Educational Codeforces Round 11 C. Hard Process 二分
C. Hard Process题目连接:http://www.codeforces.com/contest/660/problem/CDes…
日期:2022-11-24 点赞:807 阅读:5,512
下载Ubuntn 17.04 内核源代码
zengkefu@server1:/usr/src$ uname -aLinux server1 4.10.0-19-generic #21…
日期:2022-11-24 点赞:569 阅读:6,358
可用Active Desktop Calendar V7.86 注册码序列号
可用Active Desktop Calendar V7.86 注册码序列号Name: www.greendown.cn Code: &nb…
日期:2022-11-24 点赞:733 阅读:6,141
Android调用系统相机、自定义相机、处理大图片
Android调用系统相机和自定义相机实例本博文主要是介绍了android上使用相机进行拍照并显示的两种方式,并且由于涉及到要把拍到的照片显…
日期:2022-11-24 点赞:512 阅读:7,771
Struts的使用
一、Struts2的获取  Struts的官方网站为:http://struts.apache.org/  下载完Struts2的jar包,…
日期:2022-11-24 点赞:671 阅读:4,849