You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.22 16:15:41