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

本文解决了一个MySQL复制过程中遇到的问题,具体表现为Slave_IO_Running和Slave_SQL_Running状态异常。通过调整主机名设置、手动恢复旧数据、更新索引日志等步骤成功解决了问题,并实现了从master到slave的数据同步。
在master数据库上产生了一个数据库space,并在配置文件中添加了binlog_do_db = space
原以为启动了slave就ok了。
结果在slave机器上show slave status发现:
Slave_IO_Running和Slave_SQL_Running均不正常,且错误日志中有:
071128 14 : 54 : 52 [ERROR]Failedtoopentherelaylog' ./ dev4-relay-bin . 003594 ' ( relay_log_pos 235 )
071128 14 : 54 : 52 [ERROR]Could not find targetlogduringrelayloginitialization
原来是因为hostname改变了
于是:
1)恢复老数据
mysqlbinlogoldhostname-relay-bin . 003594 -- start -position = 235 |mysql-uroot-ppassword ;
2)修改索引日志,使slave日志指向新日志
virelay-log . info

./ newhostname-relay-bin . 000000
0
然后
Start slave ;
Showslavestatus
;
Slave_IO_Running和Slave_SQL_Running正常运行
然后将 master中有关的space数据库的数据库手工导入slave;
然后开始往master添加数据,发现slave正常了复制了数据,一切恢复正常了
以下是我的mysql的yaml文件代码,请你根据这个写出Redis的yaml文件: # 创建命名空间 apiVersion: v1 kind: Namespace metadata: name: mysql-server --- # 主库PV - 部署到k8smaster apiVersion: v1 kind: PersistentVolume metadata: name: mysql-master-pv labels: app: mysql role: master spec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain local: path: /root/mysql_k8s/mysql-master nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8smaster --- # 从库1 PV - 部署到k8snode1 apiVersion: v1 kind: PersistentVolume metadata: name: mysql-slave1-pv labels: app: mysql role: slave spec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain local: path: /root/mysql_k8s/mysql-slave1 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8snode1 --- # 从库2 PV - 部署到k8snode2 apiVersion: v1 kind: PersistentVolume metadata: name: mysql-slave2-pv labels: app: mysql role: slave spec: capacity: storage: 10Gi volumeMode: Filesystem accessModes: - ReadWriteOnce persistentVolumeReclaimPolicy: Retain local: path: /root/mysql_k8s/mysql-slave2 nodeAffinity: required: nodeSelectorTerms: - matchExpressions: - key: kubernetes.io/hostname operator: In values: - k8snode2 --- # 主库PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-master-pvc namespace: mysql-server spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi selector: matchLabels: app: mysql role: master --- # 从库1 PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-slave1-pvc namespace: mysql-server spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi selector: matchLabels: app: mysql role: slave --- # 从库2 PVC apiVersion: v1 kind: PersistentVolumeClaim metadata: name: mysql-slave2-pvc namespace: mysql-server spec: accessModes: - ReadWriteOnce resources: requests: storage: 10Gi selector: matchLabels: app: mysql role: slave --- # 配置文件 apiVersion: v1 kind: ConfigMap metadata: name: mysql-config namespace: mysql-server data: my_master.conf: |- [mysqld] server_id=1 log-bin=mysql-bin binlog-ignore-db=mysql binlog-ignore-db=information_schema binlog-do-db=test binlog_format=ROW expire_logs_days=7 max_binlog_size=100M symbolic-links=0 sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES my_slave1.conf: |- [mysqld] server_id=2 relay-log=relay-bin log-bin=mysql-slave1-bin read_only=1 log_slave_updates=1 slave-skip-errors=1032,1062,1007,1050 symbolic-links=0 my_slave2.conf: |- [mysqld] server_id=3 relay-log=relay-bin log-bin=mysql-slave2-bin read_only=1 log_slave_updates=1 slave-skip-errors=1032,1062,1007,1050 symbolic-links=0 --- # 主库Service apiVersion: v1 kind: Service metadata: name: mysql-master namespace: mysql-server spec: selector: app: mysql mysql: master ports: - port: 3306 targetPort: 3306 clusterIP: None --- # 从库Service apiVersion: v1 kind: Service metadata: name: mysql-slaves namespace: mysql-server spec: selector: app: mysql mysql: slave ports: - port: 3306 targetPort: 3306 clusterIP: None --- # 主库Deployment apiVersion: apps/v1 kind: Deployment metadata: name: mysql-master namespace: mysql-server spec: replicas: 1 selector: matchLabels: app: mysql mysql: master template: metadata: labels: app: mysql mysql: master spec: tolerations: - key: "node-role.kubernetes.io/master" operator: "Exists" effect: "NoSchedule" nodeSelector: kubernetes.io/hostname: k8smaster containers: - name: mysql-master image: mysql:5.7 ports: - containerPort: 3306 name: mysql-port env: - name: MYSQL_ROOT_PASSWORD value: root - name: MYSQL_DATABASE value: test # 主库自动创建test数据库 volumeMounts: - name: mysql-master-storage mountPath: /var/lib/mysql - name: mysql-config mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf livenessProbe: exec: command: ["mysqladmin", "ping", "-uroot", "-proot"] initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: ["mysqladmin", "ping", "-uroot", "-proot"] initialDelaySeconds: 5 periodSeconds: 5 volumes: - name: mysql-master-storage persistentVolumeClaim: claimName: mysql-master-pvc - name: mysql-config configMap: name: mysql-config items: - key: my_master.conf path: my.cnf --- # 从库1 Deployment apiVersion: apps/v1 kind: Deployment metadata: name: mysql-slave1 namespace: mysql-server spec: replicas: 1 selector: matchLabels: app: mysql mysql: slave slave-id: "1" template: metadata: labels: app: mysql mysql: slave slave-id: "1" spec: nodeSelector: kubernetes.io/hostname: k8snode1 containers: - name: mysql-slave1 image: mysql:5.7 ports: - containerPort: 3306 name: mysql-port env: - name: MYSQL_ROOT_PASSWORD value: root - name: MASTER_HOST value: mysql-master - name: MASTER_USER value: repl - name: MASTER_PASSWORD value: replpass volumeMounts: - name: mysql-slave-storage mountPath: /var/lib/mysql - name: mysql-slave-config mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf - name: init-scripts mountPath: /docker-entrypoint-initdb.d livenessProbe: exec: command: ["mysqladmin", "ping", "-uroot", "-proot"] initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: ["mysqladmin", "ping", "-uroot", "-proot"] initialDelaySeconds: 5 periodSeconds: 5 volumes: - name: mysql-slave-storage persistentVolumeClaim: claimName: mysql-slave1-pvc - name: mysql-slave-config configMap: name: mysql-config items: - key: my_slave1.conf path: my.cnf - name: init-scripts configMap: name: slave-init-scripts --- # 从库2 Deployment apiVersion: apps/v1 kind: Deployment metadata: name: mysql-slave2 namespace: mysql-server spec: replicas: 1 selector: matchLabels: app: mysql mysql: slave slave-id: "2" template: metadata: labels: app: mysql mysql: slave slave-id: "2" spec: nodeSelector: kubernetes.io/hostname: k8snode2 containers: - name: mysql-slave2 image: mysql:5.7 ports: - containerPort: 3306 name: mysql-port env: - name: MYSQL_ROOT_PASSWORD value: root - name: MASTER_HOST value: mysql-master - name: MASTER_USER value: repl - name: MASTER_PASSWORD value: replpass volumeMounts: - name: mysql-slave-storage mountPath: /var/lib/mysql - name: mysql-slave-config mountPath: /etc/mysql/conf.d/my.cnf subPath: my.cnf - name: init-scripts mountPath: /docker-entrypoint-initdb.d livenessProbe: exec: command: ["mysqladmin", "ping", "-uroot", "-proot"] initialDelaySeconds: 30 periodSeconds: 10 readinessProbe: exec: command: ["mysqladmin", "ping", "-uroot", "-proot"] initialDelaySeconds: 5 periodSeconds: 5 volumes: - name: mysql-slave-storage persistentVolumeClaim: claimName: mysql-slave2-pvc - name: mysql-slave-config configMap: name: mysql-config items: - key: my_slave2.conf path: my.cnf - name: init-scripts configMap: name: slave-init-scripts --- # 从库初始化脚本(已包含创建test数据库的步骤) apiVersion: v1 kind: ConfigMap metadata: name: slave-init-scripts namespace: mysql-server data: init-slave.sh: |- #!/bin/bash set -e # 等待主库就绪 until mysql -h$MASTER_HOST -uroot -p$MYSQL_ROOT_PASSWORD -e "SELECT 1"; do echo "等待主库就绪..." sleep 5 done # 关键步骤:在从库创建test数据库,与主库保持一致 mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE DATABASE IF NOT EXISTS test;" # 在主库创建复制用户 mysql -h$MASTER_HOST -uroot -p$MYSQL_ROOT_PASSWORD -e "CREATE USER IF NOT EXISTS '$MASTER_USER'@'%' IDENTIFIED BY '$MASTER_PASSWORD'; GRANT REPLICATION SLAVE ON *.* TO '$MASTER_USER'@'%'; FLUSH PRIVILEGES;" # 获取主库日志位置 MASTER_STATUS=$(mysql -h$MASTER_HOST -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW MASTER STATUS\G" | grep -E 'File|Position') MASTER_LOG_FILE=$(echo "$MASTER_STATUS" | grep File | awk '{print $2}') MASTER_LOG_POS=$(echo "$MASTER_STATUS" | grep Position | awk '{print $2}') # 配置从库复制 mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "CHANGE MASTER TO MASTER_HOST='$MASTER_HOST', MASTER_USER='$MASTER_USER', MASTER_PASSWORD='$MASTER_PASSWORD', MASTER_LOG_FILE='$MASTER_LOG_FILE', MASTER_LOG_POS=$MASTER_LOG_POS; START SLAVE;" # 检查复制状态 mysql -uroot -p$MYSQL_ROOT_PASSWORD -e "SHOW SLAVE STATUS\G"
最新发布
10-15
<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等其他主从架构场景。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值