SQL Server也可以异地恋:借助rsync轻松实现异地日志传送
微软有一个爱好叫绑定。我最痛恨的一个绑定是IIS与Windows的绑定——升级IIS竟然要升级操作系统,服务器不是PC,系统不是想重装就可以重装。
在使用SQL Server日志传送进行异地备份时,又被微软的绑定策略坑了一次。日志传送只支持Windows文件共享这1种也仅此1种方式,而用于异地备份的服务器与主服务器不在同一个网络中,根本无法使用Windows文件共享。下图就是微软绑定策略的证据:
上图中的共享路径 \\dbserver\LogBackup 是在日志传送主服务器上设置的,备份服务器进行日志传送时,需要访问这个路径,复制其中的日志备份文件并进行恢复。
而异地备份时,备份服务器与主服务器不在同一个网络,无法通过这个共享路径访问到要传送的日志文件。
怎么解决这个问题呢?
如果用Windows架构VPN,你就上了微软绑定策略的当。
我们没上这个当,用移花接木之法解决这个问题。
备份服务器不是需要访问 \\dbserver\LogBackup 吗?那我们就在与备份服务器同一个网络的另外一台服务器(中间服务器)上共享出一个这样的路径,对于备份服务器来说,只要能访问 \\dbserver\LogBackup 就行,才不管是谁共享的呢。
共享路径的问题解决了,但是备份服务器访问共享路径的真正目的是复制日志备份文件。所以,接下来的问题是如何将远程主服务器上的日志备份文件同步到这台中间服务器上?
你可能想到的是FTP,我们开始也是这么想的。但是FTP是上传/下载的利器,但不是同步的利器。我们这里的场景是中间服务器要与远程主服务器上的日志备份文件进行同步,比如远程主服务器会自动删除超过多少天的日志备份文件,主服务器上删除了,中间服务器也要自动删除。
后来想到了我们在用的文件同步利器——rsync(使用方法可以参考之前的一篇博文:Windows平台网站文件同步备份解决方案——cwRsyn),这也是开源世界的杰作,东西虽然看起来简单、丑陋,但解决起问题来就是那么有效。
我们就靠rsync解决了SQL Server的异地恋问题,轻松实现了异地自动化日志传送。
分享一下使用的rsync命令:
rsync -avz --delete --no-super rsync://远程主服务器/logbackup /cygdrive/e/LogBackup
解决问题后的感想
在想到rsync之前,我们打算采用的方法是在远程主服务器跑FTP服务,然后通过写C#代码从远程主服务器上FTP下载日志备份文件实现同步。即使这部分代码写起来不复杂,但从创建项目到发布项目整个加起来的时间会远远超过部署rsync的时间。
所以,对于程序员来说,仅仅会写代码解决问题是不够的。真正的程序员不仅追求代码写得有多漂亮,而且追求用更巧妙的方式解决问题,哪怕不写一行代码,哪怕解决的不是技术问题。
用一句话结束这篇博文:如果把解决问题当作乐趣,程序人生将其乐无穷。