mysql5.7-基于docker-compose搭建主从同步

一、环境信息

  • 系统版本:CentOS Linux release 7.9.2009 (Core)
    • cat /etc/centos-release
  • Docker版本:Docker version 20.10.6, build 370c289
    • docker --version
  • Docker-compose版本:Docker Compose version v2.10.2
    • docker-compose --version
  • MySQL版本:5.7
    • mysql> select version()
  • 主机两台 或者 单台部署两个容器

二、主从复制说明

1、简单了解下binlog

  • binlog是记录所有数据库表结构变更(例如CREATE、ALTER TABLE…)以及表数据修改(INSERT、UPDATE、DELETE…)的二进制日志。
  • binlog日志包括两类文件:二进制日志索引文件(文件名后缀为.index)用于记录所有的二进制文件,二进制日志文件(文件名后缀为.00000*)记录数据库所有的DDL和DML(除了数据查询语句)语句事件。
  • binlog有三种格式:statement基于sql语句复制、row基于行数据变更的复制、mixed混合前两种格式的复制。

2、主从复制原理

  1. Master将改变记录到二进制日志(binary log)中
  2. Slave将Master的二进制日志事件(binary log events)拷贝到它的中继日志(relay log)
  3. Slave重做中继日志(Relay Log)中的事件,将Master上的改变反映到它自己的数据库中
  4. 这些是由从库在做,所以是异步的数据同步

3、主从复制应用场景

  1. 主从服务器互为备份,加强数据库架构的健壮性
  2. 主从服务器读写分离,分担网站压力,从服务器只处理用户的查询请求
  3. 将从服务器,按照业务拆分,分担压力

三、master主节点配置

1、目录结构

.
├── docker-compose.yml
└── mysql└── conf│   └── my.cnf└── data└── log

需要 docker-compose.ymlmy.cnf 两个文件

2、my.cnf配置文件

创建文件夹

mkdir -p mysql/conf

配置文件

cat >> mysql/conf/my.cnf <<EOF# @Author: Johnny
# master[mysqld]# [必须]服务器唯一ID
server-id=104# [必须]启用二进制日志
log-bin=mysql-bin # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql# 确保binlog日志写入后与硬盘同步
sync_binlog = 1# 跳过所有的错误,继续执行复制操作
slave-skip-errors = all     # default
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/EOF

3、docker-compose.yml


# @Author: Johnnyversion: '3'
services:mysql:container_name: mysql-masterimage: mysql:5.7restart: alwaysvolumes:- $PWD/mysql/log:/var/log/mysql  - $PWD/mysql/conf/my.cnf:/etc/mysql/my.cnf- $PWD/mysql/data:/var/lib/mysqlports:- '3306:3306'command: ['--explicit_defaults_for_timestamp=true','--character-set-server=utf8mb4','--collation-server=utf8mb4_general_ci','--max_connections=3000']environment:MYSQL_ROOT_PASSWORD: "shield"

将上面的内容准备好后,安装:

docker-compose up -d

4、配置主从同步账号和权限

进入容器

docker exec -it mysql-master bash

登录mysql

mysql -uroot -pshield

执行sql

# 查看配置的服务ID,显示的应该是配置的ID
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| server_id      | 104   |
| server_id_bits | 32    |
+----------------+-------+# 看master信息 File 和 Position 从服务上要用
mysql> show master status;
+------------------+----------+--------------+------------------+-------------------+
| File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+------------------+----------+--------------+------------------+-------------------+
| mysql-bin.000001 |      154 |              | mysql            |                   |
+------------------+----------+--------------+------------------+-------------------+# 创建同步账户并开启权限,只是同步账号
mysql> create user 'sync'@'%' identified by '123456';
mysql> grant replication slave,replication client on *.* to 'sync'@'%';# 刷新信息生效
mysql> flush privileges;

四、slave从节点配置(备份节点)

如果是一台主机安装2个mysql,注意更新 docker-compose.yml 中的端口,避免端口冲突

1、目录结构

.
├── docker-compose.yml
└── mysql└── conf│   └── my.cnf└── data└── log

需要 docker-compose.ymlmy.cnf 两个文件

2、my.cnf配置文件

创建文件夹

mkdir -p mysql/conf

配置文件

cat >> mysql/conf/my.cnf <<EOFcat >> mysql/conf/my.cnf <<EOF# @Author: Johnny
# slave[mysqld]
# [必须]服务器唯一ID
server-id=106# [必须]启用二进制日志
log-bin=mysql-bin # 复制过滤:也就是指定哪个数据库不用同步(mysql库一般不同步)
binlog-ignore-db=mysql# 确保binlog日志写入后与硬盘同步
sync_binlog = 1# 跳过所有的错误,继续执行复制操作
slave-skip-errors = all     # relay_log配置中继日志
relay_log=mysql-relay-bin  # log_slave_updates表示slave将复制事件写进自己的二进制日志
log_slave_updates=1  # default 
skip-host-cache
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysql# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0#log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/EOF

3、docker-compose.yml


# @Author: Johnnyversion: '3'
services:mysql:container_name: mysql-slaveimage: mysql:5.7restart: alwaysvolumes:- $PWD/mysql/log:/var/log/mysql  - $PWD/mysql/conf/my.cnf:/etc/mysql/my.cnf- $PWD/mysql/data:/var/lib/mysqlports:- '3306:3306'command: ['--explicit_defaults_for_timestamp=true','--character-set-server=utf8mb4','--collation-server=utf8mb4_general_ci','--max_connections=3000']environment:MYSQL_ROOT_PASSWORD: "shield"

将上面的内容准备好后,安装:

docker-compose up -d

4、链接master节点

docker exec -it mysql-slave bash
mysql -uroot -pshield

执行sql

#查看server_id是否生效
mysql> show variables like '%server_id%';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| server_id      | 106   |
| server_id_bits | 32    |
+----------------+-------+# 连接主mysql服务 master_log_file 和 master_log_pos的值要填写主master里查出来的值 注意这里使用的docker-compose 内部服务的端口和ip,实际应该为真实的master_host,参数看后面的介绍
mysql> change master to master_host='mysql-master',master_user='sync',master_password='123456',master_port=3306,master_log_file='mysql-bin.000001', master_log_pos=154,master_connect_retry=30;######################################################
###  连接主mysql参数说明:
###  master_port:Master的端口号,指的是容器的端口号
###  master_user:用于数据同步的用户
###  master_password:用于同步的用户的密码
###  master_log_file:指定 Slave 从哪个日志文件开始复制数据,即上文中提到的 File 字段的值
###  master_log_pos:从哪个 Position 开始读,即上文中提到的 Position 字段的值
###  master_connect_retry:如果连接失败,重试的时间间隔,单位是秒,默认是60秒
####################################################### 开启slave
mysql> start slave;mysql> show slave status \G   
*************************** 1. row ***************************Slave_IO_State: Waiting for source to send eventMaster_Host: mysql-masterMaster_User: syncMaster_Port: 3306Connect_Retry: 30Master_Log_File: mysql-bin.000001Read_Master_Log_Pos: 1166Relay_Log_File: mysql-relay-bin.000002Relay_Log_Pos: 1334Relay_Master_Log_File: mysql-bin.000001Slave_IO_Running: YesSlave_SQL_Running: YesReplicate_Do_DB: Replicate_Ignore_DB: Replicate_Do_Table: Replicate_Ignore_Table: Replicate_Wild_Do_Table: Replicate_Wild_Ignore_Table: Last_Errno: 0Last_Error: Skip_Counter: 0Exec_Master_Log_Pos: 1166Relay_Log_Space: 1543Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Master_SSL_Allowed: NoMaster_SSL_CA_File: Master_SSL_CA_Path: Master_SSL_Cert: Master_SSL_Cipher: Master_SSL_Key: Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Master_Server_Id: 888Master_UUID: 05f48dfa-4afd-11ee-821c-0242ac170002Master_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLSlave_SQL_Running_State: Replica has read all relay log; waiting for more updatesMaster_Retry_Count: 86400Master_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Master_SSL_Crl: Master_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Master_TLS_Version: Master_public_key_path: Get_master_public_key: 0Network_Namespace: 
1 row in set, 1 warning (0.01 sec)

看到下列信息代表链接成功

Slave_IO_Running:Yes;
Slave_SQL_Running:Yes;

五、常见问题

1、常用命令

stop slave;
start slave;
show slave status;

2、设置从服务器slave为只读模式(可选)

SHOW VARIABLES LIKE '%read_only%'; #查看只读状态SET GLOBAL super_read_only=1; #super权限的用户只读状态 1.只读 0:可写
SET GLOBAL read_only=1; #普通权限用户读状态 1.只读 0:可写

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

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

相关文章

paddlenlp进行训练UIE-X相关问题

问题一:使用UIE-X 进行实体抽取的时候,如何提升OCR的识别(中文)准确率 问题描述:在使用UIE-X 模型微调时,进行实体抽取的时候,如何提升OCR的识别(中文)准确率,目前提取关系正常,但OCR识别结果存在错别字和未识别到的部分 OCR那里检测和识别要标注训练调整 OCR效果没有PA…

解密Kubernetes(K8s)集群的创建过程和关键步骤

文章目录 1. 准备环境2. 安装Docker3. 安装Kubernetes在Master节点上执行以下步骤&#xff1a;安装kubeadm、kubelet和kubectl初始化Master节点 在工作节点上执行以下步骤&#xff1a;加入集群 4. 设置Kubeconfig5. 安装网络插件6. 验证集群7. 部署应用程序8. 扩展和管理集群9.…

算法专栏——双指针

1.移动零 题目链接&#xff1a;移动 0_牛客题霸_牛客网 (nowcoder.com) 算法原理&#xff1a; 像这样子的将一整块数组划分很多部分可以称为数组划分&#xff0c;常用的解法可以是双指针。 说是双指针&#xff0c;但操作的对象是数组&#xff0c;因此下标就是指针。 双指针的…

Rust个人学习笔记

感悟&#xff1a;感觉rust好像缝合怪&#xff0c;既有python的影子&#xff0c;又有java和cpp的影子&#xff0c;可能这就是新型编程语言趋势吧。而且他的各种规范很严格很规范&#xff0c;比java还更工程&#xff0c;各种规范不对都有warning。 命名规范&#xff1a;蛇形命名…

【面试题精讲】Redis如何实现分布式锁

首发博客地址 系列文章地址 Redis 可以使用分布式锁来实现多个进程或多个线程之间的并发控制&#xff0c;以确保在给定时间内只有一个进程或线程可以访问临界资源。以下是一种使用 Redis 实现分布式锁的常见方法&#xff1a; 获取锁&#xff1a; 客户端尝试使用 SETNX命令在 Re…

LeetCode 48题: 旋转图像

题目 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。 你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1&#xff1a; 输入&#xff1a;matrix [[1,2,3],[4,5,6],[7,8,9]]…

MySql学习笔记04——DDL

DDL 建表语法 建表属于DDL语句&#xff0c;DDL语句包括create drop alter create table 表名(字段名1 数据类型,字段名2 数据类型,字段名3 数据类型,.. );表名一般建议使用t_开头&#xff0c;可读性更强。 Mysql数据类型 varchar 可变长度的字符串&#xff0c;最长为255&…

webserver 同步 I/O 模拟 Proactor 模式的工作流程

服务器基本框架、I/O 模型、事件处理模式 一、服务器编程基本框架 虽然服务器程序种类繁多&#xff0c;但其基本框架都一样&#xff0c;不同之处在于逻辑处理。 二、五种 I/O 模型 阻塞/非阻塞、同步/异步&#xff08;网络IO&#xff09;_呵呵哒(&#xffe3;▽&#xffe3;)&…

LLVM编译安装

LLVM编译安装 #全量下载 git clone https://github.com/llvm/llvm-project.git #只下载最新commit版本 git clone --depth 1 https://github.com/llvm/llvm-project.git#配置 #!/bin/bash set -ex cmake -S llvm -B build -DCMAKE_INSTALL_PREFIX/data0/huozai/software/insta…

ElementUI浅尝辄止22:Alert 警告

用于页面中展示重要的提示信息。 常见于消息提示或警告框。 1.如何使用&#xff1f; 页面中的非浮层元素&#xff0c;不会自动消失。 //Alert 组件提供四种主题&#xff0c;由type属性指定&#xff0c;默认值为info。<template><el-alerttitle"成功提示的文案&…

python如何爬取手机app的数据

引言 随着移动互联网的发展&#xff0c;App已经成为了人们生活中必不可少的一部分。对于开发者来说&#xff0c;了解用户对App的使用情况和反馈意见非常重要。因此&#xff0c;爬取手机App的数据成为了一项必备技能。 本文将介绍如何使用Python爬取手机App的数据&#xff0c;并…

Increment Selection 插件

Increment Selection 插件实现递增 初次使用 按下快捷键 Alt Shift 鼠标左键向下拖拽 向下拖拽之后&#xff0c;在输入一个数字&#xff0c;比如我这里输入了一个数字1 然后按下快捷键 Ctrl Shift ← 进行选中数字 然后按下快捷键 Ctrl Alt i 建自动递增。 然后鼠标随…

使用cmake,将github上的某一个库进行集成到vs2022上

可以参考如下链接的内容: (还未完成,将在后序补充) 1.首先使用cmake,得到对应库的lib,include,bin文件夹 可以参考 https://www.youtube.com/watch?vu5-Df1YlxCI 2.现在我用cmake对这个第三方库进行编译&#xff0c;生成了三个文件夹&#xff1a;一个放的是lib文件(lib文件…

c#using关键字的作用

https://blog.csdn.net/Mona_Zhao/article/details/91363446 using关键字的三种作用&#xff1a; 1. 引用命名空间&#xff1b; 2. 为命名空间或者类型创建别名&#xff1b; 3. 使用using语句。 &#xff08;1&#xff09;引用命名空间 类似于c和c的#include<>, pyt…

idea意外退出mac

目录 问题描述 解决过程 问题描述 mac上的idea我很久没用了&#xff0c;之前用的时候还是发布新版的开源项目&#xff0c;这几天再用的时候&#xff0c;就出现了idea意外退出的问题&#xff0c;我上网查找了很久&#xff0c;对于我的问题都没有很好的解决。 解决过程 在寻求…

高并发下单例线程安全

1.使用静态内置类实现单例模式 自定义线程池 2.使用static代码块实现单例 3.使用静态内置类实现单例模式 4.使用static代码块实现单例 public class MySingleton {//使用volatile关键字保其可见性volatile private static MySingleton instance null;private MySingleton…

C# 采用3DES-MAC进行签名 base64解码与编码

** 3DES-MAC ** 3DES-MAC&#xff08;Triple Data Encryption Standard Message Authentication Code&#xff09;是一种消息认证码&#xff08;MAC&#xff09;算法&#xff0c;用于验证消息的完整性和真实性。3DES-MAC使用了3DES&#xff08;Triple Data Encryption Standa…

Multisim14.0仿真(十)同相放大器

一、仿真原理图&#xff1a; 二、仿真效果图&#xff1a;

海量小文件传输对于企业选用文件传输软件的重要意义

在当前的商业环境中&#xff0c;数据具有极其重要的作用&#xff0c;是企业竞争的核心要素。随着互联网、物联网和云计算等技术的快速发展&#xff0c;数据的类型和规模变得越来越多样。在这其中&#xff0c;海量小文件作为一种普遍而重要的数据形式&#xff0c;扮演着连接信息…

Python UDP编程

前面我们讲了 TCP 编程&#xff0c;我们知道 TCP 可以建立可靠连接&#xff0c;并且通信双方都可以以流的形式发送数据。本文我们再来介绍另一个常用的协议--UDP。相对TCP&#xff0c;UDP则是面向无连接的协议。 UDP 协议 我们来看 UDP 的定义&#xff1a; UDP 协议&#xff…