Docker-搭建MySQL主从复制与双主双从
Docker -- 搭建MySQL主从复制与双主双从
- 一、MySQL主从复制
- 1.1 准备工作
- 从 Harbor 私有仓库拉取镜像
- 直接拉取镜像
- 运行容器
- 1.2 配置主、从服务器
- 1.3 创建主、从服务器
- 1.4 启动主库,创建同步用户
- 1.5 配置启动从库
- 1.6 主从复制测试
- 二、MySQL双主双从
- 2.1 创建网络
- 2.2 创建容器
- 2.3 创建配置文件
- 2.4 配置主主复制
- 2.4.1 在 master 上配置
- 2.4.2 配置 master1 复制 master2
- 2.4.3 配置 master2 复制 master1
- 2.5 配置从节点
- 2.5.1 配置 slave1 复制 master1
- 2.5.2 配置 slave2 复制 master2
- 2.6 验证复制状态
主从复制是指 一台服务器充当主数据库服务器 , 另一台或多台服务器充当从数据库服务器,主服务器中的数据自动复制到从服务器之中。
对于多级复制,数据库服务器即可充当主机,也可充当从机。MySQL 主从复制的基础是 主服务器对数据库修改记录二进制日志 ,从服务器通过主服务器的 二进制日志 自动执行更新
- 主数据库(Master):负责处理
写操作和更新数据
,是业务操作的主要入口。 - 从数据库(Slave):复制主数据库的数据,通常用于
读操作和数据备份
,以减轻主数据库的
压力。
- 记录主库更新的操作记录到二进制日志 binlog 中,通过 binlog dump线程发送给从库
- 当主库发生更新事件(如UPDATE、INSERT、DELETE、CREATE)时,这些操作会被顺序地写入二进制日志(binlog)中。
- 主库会开启一个 binlog dump线程,负责将 binlog 日志中的事件发送给从库。
- 从库 IO 线程通过设置的主库的 slave 账号,连接到主库请求 binlog,并接收主库的binlog,写入到中断日志 relay log 中
- 从库通过 IO 线程连接到主库,并请求 binlog 日志的内容。
- 主库的 binlog dump 线程将 binlog 日志中的事件发送给从库的 IO 线程。
- 从库的 IO 线程接收这些事件,并将其写入到从库的中继日志(relay log)中
- 从库 SQL 线程实时监控 relay log,读取、解析并执行 relay log 中的SQL语句,实现数据的同步。
- 从库开启一个 SQL 线程,实时监控 relay log 的内容是否有更新。
- SQL 线程解析 relay log 中的 SQL 语句,并在从库上执行这些语句,从而实现
数据的同步
。
一、MySQL主从复制
1.1 准备工作
从 Harbor 私有仓库拉取镜像
首先虚拟机打开 harbor 虚拟机,浏览器登录进入到 harbor
- 在 Harbor 私有仓库拉取镜像前提:
- 需要拉取镜像的虚拟机上配置 /etc/hosts文件,添加:
harbor 主机 IP 地址 harbor.registry.com harbor
- 保证本主机 docker 的安装配置的正确性
- 拉取命令:
docker pull harbor.registry.com/library/仓库内的镜像名称和版本
- 需要拉取镜像的虚拟机上配置 /etc/hosts文件,添加:
这里的 harbor.registry.com 来自于/etc/docker/daemon.json文件 “insecure-registries”: [“https://harbor.registry.com”]
[root@docker ~]# cat /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
::1 localhost localhost.localdomain localhost6 localhost6.localdomain6
192.168.86.20 harbor.registry.com harbor
[root@docker ~]# cat /etc/docker/daemon.json
{"default-ipc-mode": "shareable", "data-root": "/data/docker", "exec-opts": ["native.cgroupdriver=systemd"], "log-driver": "json-file", "log-opts": {"max-size": "100m","max-file": "50"},"insecure-registries": ["https://harbor.registry.com"], "registry-mirrors":[ "https://docker.m.daocloud.io","https://docker.imgdb.de","https://docker-0.unsee.tech","https://docker.hlmirror.com","https://docker.1ms.run","https://func.ink","https://lispy.org","https://docker.xiaogenban1993.com"]
}
[root@docker ~]# systemctl restart docker
[root@docker ~]# systemctl restart docker
在 Harbor 私有仓库查看镜像版本
拉取命令:docker pull harbor.registry.com/library/mysql:9.3.0
[root@docker ~]# docker pull harbor.registry.com/library/mysql:9.3.0
9.3.0: Pulling from library/mysql
c2eb5d06bfea: Pull complete
ba361f0ba5e7: Pull complete
0e83af98b000: Pull complete
770e931107be: Pull complete
a2be1b721112: Pull complete
68c594672ed3: Pull complete
cfd201189145: Pull complete
e9f009c5b388: Pull complete
61a291920391: Pull complete
c8604ede059a: Pull complete
Digest: sha256:242c70430703dd27b3a0fcfa628368d165510a5867f20a9beb62f6036879bcf8
Status: Downloaded newer image for harbor.registry.com/library/mysql:9.3.0
harbor.registry.com/library/mysql:9.3.0
直接拉取镜像
[root@docker conf]# docker pull mysql:9.3.0
9.3.0: Pulling from library/mysql
c2eb5d06bfea: Pull complete
ba361f0ba5e7: Pull complete
0e83af98b000: Pull complete
770e931107be: Pull complete
a2be1b721112: Pull complete
68c594672ed3: Pull complete
cfd201189145: Pull complete
e9f009c5b388: Pull complete
61a291920391: Pull complete
c8604ede059a: Pull complete
Digest: sha256:2247f6d47a59e5fa30a27ddc2e183a3e6b05bc045e3d12f8d429532647f61358
Status: Downloaded newer image for mysql:9.3.0
docker.io/library/mysql:9.3.0
运行容器
[root@docker ~]# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
harbor.registry.com/library/mysql 9.3.0 2c849dee4ca9 5 weeks ago 859MB
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
[root@docker ~]# docker run --name mysql -p 3306:3306 -d -e MYSQL_ROOT_PASSWORD="123456" harbor.registry.com/library/mysql:9.3.0
f2bed716866881f1bb4cd1db02889d34f8faac25480367e02eb2bc4e55aabf83
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
f2bed7168668 harbor.registry.com/library/mysql:9.3.0 "docker-entrypoint.s…" 3 seconds ago Up 3 seconds 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql
# 执行此命令可进入 MySQL
[root@docker ~]# docker exec -it mysql /bin/bash
1.2 配置主、从服务器
- 创建挂载数据目录
/data/master/conf
/data/slave/conf - 创建配置文件
my.cnf
# 1.创建挂载数据目录
[root@docker ~]# mkdir /data/master/conf -p
[root@docker ~]# mkdir /data/slave/conf -p# 2.创建配置文件
#主:
[root@docker ~]# cd /data/master/conf/ #
[root@docker conf]# docker cp mysql:/etc/my.cnf .
Successfully copied 2.56kB to /data/master/conf/.
[root@docker conf]# ls
my.cnf[root@docker conf]# vim my.cnf
[root@docker conf]# cat my.cnf
[mysqld]server-id=1host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/#从:
[root@docker conf]# cp my.cnf ../../slave/conf/
[root@docker conf]# vim /data/slave/conf/my.cnf
[root@docker conf]# cat /data/slave/conf/my.cnf
[mysqld]server-id=2 #id改变host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
- my.cnf 文件内容:
[mysqld]
# mysql 服务ID,保证整个集群环境中唯一,取值范围:1 – 2的32次方-1,默认为1
server-id=1# 是否只读,1 代表当前服务器只读(不能做增删改操作), 0代表读写
read-only=0
host-cache-size=0# 只能用IP地址检查客户端的登录,不用主机名
skip-name-resolve# mysql数据文件所在位置
datadir=/var/lib/mysql# 设置socke文件所在目录
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files# 用户
user=mysql# pid文件
pid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock
[root@docker ~]# docker stop mysql
mysql
[root@docker ~]# docker rm mysql
mysql
[root@docker ~]# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS
1.3 创建主、从服务器
- 运行容器
docker run -d
- 查看容器
docker ps
# 1.运行容器
#主:
[root@docker ~]# docker run -d \
--name mysql-master \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/master/conf/my.cnf:/etc/my.cnf \
-p 3306:3306 \
harbor.registry.com/library/mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
981cc5a3123d9db266efd8504d66ee553c29277521dba412437cbace074c5849# 2.查看容器
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
981cc5a3123d harbor.registry.com/library/mysql:9.3.0 "docker-entrypoint.s…" 2 minutes ago Up 2 minutes 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql-master
# 从:
[root@docker ~]# docker run -d \
--name mysql-slave \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/slave/conf/my.cnf:/etc/my.cnf \
-p 3307:3306 \
harbor.registry.com/library/mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
895a1d40e66bbb1784cc275c01c30713550cd779340b61e75d7a3152198c1d50
[root@docker ~]# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
895a1d40e66b harbor.registry.com/library/mysql:9.3.0 "docker-entrypoint.s…" 4 seconds ago Up 4 seconds 3306/tcp, 33060/tcp, 0.0.0.0:3307->3307/tcp, [::]:3307->3307/tcp mysql-slave
981cc5a3123d harbor.registry.com/library/mysql:9.3.0 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, [::]:3306->3306/tcp, 33060/tcp mysql-master
- 运行容器命令:
- –name 名字那里注意修改
- -v 文件挂载路径注意修改
- -p 注意端口冲突,后续服务器端口修改第一个端口号
docker run -d \ #daemon缩写,后台运行 \:连接符
--name mysql-master \ #取名字 注意 master
-e MYSQL_ROOT_PASSWORD=123456 \ #-e:指定密码
-v /data/master/conf/my.cnf:/etc/my.cnf \ #指定文件挂载 注意master与slave时文件路径切换
-p 3306:3306 \ #暴露端口 注意端口冲突,slave可改为3307,只改前面不改后面
# 如果是在harbor内拉取的则为:harbor.registry.com/library/mysql:9.3.0
harbor.registry.com/library/mysql:9.3.0 \ #指定容器的镜像
--character-set-server=utf8mb4 \ #指定编码格式
--collation-server=utf8mb4_unicode_ci
1.4 启动主库,创建同步用户
- 进入主服务器数据库
docker exec -it mysql-master /bin/bash
mysql uroot -p密码
或者docker exec -it mysql-master mysql -uroot -p123456
- 创建专门用于复制的账户
create user 'backups'@'%' identified by '123456';
- 授予此帐户复制所需的权限并刷新权限
grant replication slave on *.* to 'backups'@'%';
flush privileges;
- 确定当前二进制日志文件的名称和位置
show binary log status;
show binary log status\G
# 1.进入主服务器数据库
[root@docker ~]# docker exec -it mysql-master /bin/bash
bash-5.1# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 10
Server version: 9.3.0 MySQL Community Server - GPLCopyright (c) 2000, 2025, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sys |
+--------------------+
4 rows in set (0.005 sec)[root@docker ~]# docker exec -it mysql-master mysql -uroot -p123456
- 创建传门用于复制的账户
# 创建账户
mysql> create user 'backups'@'%' identified by '123456';
Query OK, 0 rows affected (0.013 sec)
- 授予此帐户复制所需的权限并刷新权限
mysql> grant replication slave on *.* to 'backups'@'%';
Query OK, 0 rows affected (0.004 sec)mysql> flush privileges;
Query OK, 0 rows affected, 1 warning (0.003 sec)
- 确定当前二进制日志文件的名称和位置
mysql> show binary log status;
+---------------+----------+--------------+------------------+-------------------+
| File | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set |
+---------------+----------+--------------+------------------+-------------------+
| binlog.000002 | 864 | | | |
+---------------+----------+--------------+------------------+-------------------+
1 row in set (0.001 sec)
# 或者
mysql> show binary log status\G
*************************** 1. row ***************************File: binlog.000002Position: 864Binlog_Do_DB: Binlog_Ignore_DB:
Executed_Gtid_Set:
1 row in set (0.000 sec)
记录一下 File 和 Position,在从库配置同步源的时候需要用到
# 主:
File: binlog.000002
Position: 862
1.5 配置启动从库
- 进入从服务器容器数据库
docker exec -it mysql-slave /bin/bash
mysql -uroot -p123456
- 配置 MySQL 主从复制
CHANGE REPLICATION SOURCE TO \ SOURCE_HOST='192.168.98.140',SOURCE_USER='backups',SOURCE_PASSWORD='123456', \ SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=864, \ GET_SOURCE_PUBLIC_KEY=1;
- 注意主服务器的 FILE 和 Position 值
- 执行语句开启同步
start replica;
- 查看复制状态
show replica status\G
- 注意查看Replica_IO_Running: 、Replica_SQL_Running: 两值为 YES
配置启动从库流程:
- 进入从服务器容器数据库
[root@docker conf]# docker exec -it mysql-slave /bin/bash
bash-5.1# mysql -uroot -p123456
mysql: [Warning] Using a password on the command line interface can be insecure.
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 9
Server version: 9.3.0 MySQL Community Server - GPLCopyright (c) 2000, 2025, Oracle and/or its affiliates.Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.mysql>
- 配置 MySQL 主从复制
mysql> CHANGE REPLICATION SOURCE TO \ #复制源,从主机'192.168.98.140',以及master主机的用户'backups'.....-> SOURCE_HOST='192.168.98.140',SOURCE_USER='backups',SOURCE_PASSWORD='123456', \-> SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=864, \ #主服务器的FILE 和Position-> GET_SOURCE_PUBLIC_KEY=1;
Query OK, 0 rows affected, 2 warnings (0.015 sec)
- 执行语句开启同步
# 开始复制/开始同步
mysql> start replica;
Query OK, 0 rows affected (0.102 sec)
- 查看复制状态
mysql> show replica status\G
*************************** 1. row ***************************Replica_IO_State: Waiting for source to send eventSource_Host: 192.168.98.140Source_User: backupsSource_Port: 3306Connect_Retry: 60Source_Log_File: binlog.000002Read_Source_Log_Pos: 864Relay_Log_File: ba94af67c5cd-relay-bin.000002Relay_Log_Pos: 325Relay_Source_Log_File: binlog.000002Replica_IO_Running: YesReplica_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_Source_Log_Pos: 864Relay_Log_Space: 543Until_Condition: NoneUntil_Log_File: Until_Log_Pos: 0Source_SSL_Allowed: NoSource_SSL_CA_File: Source_SSL_CA_Path: Source_SSL_Cert: Source_SSL_Cipher: Source_SSL_Key: Seconds_Behind_Source: 0
Source_SSL_Verify_Server_Cert: NoLast_IO_Errno: 0Last_IO_Error: Last_SQL_Errno: 0Last_SQL_Error: Replicate_Ignore_Server_Ids: Source_Server_Id: 1Source_UUID: 830681c2-36f1-11f0-ac13-424aa25cd880Source_Info_File: mysql.slave_master_infoSQL_Delay: 0SQL_Remaining_Delay: NULLReplica_SQL_Running_State: Replica has read all relay log; waiting for more updatesSource_Retry_Count: 10Source_Bind: Last_IO_Error_Timestamp: Last_SQL_Error_Timestamp: Source_SSL_Crl: Source_SSL_Crlpath: Retrieved_Gtid_Set: Executed_Gtid_Set: Auto_Position: 0Replicate_Rewrite_DB: Channel_Name: Source_TLS_Version: Source_public_key_path: Get_Source_public_key: 1Network_Namespace:
1 row in set (0.000 sec)
- MySQL 主从复制语句:
CHANGE REPLICATION SOURCE TO \
SOURCE_HOST='192.168.98.140',SOURCE_USER='backups',SOURCE_PASSWORD='123456', \
SOURCE_LOG_FILE='binlog.000002',SOURCE_LOG_POS=864, \
GET_SOURCE_PUBLIC_KEY=1;
1.6 主从复制测试
- 在主服务器上创建库、表并插入数据
- 在从服务器上查看数据
- 主服务器
# 主
mysql> create database my_db;
Query OK, 1 row affected (0.006 sec)mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.007 sec)mysql> use my_db;
Database changed
mysql> create table t1(name varchar(5),sex varchar(2));
Query OK, 0 rows affected (0.013 sec)mysql> desc t1;
+-------+------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+------------+------+-----+---------+-------+
| name | varchar(5) | YES | | NULL | |
| sex | varchar(2) | YES | | NULL | |
+-------+------------+------+-----+---------+-------+
2 rows in set (0.008 sec)
mysql> insert into t1(name,sex) values('li','m');
Query OK, 1 row affected (0.002 sec)
mysql> select * from t1;
+------+------+
| name | sex |
+------+------+
| li | m |
+------+------+
1 row in set (0.001 sec)
- 从
mysql> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| my_db |
| mysql |
| performance_schema |
| sys |
+--------------------+
5 rows in set (0.001 sec)mysql> use my_db;
Reading table information for completion of table and column names
You can turn off this feature to get a quicker startup with -ADatabase changed
mysql> select * from t1;
+------+------+
| name | sex |
+------+------+
| li | m |
+------+------+
1 row in set (0.000 sec)
二、MySQL双主双从
- 直接拉取镜像
[root@docker conf]# docker pull mysql:9.3.0
9.3.0: Pulling from library/mysql
c2eb5d06bfea: Pull complete
ba361f0ba5e7: Pull complete
0e83af98b000: Pull complete
770e931107be: Pull complete
a2be1b721112: Pull complete
68c594672ed3: Pull complete
cfd201189145: Pull complete
e9f009c5b388: Pull complete
61a291920391: Pull complete
c8604ede059a: Pull complete
Digest: sha256:2247f6d47a59e5fa30a27ddc2e183a3e6b05bc045e3d12f8d429532647f61358
Status: Downloaded newer image for mysql:9.3.0
docker.io/library/mysql:9.3.0
2.1 创建网络
docker network create mysql-replication-net
2.2 创建容器
- master1:
docker run -d \
--name master1 \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/master1.cnf:/etc/my.cnf \
-p 3306:3306 \
mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
- master2:
docker run -d \
--name master2 \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/master2.cnf:/etc/my.cnf \
-p 3307:3306 \
mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
- slave1:
docker run -d \
--name slave1 \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/slave1.cnf:/etc/my.cnf \
-p 3308:3306 \
mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
- slave2:
docker run -d \
--name slave1 \
--network mysql-replication-net \
-e MYSQL_ROOT_PASSWORD=123456 \
-v /data/slave2.cnf:/etc/my.cnf \
-p 3309:3306 \
mysql:9.3.0 \
--character-set-server=utf8mb4 \
--collation-server=utf8mb4_unicode_ci
2.3 创建配置文件
[root@docker ~]# cd /data/master/conf/
[root@docker conf]# cp my.cnf /data/master1.cnf
[root@docker conf]# cp my.cnf /data/master2.cnf
[root@docker conf]# cp my.cnf /data/slave1.cnf
[root@docker conf]# cp my.cnf /data/slave2.cnf
[root@docker conf]# vim /data/master1.cnf
[root@docker conf]# cat /data/master1.cnf
[mysqld]
server-id=1host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
[root@docker conf]# vim /data/master2.cnf
[root@docker conf]# cat /data/master2.cnf
[mysqld]
server-id=2host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
[root@docker conf]# vim /data/slave1.cnf
[root@docker conf]# cat /data/slave1.cnf
[mysqld]
server-id=11host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
[root@docker conf]# vim /data/slave2.cnf
[root@docker conf]# cat /data/slave2.cnf
[mysqld]
server-id=22host-cache-size=0
skip-name-resolve
datadir=/var/lib/mysql
socket=/var/run/mysqld/mysqld.sock
secure-file-priv=/var/lib/mysql-files
user=mysqlpid-file=/var/run/mysqld/mysqld.pid
[client]
socket=/var/run/mysqld/mysqld.sock!includedir /etc/mysql/conf.d/
2.4 配置主主复制
在两个主数据服务中创建用于复制/同步数据的用户
查看两个主数据库服务器中查看要同步的二进制文件及位置
记录这个显示中 file 和 position 的值,以便于从服务器进行复制。
2.4.1 在 master 上配置
- master1 和 master2 执行下列命令
- 进入master容器
docker exec -it mysql-master1 mysql -uroot -p123456
docker exec -it mysql-master2 mysql -uroot -p123456
- 创建复制用户
create user 'rep1'@'%' identified by '123456';
- 赋权限
grant replication slave on *.* to 'rep1'@'%';
- 刷新
flush privileges;
- 查看 master1 状态并记录 File 和 Position
show binary log status\G
- 进入master容器
# 在两个主数据服务中创建用于复制/同步数据的用户
create user 'rep1'@'%' identified by '123456';
grant replication slave on *.* to 'rep1'@'%';
flush privileges;# 查看两个主数据库服务器中查看要同步的二进制文件及位置
show binary log status\G;
#记录这个显示中 file 和 position 的值,以便于从服务器进行复制
2.4.2 配置 master1 复制 master2
- 在 master1上执行:
- 查看复制状态
show replica status\G
- 开始复制
start replica;
- 查看复制状态
# master1主数据库服务器同步master2主数据库:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master2',
SOURCE_USER='rep1',
SOURCE_PASSWORD='123456',
SOURCE_LOG_FILE='binlog.000003', #master2的file
SOURCE_LOG_POS=864, #master2的Position
GET_SOURCE_PUBLIC_KEY=1;
2.4.3 配置 master2 复制 master1
- 在 master2上执行:
- 查看复制状态
show replica status\G
- 开始复制
start replica;
- 查看复制状态
# master2同步master1:
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master1',
SOURCE_USER='rep1',
SOURCE_PASSWORD='123456'
SOURCE_LOG_FILE='binlog.000003',
SOURCE_LOG_POS=864,
GET_SOURCE_PUBLIC_KEY=1;
2.5 配置从节点
2.5.1 配置 slave1 复制 master1
-
进入 slave1 容器:
docker exec -it mysql-slave1 mysql -uroot -p123456
-
配置复制
-
查看复制状态
show replica status\G
-
开始复制
start replica;
# slave1同步master1
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master1',
SOURCE_USER='rep1',
SOURCE_PASSWORD='123456'
SOURCE_LOG_FILE='binlog.000003',
SOURCE_LOG_POS=864,
GET_SOURCE_PUBLIC_KEY=1;
2.5.2 配置 slave2 复制 master2
-
进入 slave2 容器:
docker exec -it mysql-slave2 mysql -uroot -p123456
-
配置复制
-
查看复制状态
show replica status\G
-
开始复制
start replica;
# slave2同步master2
CHANGE REPLICATION SOURCE TO
SOURCE_HOST='master2',
SOURCE_USER='rep1',
SOURCE_PASSWORD='123456',
SOURCE_LOG_FILE='binlog.000003'
SOURCE_LOG_POS=864,
GET_SOURCE_PUBLIC_KEY=1;
2.6 验证复制状态
# 在每个节点上执行:
show replica status\G
#检查slave_IO_Running和Slave_SQL_Running是否为Yes。
相关文章:

Docker-搭建MySQL主从复制与双主双从
Docker -- 搭建MySQL主从复制与双主双从 一、MySQL主从复制1.1 准备工作从 Harbor 私有仓库拉取镜像直接拉取镜像运行容器 1.2 配置主、从服务器1.3 创建主、从服务器1.4 启动主库,创建同步用户1.5 配置启动从库1.6 主从复制测试 二、MySQL双主双从2.1 创建网络2.2 …...
LeetCode - 203. 移除链表元素
目录 题目 解题思路 读者可能出现的错误写法 正确的写法 题目 203. 移除链表元素 - 力扣(LeetCode) 解题思路 使用哨兵节点: 创建一个哨兵节点(dummy),将其next指向原链表头节点 哨兵节点的作用是统一处理所有情况&#x…...

canvas 实现全屏倾斜重复水印
参考: html、js、canvas实现水印_html页面使用canvas绘制重复水印-CSDN博客 效果 不求水印显示完全。 实现代码 <template><div class"watermark" ref"waterMark"></div></template><script lang&q…...

vue3项目 前端文件下载的两种工具函数
1、Blob 流下载 Blob 表示不可变的原始数据的类文件对象,通常用于处理文件或大块二进制数据。 注意:js中还有一个二进制数据类型ArrayBuffer,它们的区别如下 Blob 可以位于磁盘、高速缓存内存和其他不可用的位置;ArrayBuffer 是存…...
SpringAI系列 - 升级1.0.0
目录 一、调整pom二、MessageChatMemoryAdvisor调整三、ChatMemory get方法删除lastN参数四、QuestionAnswerAdvisor调整Spring AI发布1.0.0正式版了😅 ,搞起… 一、调整pom <properties><java.version>17</java.version><spring-ai.version>...

5.31 day33
知识点回顾: PyTorch和cuda的安装 查看显卡信息的命令行命令(cmd中使用) cuda的检查 简单神经网络的流程 数据预处理(归一化、转换成张量) 模型的定义 继承nn.Module类 定义每一个层 定义前向传播流程 定义损失函数和优…...
Vue3 + VTable 高性能表格组件完全指南,一个基于 Canvas 的高性能表格组件
Vue3 + VTable 高性能表格组件完全指南 前言 VTable 是一个高性能的多维表格组件,专为处理大数据量场景而设计。它支持数十万条数据的快速渲染,提供了丰富的表格功能和良好的用户体验。本文将详细介绍如何在 Vue3 项目中使用 VTable,并解决常见的配置问题。 什么是 VTabl…...
【七. Java字符串操作与StringBuilder高效拼接技巧】
7. java字符串 7.1 API 介绍:应用程序编程接口。在 Java 中,API 指的是 JDK 提供的各种功能类,这些类把底层实现封装好了,我们不用关心内部怎么写的,直接用就行 用 API 帮助文档步骤:以查Random类为例 打…...
题解:洛谷 P12672 「LAOI-8」近期我们注意到有网站混淆视听
设 LGR 存在数量为 x x x,CSP 存在数量为 y y y。 很明显,我们只需要将其中数量较小的一方改没就行了(一个巴掌拍不响)。 每两个字符串可同意进行一次更改,答案为: ⌈ min ( x , y ) 2 ⌉ \left\lce…...

HTML 计算网页的PPI
HTML 计算网页的PPI vscode上安装live server插件,可以实时看网页预览 有个疑问: 鸿蒙density是按照类别写死的吗,手机520dpi 折叠屏426dpi 平板360dpi <html lang"en" data - overlayscrollbars - initialize><header&…...
WIN11+eclipse搭建java开发环境
环境搭建(WIN11ECLIPSE) 安装JAVA JDK https://www.oracle.com/cn/java/technologies/downloads/#jdk24安装eclipse https://www.eclipse.org/downloads/ 注意:eclipse下载时指定aliyun的软件源,后面安装会快一些。默认是jp汉化e…...
Linux 环境下C、C++、Go语言编译环境搭建秘籍
引言 在当今多元化的编程世界里,C、C 和 Go 语言凭借各自独特的优势,在不同的领域发光发热。C 语言作为一门古老而强大的编程语言,以其高效、贴近硬件的特性,在操作系统、嵌入式系统等底层开发中占据着重要地位;C 作为…...

MMR-Mamba:基于 Mamba 和空间频率信息融合的多模态 MRI 重建|文献速递-深度学习医疗AI最新文献
Title 题目 MMR-Mamba: Multi-modal MRI reconstruction with Mamba and spatial-frequency information fusion MMR-Mamba:基于 Mamba 和空间频率信息融合的多模态 MRI 重建 01 文献速递介绍 磁共振成像(MRI)因其无创、无辐射特性以及…...

2.5/Q2,Charls最新文章解读
文章题目:Trajectories of depressive symptoms and risk of chronic liver disease: evidence from CHARLS DOI:10.1186/s12876-025-03943-7 中文标题:抑郁症状的轨迹和慢性肝病风险:来自 CHARLS 的证据 发表杂志:BM…...

Unity QFramework 简介
目录 什么是MVC模式? QFramework 架构提供了 Model 的概念 QFramework 架构引入 Command 的方式 QFramework 架构引入 Event事件机制 四个层:表现层、系统层、数据层、工具层 委托和回调函数的关系 命令和事件的区别 工具篇 QFramework整体基于M…...

C++ 日志系统实战第五步:日志器的设计
全是通俗易懂的讲解,如果你本节之前的知识都掌握清楚,那就速速来看我的项目笔记吧~ 本文项目代码编写收尾! 日志器类 (Logger) 设计(建造者模式) 日志器主要用于和前端交互。当我们需要使用日志系统打印 log 时&…...
@Docker Compose部署Alertmanager
文章目录 Docker Compose部署Alertmanager1. 准备工作1.1 系统要求1.2 目录结构准备 2. 配置文件准备2.1 创建docker-compose.yml文件2.2 创建Alertmanager配置文件 3. 部署Alertmanager3.1 启动服务3.2 验证服务状态3.3 检查日志 4. 服务验证4.1 访问Web UI 4.2 API健康检查5.…...
前端面试准备-3
1.let、const、var的区别 ①:let和const为块级作用域,var为全局作用域 ②:let和var可以重新赋值定义,而const不可以 ③:var会提升到作用域顶部,但不会初始化;let和const也会提升到作用不顶部…...

性能测试-jmeter实战1
课程:B站大学 记录软件测试-性能测试学习历程、掌握前端性能测试、后端性能测试、服务端性能测试的你才是一个专业的软件测试工程师 性能测试-jmeter实战1 为什么需要性能测试呢?性能测试的作用?性能测试体系性能测试基础性能测试工具性能监控…...
汽车高速通信的EMC挑战
随着“软件定义汽车”的理念全面渗透,中国汽车行业正加速向集中式电子电气架构(E/E架构)转型。SOA(面向服务的架构)理念推动下,整车开始围绕中央计算平台(OIB)与分布式域控制器(VIU)构建,硬件平台具备前所未有的数据处理能力,能掌控整车控制与实时感知决策。 一、…...
[SC]SystemC在CPU/GPU验证中的应用(五)
SystemC在CPU/GPU验证中的应用(五) 摘要:下面分享50个逐步升级SystemC编程能力的示例及建议的学习路线图。您可以一次一批地完成它们——从前五个基础的例子开始,然后转向channels, TLM, bus models, simple CPU/GPU kernels等等。在每个阶段掌握之后,再进行下一组…...
[蓝桥杯C++ 2024 国 B ] 立定跳远(二分)
题目描述 在运动会上,小明从数轴的原点开始向正方向立定跳远。项目设置了 n n n 个检查点 a 1 , a 2 , ⋯ , a n a_1, a_2, \cdots , a_n a1,a2,⋯,an 且 a i ≥ a i − 1 > 0 a_i \ge a_{i−1} > 0 ai≥ai−1>0。小明必须先后跳跃到每个检查…...
现代网络安全攻防技术与发展现状
1. 引言 随着数字化转型进程的加速,全球信息化程度不断深入,网络安全问题日益凸显。根据最新的统计数据,2022年全球范围内的网络攻击事件较前一年增长了约41%,造成的经济损失高达超过6万亿美元。在这个背景下,了解现代…...

杏仁海棠花饼的学习日记第十四天CSS
一,前言 第二天,今天看CSS。 二,CSS简介及导入方式 CSS简介 CSS(层叠样式表,Cascading Style Sheets)是一种用于描述 HTML 或 XML(包括 SVG、XHTML 等)文档呈现效果的样式语言。…...

ESP8266远程控制:实现网络通信与设备控制
概述: 最近一直在弄esp8266的网络通信,但是一直都还没搞懂到底esp8266可不可以通过连接一个网络过后,在很远的地方使用网络将其关掉 在网上找了两个教程都有程序,都跑通了 第一个 第二个找不到了,但是程序有 CSDN上放文…...
RabbitMQ监控:关键技术、技巧与最佳实践
RabbitMQ作为企业级消息中间件的核心组件,其稳定性和性能直接影响分布式系统的可靠性。有效的监控不仅能帮助快速定位问题,还能优化系统资源分配,预防潜在故障。本文基于RabbitMQ官方文档,深入探讨其监控的技术方案、实践技巧及最…...

【机器学习基础】机器学习入门核心算法:隐马尔可夫模型 (HMM)
机器学习入门核心算法:隐马尔可夫模型 (HMM) 一、算法逻辑与核心思想二、算法原理与数学推导核心问题与算法推导 三、模型评估四、应用案例1. 语音识别 (Speech Recognition)2. 自然语言处理 (Natural Language Processing - NLP)3. 手写体识…...
zookeeper 操作总结
zookeeper 中的节点类型 节点类型命令选项说明持久节点无选项(默认)永久存在,除非手动删除。临时节点-e与客户端会话绑定,会话结束自动删除(不能有子节点)。顺序节点-s节点名自动追加递增…...
golang 实现基于redis的并行流量控制(计数锁)
在业务开发中,有时需要对某个操作在整个集群中限制并发度,例如限制大模型对话的并行数。基于redis zset实现计数锁,做个笔记。 关键词:并行流量控制、计数锁 package redisutilimport ("context""fmt""…...

Leetcode 2819. 购买巧克力后的最小相对损失
1.题目基本信息 1.1.题目描述 现给定一个整数数组 prices,表示巧克力的价格;以及一个二维整数数组 queries,其中 queries[i] [ki, mi]。 Alice 和 Bob 去买巧克力,Alice 提出了一种付款方式,而 Bob 同意了。 对于…...