我对mongodb相当陌生,现在正在处理一些devops问题。
我们在AWS上部署了一款b2b saas产品,客户之间没有networking效应,一些客户拥有比其他客户更多的数据库。 他们目前正在运行一个中央MongoDB服务器,我们得到了嘈杂的邻居问题,我们需要孤立的客户谁拥有可笑的大量的联系人。
我的问题是:什么是最低合理的mongodb服务器的设置,我们给个别大客户自己的独立vpc aws? 这是否需要如mongo文档中所示的3服务器副本集,或者可以合理使用一个ec2实例作为小型数据库的生产mongo服务器?
您可以让生产环境在单个MongoDB实例上运行。 在非常特殊的情况下。 让我们看看这些情况是在我们清理了一些关于副本集的东西之后。
与stream行的观点相反,副本集只有一个主要目的:确保数据库的可用性。 让我们假设你只有一个实例。 每个维护工作,每个服务器崩溃,pipe理中的每个错误都会导致停机。 停机时间不仅影响到你的SLA(足够糟糕),而且很可能导致DBA在派对之夜的早晨06:00在床上爬出床,现在他试图让他的咖啡因水平足够高能够在半醉的时候恢复数据库。
此外:不可避免地,您将丢失备份和恢复服务之间的所有数据。 首先,很明显,你将丢失上一次备份和服务器不可用的点之间的所有数据。 那么,你将失去在停机时间产生的所有数据。
现在让我们假设您有一个具有两个数据承载节点和仲裁器的副本集。 稍微好一些。 您的主服务器出现故障时,其他数据承载节点会被选中,并且由于大多数驱动程序提供的自动故障切换function,您的服务将继续运行,而不会停机和数据丢失。 但是 :你已经失去了冗余。 所以为了降低风险,一个DBA再次起床,现在必须将仲裁者提升到一个数据承载节点,等待数据同步,同时希望同步速度更快,数据(更准确地说:您希望您的复制oplog窗口大于同步数据所需的时间)。 否则,数据同步将失败,您必须closures应用程序才能使同步成功。 您使用此设置赢得的是您可以select何时closures应用程序以恢复冗余。
附注:如果您的数据更改速率超过复制oplog窗口,则应该分片。 总是看到你的复制oplog窗口是足够大的。
现在让我们假设你有三个数据承载节点,如所build议的。 即使一台服务器出现故障(或更新等),仍然有冗余。 一个节点在夜间失败? 睡个好觉!
考虑到上述因素,只有在您的情况下,您才可以拥有单一实例生产环境
在我认识的最严肃的商业应用中,对这些条件中的一个或多个的回答是“否”。
是的,假设你可以忍受失去一个数据承载节点会花费你的冗余。 在这种情况下,您很可能需要重新同步数据,这需要您密切监视复制oplog窗口, 并确保重新同步所需的时间适合它。
考虑到仲裁器实例和数据承载节点之间的价格差异,在具有两个数据承载节点和仲裁器的设置或具有三个数据承载节点的build议设置之间select风险pipe理是一个问题。
一个合理使用一个EC2实例作为一个小型数据库的生产mongo服务器?
坦率地说:不是imho。 这样做会带来疏忽,增加可以用相对较less的钱来减轻的风险,并且最可能比至less有一个具有两个数据承载节点和判优器的副本集更昂贵。 如果你把一切都考虑在内。
这是否需要如mongo文档中所示的3服务器副本集?
除非你真的 , 真的 , 真的知道你在做什么:是的。
如果所有客户的数据在没有警告的情况下消失,您可以使用单个EC2实例作为生产mongoDB服务器。 当然,首先selectMongoDB(可能是因为它的着名的webscale属性 ),你可能不会对耐久性感兴趣,但是在单个EC2实例上运行它只是乞求数据库gremlins给你不好的一天。