Docker로 MongoDB 복제 세트를 실행하기 위한 로컬 개발 설정 개선

10939 단어 mongodbtutorialdocker
이 블로그에 사용된 모든 관련 소스 코드는 다음 Github 리포지토리에서 찾을 수 있습니다.


snntnupl / devcontainers-mongodb-replica-set-with-docker


로컬 머신에서 MongoDB 복제 세트 클러스터를 실행하기 위한 Docker 기반 개발 컨테이너 템플릿.




내 에서 MongoDB 복제 세트를 실행하기 위한 도커 기반 개발 설정을 만들었습니다.

해당 설정의 결함은 클라이언트가 복제 세트의 독립 실행형 노드에 연결할 수 있지만 this issuegithub repository에서 보고한 것처럼 전체 복제 세트에 연결할 수 없다는 것입니다.

이 블로그 게시물에서는 이 문제를 극복하기 위해 무엇을 할 수 있는지 살펴보겠습니다.


근본 원인



MongoDB specifications에 따라:

the hostnames used in a replica set config are reachable from the client



이전 블로그에서 다음 복제 세트 구성을 초기화했습니다.

MONGODB1=mongo1
MONGODB2=mongo2
MONGODB3=mongo3
:
var cfg = {
    "_id": "rs0",
    ...
    "members": [
        {
            ...
            "host": "${MONGODB1}:27017",
            ...
        },
        {
            ...
            "host": "${MONGODB2}:27017",
            ...
        },
        {
            ...
            "host": "${MONGODB3}:27017",
            ...
        }
    ]
};


본질적으로 이렇게 하려면 클라이언트가 다음 호스트에 연결할 수 있어야 합니다. mongo1:27017, mongo2:27017, mongo3:27017 .
/etc/hosts에서 127.0.0.1 호스트 이름을 가리키도록 mongo1, mongo2, mongo3 파일을 업데이트할 수 있습니다. 그러나 포트 번호27017는 여전히 문제를 일으킬 수 있습니다. 동일한 포트에서 3개의 노드(서비스)를 실행할 수 없습니다.

따라서 문제에 대한 해결책은 다음과 같습니다.
  • 호스트 이름hostsmongo1, mongo2, mongo3에 매핑하도록 클라이언트 시스템의 127.0.0.1 파일 업데이트
  • 복제 세트의 3개 노드에서 서비스를 실행합니다mongod. 다른 포트 번호에서



  • 해결책



    첫 번째 단계를 구현하는 것은 간단합니다. Linux에서 /etc/hosts 파일을 업데이트하거나 Windows에서 C:\Windows\System32\drivers\etc\hosts 파일을 업데이트해야 합니다.

    127.0.0.1 localhost mongo1 mongo2 mongo3
    


    두 번째 단계를 구현하는 단계를 살펴보겠습니다.

    docker compose 파일 변경

    ...
    mongo1:
      hostname: 'mongo1'
      container_name: 'mongo1'
      ...
      command: ["-f", "/etc/mongod.conf", "--port", "30001", "--keyFile", "/auth/file.key", "--replSet", "${MONGO_REPLICA_SET_NAME}", "--bind_ip_all"]
      expose: 
        - 30001
      ports: 
        - 30001:30001 
      ...
    
    mongo2:
      hostname: 'mongo2'
      container_name: 'mongo2'
      ...
      command: ["-f", "/etc/mongod.conf", "--port", "30002", "--keyFile", "/auth/file.key", "--replSet", "${MONGO_REPLICA_SET_NAME}", "--bind_ip_all"]
      expose: 
        - 30002
      ports: 
        - 30002:30002 
      ...
    
    mongo3:
      hostname: 'mongo3'
      container_name: 'mongo3'
      ...
      command: ["-f", "/etc/mongod.conf", "--port", "30003", "--keyFile", "/auth/file.key", "--replSet", "${MONGO_REPLICA_SET_NAME}", "--bind_ip_all"]
      expose: 
        - 30003
      ports: 
        - 30003:30003 
      ...
    
    


    이렇게 하면 3개의 다른 포트에 있는 3개의 노드에서 mongod 서비스가 나타납니다.

    다음으로 mongosetup.sh 파일을 변경하여 복제 세트 구성을 수정합니다.

    mongo --host ${MONGODB1}:30001 -u ${MONGO_INITDB_ROOT_USERNAME} -p ${MONGO_INITDB_ROOT_PASSWORD} <<EOF
    var cfg = {
        "_id": "rs0",
        ...
        "members": [
            {
                ...
                "host": "${MONGODB1}:30001",
                ...
            },
            {
                ...
                "host": "${MONGODB2}:30002",
                ...
            },
            {
                ...
                "host": "${MONGODB3}:30003",
                ...
            }
        ]
    };
    


    이것은 기본적으로 문제를 해결하기 위해 수행해야 하는 모든 필수 변경 사항입니다.


    최종 결과



    이러한 변경을 수행하면 mongo 클라이언트를 사용하여 복제 세트에 연결할 수 있습니다.

    $ mongo "mongodb://localhost:30001,localhost:30002,localhost:30003/<MONGO_INITDB_DATABASE>?replicaSet=rs0" -u <MONGO_INITDB_USERNAME> --authenticationDatabase admin
    


    또는

    $ mongo "mongodb://mongo1:30001,mongo2:30002,mongo3:30003/<MONGO_INITDB_DATABASE>?replicaSet=rs0" -u <MONGO_INITDB_USERNAME> --authenticationDatabase admin
    




    또한 db.isMaster() 명령의 결과를 보고 클라이언트가 연결해야 하는 복제 세트의 호스트, 노드가 기본 노드인 경우 등과 같은 세부 정보를 디버깅할 수 있습니다.

    좋은 웹페이지 즐겨찾기