여기서 소개하는 기능은 Realm 모바일 플랫폼 프로페셔널 및 엔터프라이즈 에디션에서 제공됩니다. 더 자세한 내용을 알아보고 무료 평가판을 시작해보세요.

Note: 이 문서는 엔터프라이즈 및 프로페셔널 에디션에 제한된 기능만 설명합니다. 설정과 일반적인 사용법 및 문제 해결을 포함한 다른 항목에 대해서는 주 오브젝트 서버 문서를 참고하세요.

설치/업그레이드

프로페셔널 에디션과 엔터프라이즈 에디션을 설치하고 기능을 구성, 탐색하는 방법에 대한 자세한 내용은 기술 참고 사항 2017-003, Realm 모바일 플랫폼 안내를 참고하세요.

Note: 프로페셔널 및 엔터프라이즈 버전은 현재 Linux에서만 사용할 수 있습니다.

프로페셔널 에디션으로 업그레이드

Realm 모바일 플랫폼 프로페셔널 에디션의 14일 무료 평가판을 사용하려면 신청서를 작성하세요. 접근 토큰을 이메일로 보내 드립니다.

Realm 오브젝트 서버를 프로페셔널 에디션으로 업그레이드하는 경우 먼저 개발자 에디션을 삭제해야 합니다. 그 다음 이메일로 보내드린 접근 토큰을 사용해 배포 환경에 맞게 다음과 같은 단계를 따르세요.

# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 패키지 저장소 설정하기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-professional/script.rpm.sh | sudo bash

# Realm 오브젝트 서버 설치하기
sudo yum -y install realm-object-server-professional

# 서비스 활성화하고 시작하기
sudo chkconfig realm-object-server on
sudo service realm-object-server start
# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 패키지 저장소 설정하기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-professional/script.rpm.sh | sudo bash

# Realm 오브젝트 서버 설치하기
sudo yum -y install realm-object-server-professional

# 서비스 활성화하고 시작하기
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server
# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 패키지 저장소 설정하기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-professional/script.deb.sh | sudo bash

# 저장소 업데이트
sudo apt-get update

# Realm 오브젝트 서버 설치하기
sudo apt-get install realm-object-server-professional

# 서비스 활성화하고 시작하기
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server

엔터프라이즈 에디션으로 업그레이드

Realm 오브젝트 서버를 엔터프라이즈 에디션으로 업그레이드하는 경우 먼저 개발자/프로페셔널 에디션을 삭제해야 합니다. 그 다음 이메일로 보내드린 접근 토큰을 사용해 배포 환경에 맞게 다음과 같은 단계를 따르세요.

# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 패키지 저장소 설정하기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.rpm.sh | sudo bash

# Realm 오브젝트 서버 설치하기
sudo yum -y install realm-object-server-enterprise

# 서비스 활성화하고 시작하기
sudo chkconfig realm-object-server on
sudo service realm-object-server start
# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 패키지 저장소 설정하기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.rpm.sh | sudo bash

# Realm 오브젝트 서버 설치하기
sudo yum -y install realm-object-server-enterprise

# 서비스 활성화하고 시작하기
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server
# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 패키지 저장소 설정하기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.deb.sh | sudo bash

# 저장소 업데이트
sudo apt-get update

# Realm 오브젝트 서버 설치하기
sudo apt-get install realm-object-server-enterprise

# 서비스 활성화하고 시작하기
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server

로드 밸런싱

이 기능은 프로페셔널과 엔터프라이드 에디션에서만 가능합니다. 이 곳에서 더 많은 기능을 알아보세요.

Realm 오브젝트 서버는 고성능으로 설계됐으며, 단일 인스턴스로도 수만 개 이상의 동시 연결을 처리할 수 있습니다. 그러나 수백만 이상의 동시 접속이 예상되는 대규모의 애플리케이션의 경우, 여러 서버가 필요할 수 있습니다. Realm 모바일 플랫폼 엔터프라이즈 에디션은 대규모 애플리케이션을 지원하고 있는 Realm 오브젝트 서버라도 얼마든지 그 수에 관계없이 수평적으로 확장할 수 있는 완벽한 솔루션을 제공합니다.

이 시스템은 클라이언트와 서버에 의해 사용되는 양방향 연결을 유지하는 로드 밸런서에 의해 동작합니다.

설치

각 백엔드 노드는 동일한 클러스터의 다른 백엔드 노드와 독립적으로 동작합니다. 각 백엔드 노드는 realm-sync-worker 바이너리의 인스턴스를 실행하는데, realm-sync-worker란 Realm 오브젝트 서버의 일부분으로 주로 실행되는 동기화 워커의 이름입니다. 설정이 필요하지 않지만 Realm 오브젝트 서버를 실행하는 서버 인스턴스에서 연결할 수 있어야 합니다.

동기화 워커를 설치하려면 아래 설명처럼 엔터프라이즈 저장소를 설정해야 합니다.

# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 엔터프라이즈 저장소 설정하기. 이미 ROS 엔터프라이즈를 설치했다면 건너 뛰세요.
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.rpm.sh | sudo bash

# Realm 오브젝트 서버의 독립형 동기화 워커 설치
sudo yum -y install realm-sync-worker

# /etc/realm/token-signature.pub를 Realm 오브젝트 서버의 것으로 교체합니다

# 서비스 활성화하고 시작하기
sudo chkconfig realm-sync-worker on
sudo service realm-sync-worker start
# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 엔터프라이즈 저장소 설정하기. 이미 ROS 엔터프라이즈를 설치했다면 건너 뛰세요.
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.rpm.sh | sudo bash

# Realm 오브젝트 서버의 독립형 동기화 워커 설치
sudo yum -y install realm-sync-worker

# /etc/realm/token-signature.pub를 Realm 오브젝트 서버의 것으로 교체합니다

# 서비스 활성화하고 시작하기
sudo systemctl enable realm-sync-worker
sudo systemctl start realm-sync-worker
# 토큰 변수 설정하기
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm 엔터프라이즈 저장소 설정하기. 이미 ROS 엔터프라이즈를 설치했다면 건너 뛰세요.
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.deb.sh | sudo bash

# 저장소 업데이트
sudo apt-get update

# Realm 오브젝트 서버 설치하기
sudo apt-get install realm-sync-worker

# /etc/realm/token-signature.pub를 Realm 오브젝트 서버의 것으로 교체합니다

# 서비스 활성화하고 시작하기
sudo systemctl enable realm-sync-worker
sudo systemctl start realm-sync-worker

설정

Realm 오브젝트 서버의 configuration.yml의 “sync.servers” 섹션은 백엔드 노드의 클러스터를 설명합니다. 로드 밸런싱을 위해 각 백엔드 노드는 고유한 ID로 식별될 수 있어야 합니다. ID는 유효한 파일시스템 경로 구성요소라면 어느 문자열이든 가능합니다.

아래 예시를 참고하세요.

sync:
  servers:
  - id: 'alpha'
    address: '::'
    port: 7800
  - id: 'beta'
    address: 'beta.local'
    port: 7800
  - id: 'delta'
    address: 'delta.local'
    port: 7800

예제 설정 파일은 Realm 오브젝트 서버 설치 과정에서 추가 세부 사항으로 제공됩니다.

주소가 IPv6를 사용하는 경우 “0.0.0.0”나 “::”과 같은 모든 인터페이스를 나타내는 IP 주소를 각 클러스터 백엔드 노드의 “address” 필드에 지정하면 특별히 해석됩니다. 이 경우 로컬 동기화 워커가 “127.0.0.1”나 “::1” 등의 로컬호스트 IP 주소를 수신하기 시작해야 한다고 Realm 오브젝트 서버에 알립니다.

동기화 워커는 별도의 설정 파일인 sync-worker-configuration.yml을 사용합니다. 이 파일은 Realm 오브젝트 서버 파일의 부분 집합으로 기본적으로 워커 시작시 생성됩니다. sync-worker-configuration.ymlnetwork 섹션을 확인하고 listen_address 라인이 주석 처리되지 않고 올바르게 설정됐는지 확안하세요.

network:
  sync:
    listen_address: '0.0.0.0'

0.0.0.0의 주소는 모든 인터페이스를 수신 대기합니다. IP 주소로 특정 인터페이스를 지정할 수도 있습니다. 서버는 Realm 오브젝트 서버 설정 파일의 sync.servers 섹션에 지정돼야 합니다.

예제 설정은 Realm 오브젝트 서버 설치시 함께 제공되므로 추가 정보를 확인해 볼 수 있습니다.

장애 조치(failover)

이 기능은 프로페셔널과 엔터프라이드 에디션에서만 가능합니다. 이 곳에서 더 많은 기능을 알아보세요.

Realm 오브젝트 서버는 수동 장애 조치 를 지원하지만, 자동 장애 조치 는 지원하지 않습니다. 장애 조치를 사용하려면 동기화 워커와 함께 설정된 로드 밸런싱이 있어야 하며, 아래 “필수 구성 요소”에서 설명하는 것처럼 중복 동기화 워커나 Realm 오브젝트 서버가 있어야 합니다.

백업 동기화 워커로 전환

Sync Worker Failover Diagram

필수 구성 요소

연속 백업 클라이언트 섹션의 가이드에 따라 백업 클라이언트가 sync-worker를 실행하는 머신을 가리키도록 설정하세요. 설정 파일(object-server-backup-client.yml)의 network.server_address 설정은 동기화 워커의 IP 주소나 도메인 이름이어야 합니다.

이 백업 클라이언트와 같은 머신에 sync-worker를 설치하고 아직 시작하지 마세요.

동기화 워커를 “로드 밸런싱”의 설정 가이드에 맞게 다음과 같이 설정하세요.

  • 백업 클라이언트가 기록하고 있는 폴더를 가리키도록 storage.root_path를 설정합니다.
  • token-signature.pub 파일이 백업 클라이언트와 실행 중인 동기화 워커 양측에서 동일한지 확인합니다.

장애 조치 작동하기

sync-worker 머신의 동작이 실패한 다음 장애 조치 머신을 온라인 상태로 만들려면, 다음 단계를 따릅니다. (“장애 조치 머신”이란 이전 “필수 구성 요소” 섹션에서 실패한 동기화 워커를 대신하도록 설정한 머신입니다.)

  • 장애 조치 머신에서 백업 클라이언트 프로세스를 중지합니다. (Ubuntu 서버: systemctl stop realm-object-server-backup-client`)
  • 장애 조치 머신에서 동기화 워커를 시작합니다. (systemctl start realm-sync-worker)
  • Realm 오브젝트 서버의 configuration.yml 파일을 열고 실패한 sync-worker의 IP 주소나 호스트 이름을 장애 조치 머신의 IP 주소나 호스트 이름으로 변경합니다.
  • Realm 오브젝트 서버를 재시작합니다. (systemctl restart realm-object-server)

주의: 일부 모니터링 서비스는 기본 머신에 연결할 수 없을 때 장애 조치 머신의 IP 주소로 DNS 레코드를 자동으로 업데이트할 수 있으므로 세 번째 단계가 필요하지 않습니다. 혹은 세 번째 단계 대신 DNS 레코드를 수동으로 업데이트할 수도 있습니다. 두 경우 모두 동기화 워커의 DNS에 TTL (time-to-live)값을 최단 시간으로 지정해야 합니다. configuration.yml를 수정하는 대신 자동이나 수동으로 DNS 레코드를 변경하는 경우 최대 TTL 값의 시간이나 고객의 네임 서버가 이 설정을 따르지 않는 경우 더 오랜 시간 동안 Realm 오브젝트 서버에 연결하지 못할 수 있습니다.

backup 백업 Realm 오브젝트 서버로 전환

이 기능은 하나 이상의 sync-worker가 설정되어 동작하는 로드 밸런싱이 필요합니다.

Object Server Failover Diagram

필수 구성 요소

예비 버신에 Realm 오브젝트 서버를 설치합니다. (이것이 “장애 조치 머신”이 됩니다) 아직 서버를 시작하지 마세요. 클러스터에서는 동시에 하나의 Realm 오브젝트 서버만 실행할 수 있습니다.

실행 중인 Realm 오브젝트 서버와 백업 서버 양측에서 다음 파일이 동일한지 확인하세요.

  • configuration.yml
  • token-signature.pub
  • token-signature.key
  • 커스텀 인증 공급자

장애 조치 작동하기

기본 Realm 오브젝트 서버가 다운되었다면, 장애 조치 머신에서 Realm 오브젝트 서버를 시작하세요. Ubuntu 서버: systemctl start realm-object-server

시작시 장애 조치 머신이 sync-workers로부터 동기화된 데이터를 불러옵니다. 클라이언트 Realm 모바일 데이터베이스는 로드 밸런서를 가리키므로 설정을 변경할 필요가 없습니다. Amazon Web Services에서는 기본 Realm 오브젝트 서버에서 실행되는 상태 점검으로 ELB를 설정합니다.

고가용성

Realm 모바일 플랫폼의 고유한 특성은 오프라인-우선으로 설계됐다는 것입니다. 구조적으로 이는 클라이언트가 데이터의 로컬 복사본을 서버로부터 받고 이를 직접 읽거나 쓴다는 것입니다. 그런 다음 클라이언트 SDK는 네트워크가 연결될 때 비동기적으로 변경 사항을 전송하며, Realm 오브젝트 서버는 이런 변경 사항을 자동으로 통합해서 결정형 방식으로 저장합니다. 이러한 시스템의 결과로 클라이언트 관점에서 본질적으로 높은 가용성을 지니게 됩니다. 네트워크 상태나 서버 작업과 관계없이 항상 로컬에서 읽기 및 쓰기가 가능해집니다.

현재 서비스 손실을 방지할 수 있도록 자동 장애 조치를 지원하는 클러스터링 솔루션을 개발 중으로, 해당 기능은 엔터프라이즈 에디션에서 지원될 예정입니다. 문의하기를 통해 자세한 내용과 미리 사용하는 방법을 알려드립니다.

연속 백업

이 기능은 프로페셔널과 엔터프라이드 에디션에서만 가능합니다. 이 곳에서 더 많은 기능을 알아보세요.

Realm 오브젝트 서버의 엔터프라이즈 에디션에는 메인 프로세스와 함께 실행되는 백업 서버 가 포함됩니다. 이 서버는 실행 중인 오브젝트 서버의 상태를 모니터링하고 한 대 혹은 여러 대의 백업 클라이언트 에 변경 사항을 비동기적으로 보냅니다. 모든 클래이언트는 약간의 지연 시간을 두고 서버 상태 복사본을 유지합니다.

엔터프라이즈 에디션과 병행하여 메인 오브젝트 서버 문서에서 설명하는 수동 백업 시스템을 계속 사용할 수 있습니다. (수동 백업은 프로페셔널과 개발자 에디션에서 제공하는 유일한 백업 시스템입니다)

연속 백업 시스템은 암호화 및 인증된 접근없이 통신합니다! 보안을 유지하려면 백업 시스템을 방화벽 안에서 실행하세요.

백업 서버

백업 서버는 realm-object-server와 realm-sync-worker와 함께 설치되며, 다음 명령어를 실행해서 활성화합니다.

sudo chkconfig realm-object-server-backup-server on
sudo service realm-object-server-backup-server start
# realm-object-server가 실행될 때 자동으로 함께 실행됩니다
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server
sudo systemctl status realm-object-server-backup-server
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server
sudo systemctl status realm-object-server-backup-server

설정은 백업 섹션 하위의 Realm 오브젝트 서버 YAML 파일(/etc/realm/configuration.yml) 에서 지정합니다. 백업 서버에서 사용하는 키는 다음과 같습니다.

설정 키 기본값 설명
backup.enable true 백업을 비활성화하려면 false로 설정
backup.network.listen_address 127.0.0.1 IP 어드레스/인터페이스
backup.network.listen_port 27810 백업의 리스닝 포트
backup.logging.level info Logging에서 설정한 로그 레벨
backup.logging.path /var/log/realm-object-server-backup-server.log (Linux) 로그 파일 경로, 빈 값인 경우 stderr

동기화 워커 클러스터에서 노드를 백업하는 경우, 백업 서버는 /etc/realm/sync-worker-configuration.yml에 있는 동기화 워커 설정 파일을 대신 읽습니다.

백업 클라이언트

Realm 오브젝트 서버 백업 클라이언트는 백업이 필요한 경우 각 머신에서 시작됩니다. 백업 클라이언트는 별도의 YAML에서 설정합니다.

백업 클라이언트를 설치하려면 앞서 설명한대로 엔터프라이즈 저장소를 설정해야 합니다.

# 토큰 변수 설정
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm의 엔터프라이즈 저장소 설정, 이미 ROS 엔터프라이즈를 설치한 경우 건너 뛰기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.rpm.sh | sudo bash

# Realm 오브젝트 서버 백업 클라이언트 설치
sudo yum -y install realm-object-server-backup-client

# 백업이 설정된 Realm 오브젝트 서버를 가리키도록 설정 편집, 기본 구성에서는 Realm 오브젝트 서버와 백업 서버가 동일한 머신에 있다고 가정
vim /etc/realm/object-server-backup-client.yml

# 서비스를 활성화하고 시작
sudo chkconfig realm-object-server-backup-client on
sudo service realm-object-server-backup-client start
# 토큰 변수 설정
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm의 엔터프라이즈 저장소 설정, 이미 ROS 엔터프라이즈를 설치한 경우 건너 뛰기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.rpm.sh | sudo bash

# Realm 오브젝트 서버 설치
sudo yum -y install realm-object-server-backup-client

# 백업이 설정된 Realm 오브젝트 서버를 가리키도록 설정 편집, 기본 구성에서는 Realm 오브젝트 서버와 백업 서버가 동일한 머신에 있다고 가정
vim /etc/realm/object-server-backup-client.yml

# 서비스를 활성화하고 시작
sudo systemctl enable realm-object-server-backup-client
sudo systemctl start realm-object-server-backup-client
# 토큰 변수 설정
export PACKAGECLOUD_TOKEN=<the token you received via email>

# Realm의 엔터프라이즈 저장소 설정, 이미 ROS 엔터프라이즈를 설치한 경우 건너 뛰기
curl -s https://$PACKAGECLOUD_TOKEN:@packagecloud.io/install/repositories/realm/ros-enterprise/script.deb.sh | sudo bash

# 저장소 업데이트
sudo apt-get update

# Realm 오브젝트 서버 설치
sudo apt-get install realm-object-server-backup-client

# 백업이 설정된 Realm 오브젝트 서버를 가리키도록 설정 편집, 기본 구성에서는 Realm 오브젝트 서버와 백업 서버가 동일한 머신에 있다고 가정
vim /etc/realm/object-server-backup-client.yml

# 서비스를 활성화하고 시작
sudo systemctl enable realm-object-server-backup-client
sudo systemctl start realm-object-server-backup-client

설정 파일은 /etc/realm/object-server-backup-client.yml에 있습니다.

백업 클라이언트 설정에 사용하는 키는 다음과 같습니다.

설정키 기본값 설명
storage.root_path   백업을 저장할 디렉터리, 복구된 Realm 오브젝트 서버는 이 디렉터리를 루트 경로로 시작
network.server_address   백업 서버의 IP 어드레스/인터페이스
network.server_port 27810 백업 서버의 IP 어드레스/인터페이스
network.reconnect_delay 2000 백업 서버에 연결하려는 시도 사이의 지연 시간(밀리 초), 클라이언트는 연결이 끊어진 후에 자동으로 다시 연결
logging.level info Logging에서 설정한 로그 레벨
logging.path /var/log/realm-object-server-backup-client.log (Linux) 로그 파일 경로, 빈 값인 경우 stderr

동기 백업

동기 백업 기능은 Realm 모바일 플랫폼 2.0 엔터프라이즈 에디션에서 제공합니다. 2.0 이전의 버전에서는 제공되지 않습니다. 자세한 내용은 Realm 담당자에게 문의하세요!

Realm 오브젝트 서버 엔터프라이즈 에디션에는 로드 밸런싱에서 설명하는 sync-worker 시스템을 사용해서 동기적으로 백업을 유지할 수 있습니다. 두 개의 동기화 워커는 프라이머리(primary)레플리카(replica) 로 작동하며 네트워크를 통해 통신합니다. 레플리카는 프라이머리 복사본이 자체 복사본을 업데이트한 이후에 모든 Realm의 증분 업데이트를 받습니다. 프라이머리 동기화 워커의 동작이 실패하면, 레플리카를 새 프라이머리로 재시작하고 프락시를 리디렉션해서 Realm 오브젝트 서버를 지속할 수 있습니다. 동기 백업을 사용하면 프라이머리에 업로드된 클라이언트 변경 집합이 프라이머리에서 레플리카로 전송됩니다. 레플리카는 복사본을 저장한 후 프라이머리로 확인 응답을 보냅니다. 그러면 클라이언트에 변경 집합 전송 성공에 대한 확인 응답이 전송됩니다.

Note: 동기 백업 대신 엔터프라이즈 에디션과 함께 오브젝트 서버 문서에서 설명된 수동 백업 시스템을 사용할 수 있습니다. (수동 백업은 개발자 에디션과 프로페셔널 에디션에서 제공하는 유일한 백업 시스템입니다.)

동기 백업 시스템의 장점은 프라이머리와 레플리카에서 동시에 데이터 손실이 일어나지 않는 한 클라이언트가 리셋되지 않는다 는 점입니다. 클라이언트의 Realm 로컬 복사본의 버전이, 동기화되고 있는 Realm 오브젝트 서버의 버전보다 높을 때만 클라이언트가 리셋됩니다. 이런 상황은 서버가 손상에서 복원됐지만 로컬 클라이언트가 충돌 후 복원 전에 동기화되지 않은 변경 사항을 만들 때 발생합니다. 이 경우 로컬 Realm은 서버의 복사본으로 완전히 대체됩니다.

클라이언트 Realm 모바일 데이터베이스는 성공적인 업로드 확인을 수신할 때까지 변경 집합 데이터를 지우지 않습니다. 따라서 동기 백업 시스템을 사용하는 경우 프라이머리와 레플리카가 동시에 동작에 실패하지 않는 한 데이터가 손실되지 않습니다. 클라이언트는 클라이언트는 프라이머리와 레플리카 양측이 모두 데이터 사본을 받을 때까지 확인 응답을 받지 않습니다.

동기 백업 시스템은 데이터 손실을 방지할 뿐만 아니라 내부 ID와 버전 번호의 일관성을 보장하므로 모든 클라이언트에 영향을 미치지 않고도 프라이머리를 레플리카로 교체할 수 있습니다.

오퍼레이팅 모드

백업 시스템은 별도의 시스템이 아닌 동기화 워커로 구축됩니다. 다음 네 가지 모드 중 하나로 Realm 동기화 워커를 시작할 수 있습니다.

  • 레플리카 없이 프라이머리만: 백업을 수행하지 않는 표준 동기화 워커
  • 비동기 레플리카가 있는 프라이머리: 연결된 레플리카에 데이터를 전달하는 서버와 표준 동기화 워커. 비동기 레플리카가 있는 프라이머리는 해당 레플리카를 기다리지 않으며 클라이언트는 항상 지연 시간이 최소화됩니다. 하지만 클라이언트가 데이터 복제 이전에 데이터 쓰기 확인 응답을 수신하므로 데이터 손실 방지가 보장되지 않습니다.
  • 동기 레플리카가 있는 프라이머리: 클라이언트에 데이터를 다운로드하고 확인 응답을 보내기 전에 데이터가 레플리카에 성공적으로 복사되는 것을 보장하는 동기화 워커. 이 시스템은 비동기 레플리카가 있는 프라이머리보다 지연 시간이 다소 높지만 데이터 손실을 방지합니다.
  • 레플리카: 프라이머리의 동기화 워커를 위한 레플리카로 작동하는 동기화 작업자. 레플리카는 클라이언트에서 연결할 수 없습니다.

프라이머리는 동일한 포트를 사용해서 Realm 오브젝트 서버 연결과 레플리카 연결을 수신합니다. 프라이머리 동기화 워커와는 하나의 레플리카만 연결할 수 있습니다. 기존 레플리카가 연결된 상태에서 새 레플리카가 연결되면, 새 레플리카에 기본 설정이 제공되고 이전 연결은 닫힙니다.

레플리카는 성공할 때까지 지속해서 프라이머리에 연결을 시도합니다. 즉, 연결이 끊어지면 레플리카는 무기한으로 연결을 시도합니다.

프라이머리나 레플리카의 시작 순서는 큰 상관이 없으므로 어느 쪽이라도 먼저 시작할 수 있습니다.

프로토콜

동기화 워커에는 전체 Realm 전송이나 증분 업데이트, 두 가지 방식으로 데이터를 교환할 수 있는 백업 프로토콜이 있습니다. 레플리카가 빈 슬레이트에서 시작되는 경우라면 전체 Realm 전송이 가장 효율적입니다. 레플리카는 매우 길지도 모를 전체 변경 히스토리를 재생하는 대신, 전체 Realm을 한 번에 받습니다. Realm 백업 시스템은 레플리카가 처음부터 시작하는 경우 전체 Realm 전송을 사용합니다. 레플리카와 프라이머리가 동기화되면, 워커는 증분 업데이트를 사용하도록 전환됩니다.

프라이머리에서 Realm이 변경되면 프라이머리가 레플리카로 증분 업데이트를 보냅니다. 이는 충돌이나 네트워크 연결 장애로 업데이트가 손실되는 경우 다시 생성되지 않습니다. 대신 연결이 재설정되면 프라이머리와 레플리카가 각각의 해당 Realm 복사본의 버전 번호를 확인하고 프라이머리가 레플리카보다 높은 번호인 경우 전체 Realm이 다시 전송됩니다. (과도한 네트워크 오류가 발생하는 환경이 아닌 한 이런 경우는 자주 발생하지 않습니다) 동기화 워커는 마이그레이션없이도 언제든지 레플리카가 있는 프라이머리로 재설정될 수 있습니다.

각 Realm은 다른 모든 Realm과 독립적으로 백업되므로 하나의 Realm을 사용하는 동기화 클라이언트의 다운로드로 인해 다른 Realm의 백업 활동이 차단될 염려가 없습니다.

병합과 성능

레플리카에서 변경 집합을 병합하는 방법은 두 가지입니다. 프라이머리가 수행한 병합 연산을 레플리카가 반복하는 방법과, 프라이머리가 수행한 병합 연산 결과를 레플리카가 받는 방법입니다. 전자는 네트워크 대역폭을 덜 사용하며, 후자는 레플리카의 CPU 시간을 덜 사용합니다.

Realm 백업 시스템을 사용하면 병합 연산이 매우 느린 경우가 아니라면 레플리카가 병합을 수행하도록 합니다. 프라이머리가 병합 연산 수행 시간을 측정해서 연산 시간이 긴 경우 느린 병합 연산이 반복되지 않도록 전체 Realm을 전송합니다.

동기화 백업이 되는 프라이머리인 경우 다른 프라이머리 타입보다 지연 시간이 조금 더 걸립니다. 하지만 파이프라이닝을 사용하므로 특정 유스 케이스에서 동기화 프라이머리는 다른 프라이머리 타입보다 쓰기 트랜잭션을 적게 수행합니다. 따라서 다른 타입보다 동기 백업을 하는 프라이머리가 높은 성능을 보일 수 있습니다. (물론 다른 두 타입에도 파이프라이닝을 사용하도록 재작성할 수 있습니다.)

보안

동기화 워커는 기본적으로 암호화되지 않은 TCP를 통해 통신하며, 이를 TCP를 통한 TLS를 사용하도록 설정할 수도 있습니다. TLS를 사용하면 백업 연결이 도청 및 변조 위험이 최소화된 보호되지 않은 네트워크 중개자를 통과할 수 있습니다.

레플리카는 백업 데이터 수신 가능성 증명을 위해 공유 비밀(shared secret)을 프라이머리에 제시해야 합니다. 공유 비밀은 문자열이며 프라이머리와 레플리카를 위한 설정 파일에 저장됩니다. 시스템 관리자는 공유 비밀을 생성하고 이를 프라이머리와 레플리카에 입력해야 합니다.

장애 조치

프라이머리나 레플리카의 동작이 실패하면서 데이터 손실이 일어나면 새 설정으로 시스템을 재시작해야 합니다.

가장 간단한 경우는 레플리카 동작이 실패하는 경우로, 새 레플리카를 시작하고 프라이머리를 가리키도록 해야 합니다. 프라이머리의 동작이 실패하는 경우 레플리카를 프라이머리로 재시작하거나, 레플리카의 루트 디렉터리를 새 프라이머리에 전송해야 합니다. 새 레플리카 역시 시작해야 합니다.

프락시는 항상 프라이머리를 가리키도록 구성해야 합니다.

설정

로드 밸런싱과 마찬가지로, 동기화 워커는 configuration.yml 파일에서 설정됩니다. 설정을 변경하려면 동기화 워커를 새 설정 파일로 재시작해야 합니다.

backup:을 위한 새로운 설정 옵션은 다음과 같습니다.

  • master_slave_shared_secret: 프라이머리와 레플리카 사이에 공유되는 공유 비밀
  • master_addressmaster_port: 레플리카가 프라이머리를 연결하기 위한 정보
  • operating_mode: 위에서 설명한 네 가지 오퍼레이팅 모드로 다음 값 을 사용합니다.
    • master_with_no_slave
    • master_with_asynchronous_slave
    • master_with_synchronous_slave
    • slave

operating_mode가 지정되지 않는 경우 master_with_no_slave를 기본값으로 해서 레플리카가 없는 일반 동기화 워커를 생성합니다.

동기화 워커가 레플리카로 설정된 경우, 설정에서 프라이머리(마스터)의 주소/포트를 지정해야 합니다. 레플리카의 설정 파일에 지정된 프라이머리의 주소/포트는 프라이머리의 수신 대기 주소/포트와 같아야 합니다.

레플리카는 초기 연결 중에 프라이머리에 공유 비밀을 보냅니다. 공유 비밀이 일치하면 프라이머리는가 백업 교환을 진행합니다.

프라이머리와 레플리카를 위한 configuration.yml 파일 예제입니다. 레플리카가 수동으로 승격해서 프라이머리로 전환되는 경우인 복원된 프라이머리와 레플리카의 내용도 포함합니다.

Primary

storage:
  root_path: root-dir-original-primary

network:
  sync:
    listen_address: '1.2.3.4'
    listen_port: '9001'

backup:
  operating_mode: 'master_with_synchronous_slave'

  master_slave_shared_secret: 'A secret'

Replica

storage:
  root_path: root-dir-original-replica

network:
  sync:
    listen_address: '5.6.7.8'
    listen_port: '9002'

backup:
  operating_mode: 'slave'

  master_address: '1.2.3.4'
  master_port: '9001'

  master_slave_shared_secret: 'A secret'

Recovered Primary (a replica promoted to a primary)

storage:
  root_path: root-dir-original-replica

network:
  sync:
    listen_address: '9.10.11.12'
    listen_port: '9003'

backup:
  operating_mode: 'master_with_synchronous_slave'

  master_slave_shared_secret: 'Possibly another secret'

Replica for Recovered Primary

storage:
  root_path: root-dir-new-replica

network:
  sync:
    listen_address: '13.14.15.16'
    listen_port: '9004'

backup:
  operating_mode: 'slave'

  master_address: '9.10.11.12'
  master_port: '9003'

  master_slave_shared_secret: 'Possibly another secret'

주의:

  • 레플리카의 backup.master_addressbackup.master_port는 프라이머리의 network.listen_addressnetwork.listen_port와 같아야 합니다.
  • 레플리카의 root_path는 다음 프라이머리의 root_path가 됩니다. 동기화 워커가 멈춘 동안 전체 디렉터리를 다른 위치로 복사할 수도 있습니다.
  • 레플리카는 동기화 연결을 허용하지 않더라도 들어오는 연결을 수신 대기합니다. /info 엔드 포인트는 레플리카를 포함하여 모든 동기화 워커에 대해 활성화됩니다.
  • 필요한 경우 프락시를 리디렉션해야 합니다.
  • 통신 중인 프라이머리와 레플리카는 같은 공유 비밀을 가져야 하지만, 공유 비밀은 언제든지 변경할 수 있습니다.

모니터링

Realm 오브젝트 서버 워커는 localhost:8125를 수신하는 statsd 에 대한 메트릭 전송을 지원합니다. 이런 메트릭 모니터링을 위해 graphite 등의 시스템에 전달할 수 있습니다.

모든 메트릭 키는 realm.<hostname> 접두어로 시작합니다.

realm.example.com.connection.online
realm.example.com.connection.failed
realm.example.com.realms.open
realm.example.com.protocol.violated
realm.example.com.protocol.bytes.received
realm.example.com.authentication.failed

메트릭

Name Type Description
<prefix>.client.unsyncable counter 클라이언트가 히스토리 불일치로 인해 Realm의 동기화를 시작하지 못할 때마다 작동합니다. 이 경우 클라이언트는 자신의 Realm 파일을 삭제한 다음 서버에서 복구해야 합니다. 서버 동작이 실패하고 백업에서 복구되는 경우에 발생할 수 있습니다.
     
<prefix>.session.started counter 세션이 시작할 때마다 작동합니다. 세션은 인증되기 전에도 시작된 것으로 간주됩니다.
<prefix>.session.online gauge 현재 제공되는 전체 세션 수입니다.
<prefix>.session.failed counter 세션 레벨의 에러가 있을 때마다 작동합니다.
<prefix>.session.terminated counter 세션이 끝날 때마다 동작합니다.
     
<prefix>.connection.started counter 클라이언트가 연결을 열 때마다 작동합니다.
<prefix>.connection.online gauge 현재 열린 전체 연결 수입니다. 하나의 연결에서 다수의 세션이 제공될 수 있습니다.
<prefix>.connection.failed counter 연결에 대한 저수준 에러로 accept(), read(), write() 중에 실패가 발생할 때마다 작동합니다.
<prefix>.connection.terminated counter 연결이 종료될 때마다 동작하며, 실패한 경우에도 동작합니다.
     
<prefix>.realms.open gauge 현재 열린 Realm의 전체 개수입니다.
     
<prefix>.authentication.failed counter 인증이 실패될 때 작동합니다. 예를 들어 토큰이 유효하지 않거나 만료되는 경우입니다. 일반적으로 발생하면 안되는 에러입니다.
<prefix>.permission.denied counter 권한 실패시 작동합니다. 예를 들어 다른 Realm의 토큰으로 어떤 Realm에 접근을 시도하거나 다운로드 전용 토큰으로 업로드를 시도하는 경우입니다. 일반적으로 발생하면 안되는 에러입니다.
<prefix>.protocol.<version>.used counter 프로토콜 버전인 <version>으로 연결이 된 경우마다 동작합니다. 이를 통해 초기화된 각 프로토콜 버전의 연결 수를 파악하고 서버와 앱을 업데이트하는 시간을 최적화할 수 있습니다.
<prefix>.protocol.violated counter 동기화 프로토콜을 위반할 때마다 작동합니다. 애플리케이션이 너무 오래되거나 잘못 작성된 경우에도 발생할 수 있습니다.
     
<prefix>.protocol.bytes.received counter 서버가 업로드 메시지를 받을 때마다 작동합니다.
<prefix>.protocol.bytes.sent counter 서버에 다운로드 메시지가 보내질 때마다 작동합니다.
     
<prefix>.protocol.bytes.received gauge 시작 이후 전송받은 총 바이트
<prefix>.protocol.bytes.sent gauge 시작 이후 전송한 총 바이트

프로페셔널 및 엔터프라이즈 API 활성화

Realm은 현재 Node.js 버전 6만을 지원합니다. Realm 오브젝트 서버는 Node.js 4 이하, 5, 7, 8과 호환되지 않습니다. 권장 버전은 6.10.입니다.

Node.js 애플리케이션에서 이벤트 핸들링, 데이터 접근, 데이터 커넥터 기능을 사용하려면 접근 토큰 을 애플리케이션에 포함해서 API를 활성화해야 합니다. (이 토큰은 평가 버전에 가입하거나 프로페셔널 또는 엔터프라이즈 에디션을 구매하는 시점에 이메일을 통해 전송됩니다.) Node.js 애플리케이션의 시작 부분에서 토큰을 포함하고 오브젝트 서버에 대한 setAccessToken 호출을 만듭니다.

var token = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...";

// 프로페셔널 에디션 API 잠금 해제
Realm.Sync.setAccessToken(token);

접근 토큰을 코드에 저장하는 대신 파일에서 불러올 수도 있습니다.

RealmSync.setAccessToken(fs.readFileSync('./access-token', 'utf-8'));

이벤트 핸들링

Realm 대시보드Realm Functions로 이벤트 핸들러를 관리할 수 있는 단순하고 강력한 인터페이스를 제공합니다. Functions를 사용하면 이벤트에 대한 전체 Node.js를 생성하지 않고도 아래처럼 handleChange() 콜백만 다룰 수 있습니다.

Realm 오브젝트 서버의 독점적인 기능은 이벤트 핸들링입니다. 이 기능은 Realm 객체 서버에 걸리는 전역 이벤트 리스너 API를 통해 서버측 Node.js SDK가 제공되므로 Realm 전체의 변경 사항을 관찰할 수 있습니다. 즉, 모든 Realm, 혹은 특정 패턴과 일치하는 Realm의 변화를 수신할 수 있습니다. 예를 들어 사용자 설정 데이터를 가상 경로가 /~/settings인 각 사용자마다 고유한 Realm으로 분리하는 앱 구조라면 모든 사용자의 settings Realm의 변경 사항에 반응하는 리스너를 설정할 수 있습니다.

변경 사항이 서버로 동기화될 때마다 변경 사항에 대한 응답으로 사용자가 정의한 서버측 로직을 실행할 수 있는 알림이 발동됩니다. 이 알림에서 업데이트된 Realm의 가상 경로와 Realm 객체, 변경된 객체에 대한 정밀한 알림이 제공됩니다. 최종으로 동기화된 트랜잭션에서 삽입, 삭제, 수정된 객체의 클래스 이름별로 분류된 객체 색인은 변경 세트에서 볼 수 있습니다.

이벤트 핸들러 생성

Realm의 이벤트 핸들링을 사용하려면 간단한 Node.js 애플리케이션을 만들어야 합니다.

서버 파일을 저장할 디렉터리를 만들고 package.json 파일을 생성합니다. Node.js와 npm, npm 패키지 매니저는 이 JSON 파일로 애플리케이션을 정의하고 외부 디펜던시를 지정합니다.

npm init를 사용해서 대화 형식으로 이 파일을 만들 수도 있습니다. 텍스트 편집기를 사용해서 아래와 같은 간단한 구조 파일을 직접 만들어도 됩니다.

{
    "name": "MyApp",
    "version": "0.0.1",
    "main": "index.js",
    "author": "Your Name",
    "description": "My Cool Realm App",
    "dependencies": {
        "realm": "^1.8.0"
    }
}

Realm 모바일 플랫폼을 1.8 버전 이상으로 지정했습니다. 애플리케이션에 다른 의존성이 있다면 dependencies 섹션에 추가합니다.

package.json를 올바르게 설정했다면 아래 명령어를 입력하세요.

npm install

이 명령어는 디펜던시에 있는 모든 모듈을 다운로드하고 압축을 풀어서 설정합니다.

이벤트 핸들러는 어드민 권한으로 오브젝트 서버에 접근해야 하므로 오브젝트 서버의 어드민 토큰이 필요합니다. Linux에서는 다음 명령어로 토큰을 볼 수 있습니다.

cat /etc/realm/admin_token.base64

macOS에서는 Realm 모바일 플랫폼 폴더 내의 realm-object-server 폴더에 토큰이 저장돼 있습니다. 해당 폴더로 이동해서 아래 명령어로 토큰을 확인하세요.

cd path-to/realm-mobile-platform
cat realm-object-server/admin_token.base64

샘플 index.js 파일은 아래와 같습니다. 이 예제는 /~/private라는 가상 경로에 위치한 사용자별 개인 Realm에 대한 변경 사항을 수신합니다. 해당 Realm에서 업데이트된 Coupon 객체를 찾아서 쿠폰 코드를 검증합니다. 아직 검증되지 않았다면 검증 결과를 Coupon 객체의 isValid 속성에 넣습니다.

var Realm = require('realm');

var ACCESS_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...";

// 프로페셔널 에디션 API 잠금 해제
Realm.Sync.setAccessToken(ACCESS_TOKEN); 

// 여기에 Realm 어드민 토큰을 입력
//   Linux:  cat /etc/realm/admin_token.base64
//   macOS:  cat realm-object-server/admin_token.base64
var ADMIN_TOKEN = 'ADMIN_TOKEN';

// Realm 오브젝트 서버의 URL
var SERVER_URL = 'realm://127.0.0.1:9080';

// 정규 표현식을 넣으면 관찰할 Realm 파일을 제한합니다.
// 이 작업은 별도의 단계로 수행되므로
// 필요하지 않은 경우 정밀한 변경 세트를 계산하는데 비용이 소비되지 않습니다.
var NOTIFIER_PATH = '/^\/([0-9a-f]+)\/private$/';

// 변경 사항이 있을 때마다 관찰된 모든 Realm 파일에 대해 handleChange 콜백이 호출됩니다.
// 이 필드에는 경로, Realm, 변경 전의 Realm 버전,
// 이 변경에서 추가, 삭제, 수정된 모든 객체를 나타내는 인덱스가 포함됩니다.
function handleChange(changeEvent) {
  // 사용자 개인 Realm에 대한 업데이트만 구독하는 필터를 사용한다고 가정하고
  // 가상 경로에서 사용자 ID를 추출합니다.
  var matches = changeEvent.path.match(/^\/([0-9a-f]+)\/private$/);
  var userId = matches[1];

  var realm = changeEvent.realm;
  var coupons = realm.objects('Coupon');
  var couponIndexes = changeEvent.changes.Coupon.insertions;

  for (var couponIndex of couponIndexes) {
    var coupon = coupons[couponIndex];
    if (coupon.isValid !== undefined) {
      var isValid = verifyCouponForUser(coupon, userId);
      // 주의: 여기에 작성하면 후속 알림이 발동하므로
      // 이로 인해 무한한 변경이 발생하지 않도록 주의하세요!
      realm.write(function() {
        coupon.isValid = isValid;
      });
    }
  }
}

// 어드민 사용자 생성
var adminUser = Realm.Sync.User.adminUser(adminToken);

// 이벤트 핸들러 콜백 등록
Realm.Sync.addListener(SERVER_URL, adminUser, NOTIFIER_PATH, 'change', handleChange);

console.log('Listening for Realm changes');

이벤트 핸들러의 핵심은 changeEvent 객체에 전달되는 handleChange() 함수입니다. 이 객체에는 다음 네 개의 키가 있습니다.

  • path: 변경된 Realm의 경로 (위에서 match를 사용해서 사용자 ID 추출)
  • realm: 변경된 Realm 자신
  • oldRealm: 변경이 적용되기 전 기존 상태인 변경된 Realm
  • changes: Realm에서 변경된 객체의 해시 맵을 포함하는 객체

changes 객체는 좀 더 복잡한 구조를 갖고 있습니다. 일련의 키/값 쌍으로, 키는 객체의 이름(위 코드에서는 Coupon)이며, 값은 또다른 객체로 삽입, 삭제, 수정을 나열하는 키/값 쌍들입니다. 여기서 키는 Realm의 인덱스 값입니다. changeEvent의 전체 구조는 다음과 같습니다.

{
  path: "realms://server/user/realm",
  realm: <realm object>,
  oldRealm: <realm object>,
  changes: {
    objectType1: {
      insertions: [ a, b, c, ...],
      deletions: [ a, b, c, ...],
      modifications: [ a, b, c, ...]
    },
    objectType2: {
      insertions: [ a, b, c, ...],
      deletions: [ a, b, c, ...],
      modifications: [ a, b, c, ...]
    }
  }
}

다음처럼 새로 삽입된 쿠폰의 인덱스와 쿠폰을 얻을 수 있습니다.

var realm = changeEvent.realm;
var coupons = realm.objects('Coupon');
var couponIndexes = changeEvent.changes.Coupon.insertions;

다음으로 for (var couponIndex of couponIndexes) 루프를 사용해서 인덱스를 순회하면서 각각의 변경된 쿠폰을 얻을 수 있습니다.

다른 서비스와 통합

다른 서비스와 이벤트 핸들링 프레임워크를 통합하는 전체 예제는 스캐너 앱 튜토리얼을 참고하세요. 예제의 경우 IBM Watson의 Bluemix와 통합했습니다.

데이터 접근

Realm 오브젝트 서버 프로페셔널 및 엔터프라이즈 에디션을 사용하면 서버를 시작할 때 생성된 관리 토큰을 사용해서 모든 공유 Realm 서버에 접근하고 이를 변경할 수 있습니다. 즉, 해당 Realm의 모든 데이터에 접근할 수 있습니다.

Linux에서 어드민 토큰을 검색하려면 아래 명령어를 사용하세요.

cat /etc/realm/admin_token.base64

macOS에서는 토큰이 zip 파일 내부의 realm-object-server 폴더에 저장돼 있습니다.

cat realm-object-server/admin_token.base64

이 토큰을 Realm.Sync.User 객체를 동기적으로 생성할 수 있습니다. 이렇게 만든 사용자 객체를 Realm 생성자에 넘겨서 서버 측의 모든 Realm과 연결할 수 있습니다.

// 어드민 사용자를 이용해서 Realm 열기
var adminToken = '3x4mpl3T0k3n…';
var adminUser = Realm.Sync.User.adminUser(adminToken);
var realm = new Realm({
  sync: {
    user: admin_user,
    url: 'realm://object-server-url:9080/my-realm',
  },
  schema: [{...}
  }]
});

어드민 사용자를 사용하면 Realm URL은 관리자가 아닌 인증에서 사용자 ID로 해석되는 ~ 문자를 포함하지 않습니다. 어드민 사용자에게는 사용자 ID가 없습니다. 비관리자 인증에 대해서는 오브젝트 서버 접근 제어 문서의 인증 섹션을 확인하세요.

데이터 커넥터

이 기능은 프로페셔널과 엔터프라이드 에디션에서만 가능합니다. 이 곳에서 더 많은 기능을 알아보세요.

Realm 오브젝트 서버 엔터프라이즈 에디션은 모든 하위 오브젝트 서버 작업 및 데이터에 접근할 수 있는 Node.js 기반의 어댑터 API를 제공합니다. 이 API으로 동기화된 Realm을 PostgreSQL와 같은 레거시 데이터베이스와 상호 작용하도록 할 수 있습니다. Realm은 외부 데이터베이스와 실시간으로 동기화됩니다. 클라이언트 애플리케이션에서는 Realm 모바일 데이터베이스 API를 사용해서 실시간 네이티브 객체 작업의 이점을 누릴 수 있습니다.

{
    "name": "MyApp",
    "version": "0.0.1",
    "main": "index.js",
    "author": "Your Name",
    "description": "My Cool Realm App",
    "dependencies": {
        "realm": "^1.8.0"
    }
}

다른 의존성을 모두 지정했으면, 모듈을 다운로드하고 압축 해제한 후 설정하는 npm install 명령어를 사용하세요.

이벤트 핸들러 API와 마찬가지로 어드민 권한으로 오브젝트 서버에 접근해야 하므로 오브젝트 서버의 어드민 토큰이 필요합니다. Lunux에서는 다음 명령어로 토큰을 볼 수 있습니다.

cat /etc/realm/admin_token.base64

OmacOS에서는 Realm 모바일 플랫폼 폴더 내의 realm-object-server 폴더에 토큰이 저장돼 있습니다. 해당 폴더로 이동해서 아래 명령어로 토큰을 확인하세요.

cd path-to/realm-mobile-platform
cat realm-object-server/admin_token.base64

어댑터 API를 사용하려면 오브젝트 서버에서 명령을 수신하고 외부 데이터베이스의 API를 호출해서 읽고 쓰는 번역기 역할을 해당 Node.js 애플리케이션이 수행해야 합니다. 다음 코드에 샘플 애플리케이션을 소개합니다.

var Realm = require('realm');

var ACCESS_TOKEN = "eyJhbGciOiJSUzI1NiIsInR5cCI6IkpXVCJ9...";

// 엔터프라이즈 에디션 API 잠금 해제
Realm.Sync.setAccessToken(ACCESS_TOKEN); 

var adapterConfig = {
  // 여기에 Realm 어드민 토큰을 입력
  //   Linux:  cat /etc/realm/admin_token.base64
  //   macOS:  cat realm-object-server/admin_token.base64
  admin_token: 'ADMIN_TOKEN',

  // Realm 오브젝트 서버의 URL
  server_url: 'realms://127.0.0.1:9080',

  // 어댑터 API 파일의 로컬 경로
  local_path: './adapter',

  // 관찰할 Realm을 한정할 정규 표현식
  realm_path_regex: '/^\/([0-9a-f]+)\/private$/'
};

class CustomAdapter {
  constructor(config) {
    this.adapter = new Realm.Sync.Adapter(
      config.local_path,
      config.server_url,
      Realm.Sync.User.adminUser(config.admin_token),
      config.realm_path_regex,

      // 이 콜백은 새 트랜잭션을 사용할 수 있을 때마다 지정된 경로를 처리하기 위해 호출됩니다.
      // 인자는 변경 사항을 사용할 수 있는 Realm 경로입니다.
      // realm_path_regex와 일치하는 모든 Realm에 대해 호출됩니다.
      (realm_path) => {
        var current_instructions = this.adapter.current(realm_path);
        while (current_instructions) {
          // 정의된 경우 현재 명령어 배열을 처리합니다
          this.process_instructions(current_instructions);

          // 다음 트랜잭션 진행을 위해 호출됩니다.
          this.adapter.advance(realm_path);
          current_instructions = this.adapter.current(realm_path);
        }
      }
    )
  }

  // Adapter.current(path)에서 반환된 명령어 리스트를 넘깁니다
  process_instructions(instructions) {
    instructions.forEach((instruction) => {
        // 각 유형의 명령어에 대한 연산을 수행합니다
        switch (instruction.type) {
          case 'INSERT':
            insert_object(instruction.object_type, instruction.identity, instruction.values);
            break;
          case 'DELETE':
            delete_object(instruction.object_type, instruction.identity);
            break;
          // ... 다른 모든 관련 명령어 유형에 대한 핸들러를 추가하세요
          default:
            break;
        }
      })
  }
}

Adapter.current에서 반환된 각 명령어 객체는 다음 문자열 중 하나의 type을 가집니다. 명령 처리를 위한 데이터를 포함하는 둘 이상의 다른 속성도 설정됩니다.

  • INSERT: 새 객체 삽입
    • object_type: 삽입되는 객체 타입
    • identity: 객체의 기본 키 값이나 객체의 행 인덱스
    • values: 삽입할 객체의 속성 이름과 속성 값의 맵
  • SET: 기존 객체의 속성 값 설정
    • object_type: 객체 타입
    • identity: 객체의 기본 키 값이나 객체의 행 인덱스
    • values: 객체를 업데이트할 속성 이름과 속성 값의 맵
  • DELETE: 기존 객체 삭제
    • object_type: 객체 타입
    • identity: 객체의 기본 키 값이나 객체의 행 인덱스
  • CLEAR: 주어진 타입의 객체를 모두 삭제
    • object_type: 객체 타입
  • LIST_SET: 주어진 리스트 인덱스의 모든 객체를 다른 객체로 설정
    • object_type: 객체 타입
    • identity: 객체의 기본 키
    • property: 변형할 리스트 속성의 속성 이름
    • list_index: 설정할 리스트 인덱스
    • object_identity: 설정되는 객체의 기본 키나 객체의 행 인덱스
  • LIST_INSERT: 리스트의 주어진 인덱스에 객체 삽입
    • object_type: 객체 타입
    • identity: 객체의 기본 키
    • property: 변형할 리스트 속성의 속성 이름
    • list_index: 삽입할 리스트 인덱스
    • object_identity: 삽입할 객체의 기본 키나 객체의 행 인덱스
  • LIST_ERASE: 주어진 인덱스에서 리스트의 객체 삭제: 리스트에서 객체를 지우지만 Realm에는 존속
    • object_type: 객체 타입
    • identity: 객체의 기본 키
    • property: 변형할 리스트 속성의 속성 이름
    • list_index: 삭제할 리스트 인덱스
  • LIST_CLEAR: 모든 객체를 삭제하고 리스트 제거: 객체는 Realm에 존속
    • object_type: 객체 타입
    • identity: 객체의 기본 키
    • property: 삭제할 리스트 속성의 속성 이름
  • ADD_TYPE: 새 타입 추가
    • object_type: 타입 이름
    • primary_key: 타입의 키 속성 이름
    • properties: Realm.ObjectSchema에 설명된 속성 맵
  • ADD_PROPERTIES: 기존 타입에 속성 추가
  • CHANGE_IDENTITY: 기존 객체의 행 인덕스 변경: 기본 키가 있는 객체에는 호출되지 않음
    • object_type: 객체 타입
    • identity: 객체의 이전 행 값
    • new_identity: 객체의 새로운 행 값

모든 명령어 유형과 전달되는 데이터를 포함한 상세 정보는 Realm.Sync.Adapter 클래스의 API 참조 문서를 확인하세요.

PostgreSQL 데이터 커넥터는 이미 구현됐으며, MongoDB, Microsoft SQL 서버 등 더 많은 작업을 진행하고 있습니다. 모든 데이터 커넥터는 애플리케이션의 특정 요구에 맞게 커스터마이징할 수 있습니다. Realm 엔터프라이즈 고객이시라면 담당자에게 자세한 내용을 문의하세요.