Blog Content

    티스토리 뷰

    [ArangoDB] Replication Overview (비동기 복제)


    참고: 내용의 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({
      endpoint: "tcp://master.domain.org:8529",
      username: "myuser",
      password: "mypasswd",
      autoStart: true,
      autoResync: true,
      autoResyncRetries: 2,
      adaptivePolling: true,
      includeSystem: false,
      requireFromPresent: false,
      idleMinWaitTime: 0.5,
      idleMaxWaitTime: 1.5,
      verbose: false
    });


    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",
      username: "root",
      password: "secret,
      restrictType: "include",
      restrictCollections: [ "foo", "bar" ]
    });

    슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
    복제서버의 중지 후 doc1 컬렉션에 A 라는 _key 값을 입력 후 복제를 재 구동하면 정상 구동 됩니다.
    이 후 마스터 서버에서 doc1 컬렉션에 A라는 _key 값을 입력하게 되면 복제서버의 A 값은 B로 변경되며, 데이터는 삭제 됩니다.
    즉 복제 충돌은 발생하지 않지만 충돌 _key 값을 자동으로 변경하게 됩니다.

    슬레이브에서 복제를 구성할 때 고려해야 할 한 가지 주의 사항이 있습니다.
    sync 명령을 통한 초기 동기화 는 완료하는 데 시간이 오래 걸릴 수 있습니다.
    셸은 슬레이브가 초기 동기화를 완료하거나 오류가 발생할 때까지 차단됩니다.
    이 경우 차단되지 않도록 sync 명령어 옵션에 async = true 로 설정하여 초기동기화 작업이 가능 합니다.


    Comments