我们有两个节点运行 heartbeat/drbd,我们使用的服务之一是 subversion。我想知道的是:在两个节点上一直运行 svnserve 是否安全,还是应该只在活动节点上运行?
svnserve 是否使用文件级锁定,还是全部在内存中?如果运行 svnserve 而无法访问其存储库,会有什么后果?
如果这不清楚,请告诉我,我会尽力重新措辞/澄清。:)
答案1
我假设,由于您控制了heartbeat
故障转移,因此您正在运行主动/被动 DRBD 集群。因此,在故障转移时,heartbeat
被动节点检测到它必须将自身提升为主动节点。在此过程中,它(通常)广播它正在接管主节点的 VIP 的事实,然后安装 DRBD 磁盘。这使得文件系统可以访问磁盘,并最终heartbeat
按照 启动必要的软件(MySQL、Apache 等)haresources
。
您应该将故障转移后需要启动的任何额外服务添加到文件中,/etc/ha.d/haresources
格式如下:
#node1 10.0.0.170 Filesystem::/dev/sda1::/data1::ext2
db1 192.168.100.200/24/eth0 drbddisk::mysql Filesystem::/dev/drbd0::/drbd::ext3::defaults mysql
使用适当的启动脚本/etc/ha.d/resource.d/mysql
(或根据脚本的功能命名!) - 详细信息配置 haresources, 这drbd 手册和OpenVZ 维基
svnserve
问题的关键在于,在被接管为主动模式之前,实际上没有磁盘可以读取您的存储库,因为drbd
进程在被动模式下会将其锁定。可以运行 DRBD 主动/主动模式,但这是一项相对较新的功能,我还没有尝试过!
一个没有充分记录的陷阱:不要使用 hb_takeover 脚本来测试故障转移,只需终止heartbeat
主服务器上的服务并等待辅助服务器接管,使用 监视两台服务器tail -f /var/log/ha-log
。这还有额外的好处,可以测试和参数deadtime
,这些参数在现实世界的故障转移中都很重要。warntime
initdead
ha.cf
答案2
是的,您可以同时运行 2 个 svnserve 进程,只要您在集群感知文件系统上运行,并且不允许它们同时写入同一个文件。
例如,您可以在同一个 repo 上运行 svnserve 和 httpd 而不会出现问题。
存储库由一个文件锁定,当提交发生时,上传将转到事务目录,当其完成时,事务将原子地应用到存储库。svn 手册的这一部分详细说明多个进程如何通过不同的协议同时提供 svn 数据。