Mysql master slave因改变hostname导致问题及其解决办法

 
在master数据库上产生了一个数据库space,并在配置文件中添加了binlog_do_db = space
原以为启动了slave就ok了。
 
结果在slave机器上show slave status发现:
 
 Slave_IO_Running和Slave_SQL_Running均不正常,且错误日志中有:
 
071128 14:54:52 [ERROR] Failed to open the relay log './dev4-relay-bin.003594(relay_log_pos 235)
071128 14:54:52 [ERROR] Could not find target log during relay log initialization
 
原来是因为hostname改变了
 
于是:
1)恢复老数据
mysqlbinlog oldhostname-relay-bin.003594 --start-position=235 | mysql -u root -ppassword;
2)修改索引日志,使slave日志指向新日志 
vi relay-log.info
 
./newhostname-relay-bin.000000
0
 
然后
Start slave;
Show slave status
;
Slave_IO_Running和Slave_SQL_Running正常运行
 
然后将 master中有关的space数据库的数据库手工导入slave;
 
然后开始往master添加数据,发现slave正常了复制了数据,一切恢复正常了
 
<think>好的,用户之前已经询问了如何在VirtualBox中搭建Ubuntu系统并创建Docker容器,现在他们想进一步在Docker容器中创建三个节点,分别是masterslave1和slave2。我需要先理解用户的具体需求是什么。可能他们是在搭建一个分布式系统,比如Hadoop集群、Redis集群,或者是一个数据库主从复制结构,比如MySQL主从复制。不过用户没有具体说明用途,所以可能需要保持通用性,或者给出一个常见的例子,比如Redis集群。 首先,用户的需求是创建三个容器,分别命名为masterslave1和slave2。这意味着这三个容器需要能够互相通信,可能需要配置网络。在之前的回答中,用户已经安装了Docker,并且可能已经运行了一个Nginx容器。现在需要扩展这个环境,添加多个容器。 接下来,我需要考虑如何创建这些容器。用户可能希望这三个容器在同一个网络中,这样它们可以通过容器名称互相访问。因此,可能需要创建一个自定义的Docker网络,然后将这三个容器连接到这个网络。这样,容器之间可以使用容器名作为主机名进行通信,而不需要知道IP地址。 另外,用户可能需要这些容器在启动时自动运行某些服务,或者需要配置它们之间的主从关系。例如,如果用户是要搭建Redis主从复制,那么需要在master节点上配置为主节点,slave1和slave2配置为从节点,连接到master。如果是MySQL主从复制,则需要配置主数据库和从数据库的复制设置。 不过,用户没有明确说明具体用途,所以可能需要给出一个通用的步骤,包括创建容器、配置网络,并提供一个示例配置(比如Redis主从),让用户可以根据自己的需求进行调整。 此外,用户可能对Docker命令不熟悉,所以需要详细说明每个步骤,包括创建网络、运行容器、连接到网络,以及验证容器之间的通信。同时,可能需要提醒用户关于数据持久化的问题,比如使用Docker卷来保存数据库数据,避免容器删除后数据丢失。 在安全性方面,可能需要提到容器之间的端口开放情况,是否需要暴露端口给宿主机或外部网络访问。比如,如果主节点需要对外提供服务,可能需要映射端口,而从节点可能只需要内部通信。 另外,用户可能遇到的问题包括容器无法互相解析主机名、网络配置错误、服务启动失败等,需要在回答中提供常见问题排查的方法,比如检查网络连接、查看容器日志、验证服务配置等。 最后,需要确保步骤清晰,命令准确无误,并且给出验证方法,让用户能够确认每个步骤是否成功完成。例如,通过进入容器内部ping其他容器的主机名,或者使用具体的应用命令检查主从状态。 综上所述,回答的结构应该是先创建自定义网络,然后分别运行三个容器,指定主机名和网络,最后给出验证步骤和一个应用示例(如Redis主从配置),帮助用户理解如何实际使用这些节点。</think>以下是使用Docker创建`master`、`slave1`、`slave2`三个容器的详细步骤,以搭建一个简单的主从节点环境(示例使用Redis主从复制场景): --- ### **一、创建自定义网络** 为容器分配独立网络,确保节点间可通过容器名称通信: ```bash docker network create my-network ``` --- ### **二、启动主节点(master)** 1. **运行容器** ```bash docker run -d \ --name master \ --hostname master \ --network my-network \ -p 6379:6379 \ # 暴露Redis端口(宿主机访问) redis:latest \ redis-server --appendonly yes # 启用持久化 ``` --- ### **三、启动从节点(slave1/slave2)** 1. **启动slave1** ```bash docker run -d \ --name slave1 \ --hostname slave1 \ --network my-network \ redis:latest \ redis-server --appendonly yes --slaveof master 6379 ``` 2. **启动slave2** ```bash docker run -d \ --name slave2 \ --hostname slave2 \ --network my-network \ redis:latest \ redis-server --appendonly yes --slaveof master 6379 ``` --- ### **四、验证容器运行状态** 1. **查看容器列表** ```bash docker ps -a --format "table {{.Names}}\t{{.Status}}\t{{.Ports}}" ``` - 输出应显示`master`、`slave1`、`slave2`均为运行状态 2. **验证主从复制(以Redis为例)** - 进入主节点写入数据: ```bash docker exec -it master redis-cli > SET test_key "hello" ``` - 进入从节点读取数据: ```bash docker exec -it slave1 redis-cli > GET test_key # 应返回"hello" ``` --- ### **五、节点管理命令** | 操作 | 命令 | |-----------------------|-----------------------------------| | 进入容器终端 | `docker exec -it master /bin/bash` | | 查看容器日志 | `docker logs master` | | 停止容器 | `docker stop slave1` | | 删除容器 | `docker rm slave1` | --- ### **六、扩展配置(可选)** 1. **数据持久化** 挂载宿主机目录保存Redis数据: ```bash docker run -d \ --name master \ -v /path/on/host:/data \ # 绑定数据卷 redis --appendonly yes ``` 2. **容器自启动** 添加`--restart unless-stopped`参数: ```bash docker run -d --restart unless-stopped ... ``` --- ### **常见问题** 1. **节点无法通信** - 检查网络配置:`docker network inspect my-network` - 验证容器IP:`docker inspect master | grep IPAddress` 2. **主从同步失败** - 查看Redis日志:`docker logs slave1` - 确认主节点端口开放:`telnet master 6379`(需安装`telnet`) --- 通过以上步骤,您已成功创建了一个包含主从节点的Docker容器集群。此模式可扩展至MySQL、Elasticsearch等其他主从架构场景。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值