本系列文章翻译自《50 Tips and Tricks for MongoDB Developers》,暂时没有找到中文版,反正自己最近也在深入学习mongodb,所以正好拿来翻译一下。一方面加强自己学习的效果,另一方面让大 家也一起来体验一下需要我们这些mongodb使用者需要注意的地方。
首先声明自己的英文水平不是太高,加之有些英文翻译成中文也找不到合适的词来表达,所以在文章中可能会出现英文原词,或者说有些地方的翻译会有些生 硬,也就是说会出现直译的地方。翻译该书的主要目的是为大家学习探讨用的,如果有翻译不精准的地方,或者说有更加精准的翻译,还请大家指出,我会及时的更 正的,在此先谢过各位了。
Tip#19.Handle "seamless" failover
处理无缝的故障恢复(直译,没找到好的翻译)
人们经常听说mongodb可以无缝的处理故障恢复的问题,很惊讶mongodb什么时候开始进行这些处理的。mongodb进行故障恢复,不需要外界干预,但是不可能自动的处理一些错误。
假设你向服务器发送一个请求,返回给你一个网络错误。你的驱动程序有两个选择;
如果驱动不能再次连接数据库,也就不能重新发送请求了。但是,假设驱动知道还有一台服务器,它会自动的向那台服务器发送请求吗?这依赖于请求。如果你的请求是向primary写数据,可能根本就没有另外一个primary。如果你正在进行的请求是读取数据,例如在一个slave上需要长时间运行的mapreduce分析,这时候这个slave down机了,驱动不会将这个请求发送到其他服务器。因此,不会在其他服务器重新尝试请求。
如果错误是暂时的网络错误,驱动可以立即连接到服务器。任然不会重新发送请求。如果驱动发送一个请求遇到了网络错误,错误超出了数据库的响应范围。因为数据库已经响应过了,你也不希望数据库再处理一次吧。
这是一个棘手的问题,需要应用来解决。无论网络抛出任何的异常,你都必须捕获(这方面可以在驱动文档中找到捕获异常的方法)。处理异常,并且决定是否重新发送请求。是否需要先检查数据库状态?是否可以放弃,还是需要重试?