Docker 部署 MySQL 一主多从

主从复制的原理:
1、主库: 创建一个有权访问binlog日志的从库账号,配置需要主从复制的库
                 有写操作时,可以将写操作或者写操作之后的数据记录到日志文件中(binlog)
                 通过一个线程通知需要同步数据的从库来加载binlog中最新的日志
2、从库:会记录上一次读取主库日志文件的position
                启动io线程和主库的线程交互,一旦主库binlog更新,io线程会读取主库的binlog日志到从库中存到中继日志(relaylog)文件中
                再通过sql线程将中继日志文件中的最新的日志重演到从库中

数据最终一致性:弱一致性 

服务器规划:使用docker方式创建,主从服务器IP一致,端口号不一致

  • 主服务器:容器名 mysql-master,端口 3306
  • 从服务器:容器名 mysql-slave1,端口 3307
  • 从服务器:容器名 mysql-slave2,端口 3308

主:3316   mydb1,mydb2
       创建了一个从库可以使用有权同步数据的子账户
从1:3307
       使用子账户建立主从同步关系
从2:3308
       使用子账户建立主从同步关系

注意:如果此时防火墙是开启的,则先关闭防火墙,并重启docker,否则后续安装的MySQL无法启动

#关闭docker
systemctl stop docker
#关闭防火墙
systemctl stop firewalld
#启动docker
systemctl start docker

一、准备主服务器

1. 在docker中创建并启动MySQL主服务器:端口3306

docker run -d \
-p 3306:3306 \
-v /liush/mysql/master/conf:/etc/mysql/conf.d \
-v /liush/mysql/master/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql-master \
mysql:8.0.29

2. 创建MySQL主服务器配置文件: 

默认情况下MySQL的binlog日志是自动开启的,可以通过如下配置定义一些可选配置

vim /liush/mysql/master/conf/my.cnf

(1)配置如下内容

[mysqld]
# 服务器唯一id,默认值1
server-id=1
# 设置日志格式,默认值ROW
binlog_format=STATEMENT
# 二进制日志名,默认binlog
log-bin=binlog
# 设置需要复制的数据库,默认复制全部数据库
binlog-do-db=mydb1
binlog-do-db=mydb2
# 设置不需要复制的数据库
binlog-ignore-db=mysql
#binlog-ignore-db=infomation_schema

(2)重启MySQL容器

docker restart mysql-master

3. 使用命令行登录MySQL主服务器

(1)进入容器:env LANG=C.UTF-8 避免容器中显示中文乱码

docker exec -it mysql-master env LANG=C.UTF-8 /bin/bash

(2)进入容器内的mysql命令行

mysql -uroot -proot

(3)修改默认密码插件

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

4. 主机中创建slave用户

(1)创建slave用户

CREATE USER 'slave'@'%';

(2)设置密码

ALTER USER 'slave'@'%' IDENTIFIED WITH mysql_native_password BY '123456';

(3)授予复制权限

GRANT REPLICATION SLAVE ON *.* TO 'slave'@'%';

(4)刷新权限

FLUSH PRIVILEGES;

5. 主机中查询master状态

执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化

SHOW MASTER STATUS;

记下File和Position的值。执行完此步骤后不要再操作主服务器MYSQL,防止主服务器状态值变化。

二、准备从服务器

可以配置多台从机slave1、slave2...,这里以配置slave1、slave2为例

1. 在docker中创建并启动MySQL从服务器:端口3307

docker run -d \
-p 3307:3306 \
-v /liush/mysql/slave1/conf:/etc/mysql/conf.d \
-v /liush/mysql/slave1/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql-slave1 \
mysql:8.0.29
docker run -d \
-p 3308:3306 \
-v /liush/mysql/slave2/conf:/etc/mysql/conf.d \
-v /liush/mysql/slave2/data:/var/lib/mysql \
-e MYSQL_ROOT_PASSWORD=root \
--name mysql-slave2 \
mysql:8.0.29

2. 创建MySQL从服务器配置文件

vim /liush/mysql/slave1/conf/my.cnf
vim /liush/mysql/slave2/conf/my.cnf

(1)配置如下内容  

[mysqld]
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=2
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin
[mysqld]
# 服务器唯一id,每台服务器的id必须不同,如果配置其他从机,注意修改id
server-id=3
# 中继日志名,默认xxxxxxxxxxxx-relay-bin
#relay-log=relay-bin

(2)重启MySQL容器

docker restart mysql-slave1
docker restart mysql-slave2

3. 使用命令行登录MySQL从服务器

(1)进入容器

docker exec -it mysql-slave1 env LANG=C.UTF-8 /bin/bash
docker exec -it mysql-slave2 env LANG=C.UTF-8 /bin/bash

(2)进入容器内的mysql命令行

mysql -uroot -proot

(3)修改默认密码插件

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'root';

4. 在从机上配置主从关系

在从机上执行以下SQL操作

查看主的状态:show master status 

这里的File和Position要与下面配置内容保持一致

查看从的状态: show slave status

此时什么也没有!

 在从slave1和slave2分别下执行下面命令

CHANGE MASTER TO 
MASTER_HOST='47.100.73.47', 
MASTER_USER='slave',
MASTER_PASSWORD='123456', 
MASTER_PORT=3306,
MASTER_LOG_FILE='binlog.000003',
MASTER_LOG_POS=1333; 

三、启动主从同步

启动从机的复制功能,执行SQL:

启动从库:START SLAVE;

停止从库:STOP SLAVE;
-- 查看状态(不需要分号)
SHOW SLAVE STATUS\G

两个关键进程:下面两个参数都是Yes,则说明主从配置成功!  

四、实现主从同步

在主机中执行以下SQL,在从机中查看数据库、表和数据是否已经被同步

CREATE DATABASE mydb1;
USE mydb1;
CREATE TABLE t_user (
 id BIGINT AUTO_INCREMENT,
 uname VARCHAR(30),
 PRIMARY KEY (id)
);
INSERT INTO t_user(uname) VALUES('zhang3');
INSERT INTO t_user(uname) VALUES(@@hostname)

五、停止和重置

需要的时候,可以使用如下SQL语句

在从机上执行。功能说明:停止I/O 线程和SQL线程的操作。

stop slave; 

在从机上执行。功能说明:用于删除SLAVE数据库的relaylog日志文件,并重新启用新的relaylog文件。

reset slave;

-- 在主机上执行。功能说明:删除所有的binglog日志文件,并将日志索引文件清空,重新开始所有新的日志文件。
-- 用于第一次进行搭建主从库时,进行主库binlog初始化工作;

reset master;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/14149.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

设计模式:UML中的类图(6种关系)

一.UML图介绍 统一建模语言是用来设计软件的可视化建模语言。它的特点是简单、统一、图形化、能表达软件设计中的动态与静态信息。 UML 从目标系统的不同角度出发,定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等 9 种图。 二.类图…

太阳的G2

我已经忘记是怎么喜欢上保罗的 入职腾讯的第一天,同事看到我的英文名cris,就笃信我应该是保罗的球迷。 是的,我是保罗的球迷「当然,不只是保罗的球迷」。 14-15赛季,保罗在的快船跟马刺鏖战7场,硬是在第7场…

4.24~25(总结)

第一周任务 - Virtual Judge 分析:这道题开始想错了,所以错了一次。后来又仔细读了一遍题,才发现,要是最长的那个排序子数组,所以第二次就做出来了,它其实应该分为两大块,第一块找左边的起点&a…

能源管理系统在电子厂房中的应用

摘要:以能耗管理系统在工业厂房的应用为例,介绍了系统架构及功能。重点分析能耗管理系统在工业厂房实施过程中遇到的难点,并对系统采集的数据进行分析,提出了相应的节能措施,帮助该业厂房达到节约能耗和运行费用的目的…

【Daily Share】没有域名怎么破?手把手教你如何通过hosts配置域名(假域名)

目录 ❌前言📄hosts文件🦉DNS解析步骤👌配置伪域名第一步 修改本机hosts配置第二步 配置服务器nginx 🔃流程图 ❌前言 ip记不住??? 域名不想买??? 每次当我…

【Linux】Linux开发工具

Linux开发工具 前言Linux编辑器 --- vimvim长啥样vim的基本概念vim的配置 Linux编译器 --- gcc/g编译和链接预处理编译汇编链接 细🔒链接静态库和动态库 Linux调试器 --- gdbLinux项目自动化构建工具 --- make/Makefile依赖关系和依赖方法 上方工具的简单示例 前言 …

0401概述-最短路径-加权有向图-数据结构和算法(Java)

文章目录 1 最短路径2 最短路径的性质3 加权有向图的数据结构3.1 加权有向边3.2 加权有向图 4 最短路径4.1 最短路径API4.2 最短路径的数据结构4.3 边的松弛4.4 顶点的松弛 结语 1 最短路径 如图1-1所示,一幅加权有向图和其中的一条最短路径: 定义&…

LeetCode 27.移除元素

文章目录 💡题目分析💡解题思路🚩思路1:暴力求解 --- 遍历🔔接口源码:🚩思路2:空间换时间🔔接口源码:🚩思路3:双指针(快慢指针)🔔接口…

【C++】string类的简单模拟实现

目录 string类初识 string模拟实现 string类成员变量 构造函数 拷贝构造 赋值运算符重载 析构函数 深浅拷贝问题 string类初识 由于C语言中的字符串不太符合OOP(面向对象编程)的思想,而且其底层空间需要用户自己管理,经常有访问越界的情况出现。…

解决方案:Zotero实现参考文献中英文混排,将英文文献中的“等”转成“et al.”

Zotero 是一款非常实用且易于使用的参考文献管理工具,可帮助用户收集、整理和引用各种类型的文献,包括图书、期刊文章、网页等。在学术写作中起着重要作用。 但是其在中文世界中,运行起来偶尔会出现问题,这里记录一个问题及其解决…

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…

java 获取时间的方法

Java的时间是通过字节码指令来控制的,所以 java程序的运行时间是通过字节码指令来控制的。但是由于 Java程序在运行时, JVM会产生一些状态,所以在执行 JVM指令时, JVM也会产生一些状态。 我们在执行 java程序时,主要是…

kafka延时队列内部应用简介

kafka延时队列_悠然予夏的博客-CSDN博客 两个follower副本都已经拉取到了leader副本的最新位置,此时又向leader副本发送拉取请求,而leader副本并没有新的消息写入,那么此时leader副本该如何处理呢?可以直接返回空的拉取结…

IEEE14节点系统在如短路分析,潮流研究,互连电网中的研究(Simulink)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

easyrecovery16最新数据恢复软件密钥使用方法教程

easyrecovery是一款专业的数据恢复软件,其最新版本为easyrecovery2023将于2022年底发布。总之,easyrecovery是一款功能齐全、性能稳定的专业数据恢复软件,无论删除文件、格式化分区或磁盘故障,它都可以提供最高的恢复成功率。值得个人用户选用。此版本在功能和性能上有较大提升…

BBR原版/魔改/plus/锐速/七合一脚本linux加速脚本/硬盘挂载/cc防御/宝塔

BBR原版/魔改/plus/锐速七合一脚本linux加速脚本/硬盘挂载/CC防御/宝塔 新云分享的七合一脚本,包含原版BBR、魔改BBR、bbrplus以及锐速可选。 在vultr上Centos 7, Debian 8/9, Ubuntu 16/18测试通过,不支持ovz。 安装指令:复制下面命令在s…

基于构效关系模型的药物设计(QSAR)

基于构效关系模型的药物设计(QSAR) 定量构效关系(QSAR,Quantitative Structure-Activity Relationship)分析是指利用理论计算和统计分析工具来研究系列化合物结构(包括二维分子结构、三维分子结构和电子结…

【Maven 入门】第二章、Maven核心程序解压与配置

一、Maven 官网地址 首页: Maven – Welcome to Apache Maven(opens new window) 下载页面: Maven – Download Apache Maven(opens new window) 本文以maven-3.3.8为例 具体下载地址:https://dlcdn.apache.org/maven/maven-3/3.8.8/bina…

【问题记录】docker 搭建 minio

一、搭建过程 docker 搜索minio镜像 docker search miniodocker 拉取镜像 docker pull minio/miniodocker 启动 minio docker run -p 9900:9900 --name minio -d --restartalways -e MINIO_ACCESS_KEYminio -e MINIO_SECRET_KEY1qazWSX -v /usr/local/minio/data:/data -v …

vue-cli的使用和单页面应用程序、使用vue-cli脚手架创建vue项目步骤

1.vue-cli的使用 vue-cli是Vue.js开发的标准工具。它简化了程序员基于webpack创建工程化的Vue项目的过程。 引用自vue-cli官网上的一句话: 程序员可以专注在撰写应用上,而不必花好几天去纠结webpack配置的问题。 中文官网: https://cli.vuejs.org/zh/ 1.1 安装 …
最新文章