본문 바로가기
T./MongoDB

[HA]MongoDB Atlas SPOF(Single Point of Failure)

by IT Journeyman 2024. 1. 16.

Table of Contents

 

Executive Summary 

Connection String URI Format 

SRV Connection Format

SRV Lookup test

Global Cluster 환경에서의 SRV Lookup test 

    SRV Lookup for Prefrontal-AP

    SRV Lookup for Prefrontal-US

    SRV Lookup for Prefrontal-EU

Resilience Test

    Primary Node Down

    Regional Outage

References


Executive Summary

  • MongoDB Atlas의 SPOF(Single Point of Failure)는 아래와 같습니다.
    • 전세계 Network Down(Including Internet)
    • 전세계 DNS Down
      (DNS 정보는 서로 Mirroring 되기 때문에 AWS DNS Outage도, AWS Region Outage도 서비스 영향이 없습니다)
  • MongoDB Atlas는 SRV Connection Format을 사용하며, 이를 통해 관리되는 Seed List로 중단없는 서비스를 가능하게 합니다.(관련 내용 본문 참조)
  • 또한 Primary Down, Region Outage 등의 Resilience Test를 통하여 MongoDB Atlas의 Availability를 자세히 설명합니다.(관련 내용 본문 참조)

 

Connection String URI Format

MongoDB Atlas는  URI(Uniform Resource Identifier)로 접속을 합니다. 이러한 방식에는 아래 두 가지가 있습니다.

mongodb://[username:password@]host1[:port1][,...hostN[:portN]][/[defaultauthdb][?options]]

mongodb+srv://server.example.com/

 

SRV Connection Format

SRV Connection Format를 통하여 MongoDB는 DNS로 구성된 시드 목록을 지원합니다. DNS를 사용하여 사용 가능한 서버 목록을 구성하면 클라이언트를 재구성하지 않고도 보다 유연하게 배포하고 서버를 교대로 변경할 수 있습니다.

 

DNS 시드 목록을 활용하려면 Connection String을 Standard mongodb가 아닌 mongodb+srv로 사용해야 합니다. srv는 뒤에 오는 호스트 이름이 DNS SRV 레코드에 해당한다는 것을 클라이언트에게 알려 줍니다. MongoDB Client Driver 또는 mongosh는 DNS에 레코드를 쿼리하여 어떤 호스트가 mongod 인스턴스를 실행 중인지 확인합니다.

 

또한 SRV Connection Format을 사용하면 자동으로 tls (또는 이에 상응하는 ssl) 옵션으로 연결합니다. 이 것을 명시적으로 설정하여 변경할 수도 있습니다.

 

SRV Lookup test

SRV Lookup은 아래처럼 Terminal에서 nslookup 명령어로 간단히 확인할 수 있습니다.

nslookup -type=SRV _mongodb._tcp.prefrontal-ap.npgjj.mongodb.net    

Server:         61.41.153.2

Address:        61.41.153.2#53

 

Non-authoritative answer:

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net   service = 0 0 27017 prefrontal-ap-shard-00-02.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net   service = 0 0 27017 prefrontal-ap-shard-00-01.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net   service = 0 0 27017 prefrontal-ap-shard-00-03.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net   service = 0 0 27017 prefrontal-ap-shard-00-00.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net   service = 0 0 27017 prefrontal-ap-shard-00-05.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net   service = 0 0 27017 prefrontal-ap-shard-00-04.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net   service = 0 0 27017 prefrontal-ap-shard-00-06.npgjj.mongodb.net.



Global Cluster 환경에서의 SRV Lookup test

테스트를 위해 Global Cluster 환경을 아래처럼 구성하였습니다.(SRV Lookup 테스트의 편의를 위해 lookup query는 www.nslookup.io을 사용했습니다)

아래 테스트로 확인한 것처럼 MongoDB는 어떤 Cloud Service Provider를 사용하더라도 AWS DNS를 이용합니다.

 

Region Prefrontal-AP Prefrontal-US Prefrontal-EU
AP AWS(Primary) AWS AWS
US GCP GCP(Primary) GCP
EU Azure Azure Azure(Primary)



Prefrontal-AP

 

SRV Lookup for Prefrontal-AP

QUESTION

dig @ns-1647.awsdns-13.co.uk. _mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. SRV

ANSWER

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-ap-shard-00-00.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-ap-shard-00-01.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-ap-shard-00-02.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-ap-shard-00-03.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-ap-shard-00-04.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-ap-shard-00-05.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-ap.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-ap-shard-00-06.npgjj.mongodb.net.

 

AUTHORITY

mongodb.net. 172800 NS ns-1043.awsdns-02.org.

mongodb.net. 172800 NS ns-1647.awsdns-13.co.uk.

mongodb.net. 172800 NS ns-430.awsdns-53.com.

mongodb.net. 172800 NS ns-761.awsdns-31.net.

 

ADDITIONAL

prefrontal-ap-shard-00-03.npgjj.mongodb.net. 60 A 34.23.103.109

prefrontal-ap-shard-00-04.npgjj.mongodb.net. 60 A 34.73.134.217

prefrontal-ap-shard-00-05.npgjj.mongodb.net. 60 A 20.93.65.8

prefrontal-ap-shard-00-06.npgjj.mongodb.net. 60 A 20.82.151.53

. 0 OPT ; payload 4096, xrcode 0, version 0, flags 0



Prefrontal-US

 

SRV Lookup for Prefrontal-US

QUESTION

dig @ns-1043.awsdns-02.org. _mongodb._tcp.prefrontal-us.npgjj.mongodb.net. SRV

ANSWER

_mongodb._tcp.prefrontal-us.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-us-shard-00-00.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-us.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-us-shard-00-01.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-us.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-us-shard-00-02.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-us.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-us-shard-00-03.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-us.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-us-shard-00-04.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-us.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-us-shard-00-05.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-us.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-us-shard-00-06.npgjj.mongodb.net.

 

AUTHORITY

mongodb.net. 172800 NS ns-1043.awsdns-02.org.

mongodb.net. 172800 NS ns-1647.awsdns-13.co.uk.

mongodb.net. 172800 NS ns-430.awsdns-53.com.

mongodb.net. 172800 NS ns-761.awsdns-31.net.

 

ADDITIONAL

prefrontal-us-shard-00-00.npgjj.mongodb.net. 60 A 34.138.56.57

prefrontal-us-shard-00-01.npgjj.mongodb.net. 60 A 34.139.176.81

prefrontal-us-shard-00-02.npgjj.mongodb.net. 60 A 34.74.225.130

prefrontal-us-shard-00-05.npgjj.mongodb.net. 60 A 20.93.65.51

prefrontal-us-shard-00-06.npgjj.mongodb.net. 60 A 20.82.148.227

. 0 OPT ; payload 4096, xrcode 0, version 0, flags 0




Prefrontal-EU

 

SRV Lookup for Prefrontal-EU

QUESTION

dig @ns-1043.awsdns-02.org. _mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. SRV

ANSWER

_mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-eu-shard-00-00.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-eu-shard-00-01.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-eu-shard-00-02.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-eu-shard-00-03.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-eu-shard-00-04.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-eu-shard-00-05.npgjj.mongodb.net.

_mongodb._tcp.prefrontal-eu.npgjj.mongodb.net. 60 SRV 0 0 27017 prefrontal-eu-shard-00-06.npgjj.mongodb.net.

 

AUTHORITY

mongodb.net. 172800 NS ns-1043.awsdns-02.org.

mongodb.net. 172800 NS ns-1647.awsdns-13.co.uk.

mongodb.net. 172800 NS ns-430.awsdns-53.com.

mongodb.net. 172800 NS ns-761.awsdns-31.net.

 

ADDITIONAL

prefrontal-eu-shard-00-00.npgjj.mongodb.net. 60 A 20.93.64.175

prefrontal-eu-shard-00-01.npgjj.mongodb.net. 60 A 20.234.61.33

prefrontal-eu-shard-00-02.npgjj.mongodb.net. 60 A 20.13.136.85

prefrontal-eu-shard-00-03.npgjj.mongodb.net. 60 A 34.64.189.163

prefrontal-eu-shard-00-04.npgjj.mongodb.net. 60 A 34.22.67.169

. 0 OPT ; payload 4096, xrcode 0, version 0, flags 0

 

 

Resilience Test

Primary Node Down

MongoDB GUI에서 아래와 같이 손쉽게 Outage를 테스트하실 수 있습니다.

1초 간격으로 Document를 생성하는 스크립트를 실행하고 테스트하였으나 실패가 검출되지 않았습니다.
테스트 환경에 따라  Sub second의 순단 현상은 발생할 수 있습니다.
(테스트 결과로 0번에서 1번 노드로 Primary가 변경되었습니다.)

 

Regional Outage

아래 그림처럼 Region Outage를 시뮬레이션(해당 Region의 노드를 모두 Down시킴)

한 결과 20초 정도 Document를 생성이 지연되는 것을 확인했습니다.(이는 Timeout 등의 값을 변경하여 보다 단축할 수 있습니다.)
모든 테스트를 종료하고 3번 노드가 Primary로 Election되었습니다. 

 

2024-01-15 23:11:13.887917 - INSERTED TILL 123

2024-01-15 23:11:32.227956 - DB-CONNECTION-PROBLEM: prefrontal-ap-shard-00-01.npgjj.mongodb.net:27017: connection closed

2024-01-15 23:13:34.171316 - INSERTED TILL 126

 

References