SpringBoot数据库读写分离之基于Docker构建主从数据库同步实例
看了好久的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
SpringBoot数据库读写分离之基于Docker构建主从数据库同步实例的更多相关文章
- Django的数据库读写分离
Django的数据库读写分离 1.首先是配置数据库 在settings.py文件中增加多个数据库的配置: DATABASES = { 'default': { 'ENGINE': 'django.db ...
- Docker从入门到掉坑(二):基于Docker构建SpringBoot微服务
本篇为Docker从入门到掉坑第二篇:基于Docker构建SpringBoot微服务,没有看过上一篇的最好读过 Docker 从入门到掉坑 之后,阅读本篇. 在之前的文章里面介绍了如何基于docker ...
- Linux安装Mycat1.6.7.4并实现Mysql数据库读写分离简单配置
1. Mycat简介 一个彻底开源的,面向企业应用开发的大数据库集群 支持事务.ACID.可以替代MySQL的加强版数据库 一个可以视为MySQL集群的企业级数据库,用来替代昂贵的Oracle集群 一 ...
- MySQL数据库读写分离、读负载均衡方案选择
MySQL数据库读写分离.读负载均衡方案选择 一.MySQL Cluster外键所关联的记录在别的分片节点中性能很差对需要进行分片的表需要修改引擎Innodb为NDB因此MySQL Cluster不适 ...
- 数据库读写分离Master-Slave
数据库读写分离Master-Slave 一个平台或系统随着时间的推移和用户量的增多,数据库操作往往会变慢,这时我们需要一些有效的优化手段来提高数据库的执行速度:如SQL优化.表结构优化.索引优化.引擎 ...
- 视频私有云实战:基于Docker构建点播私有云平台
私有云是为一个客户单独使用而构建的,因而提供对数据.安全性和服务质量的最有效控制.前置条件是客户拥有基础设施,并可以使用基础设施在其上部署应用程序.其核心属性是专有的资源.本篇文章将会结合网易云信的实 ...
- 【docker构建】基于docker构建wordpress博客网站平台
WordPress是使用PHP语言开发的博客平台,用户可以在支持PHP和MySQL数据库的服务器上架设属于自己的网站.也可以把 WordPress当作一个内容管理系统(CMS)来使用. WordPre ...
- django数据库读写分离
django数据库读写分离 1. 配置数据库 settings.py文件中 用SQLite: DATABASES = { 'default': { 'ENGINE': 'django.db.backe ...
- Spring aop应用之实现数据库读写分离
Spring加Mybatis实现MySQL数据库主从读写分离 ,实现的原理是配置了多套数据源,相应的sqlsessionfactory,transactionmanager和事务代理各配置了一套,如果 ...
随机推荐
- [Swift]LeetCode547. 朋友圈 | Friend Circles
There are N students in a class. Some of them are friends, while some are not. Their friendship is t ...
- PHP常用设计模式讲解
开发中适当的使用设计模式,可以让项目有更易扩展,易维护.低耦合,代码简洁等 单例模式 <?php /** * 单例模式:使类在全局范围内只允许创建一个对象,常用于数据库连接等 */ class ...
- iOS学习—— UISearchBar的使用
转载自:http://blog.sina.com.cn/s/blog_7b9d64af0101dfg8.html 最近用到搜索功能.于是,经过不断的研究,终于,有点懂了. 那就来总结一下吧,好记性不如 ...
- [Abp 源码分析]三、依赖注入
0.简要介绍 在 Abp 框架里面,无时无刻不存在依赖注入,关于依赖注入的作用与好处我就不在这里多加赘述了,网上有很多解释的教程.在 [Abp 源码分析]一.Abp 框架启动流程分析 里面已经说过,A ...
- HBase篇--HBase操作Api和Java操作Hbase相关Api
一.前述. Hbase shell启动命令窗口,然后再Hbase shell中对应的api命令如下. 二.说明 Hbase shell中删除键是空格+Ctrl键. 三.代码 1.封装所有的API pa ...
- 边缘计算 VS 云计算,谁才是未来?
计算是互联网中一个永恒的话题,设备的所有运行都可以看成是 0 和 1 的运算.在计算中近些年有两个越来越响亮的技术:云计算和边缘计算.现如今是云计算方兴未艾,边缘计算已经有了燎原之势,本文将对这两种技 ...
- mysql 架构篇系列 4 复制架构一主一从搭建(半同步复制)
一.概述 在mysql 5.5之前,mysql 的复制是异步操作,主库和从库的数据之间存在一定的延时,这样存在一个隐患:当主库上写入一个事务并提交成功,而从库尚未得到主库推送的Binlog日志时,主库 ...
- Android软键盘事件imeOptions响应
版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 在android发开过程中,有时候需要对EditText的软键盘进行监听. 当点击软键盘回车位置按键的时候,需要实现 完成.前进.下 ...
- Java设计模式学习总结
设计模式基础学习总结 这篇总结主要是基于我之前设计模式基础系列文章而形成的的.主要是把重要的知识点用自己的话说了一遍,可能会有一些错误,还望见谅和指点.谢谢 更多详细内容可以查看我的专栏文章:设计模式 ...
- 看板中的WIP限制
WIP限制并不是真的要限制你的进度,事实上正相反. 什么是WIP限制? 在敏捷开发中,WIP限制决定了每种情况下的工作流中可以存续的最大工作量.限制进行中的工作数量可以更容易辨识团队工作流中的无效工作 ...