在一个存储库上运行两个 svnserve 实例是否安全,或者只运行一个?

在一个存储库上运行两个 svnserve 实例是否安全,或者只运行一个?

我们有两个节点运行 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,这些参数在现实世界的故障转移中都很重要。warntimeinitdeadha.cf

答案2

是的,您可以同时运行 2 个 svnserve 进程,只要您在集群感知文件系统上运行,并且不允许它们同时写入同一个文件。

例如,您可以在同一个 repo 上运行 svnserve 和 httpd 而不会出现问题。

存储库由一个文件锁定,当提交发生时,上传将转到事务目录,当其完成时,事务将原子地应用到存储库。svn 手册的这一部分详细说明多个进程如何通过不同的协议同时提供 svn 数据。

相关内容