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

如何为多个数据中心设置MongoDB?,mongodb,database-replication,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

以下是环境:

[ 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更快。服务器正在使用复制集。没有碎片

以下是我的问题:

  • 设置复制集时,是否需要使用外部真实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中的服务器将位于负载平衡器和防火墙之后,因此IP地址可能无法爆炸到外部世界。是否可以使用负载平衡器IP地址?如果是,怎么做

  • 我应该使用priorty=0使数据中心2和数据中心3中的服务器不再是主服务器,对吗

  • 其他应用程序如何连接到数据中心2和3中的MongoDB(仅用于读取数据)?比方说,该应用程序(服务器端应用程序)也位于数据中心2网络中。应用程序应该使用什么IP地址连接到DC2中的MongoDB?我应该使用内部IP还是外部IP?如果应用程序位于DB内部网络之外,并且希望连接到DC2中的MongoDB以仅读取数据,我应该使用负载平衡器IP还是外部IP

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

  • 更进一步,假设DC1、DC2和DC3都是单独的复制集。e、 g.DC 1只有一级和二级。到目前为止,DC2有自己的主要和次要功能,即DC3。当DC1中发生更改(新记录或更新)时,是否有一种简单、实时的方法来更新DC2和DC3

  • 视情况而定。它们必须是应用程序服务器可以访问的主机名/IP 通道如果您的应用程序服务器在同一个DC上运行,那么您的mongod进程正在运行,它们可以而且应该是内部的。任何其他设置都有重大安全问题
  • 从技术上讲,是的。将每个mongod进程分配到不同的端口。然而,我不明白为什么您会想要一个负载平衡器来分发mongo查询。这就是驱动程序将为您做的事情,甚至可能会有副作用,让驱动程序以外的其他人来决定查询到哪个RS成员
  • 内部IP是一个不错的选择。应用服务器应使用本地成员的所有内部IP初始化其驱动程序(读取:同一DC上的成员)
  • 您没有将服务器设置为slaveOk。SlaveOk功能位于驱动端。通常按连接设置,但大多数驱动程序也有全局和按查询标志。显然,如果未启用此标志,安装程序将无法运行
  • 否。MongoDB atm中没有主复制

  • 谢谢原因不是因为我想要。这是因为我跳进了那个圈套。外部请求不能直接转到内部服务器。必须通过防火墙或负载平衡器进行映射。2)我可能有端口27017、27018和27019指向每个内部服务器(ip1:27017、ip2:27018和ip3:27019),非常感谢您的建议。:)