我有一个必要的系统,需要在三个或更多的不同位置的物理存在,我需要build立在这样一种方式,我的数据库保持及时复制没有可怕的延迟的build议。 我看到,当应用程序服务器试图与没有物理configuration的节点对话时,mysql访问和复制的速度非常慢。 在这种情况下,我正在使用mongodb。
从阅读mongo的文档,mongo复制看起来更像是一个候选人而不是分区b / c,我的数据存储区不是很大。 但是,我没有看到任何解决远距离服务器通信速度问题的可能性很高的问题。
您的延迟体验有些令人担忧。 在我自己的本地快速networkingtesting中,我注意到Mongo和MySQL在延迟方面存在一些差异:
部分MongoDB时间是由于TCP连接的build立时间,在这里MySQL正在使用一个预先存在的(池)连接。 在这两种情况下,数据库没有复制或分片,所以这些可以被认为是最好的(我的networking)。
Mongo副本集可以帮助你在这里,但只有当你的应用程序能够容忍松散收敛1 。 为了达到最高速度,你必须configuration你的mongo写入,只有当mongodb服务器报告它已经收到写入时才返回,并configuration你的应用程序服务器只使用AZ本地Mongo实例。 读取将需要使用SlaveOK,以便他们可以从AZ本地副本读取,这将显示本地写入以及从已经收敛到目前为止的其他节点的复制写入。 这意味着每个AZ将有一个稍微不同的整个数据库的视图; 过去的X分钟只会有局部的变化,但深层次的历史将会融合。
此设置将提供应用程序服务器和数据库服务器之间的低(同一AZ)延迟。 但是,应用程序服务器的数据视图会因应用程序使用者的AZ而有所不同。 这个架构是否适合您的应用程序只能由您决定。
但是,这有一个很大的问题: MongoDB不支持多主复制,所有的写操作都必须到单主复制 。
目前(v2.2)无法configurationMongoDB允许写入从服务器,所以在“写入繁重”应用程序中的所有写入操作都必须到达副本服务器的单个主服务器。 如果读取延迟是一个问题,您不会提到,但如果是,SlaveOK读取将抓取本地Mongo副本成员; 但不像上面那样,它可能还没有收到主机的所有更新,所以在写入提交和显示本地从机之间肯定会有一个延迟。
Mongo有几种不同的写入types。 Mongo服务器完全接收写入后,默认返回OK。 下一步是在写入日志时只返回OK的模式。 而最偏执的人(因此在副本中是最慢的一个mongo)只有当指定数量的副本报告写入在他们的日志中时才返回OK。 默认模式是最快的,但最后一种模式确保本地副本具有写入(严格一致性)。
如果该主服务器与应用服务器不在同一个AZ中,那么即使采用默认的写入方式,延迟也可能无法使用。 如果是这样的话,mongo现在就不适合你 。 您将不得不认真思考如何将您的应用程序更改为对写入延迟不太敏感,或者使用非Mongo数据库来执行多主节点,并且收敛松散。
最近的Mongo获得多主configuration是通过分片。 如果您的应用服务器知道他们的地理位置,您可以将地理数据包含到Mongo Shard-Key中。 然后,当您连接到MongoS进行写入时,所有写入都将转到本地分片的副本集。 读取可以轮询整个数据库(从非本地分片中绘制时会相当慢),所以这将保持一致性。 然而,这完全取决于位置是你的分片键。
1: 松散收敛 ,分布式或复制式数据库达到统一状态的时间就是收敛时间。 松散的收敛是一个很长的时间间隔。 紧收敛是一个很短的时间间隔。
2: 多主 ,多个副本可以接受写入的数据库。 可以做到这一点的数据库的例子是活动目录,OpenLDAP和一些MySQLconfiguration。