웹사이트 검색

Ubuntu 12.04 VPS를 사용하여 MongoDB에서 샤드 클러스터를 생성하는 방법


상태: 더 이상 사용되지 않음

이 문서에서는 더 이상 지원되지 않는 Ubuntu 버전에 대해 설명합니다. 현재 Ubuntu 12.04를 실행하는 서버를 운영 중인 경우 지원되는 Ubuntu 버전으로 업그레이드하거나 마이그레이션하는 것이 좋습니다.

  • Ubuntu 14.04로 업그레이드합니다.
  • Ubuntu 14.04에서 Ubuntu 16.04로 업그레이드
  • 서버 데이터를 지원되는 버전으로 마이그레이션

이유:

대신 참조:

소개

MongoDB는 수평적으로 잘 확장되고 키-값 시스템을 통해 데이터 저장소를 구현하는 NoSQL 문서 데이터베이스 시스템입니다. 웹 애플리케이션 및 웹 사이트에서 널리 사용되는 MongoDB는 프로그래밍 방식으로 쉽게 구현하고 액세스할 수 있습니다.

MongoDB는 "샤딩\이라는 기술을 통해 확장을 달성합니다. 샤딩은 읽기 및 쓰기 로드와 데이터 스토리지 요구 사항을 분산하기 위해 여러 서버에 데이터를 쓰는 프로세스입니다.

이전 튜토리얼에서는 Ubuntu 12.04 VPS에 MongoDB를 설치하는 방법을 다루었습니다. 우리는 이것을 여러 다른 노드에서 샤딩을 구현하는 방법에 대해 이야기하기 위한 출발점으로 사용할 것입니다.

MongoDB 샤딩 토폴로지

샤딩은 세 가지 개별 구성 요소를 통해 구현됩니다. 각 부분은 특정 기능을 수행합니다.

  • 구성 서버: 각 프로덕션 샤딩 구현에는 정확히 3개의 구성 서버가 포함되어야 합니다. 이는 중복성과 고가용성을 보장하기 위한 것입니다.\n구성 서버는 요청된 데이터를 포함하는 샤드와 연결하는 메타데이터를 저장하는 데 사용됩니다. 정보를 안정적이고 일관되게 검색할 수 있도록 데이터를 구성합니다.\n
  • 쿼리 라우터: 쿼리 라우터는 애플리케이션이 실제로 연결되는 시스템입니다. 이러한 시스템은 요청된 데이터가 저장되는 위치를 파악하기 위해 구성 서버와 통신하는 역할을 합니다. 그런 다음 적절한 샤드에서 데이터에 액세스하고 반환합니다.\n각 쿼리 라우터는 "mongos\ 명령을 실행합니다.\n
  • 샤드 서버: 샤드는 실제 데이터 저장 작업을 담당합니다. 프로덕션 환경에서 단일 샤드는 일반적으로 단일 시스템이 아닌 복제 세트로 구성됩니다. 이는 기본 샤드 서버가 오프라인이 되는 경우에도 데이터에 계속 액세스할 수 있도록 하기 위한 것입니다.\n복제 세트 구현은 이 튜토리얼의 범위를 벗어나므로 샤드를 복제 세트 대신 단일 머신으로 구성합니다. 자신의 구성에 대해 복제본 세트를 구성하려는 경우 이를 쉽게 수정할 수 있습니다.\n

초기 설정

위에서 주의를 기울였다면 이 구성에 꽤 많은 머신이 필요하다는 것을 눈치챘을 것입니다. 이 자습서에서는 다음을 포함하는 예제 샤딩 클러스터를 구성합니다.

  • 3개의 구성 서버(프로덕션 환경에 필요)
  • 2개의 쿼리 라우터(최소 1개 필요)
  • 4개의 샤드 서버(최소 2개 필요)

즉, 정확히 따라가려면 9개의 VPS 인스턴스가 필요합니다. 실제로 이러한 기능 중 일부는 겹칠 수 있으며(예: 구성 서버로 사용하는 동일한 VPS에서 쿼리 라우터를 실행할 수 있음) 하나의 쿼리 라우터와 최소 2개의 샤드 서버만 필요합니다.

각 유형의 여러 구성 요소를 추가하는 방법을 보여주기 위해 이 최소값 이상으로 이동합니다. 또한 명확성과 단순성을 위해 이러한 모든 구성 요소를 별도의 기계로 취급합니다.

초기 기본 이미지 설정

시작하려면 이 안내서를 사용하여 Ubuntu에 초기 MongoDB 서버를 설치하고 구성하십시오. 이를 사용하여 나머지 샤딩 구성 요소를 부트스트랩합니다.

첫 번째 서버에 대한 튜토리얼을 마쳤으면 다음 명령을 사용하여 인스턴스를 종료합니다.

sudo shutdown -h now

이제 이 구성된 드롭릿의 스냅샷을 찍어 다른 VPS 인스턴스를 가동하는 데 사용할 것입니다. 실행 중인 시스템의 스냅샷을 찍을 수 있지만 전원을 끄면 파일 시스템이 일관된 상태에 있게 됩니다. 스냅샷 비용은 파일 시스템 내에서 사용되는 공간의 양을 기준으로 매월 기가바이트당 $0.05이므로 완료되면 스냅샷을 제거하는 것이 가장 좋습니다.

DigitalOcean 제어판에서 물방울을 선택합니다. "스냅샷\ 탭을 클릭합니다. 스냅샷 이름을 입력하고 "스냅샷 찍기\를 클릭합니다.

스냅샷이 찍히고 초기 서버가 재부팅됩니다.

스냅샷을 기반으로 VPS 인스턴스 가동

이제 스냅샷 프로세스를 통해 이미지를 저장했으므로 이를 나머지 MongoDB 구성 요소의 기반으로 사용할 수 있습니다.

제어판에서 "만들기” 버튼을 클릭합니다. 샤딩 구성에서 드롭릿의 목적을 설명하는 이름을 입력합니다.

액적 크기와 영역을 선택합니다. 모든 구성 요소에 대해 동일한 지역을 선택하는 것이 가장 좋습니다.

"이미지 선택\ 섹션에서 "내 이미지\ 탭을 클릭하고 방금 생성한 MongoDB 스냅샷을 선택합니다.

필요한 SSH 키를 추가하고 사용하려는 설정을 선택합니다. 새 VPS 인스턴스를 가동하려면 "물방울 생성\을 클릭하십시오.

각 샤딩 구성 요소에 대해 이 단계를 반복합니다. 이 튜토리얼을 정확히 따르려면(필수는 아니지만 시범용) 구성 서버 3개, 쿼리 서버 2개, 샤드 서버 4개가 필요합니다.

각 구성 요소에 대한 DNS 하위 도메인 항목 구성(선택 사항)

MongoDB 설명서에서는 특정 IP 주소 대신 DNS 확인 가능 이름으로 모든 구성 요소를 참조할 것을 권장합니다. 이는 연결된 모든 서버를 다시 시작하지 않고도 서버를 변경하거나 특정 구성 요소를 재배포할 수 있기 때문에 중요합니다.

사용 편의성을 위해 사용하려는 도메인에 각 서버에 고유한 하위 도메인을 제공하는 것이 좋습니다. 이 가이드를 사용하여 DigitalOcean의 제어판을 사용하여 DNS 하위 도메인을 설정하는 방법을 배울 수 있습니다.

이 자습서의 목적을 위해 다음 하위 도메인에서 액세스할 수 있는 구성 요소를 참조합니다.

  • 구성 서버
    • config0.example.com
    • config1.example.com
    • config2.example.com

    쿼리 라우터

    • query0.example.com
    • query1.example.com

    샤드 서버

    • shard0.example.com
    • shard1.example.com
    • shard2.example.com
    • shard3.example.com

    하위 도메인을 설정하지 않은 경우 계속 따라갈 수 있지만 구성이 강력하지 않습니다. 이 경로를 사용하려면 하위 도메인 사양을 드롭릿의 IP 주소로 대체하기만 하면 됩니다.

    구성 서버 초기화

    설정해야 하는 첫 번째 구성 요소는 구성 서버입니다. 쿼리 라우터 또는 샤드를 구성하려면 먼저 온라인 상태이고 작동해야 합니다.

    루트로 첫 번째 구성 서버에 로그인합니다.

    가장 먼저 해야 할 일은 구성 서버가 위치와 콘텐츠를 연결하는 메타데이터를 저장할 데이터 디렉터리를 만드는 것입니다.

    mkdir /mongo-metadata
    

    이제 적절한 매개변수로 구성 서버를 시작하기만 하면 됩니다. 구성 서버를 제공하는 서비스를 mongod라고 합니다. 이 구성 요소의 기본 포트 번호는 27019입니다.

    다음 명령으로 구성 서버를 시작할 수 있습니다.

    mongod --configsvr --dbpath /mongo-metadata --port 27019
    

    서버는 정보 출력을 시작하고 다른 구성 요소의 연결 수신을 시작합니다.

    다른 두 구성 서버에서 이 프로세스를 정확히 반복합니다. 포트 번호는 세 서버 모두에서 동일해야 합니다.

    쿼리 라우터 인스턴스 구성

    이 시점에서 세 개의 구성 서버가 모두 실행 중이고 연결을 수신해야 합니다. 계속하기 전에 작동 중이어야 합니다.

    루트로 첫 번째 쿼리 라우터에 로그인합니다.

    가장 먼저 해야 할 일은 이 인스턴스에서 이미 실행 중인 경우 mongodb 프로세스를 중지하는 것입니다. 쿼리 라우터는 기본 MongoDB 프로세스와 충돌하는 데이터 잠금을 사용합니다.

    service mongodb stop
    

    다음으로 특정 구성 문자열을 사용하여 쿼리 라우터 서비스를 시작해야 합니다. 구성 문자열은 구성하는 모든 쿼리 라우터에 대해 정확히 동일해야 합니다(인수 순서 포함). 각 구성 서버의 주소와 작동 중인 포트 번호로 구성되며 쉼표로 구분됩니다.

    쿼리 라우터 서비스를 mongos라고 합니다. 이 프로세스의 기본 포트 번호는 27017입니다(그러나 구성의 포트 번호는 기본적으로 27019인 구성 서버 포트 번호를 나타냅니다).

    최종 결과는 쿼리 라우터 서비스가 다음과 같은 문자열로 시작된다는 것입니다.

    <예비>

    첫 번째 쿼리 라우터는 세 개의 구성 서버에 연결되기 시작해야 합니다. 다른 쿼리 라우터에서 이 단계를 반복합니다. 명령을 입력하기 전에 mongodb 서비스를 중지해야 합니다.

    또한 각 쿼리 라우터를 시작하려면 정확히 동일한 명령을 사용해야 합니다. 그렇게 하지 않으면 오류가 발생합니다.

    클러스터에 샤드 추가

    이제 구성 서버와 쿼리 라우터가 구성되었으므로 실제 샤드 서버를 클러스터에 추가할 수 있습니다. 이 샤드는 각각 전체 데이터의 일부를 보유합니다.

    샤드 서버 중 하나에 루트로 로그인합니다.

    처음에 언급했듯이 이 가이드에서는 복제본 세트 대신 단일 머신 샤드만 사용합니다. 이는 데모의 간결함과 단순성을 위한 것입니다. 프로덕션 환경에서는 데이터의 무결성과 가용성을 보장하기 위해 복제본 세트가 매우 권장됩니다. MongoDB에서 복제 세트를 구성하려면 이 가이드를 따르십시오.

    샤드를 클러스터에 실제로 추가하려면 이제 클러스터와의 인터페이스 역할을 하도록 구성된 쿼리 라우터를 거쳐야 합니다. 다음과 같이 쿼리 라우터 중 아무에 연결하여 이를 수행할 수 있습니다.

    <예비>

    그러면 적절한 쿼리 라우터에 연결되고 mongo 프롬프트가 열립니다. 이 프롬프트에서 모든 샤드 서버를 추가합니다.

    첫 번째 샤드를 추가하려면 다음을 입력하십시오.

    <예비>

    그런 다음 동일한 인터페이스에서 나머지 샤드 드롭릿을 추가할 수 있습니다. 각 샤드 서버에 개별적으로 로그인할 필요가 없습니다.

    <예비>

    프로덕션 클러스터를 구성하고 복제 세트를 완성하는 경우 대신 복제 세트 이름과 복제 세트 구성원을 지정하여 각 세트를 별개의 샤드로 설정해야 합니다. 구문은 다음과 같습니다.

    <예비>

    데이터베이스 컬렉션에 대해 샤딩을 활성화하는 방법

    MongoDB는 정보를 데이터베이스로 구성합니다. 각 데이터베이스 내에서 데이터는 "컬렉션\을 통해 더 세분화됩니다. 컬렉션은 기존 관계형 데이터베이스 모델의 테이블과 유사합니다.

    이 섹션에서는 쿼리 라우터를 다시 사용하여 작업합니다. 아직 쿼리 라우터에 연결되어 있지 않으면 마지막 섹션에서 사용한 것과 동일한 mongo 명령을 사용하여 다시 액세스할 수 있습니다.

    <예비>

    데이터베이스 수준에서 샤딩 활성화

    먼저 데이터베이스 수준에서 샤딩을 활성화합니다. 이를 위해 (적절하게) test_db라는 테스트 데이터베이스를 생성합니다.

    이 데이터베이스를 만들려면 변경하기만 하면 됩니다. 현재 데이터베이스로 표시되고 데이터를 처음 입력할 때 동적으로 생성됩니다.

    use test_db
    

    다음을 입력하여 방금 생성한 데이터베이스를 현재 사용하고 있는지 확인할 수 있습니다.

    db
    
    test_db
    

    다음을 입력하여 사용 가능한 모든 데이터베이스를 볼 수 있습니다.

    show dbs
    

    방금 생성한 데이터베이스가 표시되지 않는 것을 알 수 있습니다. 데이터가 없기 때문에 아직 실제가 아닙니다.

    다음 명령을 실행하여 이 데이터베이스에서 샤딩을 활성화할 수 있습니다.

    sh.enableSharding("test_db")
    

    다시 말하지만 show dbs 명령을 입력하면 새 데이터베이스가 표시되지 않습니다. 그러나 자동으로 생성되는 config 데이터베이스로 전환하고 find() 명령을 실행하면 새 데이터베이스가 반환됩니다.

    use config
    db.databases.find()
    
    { "_id" : "admin", "partitioned" : false, "primary" : "config" }
    { "_id" : "test_db", "partitioned" : true, "primary" : "shard0003" }
    

    MongoDB가 새 데이터베이스에 일부 데이터를 추가하면 데이터베이스가 show dbs 명령과 함께 표시됩니다.

    컬렉션 수준에서 샤딩 활성화

    이제 데이터베이스가 샤딩에 사용할 수 있는 것으로 표시되었으므로 특정 컬렉션에서 샤딩을 활성화할 수 있습니다.

    이 시점에서 샤딩 전략을 결정해야 합니다. 샤딩은 저장 중인 문서에서 샤드 키로 지정된 특정 필드를 기반으로 데이터를 여러 범주로 구성하여 작동합니다. 일치하는 샤드 키가 있는 모든 문서를 동일한 샤드에 넣습니다.

    예를 들어 데이터베이스가 회사의 직원을 저장하고 있고 샤드 키가 좋아하는 색상을 기반으로 하는 경우 MongoDB는 좋아하는 색상 필드에 파란색이 있는 모든 직원을 단일 샤드에 배치합니다. 모든 사람이 몇 가지 색상을 좋아한다면 이는 불균형적인 저장으로 이어질 수 있습니다.

    샤드 키에 대한 더 나은 선택은 보다 균등하게 분산되도록 보장되는 것입니다. 예를 들어 대기업에서는 생일(월 및 일) 필드가 상당히 고르게 분포되어 있을 것입니다.

    배포 방법이 확실하지 않거나 적절한 필드가 없는 경우 기존 필드를 기반으로 "해시된\ 샤드 키를 생성할 수 있습니다. 이것이 우리가 데이터에 대해 수행할 작업입니다.

    test_collection이라는 컬렉션을 만들고 "_id\ 필드를 해시할 수 있습니다. test_db 데이터베이스를 사용하고 있는지 확인한 다음 명령을 실행합니다.

    use test_db
    db.test_collection.ensureIndex( { _id : "hashed" } )
    

    그런 다음 다음 명령을 실행하여 컬렉션을 샤딩할 수 있습니다.

    sh.shardCollection("test_db.test_collection", { "_id": "hashed" } )
    

    이렇게 하면 사용 가능한 모든 샤드에서 컬렉션이 샤딩됩니다.

    컬렉션에 테스트 데이터 삽입

    루프를 사용하여 일부 개체를 생성하여 샤딩이 작동하는 것을 볼 수 있습니다. 이 루프는 테스트 데이터를 생성하기 위해 MongoDB 웹 사이트에서 직접 가져옵니다.

    다음과 같은 간단한 루프를 사용하여 컬렉션에 데이터를 삽입할 수 있습니다.

    use test_db
    for (var i = 1; i <= 500; i++) db.test_collection.insert( { x : i } )
    

    이렇게 하면 500개의 간단한 문서(ID 필드와 숫자가 포함된 "x\ 필드만)가 생성되어 여러 샤드에 배포됩니다. 다음을 입력하여 결과를 볼 수 있습니다.

    db.test_collection.find()
    
    { "_id" : ObjectId("529d082c488a806798cc30d3"), "x" : 6 }
    { "_id" : ObjectId("529d082c488a806798cc30d0"), "x" : 3 }
    { "_id" : ObjectId("529d082c488a806798cc30d2"), "x" : 5 }
    { "_id" : ObjectId("529d082c488a806798cc30ce"), "x" : 1 }
    { "_id" : ObjectId("529d082c488a806798cc30d6"), "x" : 9 }
    { "_id" : ObjectId("529d082c488a806798cc30d1"), "x" : 4 }
    { "_id" : ObjectId("529d082c488a806798cc30d8"), "x" : 11 }
    . . .
    

    더 많은 값을 얻으려면 다음을 입력하십시오.

    it
    
    { "_id" : ObjectId("529d082c488a806798cc30cf"), "x" : 2 }
    { "_id" : ObjectId("529d082c488a806798cc30dd"), "x" : 16 }
    { "_id" : ObjectId("529d082c488a806798cc30d4"), "x" : 7 }
    { "_id" : ObjectId("529d082c488a806798cc30da"), "x" : 13 }
    { "_id" : ObjectId("529d082c488a806798cc30d5"), "x" : 8 }
    { "_id" : ObjectId("529d082c488a806798cc30de"), "x" : 17 }
    { "_id" : ObjectId("529d082c488a806798cc30db"), "x" : 14 }
    { "_id" : ObjectId("529d082c488a806798cc30e1"), "x" : 20 }
    . . .
    

    특정 샤드에 대한 정보를 얻으려면 다음을 입력하십시오.

    sh.status()
    
    --- Sharding Status --- 
      sharding version: {
        "_id" : 1,
        "version" : 3,
        "minCompatibleVersion" : 3,
        "currentVersion" : 4,
        "clusterId" : ObjectId("529cae0691365bef9308cd75")
    }
      shards:
        {  "_id" : "shard0000",  "host" : "162.243.243.156:27017" }
        {  "_id" : "shard0001",  "host" : "162.243.243.155:27017" }
    . . .
    

    이렇게 하면 MongoDB가 샤드 간에 배포한 청크에 대한 정보가 제공됩니다.

    결론

    이 가이드를 마치면 자신만의 MongoDB 샤딩 구성을 구현할 수 있어야 합니다. 서버의 특정 구성과 각 컬렉션에 대해 선택한 샤드 키는 클러스터 성능에 큰 영향을 미칩니다.

    최상의 배포 속성이 있고 데이터베이스 쿼리에 반영될 논리적 그룹화를 가장 근접하게 나타내는 필드를 선택합니다. MongoDB가 데이터를 검색하기 위해 단일 샤드로만 이동하면 되는 경우 더 빨리 반환됩니다.

    저스틴 엘링우드