mysql笔记:25. docker环境中mysql主从复制、主主复制实操

文章目录

  • 一、准备工作
    • 1. 安装配置Docker
    • 2. 准备MySQL相关的配置和数据目录
  • 二、基于日志点的主从复制
    • 1. 配置Master服务器
      • 1.1 修改配置文件
      • 1.2. 在docker中启动Master节点
      • 1.3. 创建用户并授权
    • 2. 配置Slave1服务器
      • 2.1. 修改配置
      • 2.2. 启动服务
      • 2.3. 指定Master
      • 2.4. 开始复制
    • 3. 配置Slave2服务器
      • 3.1. 修改配置
      • 3.2. 启动服务
      • 3.3. 指定Master
      • 3.4. 开始复制
    • 4. 测试效果
      • 4.1. 更新数据
      • 4.2. 查看同步结果
  • 三、基于GTID的主从复制
    • 1. Master配置文件
    • 2. Slave配置文件
    • 3. 指定Master信息
  • 四、主主复制
    • 1. 基于日志点的主主复制
      • 1.1. 修改节点1的MySQL配置
      • 1.2. 修改节点2的MySQL配置
      • 1.3. 启动两个MySQL
      • 1.4. 连接MySQL并创建用户
      • 1.5. 配置Master信息
      • 1.6. 开启复制
      • 1.7. 复制测试
    • 2. 基于GTID的主主复制
      • 2.1. 修改节点的MySQL配置
      • 2.2. 配置Master信息

Docker容器是现在的主流技术,容器提供了细粒度的系统隔离机制,每个容器都完全独立,其中包括了应用以及所有需要的系统依赖,可以把系统中每个服务放入容器,让各个服务都以容器的形式运行,这样就大大简化了系统的部署过程,更加便于维护。

一、准备工作

1. 安装配置Docker

各位看官根据自己的操作系统和喜好选择相应的Docker进行安装和配置。使用docker pull命令拉取mysql 8的镜像文件。

> docker pull mysql:8

2. 准备MySQL相关的配置和数据目录

本次演示以一主二从共三台服务器为例进行演示。在当前目录创建三个配置文件目录和三个数据目录:

> cd /Users/Tom/docker
> 
> mkdir mysqlconf
> mkdir mysqlconf/master
> mkdir mysqlconf/slave1
> mkdir mysqlconf/slave2
> 
> mkdir mysqldata
> mkdir mysqldata/master
> mkdir mysqldata/slave1
> mkdir mysqldata/slave2
> 
> tree -L 2
.
├── README.md
├── mysqlconf
│   ├── master
│   ├── slave1
│   └── slave2
└── mysqldata├── master├── slave1└── slave2

运行MySQL容器并从中拷贝MySQL配置文件到本地备用,配置文件目录:/etc/my.cnf

# 语法:
docker cp <containerId>:/path/to/file /path/on/host# 示例:temp_mysql8是本次启动的MySQL容器名称
docker cp temp_mysql8:/etc/my.cnf .

拷贝配置文件到已创建的配置文件目录:

cp my.cnf mysqlconf/master/my.cnf
cp my.cnf mysqlconf/slave1/my.cnf
cp my.cnf mysqlconf/slave2/my.cnf> tree -L 3
.
├── README.md
├── mysqlconf
│   ├── master
│   │   └── my.cnf
│   ├── slave1
│   │   └── my.cnf
│   └── slave2
│       └── my.cnf
└── mysqldata├── master├── slave1└── slave2

二、基于日志点的主从复制

1. 配置Master服务器

1.1 修改配置文件

编辑主服务器的MySQL配置文件mysqlconf/master/my.cnf,添加下列配置项:

[mysqld]
server-id=1
log-bin=mysql-binlog
binlog-do-db=your-database-name
default_authentication_plugin=mysql_native_password

1.2. 在docker中启动Master节点

docker run -P --name mysqlmaster \-v $PWD/mysqldata/master:/var/lib/mysql \-v $PWD/mysqlconf/master/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8

参数含义说明:

  • -P:本机与容器的端口映射
  • --name:为容器指定一个名称mysqlmaster
  • MYSQL_ROOT_PASSWORD:指定MySQL中root用户的密码为123456
  • -d:指定容器运行方式为后台运行
    容器启动后登录MySQL并检查配置是否生效:
$> docker exec -it mysqlmaster bash
# mysql -uroot -p123456
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 1     |
+---------------+-------+

如果登录MySQL提示错误:Access denied for user 'root'@'localhost' (using password: YES),可能是你密码输入错误,也可能是加密插件导致的。MySQL8使用的默认加密插件是 caching_sha2_password,而MySQL5.6使用的是mysql_native_password,当你在控制台使用明文密码登录的时候走的是mysql_native_password加密,而数据库记录的是caching_sha2_password加密后的密码。两个密文不一致导致登录失败。解决办法是在配置文件中指定加密插件:default_authentication_plugin=mysql_native_password

1.3. 创建用户并授权

在Master上创建一个复制用户并授权

mysql> CREATE USER 'repl'@'%' identified by 'password';
mysql> GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
# 刷新用户权限信息
mysql> FLUSH PRIVILEGES;# 查看Master状态
mysql> SHOW MASTER STATUS;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     1531 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

执行结果中显示二进制日志文件为mysql-bin.000003,日志位置为1531。Slave就是从这个日志点开始进行复制的。

2. 配置Slave1服务器

2.1. 修改配置

编辑从服务器slave1的MySQL配置文件mysqlconf/slave1/my.cnf,添加下列配置项:

[mysqld]  
server-id=2
relay-log=mysql-relay-bin
replicate-do-db=your_database_name

2.2. 启动服务

docker run -P --name mysqlslave1 \-v $PWD/mysqldata/slave1:/var/lib/mysql \-v $PWD/mysqlconf/slave1/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8

容器启动后登录MySQL并检查配置是否生效:

$> docker exec -it mysqlslave1 bash
# mysql -uroot -p123456
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 2     |
+---------------+-------+

2.3. 指定Master

指定Master的信息,包括IP、用户、密码、日志文件和位置。

mysql> change master to master_host='172.17.0.2', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=828

可以使用docker inspect mysqlmaster | grep IPAddress查看Master节点的IP信息

2.4. 开始复制

mysql> start slave;mysql> show slave status \G;
...
Relay_Master_Log_File: mysql-bin.000003
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

最关键的是这两项信息:

  • Slave_IO_Running:
  • Slave_SQL_Running:

3. 配置Slave2服务器

3.1. 修改配置

编辑从服务器slave2的MySQL配置文件mysqlconf/slave2/my.cnf,添加下列配置项:

[mysqld]  
server-id=3
relay-log=mysql-relay-bin
replicate-do-db=your_database_name

3.2. 启动服务

docker run -P --name mysqlslave2 \-v $PWD/mysqldata/slave2:/var/lib/mysql \-v $PWD/mysqlconf/slave2/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8

容器启动后登录MySQL并检查配置是否生效:

$> docker exec -it mysqlslave2 bash
# mysql -uroot -p123456
mysql> show variables like 'server_id';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| server_id     | 3     |
+---------------+-------+

3.3. 指定Master

指定Master的信息,包括IP、用户、密码、日志文件和位置。

mysql> change master to master_host='172.17.0.2', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=828

3.4. 开始复制

mysql> start slave;mysql> show slave status \G;
...
Slave_IO_Running: Yes
Slave_SQL_Running: Yes
...

最关键的是这两项信息:

  • Slave_IO_Running:
  • Slave_SQL_Running:

4. 测试效果

4.1. 更新数据

在Master节点上创建一个新的数据库和表,并任意插入一条数据:

mysql> create database test;
mysql> use test;
mysql> create table user(id bigint(20) primary key, name varchar(20));
mysql> insert into user value(1, 'Tom');
mysql> select * from user;

4.2. 查看同步结果

在Slave1和Slave2节点查看test.user表的数据:

mysql> select * from test.user;
+----+------+
| id | name |
+----+------+
|  1 | Tom  |
+----+------+

结果表明主从复制环境配置成功。

三、基于GTID的主从复制

基于GTID的主从复制配置步骤跟基于日志点的主从复制配置基本相似,差别在于配置和指定Master时使用的命令参数略有差异。具体如下:

1. Master配置文件

打开配置文件mysqlconf/master/my.cnf,在[mysqld]部分添加配置:

[mysqld]
server-id=1
# 启动二进制日志
log-bin=mysql-bin
binlog_format=row
# 开启GTID模式
gtid_mode=on
# 强制GTID一致性
enforce_gtid_consistency=true
  • binlog_format:指定二进制日志格式为row

2. Slave配置文件

打开配置文件mysqlconf/slave1/my.cnfmysqlconf/slave2/my.cnf,分别在[mysqld]部分添加配置:

# slave1节点配置
server_id=2
log-bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
read_only=ON
  • log_slave_updates:参数决定了在从服务器上是否将复制事件写入二进制日志文件(Binary Log)。默认情况下,这个参数是0,表示关闭,也就是说从服务器不会将复制事件写入二进制日志。
  • relay_log_info_repository:指定中继日志的存储方式,默认是文件,这样配置是使用了两个表,是INNODB存储引擎,好处是当出现数据库崩溃时,利用INNODB引擎事务的特点,对这两个表进行恢复,以保证从服务器可以从正确位置恢复数据。
  • read_only:指定从服务器是否只读,此参数对超级用户无效,并且不会影响从服务器的复制。这个参数主要保证从服务器的数据安全性。

# slave2节点配置
server_id=3
log-bin=mysql-bin
log_slave_updates=1
gtid_mode=on
enforce_gtid_consistency=true
master_info_repository=TABLE
relay_log_info_repository=TABLE
read_only=ON

3. 指定Master信息

change master to master_host='172.17.0.2', master_user='repl', master_password='123456', master_auto_position=1;
CHANGE MASTER TO   MASTER_HOST='172.17.0.2',MASTER_USER='repl',MASTER_PASSWORD='123456',MASTER_AUTO_POSITION=1;

四、主主复制

主从复制支持在一台Master数据库的写入和其他Slave数据库只读操作。但这种部署架构有个缺点:只有Master数据库具有写操作。当数据库写操作很多时,它的压力比较大。为了解决这个问题,可以对上述主从架构优化,改成主主复制,使每个数据库都能写入操作,同时,将写入的数据复制到其他数据库中。即数据库之间互为主从复制关系。
主主复制的搭建也比较简单,就是在主从复制的操作基础上增加一些配置和步骤即可。
使用两个MySQL服务器节点互为主从进行演示。

1. 基于日志点的主主复制

1.1. 修改节点1的MySQL配置

配置文件路径:mysqlconf/master1/my.cnf

[mysqld]
server_id=10
log-bin=mysql-bin
binlog_format=row
auto-increment-increment=2
auto-increment-offset=1
  • auto-increment-increment:设置自增长的步进值,一般有n台MySQL设置为n即可
  • auto-increment-offset:设置自增长的起始值,一般用n台MySQL的顺序号即可

主主备份配置中,最重要的就是配置自增长的步进值和起始值。通过设置它们防止多个数据库更新数据时主键重复而造成冲突。

1.2. 修改节点2的MySQL配置

配置文件路径:mysqlconf/master2/my.cnf

[mysqld]
server_id=11
log-bin=mysql-bin
binlog_format=row
auto-increment-increment=2
auto-increment-offset=2

1.3. 启动两个MySQL

docker run -P --name mysqlmaster1 \-v $PWD/mysqldata/master1:/var/lib/mysql \-v $PWD/mysqlconf/master1/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8docker run -P --name mysqlmaster2 \-v $PWD/mysqldata/master2:/var/lib/mysql \-v $PWD/mysqlconf/master2/my.cnf:/etc/my.cnf \-e MYSQL_ROOT_PASSWORD=123456 -d mysql:8

1.4. 连接MySQL并创建用户

分别连接上两个MySQL,并在每一个MySQL上创建复制用户用于后续的配置。

create user 'repl'@'%' identified by '123456';
grant replication slave on *.* to 'repl'@'%';
flush privileges;

1.5. 配置Master信息

通过docker inspect命令得知当前两个节点的IP分别为172.17.0.3172.17.0.4
先登录172.17.0.3,查询:

mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |      843 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+

登录172.17.0.4,使用上述查询的File、Position信息配置Master节点信息:

change master to master_host='172.17.0.3', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=843;

同理,登录172.17.0.4查询master节点信息,然后登录172.17.0.3配置Master。

# 在172.17.0.4上查询
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000003 |     1577 |              |                  |                   |
+------------------+----------+--------------+------------------+-------------------+# 在172.17.0.3上配置
mysql> change master to master_host='172.17.0.4', master_user='repl', master_password='123456', master_log_file='mysql-bin.000003', master_log_pos=1577;

1.6. 开启复制

在两个节点上分别执行start命令开启复制功能

mysql> start slave;mysql> show slave status;

1.7. 复制测试

分别在两个节点上执行一些更新操作,如INSERT、UPDATE或DELETE,然后去另一个节点查询相关数据是否已变更。

2. 基于GTID的主主复制

这种方式比上述方式更加简单,不用去查看日志File和Position,直接配置即可。注意复制用户创建两次要配置忽略mysql库,也可以创建一次复制用户,然后同步信息后另一个库不再创建复制用户。只是这种方式相当于多个节点使用相同的用户账号、密码,存在一定的安全风险。

2.1. 修改节点的MySQL配置

配置文件路径:mysqlconf/master1/my.cnf

[mysqld]
server_id=1
log-bin=mysql-bin
binlog_format=row
gtid_mode=on
enforce_gtid_consistency=true
auto-increment-increment=2
auto-increment-offset=1

配置文件路径:mysqlconf/master2/my.cnf

[mysqld]
server_id=2
log-bin=mysql-bin
binlog_format=row
gtid_mode=on
enforce_gtid_consistency=true
auto-increment-increment=2
auto-increment-offset=2

2.2. 配置Master信息

change master to master_host='172.17.0.3', master_user='repl', master_password='123456', master_auto_position=1;change master to master_host='172.17.0.4', master_user='repl', master_password='123456', master_auto_position=1;start slave;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

vue computed和watch的区别【网易,京东,拼多多】

知识点 computed和watch的区别 题目 讲一下vue组件的computed和watch的区别。 答案 应用场景不同 computed用在根据data属性或者其他computed计算得到一个新值的情况&#xff0c;computed的值一般被用在渲染中。 watch用在监听数据变化&#xff0c;然后做一些有副作用的操…

【2023】kafka在linux和docker安装(kafka-1)

目录&#x1f4bb; 一、linux安装kafka1. 安装jdk2. 上传解压到/usr/local目录下3、使用kafka 二、docker安装kafka1. 下载2. 安装zookeeper3. 安装kafka 一、linux安装kafka 环境主机 mac m2、虚拟机Ubuntu22.04.4 1. 安装jdk yum install -y java-1.8.0-openjdk.x86_64下载k…

11-设计模式:Go常用设计模式概述

设计模式是啥呢&#xff1f;简单来说&#xff0c;就是将软件开发中需要重复性解决的编码场景&#xff0c;按最佳实践的方式抽象成一个模型&#xff0c;模型描述的解决方法就是设计模式。使用设计模式&#xff0c;可以使代码更易于理解&#xff0c;保证代码的重用性和可靠性。 …

【Entity Framework】EF中DbSet类详解

【Entity Framework】EF中DbSet类详解 文章目录 【Entity Framework】EF中DbSet类详解一、概述二、定义DbSet2.1 具有DbSet属性的DbContext2.2 具有 IDbSet 属性的 DbContext 2.3 具有 IDbSet 属性的 DbContext三、DbSet属性四、DbSet方法五、DbContext动态生成DbSet 一、概述 …

打工人神器! Raccoon 代码小浣熊

继这三个之后&#xff0c;今天又来了一个 [ Raccoon代码小浣熊 ] 核心精要与产品特点 全面支持多种编程语言和IDE&#xff1a;「代码小浣熊」支持超过90种主流编程语言&#xff0c;包括但不限于Python、Java、JavaScript、C、Go和SQL等。同时&#xff0c;它集成了市面上主流的…

Quiet-STaR:让语言模型在“说话”前思考

大型语言模型(llm)已经变得越来越复杂&#xff0c;能够根据各种提示和问题生成人类质量的文本。但是他们的推理能力让仍然是个问题&#xff0c;与人类不同LLM经常在推理中涉及的隐含步骤中挣扎&#xff0c;这回导致输出可能在事实上不正确或缺乏逻辑。 考虑以下场景:正在阅读一…

CTF题型 php://filter特殊编码绕过小汇总

CTF题型 php://filter特殊编码绕过小汇总 文章目录 CTF题型 php://filter特殊编码绕过小汇总特殊编码base64编码string过滤器iconv字符集 例题1.[Newstarctf 2023 week2 include]2.[Ctfshow web 117] php://filter 是一个伪协议&#xff0c;它允许你读取经过过滤器处理的数据流…

YOLO图像前处理及格式转换

import cv2 import numpy as np import os import glob# 数据增强函数 def augment_data(img):rows,cols,_ img.shape# 水平翻转图像if np.random.random() > 0.5:img cv2.flip(img, 1)img_name os.path.splitext(save_path)[0] "_flip.png"cv2.imwrite(img_n…

【C++】string类(常用接口)

&#x1f308;个人主页&#xff1a;秦jh__https://blog.csdn.net/qinjh_?spm1010.2135.3001.5343&#x1f525; 系列专栏&#xff1a;http://t.csdnimg.cn/eCa5z 目录 修改操作 push_back append operator assign insert erase replace c_str find string类非成…

AI学习-Pandas数据处理分析

文章目录 1. Pandas概述2. Series用法2.1 Series的创建2.2 Series的取值2.3 Series的相关方法 3. DataFrame用法3.1 DataFrame创建3.2 DataFrame取值3.3 DataFrame相关方法 1. Pandas概述 ​ Pandas 是一个开源的数据分析处理库&#xff0c;它应用在数据科学、统计分析、机器学…

9.0-源码分析:Dubbo Remoting 层核心接口分析

dubbo-remoting 模块&#xff0c;该模块提供了多种客户端和服务端通信的功能。在 Dubbo 的整体架构设计图中&#xff0c;我们可以看到最底层红色框选中的部分即为 Remoting 层&#xff0c;其中包括了 Exchange、Transport和Serialize 三个子层次。这里我们要介绍的 dubbo-remot…

C++类继承继承5——构造函数与拷贝控制

构造函数与拷贝控制 和其他类一样&#xff0c;位于继承体系中的类也需要控制当其对象执行一系列操作时发生什么样的行为&#xff0c;这些操作包括创建、拷贝、移动、赋值和销毁。 如果一个类(基类或派生类)没有定义拷贝控制操作&#xff0c;则编译器将为它合成一个版本。当然…

手写简易操作系统(十七)--编写键盘驱动

前情提要 上一节我们实现了锁与信号量&#xff0c;这一节我们就可以实现键盘驱动了&#xff0c;访问键盘输入的数据也属于临界区资源&#xff0c;所以需要锁的存在。 一、键盘简介 之前的 ps/2 键盘使用的是中断驱动的&#xff0c;在当时&#xff0c;按下键盘就会触发中断&a…

乐理通识

2023 年搞了台雅马哈 61 键的电子琴&#xff0c;顺手看了下啊 B 的上的课程 《零基础自学音乐学乐理合集-第一季》&#xff0c;这里是部分笔记&#xff08;给博客加点不一样的东西&#x1f440;&#xff09;。 简谱各部分一览 C 表示音名竖线为小节线 音名 完整钢琴键盘 88 键…

什么是ORM

什么是ORM 通过 对象 操作数据库 的方法 被称之为 ORM 数据库的表的格式定义 和 表里面一条条数据 之间的关系&#xff0c;很像python的 类定义 和 类的实例 之间的关系 既然 数据库 表定义和表记录之间的关系 就像 类和实例 之间的关系&#xff0c;Django 就让开发者 通过 …

数据结构

一、栈 先进后出 二、队列 先进先出 三、数组 查询快&#xff0c;增加修改慢 四、链表 查询慢&#xff0c;增加修改慢 五、二叉树 节点&#xff1a; 查找二叉树 二叉查找树的特点 二叉查找树,又称二叉排序树或者二叉搜索树 每一个节点上最多有两个子节点 左子树上所…

Linux shell编程学习笔记43:cut命令

0 前言 在 Linux shell编程学习笔记42&#xff1a;md5sum 中&#xff0c;md5sum命令计算md5校验值后返回信息的格式是&#xff1a; md5校验值 文件名 包括两项内容&#xff0c;前一项是md5校验值 &#xff0c;后一项是文件名。 如果我们只想要前面的md5 校验值&#xff0c…

视频监控联网平台的评价指标体系

目录 一、视频应用系统评价指标体系的设计思路 &#xff08;一&#xff09;、明确评价目标和原则 &#xff08;二&#xff09;、确定评价指标 &#xff08;三&#xff09;、收集和处理数据 &#xff08;四&#xff09;、建立评价模型 &#xff08;五&#xff09;、进行综…

CT图像空气矫正

CT&#xff08;Computed Tomography&#xff09;扫描是一种常用的医学成像技术&#xff0c;用于获取人体内部的高分辨率图像。在CT图像中&#xff0c;由于X射线在穿过人体组织时会受到衰减&#xff0c;因此图像中不同区域的密度会表现出不同的灰度值。而空气与其他组织相比&…

[LeetCode][233]数字 1 的个数

题目 233. 数字 1 的个数 给定一个整数 n&#xff0c;计算所有小于等于 n 的非负整数中数字 1 出现的个数。 示例 1&#xff1a; 输入&#xff1a;n 13 输出&#xff1a;6 示例 2&#xff1a; 输入&#xff1a;n 0 输出&#xff1a;0 提示&#xff1a; 0 < n < 10^9 解…