项目背景
这次项目是关于银行的,主要涉及存储各种交易和客户信息,这个过程产生了大量数据。为了保护客户数据并确保合规性,需要制定了一套数据管理策略,定期备份所有金融数据,以防止数据丢失或损坏,从而在突发事件发生时能够迅速恢复运营。因此,我的任务是负责这个备份过程。我采用了一种高效的备份工具BR,并将数据存储在高可用的网络文件系统(NFS)上,以确保多台服务器之间的可靠访问。起初我以为这项工作能很快完成,但在备份过程中遇到了一个权限相关的问题,导致备份无法成功。尝试了多种方法都未能解决,直到第二天早晨,我才意识到确保备份过程顺利进行的重要性。
备份任务的计划
这次备份采用每日执行增量备份,每周进行全量备份。
- 增量备份:我们每天都会执行增量备份,捕捉自上次备份以来所有新增或更改的数据。采用这种方式目的能够节省存储空间,还能减少备份时间,每天的交易数据都能及时保存。
- 全量备份:每周进行一次全量备份,将所有金融数据完整地复制并存储。
原理解释
本文档将基于具体的使用场景,进行TiDB日志备份以及全量备份途中遇到的问题。
下面简单介绍一下TiDB集群以及工具及备份存储的情况:
- tidb集群版本 v6.5.1
- tiup版本:v1.11.3
- br工具版本 v6.5.1
- 备份存储:nfs共享文件(nfs4,xfs)
br日志备份的原理图,以及流程图:
在上面的流程图可以看得出,如下:
- br接收到备份命令 br log start,会获取当前备份时间点,备份存储地址,并在PD注册日志备份任务
- TIKV监控日志备份任务的创建与更新
- TikV log backup observer持续的变更KV变更日志
- 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的节点相关的。
在创建 tidb 用户没有正确设置 UID 和 GID,导致出现权限冲突问题。这可能会导致 TiKV 无法访问指定的备份路径,从而引发 PermissionDenied 错误。
解决步骤:
-
确认 NFS 服务端配置:
# 编辑 NFS 导出文件 sudo nano /etc/exports # 添加或修改共享目录配置,例如: /path/to/shared/directory *(rw,sync,no_subtree_check,no_root_squash) # 重新导出 NFS 共享 sudo exportfs -ra
-
设置 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
-
调整 TiDB 集群用户权限:
# 检查各个tikv用户 UID 和 GID id tidb id tikv # 更新 NFS 挂载目录的所有权 sudo chown -R tidb:tidb /path/to/mount/point
-
重新挂载 NFS 共享:
# 卸载 NFS 共享 sudo umount /path/to/mount/point # 重新挂载 NFS 共享 sudo mount -t nfs NFS_SERVER_IP:/path/to/shared/directory /path/to/mount/point
-
验证权限:
# 切换到 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备份与恢复操作中提供了宝贵的参考,也希望可以给遇到这个问题的而熬夜解决的老铁们一个参考。
总的来说,这次经历不仅提升了我的技术水平,也增强了在面对问题时的应对能力。未来,我期待在数据管理和备份策略上不断完善,以更好地在上一层楼。