如何为多个数据中心设置MongoDB?

时间:2011-10-27 22:06:26

标签: mongodb database-replication

这是环境:

[ Data Center 1 ]
   [ load balancer, ip: 45.45.45.45] 
     [ Server 1-A, internal ip: 10.0.0.1, external ip: 200.0.0.1 ]
     [ Server 1-B, internal ip: 10.0.0.2, external ip: 200.0.0.2 ]
     [ Server 1-C, internal ip: 10.0.0.3, external ip: 200.0.0.3 ]

[ Data Center 2 ]
   [ load balancer, ip: 90.90.90.90] 
     [ Server 2-A, internal ip: 10.0.0.1, external ip: 201.0.0.1 ]
     [ Server 2-B, internal ip: 10.0.0.2, external ip: 201.0.0.2 ]
     [ Server 2-C, internal ip: 10.0.0.3, external ip: 201.0.0.3 ]

[ Data Center 3 ]
   [ load balancer, ip: 88.88.88.88] 
     [ Server 3-A, internal ip: 10.0.0.1, external ip: 221.0.0.1 ]
     [ Server 3-B, internal ip: 10.0.0.2, external ip: 221.0.0.2 ]
     [ Server 3-C, internal ip: 10.0.0.3, external ip: 221.0.0.3 ]

我想要实现的是每个服务器安装一个mongo服务器,并且只允许数据中心1服务器(1-A,1-B和1-C)为主服务器。数据中心2和数据中心3中的MongoDB服务器只是辅助服务器。应用程序可以专门从数据中心2读取数据,因为这些应用程序可能与数据中心2位于同一网络中,数据中心2的连接速度比连接到数据连接器1更快。服务器正在使用复制集。没有分片。

以下是我的问题:

  1. 设置复制集时,是否需要使用外部真实IP地址从数据中心2和3指定主机? e.g。

    config = {  _id: 'foo', members: [
                          // data center 1
                          {_id: 0, host: '10.0.0.1:27017'},
                          {_id: 1, host: '10.0.0.2:27017'},
                          {_id: 2, host: '10.0.0.3:27017'},
                          // data center 2
                          {_id: 3, host: '201.0.0.1:27017'},
                          {_id: 4, host: '201.0.0.2:27017'},
                          {_id: 5, host: '201.0.0.3:27017'},
                          // data center 3
                          {_id: 6, host: '221.0.0.1:27017'},
                          {_id: 7, host: '221.0.0.2:27017'},
                          {_id: 8, host: '221.0.0.3:27017'}
                         ]
           }
    
  2. 由于数据中心2中的服务器将落后于负载均衡器和防火墙,因此IP地址可能无法向外界爆炸。是否可以使用负载均衡器IP地址?如果是的话,该怎么做?

  3. 我应该使用priorty = 0在数据中心2和数据中心制作服务器。数据中心3永远不是主要的,对吗?

  4. 其他应用程序如何连接到数据中心2和3中的MongoDB(仅用于读取数据)?假设应用程序(服务器端应用程序)也在数据中心2网络中。应用程序使用什么IP地址连接到DC2中的MongoDB?我应该使用内部IP还是外部IP?如果应用程序在DB内部网络之外并且想要在DC2中连接到MongoDB以仅读取数据,那么我应该使用负载均衡器IP还是外部IP?

  5. 因为我希望DC2和DC3中的服务器能够允许读取数据,如何设置slaveOk?我应该在主“slaveOK”中设置它,还是应该在DC2和DC3中的每个服务器中设置它?

  6. 更进一步,假设DC1,DC2和DC3都是单独的复制集。例如DC 1有唯一的主要和次要。 DC2有自己的主要和次要,到目前为止DC3。当DC1发生变化(新记录或更新)时,是否有一种简单实时的方法来更新DC2和DC3?

1 个答案:

答案 0 :(得分:3)

  1. 取决于。它们需要是应用程序服务器可以使用的主机名/ IP 访问。如果您的应用服务器在同一个DC上运行,那么您的mongod进程正在运行,它们可以而且应该是内部的。任何其他设置都存在重大安全问题。
  2. 技术上,是的。将每个mongod进程分配给不同的端口。但是,我不明白为什么你想要一个负载均衡器来分发mongo查询。这就是驱动程序会为你做什么,甚至可能会产生副作用,让驱动程序以外的其他东西决定查询的RS成员。
  3. 正确。
  4. 内部IP是要走的路。应用服务器应使用本地成员的所有内部IP初始化其驱动程序(读取:同一DC上的成员)
  5. 您没有将服务器设置为slaveOk。 SlaveOk功能在驱动程序端。通常为每个连接设置,但大多数驱动程序也有一个全局和每个查询标志。显然,如果没有启用此标志,您的设置将无法正常工作。
  6. 否。 MongoDB atm中没有主 - 主复制。