MariaDB/Mysql主从复制(Docker)——主库已有数据的解决方案——MariaDB/Mysql数据备份

本文详细介绍了如何通过Mariadb容器实现MySQL主从复制部署。包括创建数据卷、配置从库、备份主库数据、导入备份数据等关键步骤,以及如何在从库中恢复主库的完整数据。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

备份主库原有数据

使用已经主从部署好的主库master作为本次测试的主库

  • 创建好数据卷文件

    mkdir /home/lxj/hedisql/data/slave3
    
  • 创建并运行slave3容器

    docker run --name slave3 -e MYSQL_ROOT_PASSWORD=123456 -v /home/lxj/heidisql/data/slave3:/var/lib/mysql  -p 53306:3306 --restart always -d mariadb
    
  • 拷贝一份MySQL配置文件

sudo docker cp slave3:/etc/mysql/my.cnf /home/lxj/hedisql/data/slave3_my.cnf
  • 修改slave1_my.cnf,在 [mysqld] 节点下添加
		[mysqld]
		server-id=4
		relay-log-index=slave-relay-bin.index
		relay-log=slave-relay-bin
		relay_log_recovery=1		
  • 复制slave3_my.cnf并覆盖slave3中的my.cnf
docker cp /home/lxj/heidisql/data/slave3_my.cnf slave3:/etc/mysql/my.cnf
  • 重启slave1容器
docker restart slave3
  • 锁定主数据库

锁定主数据库,只允许读取不允许写入,这样做的目的是防止备份过程中或备份完成之后有新数据插入,导致备份数据和主数据数据不一致。

docker exec -it master /bin/bash
mysql -uroot -p123456
flush tables with read lock;

查询主数据库状态,并记下File及Position的值

	show master status;
	+------------------------------+
	| File              | Position |
	+-------------------+----------+
	| master-bin.000009 |      343 | 
	+-------------------+----------+

执行docker mariadb备份(如果备份所有数据库里的信息edslxj改为–all-databases既可)命令

docker exec master /usr/bin/mysqldump -p123456 edslxj > backup.sql

需要先在从数据库建立一个同名数据库,才能导入主数据库备份数据。切换到从数据库执行

CREATE DATABASE edslxj;

然后再导入主数据备份数据。

cat backup.sql | docker exec -i slave3 /usr/bin/mysql -p123456 edslxj

此时备份数据导入已完成。

只要像正常配置从库操作即可(具体操作可以查看文档MariaDB的主从复制部署)。

  • 解锁主数据库

从库配置完成之后,切换回主数据库的终端,进行表解锁操作。

unlock tables;

<think>我们计划在同一个网络中的两台服务器上部署MySQL,实现负载均衡、主从复制和读写分离。我们将使用DockerCompose来管理容器。以下是一个分步方案:###架构设计1.**服务器A**:运行一个MySQL主实例(master)和一个用于读负载均衡的MySQL从实例(slave1)。2.**服务器B**:运行一个MySQL从实例(slave2)和一个用于写负载均衡的MySQL代理(如MaxScale或ProxySQL)。3.**主从复制**:主实例(master)将数据异步复制到两个从实例(slave1和slave2)。4.**读写分离**:写操作发送到主实例,读操作在从实例之间负载均衡。###步骤####1.创建Docker网络为了确保所有容器在同一网段,我们需要创建一个自定义的Docker网络。假设两台服务器在同一物理网络(例如192.168.2.0/24),我们可以创建一个overlay网络,但更简单的方式是使用host网络模式或创建一个bridge网络并指定子网。这里我们使用自定义bridge网络并指定子网。在每台服务器上创建相同的自定义网络(确保子网相同):```bashdockernetworkcreate--driver=bridge--subnet=192.168.33.0/24mysql_network```####2.准备DockerCompose文件在每台服务器上创建`docker-compose.yml`文件,但根据服务器角色配置不同的服务。**服务器A(运行master和slave1)的docker-compose.yml**:```yamlversion:'3.8'services:mysql-master:image:mysql:8.0container_name:mysql-masterenvironment:MYSQL_ROOT_PASSWORD:rootpasswordMYSQL_DATABASE:app_dbMYSQL_USER:app_userMYSQL_PASSWORD:userpasswordcommand:---server-id=1---log-bin=mysql-bin---binlog_do_db=app_dbnetworks:mysql_network:ipv4_address:192.168.33.2volumes:-mysql-master-data:/var/lib/mysqlmysql-slave1:image:mysql:8.0container_name:mysql-slave1environment:MYSQL_ROOT_PASSWORD:rootpasswordcommand:---server-id=2networks:mysql_network:ipv4_address:192.168.33.3volumes:-mysql-slave1-data:/var/lib/mysqlnetworks:mysql_network:external:truevolumes:mysql-master-data:mysql-slave1-data:```**服务器B(运行slave2和代理)的docker-compose.yml**:```yamlversion:'3.8'services:mysql-slave2:image:mysql:8.0container_name:mysql-slave2environment:MYSQL_ROOT_PASSWORD:rootpasswordcommand:---server-id=3networks:mysql_network:ipv4_address:192.168.33.4volumes:-mysql-slave2-data:/var/lib/mysqlmaxscale:image:mariadb/maxscale:latestcontainer_name:maxscaleports:-"3306:3306"#暴露代理端口networks:mysql_network:ipv4_address:192.168.33.5volumes:-./maxscale.cnf:/etc/maxscale.cnfdepends_on:-mysql-slave2networks:mysql_network:external:truevolumes:mysql-slave2-data:```####3.配置主从复制在服务器A的mysql-master容器中:-创建复制账号(参考引用[1]):```sqlCREATEUSER'repl'@'%'IDENTIFIEDBY'replpassword';GRANTREPLICATIONSLAVE,RELOAD,SUPERON*.*TO'repl'@'%';FLUSHPRIVILEGES;```在服务器A的mysql-slave1容器和服务器B的mysql-slave2容器中:-配置从服务器连接到主服务器:```sqlCHANGEMASTERTOMASTER_HOST='192.168.33.2',MASTER_USER='repl',MASTER_PASSWORD='replpassword',MASTER_LOG_FILE='mysql-bin.000001',MASTER_LOG_POS=0;STARTSLAVE;```####4.配置MaxScale实现读写分离在服务器B上创建`maxscale.cnf`配置文件:```ini[maxscale]threads=auto#主服务器(写)[server1]type=serveraddress=192.168.33.2port=3306protocol=MariaDBBackend#从服务器1(读)[server2]type=serveraddress=192.168.33.3port=3306protocol=MariaDBBackend#从服务器2(读)[server3]type=serveraddress=192.168.33.4port=3306protocol=MariaDBBackend#监控服务[MySQLMonitor]type=monitormodule=mariadbmonservers=server1,server2,server3user=myuserpassword=mypasswordmonitor_interval=10000#写服务(主)[Write-Service]type=servicerouter=readwritesplitservers=server1user=myuserpassword=mypassword#读服务(从)[Read-Service]type=servicerouter=readconnrouterouter_options=slaveservers=server2,server3user=myuserpassword=mypassword#写监听器[Write-Listener]type=listenerservice=Write-Serviceprotocol=MariaDBClientport=3306#读监听器[Read-Listener]type=listenerservice=Read-Serviceprotocol=MariaDBClientport=3307```注意:需要替换`myuser`和`mypassword`为有权限访问MySQL的用户(例如root或app_user)。####5.启动服务在每台服务器上启动服务:```bashdocker-composeup-d```####6.测试-写操作:连接到服务器B的MaxScale的3306端口(写端口),执行写操作,应路由到主服务器(192.168.33.2)。-读操作:连接到服务器B的MaxScale的3307端口(读端口),执行读操作,应轮流路由到两个从服务器(192.168.33.3和192.168.33.4)。###注意事项1.防火墙:确保两台服务器之间3306端口可访问。2.数据目录:使用卷持久化数据。3.监控:配置MaxScale监控以确保主从状态。4.安全性:为复制账号和应用程序账号使用强密码。###相关问题1.如何监控MySQL主从复制的延迟?2.MaxScale的负载均衡算法有哪些?如何配置?3.如何实现高可用,避免主节点单点故障?4.如何扩展更多的从节点?</think>### Docker Compose 部署 MySQL 负载均衡、主从复制与读写分离方案 #### 架构设计 1. **服务器规划**: - 服务器A:运行 MySQL 主节点(Master) - 服务器B:运行 MySQL 从节点(Slave)和负载均衡器(如 MaxScale) 2. **网络配置**:使用自定义 Docker 网络确保同网段通信(例如 `subnet: 192.168.5.0/24`) 3. **核心组件**: - 主从复制:基于 MySQL 的 binlog 复制 - 读写分离:通过 MaxScale 实现自动路由(写操作到 Master,读操作到 Slave) #### 部署步骤 ##### 1. 创建共享网络(两台服务器均需执行) ```bash docker network create --driver=bridge --subnet=192.168.5.0/24 mysql_net ``` ##### 2. 服务器A:部署 MySQL 主节点 `docker-compose-master.yml`: ```yaml version: '3.8' services: mysql-master: image: mysql:8.0 container_name: mysql-master environment: MYSQL_ROOT_PASSWORD: master_root_pwd MYSQL_DATABASE: app_db MYSQL_USER: app_user MYSQL_PASSWORD: app_pwd command: - --server-id=1 - --log-bin=mysql-bin - --binlog_do_db=app_db networks: mysql_net: ipv4_address: 192.168.5.2 volumes: - mysql-master-data:/var/lib/mysql networks: mysql_net: external: true volumes: mysql-master-data: ``` ##### 3. 服务器B:部署 MySQL 从节点和 MaxScale `docker-compose-slave.yml`: ```yaml version: '3.8' services: mysql-slave: image: mysql:8.0 container_name: mysql-slave environment: MYSQL_ROOT_PASSWORD: slave_root_pwd command: - --server-id=2 networks: mysql_net: ipv4_address: 192.168.5.3 volumes: - mysql-slave-data:/var/lib/mysql maxscale: image: mariadb/maxscale:latest container_name: maxscale ports: - "3306:3306" # 应用连接端口 networks: mysql_net: ipv4_address: 192.168.5.4 volumes: - ./maxscale.cnf:/etc/maxscale.cnf depends_on: - mysql-slave networks: mysql_net: external: true volumes: mysql-slave-data: ``` ##### 4. 配置主从复制 1. **在主节点创建复制账号**: ```sql CREATE USER 'repl'@'%' IDENTIFIED BY 'Repl_Pwd123!'; GRANT REPLICATION SLAVE, RELOAD, SUPER ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES; ``` [^1] 2. **获取主节点 binlog 位置**: ```sql SHOW MASTER STATUS; -- 记录 File: mysql-bin.000001, Position: 157 ``` 3. **配置从节点同步**: ```sql CHANGE MASTER TO MASTER_HOST='192.168.5.2', MASTER_USER='repl', MASTER_PASSWORD='Repl_Pwd123!', MASTER_LOG_FILE='mysql-bin.000001', MASTER_LOG_POS=157; START SLAVE; ``` ##### 5. 配置 MaxScale 读写分离 `maxscale.cnf` 配置文件: ```ini [maxscale] threads=auto # 主节点配置 [server1] type=server address=192.168.5.2 # 主节点IP port=3306 protocol=MariaDBBackend # 从节点配置 [server2] type=server address=192.168.5.3 # 从节点IP port=3306 protocol=MariaDBBackend # 监控服务 [MySQL-Monitor] type=monitor module=mariadbmon servers=server1,server2 user=repl password=Repl_Pwd123! monitor_interval=2000ms # 写服务路由(主节点) [Write-Service] type=service router=readwritesplit servers=server1 user=app_user password=app_pwd # 读服务路由(从节点) [Read-Service] type=service router=readconnroute router_options=slave servers=server2 user=app_user password=app_pwd # 监听器 [RW-Listener] type=listener service=Write-Service protocol=MariaDBClient port=3306 ``` #### 6. 启动服务 ```bash # 服务器A docker-compose -f docker-compose-master.yml up -d # 服务器B docker-compose -f docker-compose-slave.yml up -d ``` #### 验证部署 1. **主从同步检查**: ```sql SHOW SLAVE STATUS\G -- 确保 Slave_IO_Running: Yes, Slave_SQL_Running: Yes ``` 2. **读写分离测试**: - 写操作:`INSERT` 语句通过 MaxScale (192.168.5.4:3306) 应出现在主节点 - 读操作:`SELECT` 语句应路由到从节点 #### 关键注意事项 1. **网络连通性**:确保两台服务器的防火墙允许 3306 端口通信 2. **数据持久化**:使用 Docker 卷避免数据丢失 3. **安全加固**: - 使用 TLS 加密主从同步 - 限制复制账号权限[^1] 4. **负载均衡扩展**:可添加多个从节点并在 MaxScale 配置中添加新服务器 ### 相关问题 1. 如何监控 MySQL 主从复制的延迟状态? 2. MaxScale 如何实现故障自动切换? 3. 如何扩展此架构支持多主节点? 4. Docker 容器时间不同步对主从复制有何影响?如何解决? [^1]: 引用自主从账号创建规范 [^2]: 容器网络配置参考 [^3]: 配置验证方法示例
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值