K8s部署MySQL 8.0.28主从复制(XtraBackup)遇Ncat报错求助
解决K8s中MySQL 8.0.28主从复制XtraBackup容器的Ncat断言失败问题
问题背景
基于Kubernetes官方MySQL 5.7主从复制示例修改配置,部署MySQL 8.0.28主从集群,使用自定义XtraBackup镜像hiroaki2020/dtuj_xtrabackup:1.0。在Killercoda K8s playground中应用配置后,第二个Pod(mysql-1)启动时,第一个Pod的xtrabackup容器抛出错误:
Ncat: assertion failed: count <= INT_MAX QUITTING.
原因分析
该错误源于自定义XtraBackup镜像中内置的ncat版本存在大文件传输限制:旧版ncat无法处理超过INT_MAX(约2GB)的文件传输,而MySQL 8.0的备份文件大小容易突破这个阈值,触发断言失败。官方MySQL 5.7示例使用的镜像适配了5.7的备份规模,未遇到此问题。
解决方法
1. 替换适配MySQL 8.0的XtraBackup镜像
使用Percona官方维护的支持MySQL 8.0的XtraBackup镜像percona/percona-xtrabackup:8.0,该镜像内置的ncat已修复大文件传输的断言问题,且完全兼容MySQL 8.0的备份逻辑。
2. 修改StatefulSet配置
将原配置中xtrabackup容器的image字段替换为percona/percona-xtrabackup:8.0,备份命令无需大幅调整,官方镜像已适配MySQL 8.0的参数要求。
3. 清理旧资源并重新部署
# 删除现有StatefulSet kubectl delete statefulset mysql # 删除关联的PVC,确保重新部署时使用全新存储 kubectl delete pvc data-mysql-0 data-mysql-1 # 应用修改后的配置文件 kubectl apply -f your-mysql-statefulset.yaml
4. 验证主从同步状态
部署完成后,检查主从同步是否正常:
# 进入主Pod查看主库状态 kubectl exec -it mysql-0 -- mysql -uroot -p SHOW MASTER STATUS; # 进入从Pod查看从库同步状态 kubectl exec -it mysql-1 -- mysql -uroot -p SHOW SLAVE STATUS\G
确认Slave_IO_Running和Slave_SQL_Running均为Yes,则同步正常。
官方MySQL 5.7主从复制示例(参考)
以下是官方示例中xtrabackup容器的核心配置片段,供对比参考:
containers: - name: xtrabackup image: gcr.io/google-samples/xtrabackup:1.0 command: - /bin/sh - -c - > set -x; cd /var/lib/mysql; if [[ -f xtrabackup_slave_info ]]; then mv xtrabackup_slave_info change_master_to.sql.in; rm -f xtrabackup_binlog_info; elif [[ -f xtrabackup_binlog_info ]]; then grep -a 'CHANGE MASTER TO' xtrabackup_binlog_info > change_master_to.sql.in; fi; if [[ -f change_master_to.sql.in ]]; then sed -i 's/MASTER_HOST=[^ ]*/MASTER_HOST="mysql-0.mysql"/' change_master_to.sql.in; sed -i 's/MASTER_USER=[^ ]*/MASTER_USER="root"/' change_master_to.sql.in; sed -i 's/MASTER_PASSWORD=[^ ]*/MASTER_PASSWORD="password"/' change_master_to.sql.in; sed -i 's/MASTER_LOG_FILE=[^ ]*/MASTER_LOG_FILE="'"$(cat xtrabackup_binlog_info | awk '{print $1}')"'"/' change_master_to.sql.in; sed -i 's/MASTER_LOG_POS=[^ ]*/MASTER_LOG_POS='"$(cat xtrabackup_binlog_info | awk '{print $2}')"'/' change_master_to.sql.in; fi; while true; do sleep 30; if [[ -f change_master_to.sql.in ]]; then mysql -h mysql-0.mysql -uroot -ppassword -e "FLUSH TABLES WITH READ LOCK"; xtrabackup --backup --target-dir=/var/lib/mysql/backup --user=root --password=password; mysql -h mysql-0.mysql -uroot -ppassword -e "UNLOCK TABLES"; xtrabackup --prepare --target-dir=/var/lib/mysql/backup; ncat --listen --keep-open --send-only --max-conns=1 3307 < /var/lib/mysql/backup/backup.stream; rm -rf /var/lib/mysql/backup; fi; done ports: - containerPort: 3307 name: xtrabackup volumeMounts: - name: data mountPath: /var/lib/mysql
内容的提问来源于stack exchange,提问作者Steve
相关产品推荐
相关产品推荐

