MongoDB 多服务器模式

MongoDB multi server mode

我们在两个不同的地理位置有两个应用程序服务器。负载均衡器会自动将客户端发送到最近的服务器,除非该服务器已关闭,否则所有客户端都会发送到唯一可用的服务器。两台服务器都在读写数据。 每个服务器都是 运行 一个应用程序和一个数据库实例。每台服务器上的应用程序只访问本地数据库,对其他服务器一无所知。 目前,我们正在使用 MySQL 主从复制,因此两台服务器共享数据库中的相同数据。主键是自动递增的数字,一台服务器使用偶数,第二台服务器使用奇数。 我们想向每个服务器添加 MongoDB 个实例,并保持类似的冗余和可用性方法。由于 MongoDB 本身不支持 master-master 复制,有没有办法创建一个分片副本集,所以每个服务器存储一个分片,但是两个服务器都被复制,所以两个分片都可以用于每个服务器? 有没有办法创建所需的行为,让每个应用程序只访问本地 MongoDB 实例,但来自两个服务器的数据将在每个服务器上可用?

你应该清楚地区分“复制”和“共享”

复制意味着你有多个节点。你有一个个小学和一个或几个中学。正如术语“repliaction”所暗示的那样,SECONDARY 具有 PRIMARY 的 exact 副本。应用程序只能将 写入 PRIMARY,但它可以从 PRIMARY 或 SECONDARY 读取。

分片意味着您将数据分布在多个节点上。在您的情况下,您将偶数 ID 放入一个节点,将奇数 ID 放入另一个节点。这与 MongoDB 分片非常相似,但通常您只需定义分片键,而 MongoDB 会注意如何均匀分布数据。就像在您当前的设置中一样,当一个 shard/node 出现故障时,您的一半客户将无法访问他们的数据。

请注意,每个分片本身也是一个副本集,但是可以创建只有一个成员的副本集(即只有 PRIMARY 而没有 SECONDARY)。当然,可用性会受到限制,但这与您当前的设置相同。

为了获得与当前设计相同的设置,您将构建一个分片集群。每个分片将由一个单一成员的副本集构建。 Config-Servers 将是两个节点上的副本集。

如果一个节点出现故障,那么配置将变为只读,因此通常您的应用程序仍然可用(对一半的客户),但您不能进行修改,例如创建新用户或集合。