참고: 내용의 end-point 는 노출을 방지하기 위해 변경처리 하였습니다.
■ ArangoDB Replication Overview
▶ Overview
- ArangoDB에서 복제의 주요 목적은 특정 데이터베이스의 읽기 확장 성 및 "핫 백업"을 제공하는 것입니다.
- 복제설정은 슬레이브 데이터베이스에서 replication applier 를 활성화 해야 합니다.
- 복제는 동기, 비동기 방식을 모두 지원 합니다.
- 복제는 데이터베이스 단위로 발생 합니다.
- 복제는 컬렉션 단위로 설정 가능 합니다. (syncCollection)
- 복제시 ChunkSize 를 조정하여 동기화 강약을 조정할 수 있습니다. (사이즈가 적으면 Master 연결 요청 수가 증가)
- 복제 중지 후 자동 재시작 설정이 가능 합니다.
■ ArangoDB Asynchronous replication (비동기 복제)
ArangoDB 복제구성 작업 및 사용방법에 대해서 가이드를 제공 합니다.
- SETP-01. ArangoDB 복제 구성 (초기 동기화)
- STEP-02. ArangoDB 복제 시작/중지
- STEP-03. ArangoDB 복제 초기화 (Initial synchronization )
- STEP-04. ArangoDB Shell 을 이용한 복제 초기화 ( Initial synchronization )
- STEP-05. ArangoDB 컬렉션 단위 동기화
- STEP-06. ArangoDB 복제 주의사항
√ 복제관련 명령어 모음
- require("@arangodb/replication").logger.state(); -- mysql 의 show master status 와 동일 합니다.
- require("@arangodb/replication").logger.firstTick();
- require("@arangodb/replication").logger.tickRanges();
- require("@arangodb/replication").applier.state(); -- mysql 의 show slave status 와 동일 합니다.
- require("@arangodb/replication").applier.properties();
- require("@arangodb/replication").applier.properties( -- 복제 응용프로그램 속성변경
{
endpoint: "tcp://master.domain.org:8529",
username: "root",
password: "secret",
adaptivePolling: true,
connectTimeout: 15,
maxConnectRetries: 100,
chunkSize: 262144,
autoStart: true,
includeSystem: true,
autoResync: true,
autoResyncRetries: 2,
});
- require("@arangodb/replication").setupReplication(configuration);
db._useDatabase("_system");
require("@arangodb/replication").setupReplication({
endpoint: "tcp://master.domain.org:8529",
username: "myuser",
password: "mypasswd",
verbose: false,
includeSystem: false,
incremental: true,
autoResync: true
}); - require("@arangodb/replication").applier.start(<tick>);
- require("@arangodb/replication").applier.stop();
- require("@arangodb/replication").sync({
endpoint: "tcp://master.domain.org:8529",
username: "root",
password: "secret,
includeSystem: true
});
√ 복제관련 참고사항
- _system 데이터베이스 복제 시 중요한 고려사항은 시스템 컬렉션 (_graph, _users) 동기화 여부 입니다.
기본적으로 동기화가 되게 되어있으나 슬레이브서버의 혼란을 피하기 위해 동기화를 진행하지 않으려면
setupReplication() 또는 applier.properties() 함수 사용 시 includeSystem = false 로 설정 후 동기화 해야 합니다.
● STEP-01. ArangoDB 복제 구성 (초기 동기화)
전체 동기화 (또는 재 동기화)를 수행하는 유일한 안전 방법은
- 슬레이브에서 복제 응용 프로그램 중지 (현재 실행중인 경우)
- master 데이터베이스와의 초기 전체 동기화 수행
- 마스터 데이터베이스의 lastLogTick 값과
- 이 틱 값을 사용하여 슬레이브에서 연속 복제 applier를 시작하십시오.
1) 복제 응용 프로그램 구동여부 체크 (복제 응용 프로그램 속성정보로 확인가능)
복제 설정이 있는지 우선 확인 합니다. 아래 상태 값에는 endpoint: "tcp://master.domain.org:8529" 정보가 누락되어 있다면 복제설정이 없음을 알 수 있습니다. 하지만 1회라도 복제가 설정 된 경우 endpoint 정보가 나오기 때문에, 응용프로그램 중지 상태를 정확하게 판단하기 어려울 수 있습니다. 이 경우 applier.state() 로 상태를 체크해야 합니다. require("@arangodb/replication").applier.properties(); { "requestTimeout" : 600, "connectTimeout" : 10, "ignoreErrors" : 0, "maxConnectRetries" : 100, "sslProtocol" : 0, "chunkSize" : 0, "autoStart" : false, "adaptivePolling" : true, "autoResync" : false, <-- 전체 재 동기화 수행여부 옵션으로 초기 값은 false 입니다. "autoResyncRetries" : 2, "includeSystem" : true, "requireFromPresent" : false, "verbose" : false, "incremental" : false, "useCollectionId" : true, "restrictType" : "", "restrictCollections" : [ ], "connectionRetryWaitTime" : 15, "initialSyncMaxWaitTime" : 300, "idleMinWaitTime" : 1, "idleMaxWaitTime" : 2.5 } 복제가 1회라도 설정 된 경우, 복제 응용프로그램 상태로 확인하는게 좀 더 명확 합니다. running, errorMessage 속성으로 복제 가 중 지 된 상태를 쉽게 확인 할 수 있습니다. require("@arangodb/replication").applier.state() { "state" : { "running" : false, "lastAppliedContinuousTick" : "339853", "lastProcessedContinuousTick" : "339853", "lastAvailableContinuousTick" : "341332", "safeResumeTick" : "339853", "progress" : { "time" : "2017-03-03T02:37:42Z", "message" : "applier shut down", "failedConnects" : 0 }, "totalRequests" : 459, "totalFailedConnects" : 0, "totalEvents" : 0, "totalOperationsExcluded" : 0, "lastError" : { "errorNum" : 1412, "time" : "2017-03-03T02:37:42Z", "errorMessage" : "replication stopped" }, "time" : "2017-03-03T02:37:56Z" }, "server" : { "version" : "3.1.11", "serverId" : "188430583047992" }, "endpoint" : "tcp://ec2-13-124-7-999.ap-northeast-2.compute.amazonaws.com:8529", "database" : "_system" } 구동 중이라면 applier 를 중지 하도록 합니다. db._useDatabase("_system"); require("@arangodb/replication").applier.stop(); |
2) 복제 설정 및 자동 시작
db._useDatabase("_system"); require("@arangodb/replication").setupReplication({ endpoint: "tcp://ec2-13-124-7-999.ap-northeast-2.compute.amazonaws.com:8529", username: "root", password: "qwer1234", verbose: false, includeSystem: false, incremental: true, autoResync: true <-- 전체 데이터 재 동기화 설정 }); |
※ autoResync : false / 전체 재 동기화 수행여부 옵션으로 초기 값은 false 입니다.
※ includeSystem : false / 시스템 컬렉션 동기화 여부, 초기 값은 true 입니다.
※ incremental : true / 부분 복제 동기화 여부
※ verbose : false / 현재 동기화가 수행 중인 작업 표시여부, 초기 값은 false 입니다.
※ autoResyncRetries : 2 / 재 동기화 재 시도 횟수, 초기 값은 2 입니다.
3) 복제 응용 프로그램 속성 체크
require("@arangodb/replication").applier.properties() { "endpoint" : "tcp://ec2-13-124-7-999.ap-northeast-2.compute.amazonaws.com:8529", "database" : "_system", "username" : "root", "requestTimeout" : 600, "connectTimeout" : 10, "ignoreErrors" : 0, "maxConnectRetries" : 100, "sslProtocol" : 0, "chunkSize" : 0, "autoStart" : true, "adaptivePolling" : true, "autoResync" : true, "autoResyncRetries" : 2, "includeSystem" : false, "requireFromPresent" : false, "verbose" : false, "incremental" : true, "useCollectionId" : true, "restrictType" : "", "restrictCollections" : [ ], "connectionRetryWaitTime" : 15, "initialSyncMaxWaitTime" : 300, "idleMinWaitTime" : 1, "idleMaxWaitTime" : 2.5 } |
4) 복제 응용 프로그램 속성 변경
autoStart 값이 false 인 경우, 슬레이브 서버가 다시 시작 되면 복제가 중지된 상태로 남아 있습니다.
이를 변경하기 위해서는 아래와 같이 속성을 autoStart: true 로 설정해야 합니다.
db._useDatabase("_system"); require("@arangodb/replication").applier.properties({ }); |
5) 복제 응용 프로그램 상태 체크
require("@arangodb/replication").applier.state() { "state" : { "running" : true, "lastAppliedContinuousTick" : "339853", "lastProcessedContinuousTick" : "339853", "lastAvailableContinuousTick" : "340177", "safeResumeTick" : "339853", "progress" : { "time" : "2017-03-03T02:24:47Z", "message" : "fetching master log from tick 339853, first regular tick 339853, barrier: 339855...", "failedConnects" : 0 }, "totalRequests" : 150, "totalFailedConnects" : 0, "totalEvents" : 0, "totalOperationsExcluded" : 0, "lastError" : { "errorNum" : 0 }, "time" : "2017-03-03T02:24:48Z" }, "server" : { "version" : "3.1.11", "serverId" : "188430583047992" }, "endpoint" : "tcp://ec2-13-124-7-999.ap-northeast-2.compute.amazonaws.com:8529", "database" : "_system" } |
● STEP-02. ArangoDB 복제 시작/중지
1) 복제 응용 프로그램 중지
db._useDatabase("_system"); require("@arangodb/replication").applier.stop(); |
※ 슬레이브에서 복제를 중지 할 때 고려해야 할 한 가지 주의 사항이 있습니다.
커밋 또는 중단되지 않은 계속 진행중인 복제 된 트랜잭션이있는 경우 복제 적용자를 중지하면 이러한 작업이 슬레이브에서 손실됩니다.
이러한 트랜잭션이 나중에 마스터에서 커밋되고 복제가 다시 시작되면 슬레이브는 이러한 트랜잭션을 커밋 할 수 없습니다. 따라서 마스터에
진행중인 트랜잭션이 없다는 확실성이있는 경우에만 슬레이브에서 복제 응용 프로그램을 수동으로 중지해야합니다.
( 복제가 지연 중인 상태에서는 복제를 중지 할 수 없다는 이야기와 동일 합니다. )
마스터가 현재 완전히 유휴 상태이고 모든 트랜잭션이 완전히 복제 된 경우에만 슬레이브에서 복제 applier를 중지하고 다시 시작해야합니다.
슬레이브가 마스터에서 트랜잭션을 부분적으로 만 실행하는 동안 트랜잭션에 관련된 콜렉션에 대한 쓰기 잠금을 유지할 수 있습니다.
( 트랜잭션 처리 중 복제를 중지 할 경우, 마스터의 콜렉션에 쓰기 잠금이 유지 될 수 있습니다. )
2) MASTER 서버에서 lastLogTick 값 체크
require("@arangodb/replication").logger.state(); { "state" : { "running" : true, "lastLogTick" : "342917", "lastUncommittedLogTick" : "342917", "totalEvents" : 25296, "time" : "2017-03-03T02:55:52Z" }, "server" : { "version" : "3.1.11", "serverId" : "137234961092689" }, "clients" : [ ] } |
3) SLAVE 서버에서 복제 재 구동
require("@arangodb/replication").applier.start("342917"); { "state" : { "running" : true, "lastAppliedContinuousTick" : "339853", "lastProcessedContinuousTick" : "339853", "lastAvailableContinuousTick" : "341332", <--- master 서버의 lastLogTick 값과 동일 "safeResumeTick" : "339853", "progress" : { "time" : "2017-03-03T02:37:42Z", "message" : "applier shut down", "failedConnects" : 0 }, "totalRequests" : 459, "totalFailedConnects" : 0, "totalEvents" : 0, "totalOperationsExcluded" : 0, "lastError" : { "errorNum" : 0 }, "time" : "2017-03-03T02:58:35Z" }, "server" : { "version" : "3.1.11", "serverId" : "188430583047992" }, "endpoint" : "tcp://ec2-13-124-7-999.ap-northeast-2.compute.amazonaws.com:8529", "database" : "_system" } |
● STEP-03. ArangoDB 복제 초기화 (Initial synchronization )
1) 복제 응용 프로그램 중지 (SLAVE 서버)
db._useDatabase("_system"); require("@arangodb/replication").applier.stop(); |
2) 복제 응용 프로그램 중지 (SLAVE 서버)
require("@arangodb/replication").sync({ ...> endpoint: "tcp://ec2-13-124-7-999.ap-northeast-2.compute.amazonaws.com:8529", ...> username: "root", ...> password: "qwer1234", ...> verbose: false ...> async: true ...> }); { "collections" : [ { "id" : "2", "name" : "_graphs" }, { "id" : "6", "name" : "_users" }, { "id" : "20", "name" : "_modules" }, { "id" : "22", "name" : "_routing" }, { "id" : "35", "name" : "_aqlfunctions" }, { "id" : "52", "name" : "_frontend" }, { "id" : "19081", "name" : "doc1" }, { "id" : "19123", "name" : "edge1" }, { "id" : "19201", "name" : "doc2" } ], "lastLogTick" : "346815" } |
※ 슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
경고 : 동기화 는 현재 데이터베이스의 컬렉션과 마스터 데이터베이스에있는 컬렉션의 전체 동기화 를 수행합니다.
콜렉션의 모든 로컬 인스턴스와 모든 데이터가 제거됩니다! 로컬 데이터를 제거하려면이 명령을 실행하십시오!
( sync 명령사용 시 복제서버의 모든 데이터는 초기화 되면 처음부터 다시 복제를 합니다. )
※ 슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
sync 명령을 통한 초기 동기화 는 완료하는 데 시간이 오래 걸릴 수 있습니다.
셸은 슬레이브가 초기 동기화를 완료하거나 오류가 발생할 때까지 차단됩니다.
이 경우 차단되지 않도록 sync 명령어 옵션에 async = true 로 설정하여 초기동기화 작업이 가능 합니다.
3) 복제 응용 프로그램 시작 (SLAVE 서버)
sync 명령 마지막에 나오는 lastLogTick 값을 이용하여 복제 응용 프로그램을 시작해야 합니다.
require("@arangodb/replication").applier.start("346815"); |
● STEP-04. ArangoDB Shell 을 이용한 복제 초기화 ( Initial synchronization )
기본적으로 ArangoShell 의 sync 명령은 10 초마다 상태 업데이트를 위해 슬레이브를 폴링합니다.
db._useDatabase("_system"); var replication = require("@arangodb/replication"); /* run command in async mode */ var id = replication.sync({ endpoint: "tcp://master.domain.org:8529", username: "myuser", password: "mypasswd", async: true }); /* now query the status of our operation */ print(replication.getSyncResult(id)); |
※ getSyncResult 는 동기화가 완료되지 않는 한 false 를 반환하고 그렇지 않으면 동기화 결과를 반환합니다.
● STEP-05. ArangoDB 컬렉션 단위 동기화
db._useDatabase("_system"); require("@arangodb/replication").syncCollection("test", { endpoint: "tcp://master.domain.org:8529", username: "myuser", password: "mypasswd" }); |
※ 컬렉션 단위 동기화는 슬레이브가 거의 모든 데이터를 가지고 있는 상태에서 차이점만 동기화해야 하는 경우 유용 합니다.
※ 차이점을 계산하기 위해 슬레이브와 마스터의 컬렉션에 있는 모든 문서 키의 정렬된 목록을 작성 합니다. 이로인해 메모리 사용 및 런타임 관련하여 대용량 컬렉션은 비용이 비쌀 수 있습니다.
※ 모든 문서 키의 정렬 된 목록을 만드는 동안 컬렉션은 마스터에서 읽기 잠금 됩니다.
● STEP-06. ArangoDB 복제 주의사항
※ 슬레이브에서 복제를 중지 할 때 고려해야 할 한 가지 주의 사항이 있습니다.
커밋 또는 중단되지 않은 계속 진행중인 복제 된 트랜잭션이있는 경우 복제 적용자를 중지하면 이러한 작업이 슬레이브에서 손실됩니다.
이러한 트랜잭션이 나중에 마스터에서 커밋되고 복제가 다시 시작되면 슬레이브는 이러한 트랜잭션을 커밋 할 수 없습니다. 따라서 마스터에
진행중인 트랜잭션이 없다는 확실성이있는 경우에만 슬레이브에서 복제 응용 프로그램을 수동으로 중지해야합니다.
( 복제가 지연 중인 상태에서는 복제를 중지 할 수 없다는 이야기와 동일 합니다. )
마스터가 현재 완전히 유휴 상태이고 모든 트랜잭션이 완전히 복제 된 경우에만 슬레이브에서 복제 applier를 중지하고 다시 시작해야합니다.
슬레이브가 마스터에서 트랜잭션을 부분적으로 만 실행하는 동안 트랜잭션에 관련된 콜렉션에 대한 쓰기 잠금을 유지할 수 있습니다.
( 트랜잭션 처리 중 복제를 중지 할 경우, 마스터의 콜렉션에 쓰기 잠금이 유지 될 수 있습니다. )
관련명령어
require("@arangodb/replication").applier.stop(); |
※ 슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
슬레이브의 복제 응용 프로그램이 이미 실행 중일 때 setupReplication() 명령이 실행되면
먼저 실행중인 응용 프로그램을 중지하고 구성을 삭제 한 다음 마스터와 데이터의 재 동기화를 수행합니다.
그런 다음 제공된 구성을 사용하여 이전에 기존의 복제 구성을 덮어 씁니다.
( 재 동기화가 만약 sync 와 동일하게 전체 데이터 동기화라면 항상 복제가 실행 중인지 확인해야 합니다. )
관련명령어
require("@arangodb/replication").setupReplication(configuration); |
※ 슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
경고 : 동기화 는 현재 데이터베이스의 컬렉션과 마스터 데이터베이스에있는 컬렉션의 전체 동기화 를 수행합니다.
콜렉션의 모든 로컬 인스턴스와 모든 데이터가 제거됩니다! 로컬 데이터를 제거하려면이 명령을 실행하십시오!
( sync 명령사용 시 복제서버의 모든 데이터는 초기화 되면 처음부터 다시 복제를 합니다. )
관련명령어
require("@arangodb/replication").sync({ endpoint: "tcp://master.domain.org:8529", }); |
※ 슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
복제서버의 중지 후 doc1 컬렉션에 A 라는 _key 값을 입력 후 복제를 재 구동하면 정상 구동 됩니다.
이 후 마스터 서버에서 doc1 컬렉션에 A라는 _key 값을 입력하게 되면 복제서버의 A 값은 B로 변경되며, 데이터는 삭제 됩니다.
즉 복제 충돌은 발생하지 않지만 충돌 _key 값을 자동으로 변경하게 됩니다.
※ 슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
sync 명령을 통한 초기 동기화 는 완료하는 데 시간이 오래 걸릴 수 있습니다.
셸은 슬레이브가 초기 동기화를 완료하거나 오류가 발생할 때까지 차단됩니다.
이 경우 차단되지 않도록 sync 명령어 옵션에 async = true 로 설정하여 초기동기화 작업이 가능 합니다.
'NOSQL' 카테고리의 다른 글
MongoDB 에서 SSD DISK 사용 시 주의사항 (0) | 2019.08.12 |
---|---|
[ArangoDB] Basic Guide Overview (1) | 2017.03.02 |
[MongoDB] copyDatabase (0) | 2017.02.09 |
[MongoDB] 3.4.2 버전 릴리즈 정보 (0) | 2017.02.09 |
[MongoDB] Overflow sort stage buffered data usage exceeds internal limit (0) | 2017.02.01 |
Comments