MongoDB에서 sharding으로 서버 그룹에 복사본 집합을 분배하는 방법
복사본 집합은 여러 기계에서 데이터를 동기화하는 과정이다.복제본은 데이터 이중화를 제공하여 데이터 가용성을 확장합니다.여러 서버에 데이터를 저장하면 한 서버로 인한 데이터 손실을 피할 수 있습니다.하드웨어 고장이나 서비스 중단에서 벗어날 수도 있고, 추가 데이터 사본을 이용하여 한 대의 기계에서 재난 복구나 백업에 주력할 수도 있다.
일부 장면에서는 복사본 집합을 사용하여 읽기 성능을 확장할 수 있다.클라이언트는 서로 다른 서버에 읽기와 쓰기 작업을 보낼 수 있습니다.분산 응용 프로그램을 확장하기 위해 서로 다른 데이터 센터에서 서로 다른 복사본을 얻을 수도 있다.
mongodb 복사본집은 같은 데이터를 가진 mongodb 실례입니다. 메인 mongodb는 모든 쓰기 조작을 받아들이고 모든 다른 실례는 메인 실례의 조작을 받아들여 데이터 동기화를 유지할 수 있습니다.주 실례는 고객이 쓸 수 있는 쓰기를 받아들인다. 복사본집에는 주 실례가 하나만 있을 수 있다. 데이터의 일치성을 유지하기 위해 하나의 실례만 쓸 수 있고 주 실례의 로그는oplog에 저장되기 때문이다.
Client Application Driver
Writes Reads
| |
Primary
|Replication|Replication
Secondary Secondary
2급 노드는 주 노드의oplog를 복제한 다음에 자신의 데이터 복사본에서 작업을 수행합니다. 2급 노드는 주 노드 데이터의 반사입니다. 주 노드를 사용할 수 없으면 새로운 주 노드를 선출합니다.기본 읽기 작업은 마스터에서 수행되지만 읽기 기본 설정 매개 변수를 지정하여 복사본 노드에 읽기 작업을 지정할 수 있습니다.추가 중재 노드(피선거권 없음)를 추가하여 부본 집합 노드를 홀수로 유지하고 표수가 다른 직접점을 선출할 수 있도록 할 수 있다.중재자는 전용 하드웨어 장치를 필요로 하지 않는다.중재자 노드는 중재자의 신분을 보존해 왔다.
1. 비동기식 복사본 노드 동기화 직접점 작업은 비동기적이지만 복사본 집합이 클라이언트 프로그램에 최신 데이터를 되돌려 줄 수 없습니다.
2. 자동 고장 전이 만약에 주 노드 10s 이상이 다른 노드와 통신을 잃으면 다른 노드는 새로운 노드를 주 노드로 선출한다.대다수의 표를 가진 부노드는 주 노드로 선출될 것이다.
복사본 집합은 응용 프로그램에 여러 데이터 센터에 있는 구성원이 될 수 있는 복사본 집합을 제공합니다.구성원의 다른 우선순위를 지정하여 선거를 통제할 수도 있다.
sharding 사본 집합을 분할 집단으로 변환 1.테스트 던전 집합을 배치하여 첫 번째 던전 집합을 만드는 실례입니다. 이름은firstset: 1.1입니다. 던전 집합을 만들고 데이터를 다음과 같이 삽입합니다.
/data/example/firstset1
/data/example/firstset2
/data/example/firstset3
디렉토리를 만들려면 다음과 같이 하십시오.
mkdir -p /data/example/firstset1 /data/example/firstset2 /data/example/firstset3
1.2 다른 단말기에서 세 개의 mongodb를 시작하는 예는 다음과 같다.
mongod --dbpath /data/example/firstset1 --port 10001 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset1/firstset1.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/firstset2 --port 10002 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset2/firstset2.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/firstset3 --port 10003 --replSet firstset --oplogSize 700 --rest --fork --logpath /data/example/firstset3/firstset3.log --logappend --nojournal --directoryperdb
-oplog 옵션은 모든mongodb 실례 작업 로그를 700M으로 강제로 합니다. 이 인자를 사용하지 않으면 기본적으로 구역 공간의 5%입니다.oplog의 크기를 제한하면 모든 실례를 빨리 시작할 수 있습니다.1.3 mongodb 실례를 연결하는 셸
mongo mongo01:10001/admin
생산 환경에서나 서로 다른 호스트 이름이나 IP를 실행하는 기계에서는mongo01을 지정한 이름으로 수정해야 합니다.1.4 몬고 셸에서 던전 집합 초기화
var config = {
"_id" : "firstset",
"members" : [
{"_id" : 0, "host" : "mongo01:10001"},
{"_id" : 1, "host" : "mongo01:10002"},
{"_id" : 2, "host" : "mongo01:10003"},
]
}
rs.initiate(config);
{
"info" : "Config now saved locally. Should come online in about a minute.",
"ok" : 1
}
또는
db.runCommand(
{"replSetInitiate" :
{"_id" : "firstset",
"members" : [
{"_id" : 0, "host" : "mongo01:10001"},
{"_id" : 1, "host" : "mongo01:10002"},
{"_id" : 2, "host" : "mongo01:10003"}
]
}
}
)
1.5 mongo 셸에서 데이터 생성 및 삽입:
use mydb
switched to db mydb
animal = ["dog", "tiger", "cat", "lion", "elephant", "bird", "horse", "pig", "rabbit", "cow", "dragon", "snake"];
for(var i=0; i<100000; i++){
name = animal[Math.floor(Math.random()*animal.length)];
user_id = i;
boolean = [true, false][Math.floor(Math.random()*2)];
added_at = new Date();
number = Math.floor(Math.random()*10001);
db.test_collection.save({"name":name, "user_id":user_id, "boolean": boolean, "added_at":added_at, "number":number });
}
위의 작업은 집합test_collection은 100만 개의 데이터를 삽입하는데 시스템에 따라 몇 분의 시간이 걸릴 수 있습니다.스크립트에 다음 형식의 문서가 추가됩니다.
2. 분할 시설을 배치하여 세 개의 설정 서버를 만들어 집단의 메타데이터를 저장한다.개발이나 테스트 환경에서 하나의 설정 서버는 충분하고 생산 환경에서 3일의 설정 서버가 필요하다. 왜냐하면 그들은 메타데이터를 저장하기 위해 매우 적은 자원을 차지하기 때문이다.2.1 구성 서버의 데이터 파일 저장 디렉터리를 만듭니다.
/data/example/config1
/data/example/config2
/data/example/config3
디렉토리를 만들려면 다음과 같이 하십시오.
mkdir -p /data/example/config1 /data/example/config2 /data/example/config3
2.2 별도의 터미널에서 구성 서버를 시작합니다.
mongod --configsvr --dbpath /data/example/config1 --port 20001 --fork --logpath /data/example/config1/config1.log --logappend
mongod --configsvr --dbpath /data/example/config2 --port 20002 --fork --logpath /data/example/config2/config2.log --logappend
mongod --configsvr --dbpath /data/example/config3 --port 20003 --fork --logpath /data/example/config3/config3.log --logappend
2.3 다른 단말기에서 몬고스를 시작하는 실례:
mongos --configdb mongo01:20001,mongo01:20002,mongo01:20003 --port 27017 --chunkSize 1 --fork --logpath /data/example/mongos.log --logappend
이전에 만든 테이블이나 테스트 환경에서 최소chunksize(1M)를 사용할 수 있습니다. 기본chunksize는 64M입니다. 이것은 mongodb가 자동으로 조각을 나누어 시작하기 전에 집단이 64MB의 데이터 파일을 가져야 한다는 것을 의미합니다.생산 환경에서는 아주 작은 조각 크기를 사용할 수 없다.configdb 옵션은 설정 서버를 지정합니다.mongos 실례는 기본 mongodb27017 포트에서 실행됩니다.2.4mongos에 첫 번째 블록을 추가할 수 있습니다. 새 터미널에서 다음 명령을 실행합니다. 2.4.1mongos 연결 실례
mongo mongo01:27017/admin
2.4.2 addShard 명령을 사용하여 첫 번째 슬라이스 추가
db.runCommand( { addShard : "firstset/mongo01:10001,mongo01:10002,mongo01:10003" } )
2.4.3 성공:
{ "shardAdded" : "firstset", "ok" : 1 }
3. 다른 테스트 던전 집합을 배치하여 다른 던전 집합을 만드는 실례, 이름은 secondset: 3.1 던전 집합을 만들고 데이터를 다음과 같이 삽입합니다.
/data/example/secondset1
/data/example/secondset2
/data/example/secondset3
디렉토리를 만들려면 다음과 같이 하십시오.
mkdir -p /data/example/secondset1 /data/example/secondset2 /data/example/secondset3
3.2 다른 터미널에서 세 개의 mongodb를 시작하는 예는 다음과 같다.
mongod --dbpath /data/example/secondset1 --port 30001 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset1/secondset1.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/secondset2 --port 30002 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset2/secondset2.log --logappend --nojournal --directoryperdb
mongod --dbpath /data/example/secondset3 --port 30003 --replSet secondset --oplogSize 700 --rest --fork --logpath /data/example/secondset3/secondset3.log --logappend --nojournal --directoryperdb
3.3 mongodb 실례를 연결하는 셸
mongo mongo01:20001/admin
3.4 몬고 셸에서 던전 집합 초기화
db.runCommand(
{"replSetInitiate" :
{"_id" : "secondset",
"members" : [
{"_id" : 0, "host" : "mongo01:30001"},
{"_id" : 1, "host" : "mongo01:30002"},
{"_id" : 2, "host" : "mongo01:30003"}
]
}
}
)
3.5 이 던전 집합을 분할 집단에 추가
db.runCommand( { addShard : "secondset/mongo01:30001,mongo01:30002,mongo01:30003" } )
성공 메시지로 돌아가기
{ "shardAdded" : "firstset", "ok" : 1 }
3.6 listShards 명령을 실행하여 슬라이스가 성공적으로 추가되었음을 확인합니다.다음과 같습니다.
db.runCommand({listShards:1})
{
"shards" : [
{
"_id" : "firstset",
"host" : "firstset/mongo01:10001,mongo01:10002,mongo01:10003"
},
{
"_id" : "secondset",
"host" : "secondset/mongo01:30001,mongo01:30002,mongo01:30003"
}
],
"ok" : 1
}
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.