mongodb의 레플리카 세트 구성 실습

마스터 노드 1개, 슬레이브 노드 2개를 실행할 준비를 하고 슬레이브 노드 중 하나가 중재 노드(Arb)입니다.
sudo mongod --replSet application --dbpath /data/node1/ --port 9927 --oplogSize 1024
sudo mongod --replSet application --dbpath /data/node2/ --port 9928 --oplogSize 1024
sudo mongod --replSet application --dbpath /data/arbiter/ --port 9929 --oplogSize 1024
application이 복제본 세트의 이름인 경우 노드는 동일해야 하고 dbpath는 데이터베이스 저장 경로를 지정하고 port는 수신 포트를 지정하며 oplogSize는 데이터 동기화 전 캐시 크기를 지정하고 임시로 1G를 지정합니다. 포트 9927의 인스턴스를 마스터 노드로 선택하고 9927의 셸을 입력합니다.
mongo localhost:9927
레플리카 세트를 초기화하기 위해서는 구성 테이블이 필요하며, 구성 테이블은 다음과 같이 선언된다.
config = {_id: "application", members: []}
_id는 복제본 세트가 시작하는 공유 이름과 동일합니다. 노드의 데이터 정보를 점진적으로 추가해 봅시다.
config.members.push({_id: 0, host: "localhost:9927"})
config.members.push({_id: 1, host: "localhost:9928"})
config.members.push({_id: 2, host: "localhost:9929", arbiterOnly: true})
rs.add 및 rs.addArb 함수를 사용하여 동일한 작업을 수행할 수도 있습니다. 그런 다음 이 테이블을 매개변수로 사용하여 복제본 세트를 초기화하고 포트 9927의 셸에서 실행해야 합니다.
> rs.initiate(config)
{  "info" : "Config now saved locally.  Should come online in about a minute.",  
"ok" : 1}
ok를 1로 되돌리면 초기화가 성공한 것입니다.세 노드가 서로 감지하고 통신하며 약 1분 정도 걸립니다(응답이 충분히 느립니다 ^-).세 개의 터미널 창에서 정보를 확인하여 확인할 수 있습니다. 후 통신이 완료되면 포트 9927의 쉘에서 Enter 키를 눌러 실행합니다. 구성을 확인하는 명령:
> rs.isMaster()
{  "setName" : "application",  
   "ismaster" : true,  
   "secondary" : false,  
   "hosts" : [ "localhost:9927",  "localhost:9928"],  
   "arbiters" : [  "localhost:9929" ],  
   "primary" : "localhost:9927",  
   "me" : "localhost:9927", 
   "maxBsonObjectSize" : 16777216,  
   "localTime" : ISODate("2013-01-26T13:34:03.378Z"),  
   "ok" : 1
}

참고로 포트 9927번의 인스턴스는 ismaster, secondary는 false, 호스트는 2개의 인스턴스, Arbiter는 1개의 요소, 기본키는 마스터 노드를 나타냅니다. 통신이 여러 번 완료된 후 포트의 인스턴스 쉘을 볼 수 있습니다. 9927. 프롬프트가 application:PRIMARY로 변경되었습니다. 자세한 내용은 다음을 참조하십시오.
응용 프로그램:PRIMARY> rs.status()
{  "set" : "application",  
    "date" : ISODate("2013-01-26T13:34:35Z"),  
    "myState" : 1,  "members" : [
          {          
          "_id" : 0,          
          "name" : "localhost:9927",          
          "health" : 1,          
          "state" : 1,          
          "stateStr" : "PRIMARY",          
          "uptime" : 140,          
          "optime" : Timestamp(1359207200000, 1),          
          "optimeDate" : ISODate("2013-01-26T13:33:20Z"),          
          "self" : true
          },
          {          
          "_id" : 1,          
          "name" : "localhost:9928",          
          "health" : 1,          
          "state" : 2,          
          "stateStr" : "SECONDARY",          
          "uptime" : 63,          
          "optime" : Timestamp(1359207200000, 1),          
          "optimeDate" : ISODate("2013-01-26T13:33:20Z"),          
          "lastHeartbeat" : ISODate("2013-01-26T13:34:34Z"),          
          "pingMs" : 0
          },
          {          
          "_id" : 2,          
          "name" : "localhost:9929",          
          "health" : 1,          
          "state" : 7,          
          "stateStr" : "ARBITER",          
          "uptime" : 63,          
          "lastHeartbeat" : ISODate("2013-01-26T13:34:34Z"),          
          "pingMs" : 0
          }
      ],  
      "ok" : 1
 }
각 노드의 상태, 이름, 시작 시간, 노드 유형 등이 표시됩니다. 현재 복제본 세트에 대한 구성 테이블 보기:
응용 프로그램:기본> rs.conf()
{  
"_id" : "application",  
"version" : 1,  
"members" : [
      {          
      "_id" : 0,          
      "host" : "localhost:9927"
      },
      {          
      "_id" : 1,          
      "host" : "localhost:9928"
      },
      {          
      "_id" : 2,          
      "host" : "localhost:9929",          
      "arbiterOnly" : true
      }
  ]
}

테스트 데이터 삽입:
application:PRIMARY> db.users.insert({username: "visionwang", age: 26})
9928 슬레이브 노드를 입력하고 뷰 컬렉션을 실행합니다.
application:SECONDARY> show collections
application:SECONDARY> show collections
Sat Jan 26 21:39:40 uncaught exception: error: { "$err" : "not master and slaveOk=false", "code" : 13435 }
셸에서 예외가 발생하여 slaveOK가 false이고 현재 복제 세트가 슬레이브 노드 매개변수를 지정하고 함수를 실행해야 함을 보여줍니다.
application:SECONDARY> rs.slaveOk()
application:SECONDARY> show collections
system.indexes
users
쿼리 테스트 데이터:
application:SECONDARY> db.users.find()
{ 
"_id" : 
ObjectId("5103dbc8f556a05a96a28e69"), 
"username" : "visionwang", 
"age" : 26 
}
데이터를 삽입해도 예외가 발생하지 않지만 마스터가 표시되지 않아 현재 슬레이브 노드가 읽기 전용임을 나타냅니다.
application:SECONDARY> db.users.insert({username: "nl", age: 25})
not master
9927 마스터 노드로 전환하고 시스템 공간 라이브러리를 사용하여 복제본 세트 정보를 쿼리합니다.
응용 프로그램:PRIMARY> db.system.replset.findOne()
{  
"_id" : "application",  
"version" : 1,  
"members" : [
      {          
      "_id" : 0,          
      "host" : "localhost:9927"
      },
      {          
      "_id" : 1,          
      "host" : "localhost:9928"
      },
      {          
      "_id" : 2,          
      "host" : "localhost:9929",          
      "arbiterOnly" : true
      }
  ]
}

application:PRIMARY> db.getReplicationInfo()
{  
"logSizeMB" : 1024,  
"usedMB" : 0.01,  
"timeDiff" : 169,  
"timeDiffHours" : 0.05,  
"tFirst" : "Sat Jan 26 2013 21:33:20 GMT+0800 (CDT)",  
"tLast" : "Sat Jan 26 2013 21:36:09 GMT+0800 (CDT)",  
"now" : "Sat Jan 26 2013 21:48:07 GMT+0800 (CDT)"
}

포트 9929를 입력하면 중재 노드의 프롬프트 기호를 볼 수 있습니다.
mongo localhost:9929application:ARBITER>
장애 조치 테스트를 수행하려면 ctrl+c를 사용하여 9927의 마스터 노드를 삭제하고 터미널 정보 프롬프트를 관찰하고 9927이 다운 상태에 있고 9928 슬레이브 노드가 마스터 노드로 부트스트랩됩니다. 9927이 온라인으로 전환되고 추가됩니다. 슬레이브 노드로 설정한 다음 ctrl+c를 누르면 9928 노드가 드롭됩니다. 잠시 후 9927 포트가 마스터 노드로 복원되고 9928이 온라인 상태가 되고 시스템이 원래 복제 세트로 복원됩니다.의 역할 중재 노드는 리더 선출을 조정하고 시스템의 작동 상태를 모니터링하고 노드가 서로 통신할 수 있도록 데이터 정보를 제공합니다.
mongodb도 간단한 마스터-슬레이브 복제를 지원하지만 강력한 레플리카 세트를 사용하면 단순한 마스터-슬레이브 복제 전략을 사용할 이유가 거의 없으며, mongodb의 샤딩(자동 샤딩)도 레플리카 세트를 사용하여 구현됩니다.
51CTO에는 Windows 버전 http://database.51cto.com/art/201301/379033.htm도 있습니다.

좋은 웹페이지 즐겨찾기