ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

CentOS禅道数据目录迁移:从默认路径到独立数据盘的全流程实践

CentOS禅道数据目录迁移:从默认路径到独立数据盘的全流程实践 1. 动手之前先想清楚禅道的数据到底会落在哪里1.1 一键安装包的默认目录布局禅道系统在CentOS上的部署绝大多数团队图省事直接下载官网的Linux一键安装包。这个包把Apache、PHP、MySQL全封装进了/opt/zbox目录解压后执行/opt/zbox/zbox start浏览器一开就能进安装向导。对于一个追求快速上手的内部工具来说这确实是最稳的路径。但用久了你就会意识到一键安装包在“路径管理”这件事上几乎把所有东西都堆在同一个地方。默认情况下几个关键目录是这样的程序目录/opt/zbox/app/zentao这是禅道代码本体。Web服务配置/opt/zbox/etcApache、PHP、MySQL的配置文件都在这里。MySQL数据目录/opt/zbox/data/mysql所有的业务数据、用户账号、项目记录都存在这里。附件上传目录/opt/zbox/app/zentao/www/data/upload需求文档、截图、测试附件全都落在这下面。我见过不少团队服务器系统盘只有40GB或者50GB禅道跑个一年半载数据库本身没多大但是文档、图片、压缩包越堆越多系统盘直接红了。更要命的是如果哪天需要把数据库目录挪到独立的数据盘或者给附件目录单独做容量规划默认路径会让你每一步都束手束脚。1.2 数据库路径和文件存储位置得当成两件事来看很多人在一开始部署的时候并没有意识到“数据库存储路径”和“文件存储位置”是两个独立的问题。MySQL的datadir负责承载结构化业务数据它由MySQL配置决定变更它会影响所有表的读写而ZenTao的附件目录负责承载非结构化的上传文件它受Web应用层的逻辑控制变更它不涉及数据库表结构。两者物理分离之后备份策略才能做到差异化——数据库可以用逻辑备份加binlog附件目录则直接做文件级快照或rsync同步互不干扰。把这个概念理清楚再动手后面的每一步操作都会很有方向感。我最早一次迁移就是因为没区分开这俩结果改了数据库目录附件还在系统盘上过几个月系统盘又满了又得再折腾一次。2. 部署方式选型一键包优先还是手动搭建环境2.1 三种常见部署方式对比禅道在CentOS上的部署常见的有三条路每条的侧重点都不一样我直接说结论。部署方式优点缺点适合场景官方一键安装包环境内部封装、部署快、升级省心、社区资料多路径自定义空间相对小目录迁移需额外处理中小团队快速落地、内网工具化使用手动搭建Apache/Nginx PHP MySQL路径、版本、配置完全可控迁移灵活耗时、对运维经验要求高环境问题排查成本高已有统一运维规范、需要和现有监控告警体系打通的公司Docker容器部署环境隔离、启动快、迁移方便数据卷管理不当容易丢数据网络模式和宿主机交互有学习成本已经全面容器化、有K8s或Docker Compose规范的环境如果纯粹为了把禅道跑起来每天正常用我建议直接走一键安装包。因为禅道官方对Zbox集成环境做了大量兼容性适配你换用自己编译的PHP版本或自定义的MySQL参数反而容易版本不一致出现一些隐蔽的bug。手动部署的优势在于路径和配置完全归你管但对禅道这种体量的系统来说优势并不明显。2.2 我实际选择的一键包方案与前置准备我的做法是先用官方一键包把禅道稳定跑起来再通过“迁移目录 软链接”的方式把数据库和附件目录指到独立的数据盘上。这样既享受到一键包的省心又实现了路径自定义。操作之前有几项检查必须先做不然后面很容易踩坑# 查看当前磁盘使用情况确认系统盘是否紧张 df -h # 查看是否有独立的数据盘未挂载 fdisk -l # 确认操作系统版本和架构 cat /etc/centos-release uname -m我推荐至少准备一块独立的数据盘或云盘来放禅道数据。如果只有一块系统盘至少也要保证系统盘剩余空间在计划存储量的一倍以上因为迁移过程中需要同时保留旧目录和新目录。3. 自定义数据库存储路径迁移MySQL数据目录的完整步骤3.1 磁盘分区、格式化与挂载假设你的服务器上有一块新数据盘/dev/sdb第一步是把它格式化并挂载到/data。# 创建分区如果磁盘还没有分区表 fdisk /dev/sdb # 输入 n 新建分区p 选择主分区然后一路回车 # 最后输入 w 保存分区表 # 格式化文件系统我习惯用 xfs mkfs.xfs /dev/sdb1 # 创建挂载点并挂载 mkdir -p /data mount /dev/sdb1 /data # 配置开机自动挂载 echo /dev/sdb1 /data xfs defaults 0 0 /etc/fstab挂载完之后用df -h确认一下确保/data已经挂上。这里有一个容易被忽略的点/etc/fstab的写法如果不对服务器重启之后数据盘不会自动挂载禅道服务也起不来。我在生产环境里见过太多次这种问题重启前没验证fstab结果整个系统进不去还得进救援模式改回来。验证fstab是否正确的安全做法是执行mount -a如果这个命令没有任何报错说明fstab配置没问题。3.2 停服、搬目录、建软链接迁移数据库目录的核心思路是先把禅道服务停掉把MySQL的数据目录整体移动到新位置然后在原路径建一个软链接指向新位置。这样做的好处是禅道和Zbox内部所有对数据库的引用路径都不用改它们会沿着软链接自动找到真实数据。# 第一件事停服确保数据库落盘数据一致 /opt/zbox/zbox stop # 确认进程全部退出 ps -ef | grep -E mysql|httpd|zbox | grep -v grep确认没有残留进程之后再操作目录# 创建目标目录结构 mkdir -p /data/zentao # 把MySQL数据目录整体搬过去 mv /opt/zbox/data/mysql /data/zentao/mysql # 在原路径建软链接 ln -s /data/zentao/mysql /opt/zbox/data/mysql这里要特别提醒搬迁之前一定要做一次备份或者至少确认禅道的安装包版本能重新下载。虽然mv在同一文件系统下只是改名但如果跨文件系统迁移比如系统盘是ext4、数据盘是xfsmv实际上是“复制删除”的过程一旦中途断掉旧目录可能已经不完整。更稳妥的做法是# 先用rsync做全量拷贝确认无误后再删旧目录 rsync -av /opt/zbox/data/mysql/ /data/zentao/mysql/3.3 启动验证与数据一致性确认软链接建好之后启动服务/opt/zbox/zbox start /opt/zbox/zbox status状态显示正常运行后还要做两层验证。第一层是确认MySQL的datadir确实指向新位置# 进入zbox自带的MySQL客户端 /opt/zbox/run/mysql/mysql -uroot -p登录后执行SELECT datadir; datadir ---------------------------------- /data/zentao/mysql/看到/data/zentao/mysql/就说明数据库目录切换成功了。第二层是实际访问禅道系统随便打开几个页面确认项目列表、需求、Bug这些基于数据库的动态数据都能正常加载。不要只看服务状态是running就觉得万事大吉MySQL启动成功不代表所有表都能正常读写。4. 自定义文件存储位置迁移附件目录的完整步骤4.1 禅道上传文件的存储机制禅道的附件目录默认在/opt/zbox/app/zentao/www/data/upload下面按“用户ID/年月”组织目录比如1/202501这样的路径。所有上传的图片、文档、压缩包都写在这个目录中。和数据库迁移相比附件目录的迁移更简单但也更容易出问题。原因在于Web服务器进程对目录有严格的读写权限要求而很多人迁移完只改了路径忘了权限结果禅道里显示上传成功实际上文件根本没写到目标目录或者图片加载不出来。4.2 附件目录迁移实操同样的套路停服、搬目录、建软链接# 停服 /opt/zbox/zbox stop # 搬迁上传目录 mkdir -p /data/zentao/upload rsync -av /opt/zbox/app/zentao/www/data/upload/ /data/zentao/upload/ # 确认迁移完整后删除旧目录或者先改名为备份目录 mv /opt/zbox/app/zentao/www/data/upload /opt/zbox/app/zentao/www/data/upload.bak # 建软链接 ln -s /data/zentao/upload /opt/zbox/app/zentao/www/data/upload # 确保权限正确 chown -R www:www /data/zentao/upload chmod -R 755 /data/zentao/upload等等这里有个细节需要确认。在Zbox集成环境中Web服务运行用户通常叫www但不同版本可能不一样。稳妥的做法是先看旧目录的属主ls -ld /opt/zbox/app/zentao/www/data/upload照着旧目录的属主和权限设置新目录就不会错。4.3 存量数据与增量数据的验证迁移完成后重新启动服务然后在禅道里实际操作一次新建一个任务、上传一张图片、提交一个Bug并附上截图。去目标目录里确认文件确实写到了新位置ls -l /data/zentao/upload/ ls -l /data/zentao/upload/1/202501/ # 具体路径按实际生成的为准同时再打开之前已经存在的附件页面确认历史附件能正常显示——因为软链接的关系历史文件的访问路径没变只是物理存储位置换了通常不会有什么问题。验证无误之后再把之前改名为upload.bak的旧目录删掉释放系统盘空间。不要急着删至少保留一个业务周期观察一下确认没有文件被漏迁再清理。5. 迁移过程中我踩过的坑权限、SELinux和开机自启5.1 权限错乱导致附件无法读取第一次迁移附件目录的时候我犯过一个低级错误新目录直接在/data下用mkdir创建的挂载点是root属主目录权限是755。搬完启动服务发现禅道里历史图片全部裂开登录后台查看日志发现Apache没法读/data/zentao/upload下面的文件。原因就是目录权限不对。Apache进程用户是www而/data路径下每一层目录都必须允许www用户有进入权限。检查的时候发现/data本身是drwxr-xr-x root root虽然www可以进入但新上传的子目录没有正确继承属主。解决方法是chown -R www:www /data/zentao chmod -R 755 /data/zentao这里想多说一句用chmod -R 777粗暴解决问题是最不可取的方案等于给所有本地用户都开了写权限一旦服务器上还有其他服务风险就大了。5.2 SELinux拦截导致数据库无法启动CentOS 7/8/9默认都开启了SELinux大多数情况下它不会碍事但当你把MySQL数据目录迁移到非标准路径之后SELinux的策略可能直接把MySQL的读写操作拦下来。现象很典型/opt/zbox/zbox start之后MySQL进程反复启动失败日志里报Permission denied或者Cant create/write to file /data/zentao/mysql/xxx。排查思路是这样一步步收窄的# 先看SELinux状态 getenforce # 查看审计日志有没有相关的拒绝记录 ausearch -m avc -ts recent | grep mysql如果确认是被SELinux拦了有两条路可以走。一是给新目录设置正确的SELinux文件上下文标签和默认的MySQL数据目录保持一致# 查看原目录的SELinux标签 ls -Z /opt/zbox/data/mysql # 给新目录设置同样的标签 semanage fcontext -a -t mysqld_db_t /data/zentao/mysql(/.*)? restorecon -Rv /data/zentao/mysql对于上传目录则要设置成httpd_sys_rw_content_tsemanage fcontext -a -t httpd_sys_rw_content_t /data/zentao/upload(/.*)? restorecon -Rv /data/zentao/upload第二条路如果确实不需要SELinux介入在我接触的大量内网服务器上很多团队的SELinux配置其实没那么严谨可以把SELinux改为permissive模式setenforce 0 sed -i s/^SELINUXenforcing/SELINUXpermissive/ /etc/selinux/config这里我想强调一个原则能用标签解决的就不要直接关闭SELinux。虽然我理解很多运维同学图省事直接关但在审计要求严格的环境里SELinux的开启状态可能直接决定平台能否上线。5.3 重启后软链接和路径失效的怪问题还有一个让我印象深刻的坑一切迁移配置都做好了软链接也建了当时验证全部通过结果过了几天服务器一次意外重启禅道直接打不开。排查了半天发现是数据盘没挂载上软链接还在但软链接指向的目标目录/data是空的MySQL数据文件全部“消失”了其实是在未挂载的磁盘上。这就是我在一开始强调fstab配置要验证的原因。很多人的服务器重启后数据盘丢失就是因为/etc/fstab里写的是设备名/dev/sdb1而重启后设备名可能因为内核识别顺序变了变成/dev/sdc1或其他名字。更稳妥的写法是使用UUID# 查看磁盘UUID blkid /dev/sdb1 # fstab中这样写比设备名可靠 UUIDxxxxx-xxxx-xxxx /data xfs defaults 0 0这样即使设备名变了系统也能通过UUID准确找到磁盘。6. 迁移完之后的日常维护建议备份、扩容和路径可追溯6.1 备份策略要跟着路径变化一起调整数据库路径和附件路径迁移到独立数据盘之后备份策略也必须跟着调整不能还按原来的方式备份整个/opt/zbox。我的习惯是把备份拆成两条线。数据库这条线用禅道自带的一键备份功能或者MySQL逻辑备份每天凌晨导出一份SQL文件保留近7天附件这条线用rsync增量同步到备份服务器或者云存储每周做一次全量校验。两条线分开恢复的时候也能按需恢复——数据库坏了只恢复数据库附件丢了只拉附件不需要每次都全量恢复整个禅道。# 数据库每日备份示例 /opt/zbox/run/mysql/mysql -uroot -p密码 zentao /backup/zentao_$(date %Y%m%d).sql # 附件定时同步示例 rsync -av --delete /data/zentao/upload/ backup-server:/backup/zentao-upload/6.2 扩容时只需要动数据盘路径自定义之后扩容的灵活性就体现出来了。如果附件目录增长太快导致数据盘空间不够只需要扩容数据盘不需要动系统盘。云服务器上直接扩展云盘容量然后执行# 重新读取分区表 partprobe /dev/sdb # 扩展文件系统 xfs_growfs /data系统盘的扩容反而麻烦得多要离线操作、快照、重新分区一条龙。所以如果你还在纠结要不要折腾路径这件事我的建议是早晚都得做不如在刚部署完成、数据量还小的时候就做。等系统盘满了再迁移风险和工作量都会成倍增加。6.3 让路径变更变得可追溯最后分享一个非常实用的习惯在变更完路径之后把所有关键信息记录到一个说明文件里放在/opt/zbox目录下文件名就叫CUSTOM_PATHS.txt。内容很简单数据库存储路径: /data/zentao/mysql 软链接: /opt/zbox/data/mysql 附件上传目录: /data/zentao/upload 软链接: /opt/zbox/app/zentao/www/data/upload 当前数据盘挂载: /dev/sdb1 - /data UUID: xxxxx 变更时间: 2025-01-15 操作人: xxx为什么要这样做因为禅道这套系统一旦跑起来经常是好几年都没人碰等新来的同事接手时根本不知道当年的路径迁移细节。我曾经历过一次禅道出问题接手的同学不知道/opt/zbox/data/mysql是个软链接直接把整个目录删了重新初始化结果把/data/zentao/mysql下的真实数据全带走了所幸有备份才没造成大事故。留一份说明哪怕只是几行字也能让后来者少踩一个大坑。部署禅道这类内部工具表面上是个一次性动作实际上路径规划才是长期运维里真正影响体验的部分。数据库和附件分离存放配合独立的备份和扩容方案后面几年维护都会非常省心。如果你正打算在CentOS上部署禅道或者已经在跑禅道但还没做路径规划建议尽早按照文中思路把数据目录迁移到独立位置趁数据量小的时候动刀永远是最划算的时机。
返回列表