0
1
1
1
专栏/.../

TiDB br日志备份PermissionDenied

 Zyaire  发表于  2024-10-30

项目背景

这次项目是关于银行的,主要涉及存储各种交易和客户信息,这个过程产生了大量数据。为了保护客户数据并确保合规性,需要制定了一套数据管理策略,定期备份所有金融数据,以防止数据丢失或损坏,从而在突发事件发生时能够迅速恢复运营。因此,我的任务是负责这个备份过程。我采用了一种高效的备份工具BR,并将数据存储在高可用的网络文件系统(NFS)上,以确保多台服务器之间的可靠访问。起初我以为这项工作能很快完成,但在备份过程中遇到了一个权限相关的问题,导致备份无法成功。尝试了多种方法都未能解决,直到第二天早晨,我才意识到确保备份过程顺利进行的重要性。

备份任务的计划

这次备份采用每日执行增量备份,每周进行全量备份。

  1. 增量备份:我们每天都会执行增量备份,捕捉自上次备份以来所有新增或更改的数据。采用这种方式目的能够节省存储空间,还能减少备份时间,每天的交易数据都能及时保存。
  2. 全量备份:每周进行一次全量备份,将所有金融数据完整地复制并存储。

原理解释

本文档将基于具体的使用场景,进行TiDB日志备份以及全量备份途中遇到的问题。

下面简单介绍一下TiDB集群以及工具及备份存储的情况:

  • tidb集群版本 v6.5.1
  • tiup版本:v1.11.3
  • br工具版本 v6.5.1
  • 备份存储:nfs共享文件(nfs4,xfs)

br日志备份的原理图,以及流程图:

BR log backup and PITR architecture

BR log backup process design

在上面的流程图可以看得出,如下:

  1. br接收到备份命令 br log start,会获取当前备份时间点,备份存储地址,并在PD注册日志备份任务
  2. TIKV监控日志备份任务的创建与更新
  3. TikV log backup observer持续的变更KV变更日志
  4. TIDB监控日志的备份进度

日志备份

tiup br log start --pd ${pd_addr} --task-name ${task_name} --storage ${backup_path} --log-file ${log_file}

这是一个使用 tiup 工具执行 br 日志备份的示例命令。其中:

  • ${pd_addr} 是 PD 服务器的地址
  • ${task-name} 是 br 日志任务名称
  • ${backup_path} 是备份文件的存储路径
  • ${log_file} 是日志文件的路径

日志备份报错 (PermissionDenied

tiup br log status --pd ${pd_addr} --task-name ${task_name} --storage ${backup_path}

在执行日志备份命令时,遇到了权限被拒绝的错误。I/O Error PermissionDenied 这表明 TiKV 无法在指定的备份路径创建或写入文件。并且在上面的流程图可以看出备份文件 (SST) 的保存是由 TiKV 执行的,所以备份权限是与TIKV的节点相关的

image.png

在创建 tidb 用户没有正确设置 UID 和 GID,导致出现权限冲突问题。这可能会导致 TiKV 无法访问指定的备份路径,从而引发 PermissionDenied 错误

解决步骤:

  1. 确认 NFS 服务端配置:

    # 编辑 NFS 导出文件
    sudo nano /etc/exports
    
    # 添加或修改共享目录配置,例如:
    /path/to/shared/directory *(rw,sync,no_subtree_check,no_root_squash)
    
    # 重新导出 NFS 共享
    sudo exportfs -ra
    
  2. 设置 NFS 客户端(TiDB 节点)的默认 ACL,必须将每个需要备份的 tikv 节点都配置进去

    # 在 TiDB 节点上设置挂载目录的 ACL
    sudo setfacl -R -m u:tidb:rwx,u:tikv:rwx /path/to/mount/point
    sudo setfacl -R -d -m u:tidb:rwx,u:tikv:rwx /path/to/mount/point
    
  3. 调整 TiDB 集群用户权限:

    # 检查各个tikv用户 UID 和 GID
    id tidb
    id tikv
    
    # 更新 NFS 挂载目录的所有权
    sudo chown -R tidb:tidb /path/to/mount/point
    
  4. 重新挂载 NFS 共享:

    # 卸载 NFS 共享
    sudo umount /path/to/mount/point
    
    # 重新挂载 NFS 共享
    sudo mount -t nfs NFS_SERVER_IP:/path/to/shared/directory /path/to/mount/point
    
  5. 验证权限:

    # 切换到 tidb 用户
    sudo su - tidb
    
    # 测试文件创建
    touch /path/to/mount/point/test_file_tidb
    echo "Test content" > /path/to/mount/point/test_file_tidb
    
    # 切换到 tikv 用户
    sudo su - tikv
    
    # 测试文件创建
    touch /path/to/mount/point/test_file_tikv
    echo "Test content" > /path/to/mount/point/test_file_tikv
    
    # 检查文件权限
    ls -l /path/to/mount/point/test_file_*
    

通过这些步骤,我们可以解决由于用户权限设置不当导致的 PermissionDenied 错误,TiKV 能够成功执行日志备份操作。

反思

经过这次备份操作,深刻认识到在数据备份过程中,权限管理的复杂性与重要性是不可忽视的。备份虽然是一个技术性的操作,但背后涉及到的权限配置、用户管理等问题往往会直接影响到备份的成功与否。我们在这个过程中,除了要确保备份目录的权限设置正确外,还发现了用户的umask设置、用户组的合理配置以及访问控制的重要性(虽然修改umask对于整个过程没什么帮助哈哈哈哈)。

在未来的工作中,需要继续深化更加严格的权限管理策略,确保每个用户的访问权限都是经过深思熟虑的。也需要定期进行备份流程中的权限审查,以便及时发现并解决潜在的问题,进一步提升数据的安全性与可靠性。

总结

本文详细介绍了在使用TiDB进行日志备份时遇到的权限问题及其解决方法。通过对NFS服务的配置、TiDB目录的ACL的设置,成功消除了备份过程中的权限冲突。这一经验教训为日后的TiDB备份与恢复操作中提供了宝贵的参考,也希望可以给遇到这个问题的而熬夜解决的老铁们一个参考。

总的来说,这次经历不仅提升了我的技术水平,也增强了在面对问题时的应对能力。未来,我期待在数据管理和备份策略上不断完善,以更好地在上一层楼。

0
1
1
1

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论