Realm 오브젝트 서버 설치하기

macOS

macOS에는 단순하게 파일을 다운로드해서 설치할 수 있습니다.

macOS 번들 다운로드

다운로드 폴더로 이동해서 “realm-mobile-platform” 폴더를 여세요.

start-object-server.command 파일을 더블 클릭해서 Realm 오브젝트 서버를 시작합니다. 이 파일은 터미널 창을 열어 Realm 오브젝트 서버를 실행합니다.

리눅스

리눅스에서는 Realm 패키지 저장소는 PackageCloud 서비스를 통해 관리됩니다. 아래의 패키지 저장소를 설정하고 Realm 오브젝트 서버를 설치하고 실행하기 위해 다음의 명령들을 수행하세요.

# PackageCloud 저장소의 Realm 설정
curl -s https://packagecloud.io/install/repositories/realm/realm/script.rpm.sh | sudo bash

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

# 서비스 활성화하고 시작하기
sudo chkconfig realm-object-server on
sudo service realm-object-server start
# PackageCloud 저장소의 Realm 설정
curl -s https://packagecloud.io/install/repositories/realm/realm/script.rpm.sh | sudo bash

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

# 서비스 활성화하고 시작하기
sudo systemctl enable realm-object-server
sudo systemctl start realm-object-server
# PackageCloud 저장소의 Realm 설정
curl -s https://packagecloud.io/install/repositories/realm/realm/script.deb.sh | sudo bash

# 저장소 갱신하기
sudo apt-get update

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

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

우분투 16.04 버전 기반의 아마존 EC2를 위한 공개 AMI를 제공합니다. 반가상화와 HVM의 차이점은 이 가이드에서 읽을 수 있습니다.

  Paravirtual HVM
ap-northeast-1 (Tokyo) ami-a12272c6 ami-f2247495
eu-west-1 (Ireland) ami-f0f4de96 ami-9cf7ddfa
us-east-1 (N. Virginia) ami-2f19b839 ami-d518b9c3

이 AMI들을 다른 아마존 EC2 AMI처럼 올릴 수 있습니다. 22/TCP (ssh)와 9080/TCP (대시보드와 클라이언트 접근) 포트들을 열어두는 것을 잊지 마세요. 기본 SSH 사용자는 ubuntu입니다.

Realm 대시보드 설정하기

웹 브라우저나 로컬 리눅스 머신이나 네트워크를 통해 원격으로 접속할 필요가 있습니다. 원격 브라우저를 사용할 때는 ROS(Realm 오브젝트 서버, Realm Objet Server)를 설치한 네트워크 서버의 IP 주소나 호스트 이름을 알고 있어야 합니다. 아래 URL에서 localhost 대신 적절한 IP 주소 혹은 호스트네임으로 치환하세요.

새 브라우저 창을 열고 http://localhost:9080으로 가세요. Realm 대시보드의 로그인 페이지가 표시됩니다. 리눅스 서버가 당신의 로컬 장비가 아니라면 localhost를 서버의 IP 주소로 치환하세요.

이메일과 암호를 입력해 관리자를 만듭니다. 등록된 이후에는 이 인증서로 로그인할 수 있습니다.

Realm 대시보드는 활성 네트워크 연결, 활성된 Realm, 연결된 앱에 의해 생성된 전체 네트워크 트래픽 등을 포함한 현재 Realm 오브젝트 서버의 상태를 표시합니다.

서버 설정하기

Realm 오브젝트 서버는 개발 환경을 위한 민감한 기본 정보를 포함한 YAML 포맷의 설정 정보 파일을 가집니다. 설정 파일은 설치된 상황에 맞추고 제품으로 준비를 하기 위해 수정할 수 있습니다. 아래의 내용은 configuration.yml 설정 파일로 참고되는 내용입니다.

configuration.yml에 사용 가능한 다양한 설정 옵션은 아래에 기술됩니다. 설정 파일의 기본위치는 사용하는 플랫폼에 따라 다릅니다.

설정 파일은 /etc/realm/configuration.yml에 위치합니다.

설정 파일은 Realm 모바일 플랫폼 폴더의 realm-object-server/object-server에 위치합니다.

설정 파일의 경로는 절대 주소일 수도 상대 주소일 수도 있습니다. 상대 주소를 사용할 때는 현재의 작업 디렉터리에 따라 결정됩니다. 우리는 혼란을 피하기 위해 항상 절대 주소를 쓰는 것을 추천합니다.

필수 설정

Realm 오브젝트 서버를 시작하기 위해서는 적은 옵션을 반드시 설정해야 합니다. 이 설정을 configuration.yml에 지정하는 것을 권장하지만, 명령행 인자로도 전달할 수 있습니다.

필수 설정 정의

  1. Realm 오브젝트 서버가 모든 파일을 저장할 기존 디렉터리
  2. ROS에 인증받은 클라이언트만 접근할 수 있도록 보안 접속에 사용할 키 쌍에 대한 경로. 키들은 반드시 PEM 포맷이어야 하고 일치하는 쌍을 갖춰야 합니다.

설정에 대한 요약

설정 키 CLI 인자 설명
storage.root_path --root ROS가 데이터 파일을 저장할 디렉터리 경로
auth.public_key_path --public-key 클라이언트 토큰들 인증에 사용할 (PEM 포맷으로 저장된) 공개 키에 대한 경로
auth.private_key_path --private-key 클라이언트 토큰들 인증에 사용할 (PEM 포맷으로 저장된) 비밀 키에 대한 경로

네트워크

이 기본 설정에서 내부적인 백엔드 서비스프락시 모듈로 Realm 오브젝트 서버를 동작합니다. 백엔드 서비스는 서버가 실행 중인 호스트로부터만 접근이 가능하며 모든 인터페이스로 응답하는 프락시 모듈을 통해 전체 트래픽을 전달합니다. 아래의 도표에서 기본 설정을 확인하세요.

프락시 설정 도표

기본 설정을 어떻게 바꿔야 하는지 아래에서 설명하겠습니다.

백엔드 서비스

Realm 오브젝트 서버는 내부적으로 두 개의 백엔드 서비스를 시작합니다. sync 서비스는 핵심 동기화 기능의 책임을 담당하고 27800 포트로 응답합니다. http 서비스는 인증과 대시보드를 담당하며 포트 27080로 응답합니다. 기본적으로 서비스들은 호스트의 IPv4 루프백 주소(127.0.0.1)로 응답하고 요청은 프락시 모듈을 통해 전달됩니다.

프락시 모듈을 비활성화시키고 IPv4와 IPv6의 모든 인터페이스로 백엔드 서비스가 응답하게 하려면 listen_address를 적절히 ::로 설정해야 합니다. 비슷하게 응답 포트는 listen_port을 적절히 수정해 변경합니다.

설정을 요약하면 아래와 같습니다.

설정 키 기본값 설명
network.sync.listen_address 127.0.0.1 sync 서비스가 바인드할 주소
network.sync.listen_port 27800 sync 서비스가 바인드할 포트
network.http.listen_address 127.0.0.1 http 서비스가 바인드할 주소
network.http.listen_port 27080 http 서비스가 바인드할 포트

프락시 모듈

내장된 역방향 프락시 모듈은 모든 입력된 트래픽을 적절한 백엔드 서비스로 보냅니다. 이 프락시는 HTTP, 웹소켓, HTTPS, 보안 웹소켓 트래픽 모두를 담당할 수 있지만 Realm 오브젝트 서버의 트래픽에 독점적이며 범용 프락시는 아닙니다. 기본 설정에서 HTTP 프락시는 모든 IPv4와 IPv6 인터페이스를 포트 9080에서 받습니다. 단, HTTPS 프락시는 비활성화되어 있습니다. 여러 프락시는 동시에 활성화될 수 있습니다.

필요시 내장 프락시 모듈을 비활성화하고 독자 프락시 설치로 대체하거나 백엔드 서비스를 네트워크에 직접 클라이언트 사용자 호출을 위해 드러낼 수 있습니다.

프락시 설정에 대한 요약입니다.

설정 키 기본값 설명
proxy.http.enable true HTTP 프락시를 비활성화하기 위해 false로 설정합니다
proxy.http.listen_address :: 인터페이스 주소를 제공합니다. 모든 IPv4 인터페이스를 위해서는 0.0.0.0 주소를 제공하고 모든 IPv6 인터페이스를 위해서는 ::를 제공합니다
proxy.http.listen_port 9080 HTTP 프락시를 위한 대체 포트를 제공합니다
proxy.https.enable false HTTPS 프락시를 활성화 하기 위해 true로 설정합니다
proxy.https.listen_address :: 인터페이스 주소를 제공합니다. 모든 IPv4 인터페이스를 위해서는 0.0.0.0 주소를 제공하고 모든 IPv6 인터페이스를 위해서는 ::를 제공합니다
proxy.https.listen_port 9443 HTTPS 프락시를 위한 대체 포트를 제공합니다
proxy.https.certificate_path   PEM 포맷으로 된 HTTPS 프락시용 인증 파일의 경로
proxy.https.private_key_path   PEM 포맷으로 된 HTTPS 프락시용 비밀 키 파일의 경로

만약 HTTPS 프락시를 활성화하길 원한다면 proxy.https.certificate_path, proxy.https.private_key_path 옵션을 설정해 PEM 포맷으로 된 인증 파일과 비밀 키 파일을 제공해야 합니다. 이 인증은 셀프 인증될 수 없습니다.

로그

Realm 오브젝트 서버는 자체의 상태와 진행에 대해 메시지 정보를 남깁니다. 로그는 콘솔이나 logging.path 설정에 기반한 파일로 작성될 수 있으며 logging.level 옵션으로 세밀한 정도를 변경할 수 있습니다.

logging.path의 기본 값은 플랫폼에 따라 달라집니다.

/var/log/realm-sync.log에 로그가 기록됩니다.

로그는 Realm 오브젝트 서버를 수행한 터미널에 출력됩니다.

logging.level의 값은 9 개의 가능한 값 중 하나로 지정합니다.

logging.level 구체적인 수위
all 모든 가능한 메시지
trace 내부 서버 상태와 프로토콜을 추저하기 위해 사용합니다
debug 내부 서버 디버깅 메세지
detail 동기화 트랜잭션 요약을 보여줍니다
info 제품을 위해 좋습니다 (기본)
warn 경고 메시지만 로그합니다
error 에러 메시지만 로그합니다
fatal ROS가 종료될 수 있는 에러
off 출력을 가능한 모두 감춥니다

설정을 요약하면 아래와 같습니다.

설정 키 macOS 기본 리눅스 기본 설명
logging.path   /var/log/realm-sync.log 로그가 쓰여야 할 파일의 경로. 만약 아무 값이 설정되지 않으면 출력은 표준 출력과 표준 에러에 쓰입니다.
logging.level info info 로그 출력의 전체적인 세밀 정도, 위의 검증된 값들을 보세요.

접근 제어

Realm 오브젝트 서버는 허용된 사용자만 Realm 파일에 동기화할 수 있도록 접근 제어 방법을 포함합니다. 두 가지 개념이 있는데 인증과 승인입니다. 어떤 사용자에게 Realm의 접근을 주려면 Realm 오브젝트 서버는 사용자의 정체성을 검증하기 위해 사용자를 인증해야 하고 사용자가 Realm에 접근하기 위한 정확한 권한을 가지고 있는지 승인해야 합니다. 보다 자세한 내용은 다음과 같습니다.

  • Realm 오브젝트 서버는 사용자 인증서를 검증하고 사용자를 인증하기 위해 설정 가능한 인증 제공자를 사용합니다. 사용자는 몇 가지 사용자 인증서를 사용해 서버에 연결하고 검증을 위해 이는 적절한 제공자에 전달됩니다. 인증서가 검증되면 사용자는 Realm 오브젝트 서버에 접근 허가를 받습니다. 기존 계정과 맞지 않는 인증서에는 새 사용자 계정이 생성됩니다.
  • 클라이언트가 사용자로서 접근을 허가받은 후, Realm에 확인된 특정 주소로 읽기나 쓰기 접근을 요청할 수 있습니다. 사용자가 특정 경로에 대해 요청된 접근 권한을 가졌다면 Realm의 접근이 승인되었고 일반 동기화 연산들을 시작할 수 있습니다.

서버 관리하기

Realm 오브젝트 서버 서비스는 표준 service 커맨드를 사용합니다.

sudo service realm-object-server status
sudo service realm-object-server start
sudo service realm-object-server stop
sudo service realm-object-server restart

Realm 오브젝트 서버 서비스는 표준 systemctl 커맨드를 정의합니다.

sudo systemctl status realm-object-server
sudo systemctl start realm-object-server
sudo systemctl stop realm-object-server
sudo systemctl restart realm-object-server

서버를 시작하기 위해 다운로드 받은 realm-mobile-platform 디렉터리의 start-object-server.command 파일을 더블클릭합니다.

macOS 버전의 서버를 중단하기 위해서는 단순히 start-object-server.command로 연 터미널 창에서 CTRL-C를 누르면 됩니다.

Realm 대시보드

상태

Realm 대시보드

Realm 대시보드는 사용자들을 만들거나 관리하고 Realm 오브젝트 서버의 성능을 관측하는 Realm 오브젝트 서버를 위한 관리자 인터페이스입니다.

사용자 관리

관리자는 사용자들을 만들고 관리자 권한을 부여하거나 제거할 수 있습니다.

Realm 브라우저

Realm 브라우저는 macOS에서만 사용할 수 있습니다.

Realm 브라우저는 개발자가 Realm을 관찰하거나 편집할 수 있게 합니다. Realm 브라우저는 Realm 오브젝트 서버의 macOS나 리눅스 인스턴스 모두 접속이 가능합니다.

Realm 브라우저의 Connect to Object Server 옵션을 사용하려면 자동으로 생성된 관리자 토큰을 받아와야 합니다. 리눅스의 경우에는 토큰을 보려면 다음과 같이 합니다.

cat /etc/realm/admin_token.base64

macOS 토큰은 realm-object-server 폴더에 저장되어 있습니다.

macOS에서 Realm 브라우저로 Realm들을 살펴보기

업그레이드

macOS

Realm에서 새로운 macOS 다운로드 번들을 전달받아 macOS 버전의 오브젝트 서버를 업그레이드 합니다.

리눅스

1.0.0-BETA-4.8 이전 버전에서 업그레이드하는 경우 인스톨에 따른 언인스톨 설명을 참조하세요. 독립 서버를 위한 Realm 패키지 서비스의 업그레이드 절차는 매우 간단합니다.

# 업그레이드 전에 서비스를 중단합니다
sudo service realm-object-server stop

# 가능하면 새 버전을 설치합니다
sudo yum -y upgrade realm-object-server-de

# 동작을 재개하기 위해 서버를 재시작합니다
sudo service realm-object-server start
# 업그레이드 전에 서비스를 중단합니다
sudo systemctl stop realm-object-server

# 가능하면 새 버전을 설치합니다
sudo yum -y upgrade realm-object-server-de

# 동작을 재개하기 위해 서버를 재시작합니다
sudo systemctl start realm-object-server
# 패키지 정의를 갱신합니다
sudo apt-get update

# 업그레이드 전에 서비스를 중단합니다
sudo systemctl stop realm-object-server

# 가능하면 새 버전을 설치합니다
sudo apt-get upgrade realm-object-server-de

# 동작을 재개하기 위해 서버를 재시작합니다
sudo systemctl start realm-object-server

Linux 프로페셔널 에디션

이 기능은 프로페셔널과 엔터프라이드 에디션에서만 가능합니다. 이 곳에서 더 많은 기능을 알아보고 무료 시험버전을 시작해보세요.

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

Linux 엔터프라이즈 에디션

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

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 오브젝트 서버를 제거하고 싶다면 절차는 매우 간단합니다. 데이터를 백업받고 다음을 실행하세요.

# 제거하기 전에 서비스를 중단합니다
sudo service realm-object-server stop

# 선택적/권고 단계: 데이터를 백업합니다
# cp -a /var/lib/realm{,.backup}

# 패키지를 제거합니다. 데이터는 /var/lib/realm에 보관됩니다.
sudo yum -y erase realm-object-server-developer

# 패키지를 제거합니다 (1.0.0-BETA-4.8 이전 버전 명령어)
sudo yum -y erase realm-object-server-de
# 제거하기 전에 서비스를 중단합니다
sudo systemctl stop realm-object-server

# 선택적/권고 단계: 데이터를 백업합니다
# cp -a /var/lib/realm{,.backup}

# 패키지를 제거합니다. 데이터는 /var/lib/realm에 보관됩니다.
sudo yum -y erase realm-object-server-developer

# 패키지를 제거합니다 (1.0.0-BETA-4.8 이전 버전 명령어)
sudo yum -y erase realm-object-server-de
# 제거하기 전에 서비스를 중단합니다
sudo systemctl stop realm-object-server

# 선택적/권고 단계: 데이터를 백업합니다
# cp -a /var/lib/realm{,.backup}

# 패키지를 제거합니다. 데이터는 /var/lib/realm에 보관됩니다.
sudo apt-get remove realm-object-server-developer

# 패키지를 제거합니다 (1.0.0-BETA-4.8 이전 버전 명령어)
sudo apt-get remove realm-object-server-de
# 제거하기 전에 서비스를 중단합니다
제어중인 터미널 창에서 CTRL-C를 누릅니다

# 패키지를 제거합니다
realm-mobile-platform 폴더를 휴지통으로 이동합니다

문제해결

Realm 대시보드 외부 접근을 위한 방화벽 규칙 확인

어떤 요소들은 Realm 오브젝트 서버의 동기화 요소와 Realm 대시보드에 대한 외부 (localhost이 아닌) 접근에 영향을 줍니다. 접근을 허가하려면 서버에서 9080 포트를 열어야 합니다.

표준 리눅스 도구를 사용한다면 아래 명령어들로 포트를 엽니다.

sudo iptables -A INPUT -p tcp -m tcp --dport 9080 -j ACCEPT
sudo service iptables save

방화벽을 어떻게 설정하는지 더 자세한 정보를 얻으려면 CentOS 6 Documentation을 참고하세요.

sudo firewall-cmd --get-active-zones
sudo firewall-cmd --zone=public --add-port=9080/tcp --permanent
sudo firewall-cmd --reload
sudo ufw allow 9080/tcp
sudo ufw reload

만약 사용하는 배포판이 표준 방화벽을 쓰지 않는다면 환경에 맞추어 명령들을 수정해야 합니다.

설정 에러

일반적으로는 기본 설정이 대부분의 설치에 적합합니다. (시스템은 미리 프로그래밍된 기본 값을 가지고 있습니다) Realm 설정 파일 내의 대부분 설정을 주석 처리되어 있고 어떻게 수정할 수 있는지 보여주고 있습니다. 설정 파일이 수정되고 에러가 있다면 에러 메시지는 기본 로그 위치에 쓰입니다. (macOS에서는 터미널 창이며 리눅스 시스템에서는 /var/log/realm-sync.log입니다.)

만약 Realm 오브젝트 서버가 시작하지 않는다면 설정 파일의 에러가 원인일 것입니다. 설정 파일을 디버깅하기 위해 터미널에서 시작하는 내장 체커를 다음과 같이 사용할 수 있습니다.

realm-object-server --check-configuration /etc/realm/configuration.yml

macOS에서 실행한다면 configuration.yml의 설정 파일 경로를 바꾸세요.

에러가 발생하면 서버의 파서는 자세한 에러 메시지를 출력합니다. 이 에러메시지는 문제를 표시하며 가능한 에러가 발생한 부분을 하이라이트합니다. 한번 모든 에러를 고치고는 서버는 다시 시작할 수 있습니다. ^C를 눌러 서버를 중단하고 시스템을 재부팅하거나 Realm 오브젝트 서버를 리눅스의 systemd이나 macOS의 start-object-server.command으로 재시작하세요.

에러 메시지는 대게 자기 설명적이고 여기에 잠재적인 단서가 있습니다.

  • ROS를 동작하기 위해 다음의 내용이 필수적입니다.
    • 저장소 루트 디렉터리: Realm 오브젝트 서버가 모든 파일을 저장하는 곳입니다. storage.root_path을 설정하거나 명령행 인터페이스에서 --root 인자로 주세요. 디렉터리는 반드시 ROS가 시작하기 전에 존재해야 합니다.
    • 인증 키 쌍: ROS에 인증된 클라이언트만 보안 접근을 하게 합니다. auth.private_key_path을 설정하거나 명령행 인터페이스에서 --private-key 인자를 주세요. auth.public_key_path를 설정하거나 명령행 인자 --public-key를 주세요. 이 키들은 반드시 PEM 포맷이어야 하고 쌍이 맞아야 합니다.
  • 응답 포트의 설정은 중복될 수 없습니다. listen_port는 파일에 대해 유일해야 합니다. 추가적으로 포트들은 다른 프로세스에 연결되지 말아야 합니다.

  • HTTPS 프락시는 proxy.https.certificate_pathproxy.https.private_key_path에 유효한 인증과 비밀 키가 주어질 때만 시작됩니다. 인증과 비밀 키는 PEM 포맷이어야 하고 쌍이 맞아야 합니다. 인증서는 셀프 사인이면 안됩니다.

운영시 발생할 수 있는 에러

때때로 Realm 오브젝트 서버 로그를 확인하는 것이 디버깅 용도에 유용합니다. 이는 macOS의 터미널 창이나 리눅스 시스템의 /var/log/realm-sync.log입니다. ROS는 두가지 특별한 종류의 에러와 워닝 진단을 생성합니다. 이는 시스템 관리자와 개발자에 유용합니다.

세션 특화 에러

  • 204 “Illegal Realm path (BIND)” Realm 경로가 해당 사용자에게 유효하지 않습니다.

  • 207 “Bad server file identifier (IDENT)” 로컬 Realm 연결된 서버 사이드 Realm이 존재하지 않습니다. 이는 일반적으로 서버 상태가 완전히 리셋되는 경우에 발생합니다.

  • 211 “Diverging histories (IDENT)” 로컬 Realm이 존재하지 않은 서버 버전을 지정합니다. 이는 일반적으로 서버 상태가 부분적으로 리셋되는 경우에 발생합니다. (예를 들어 백업이 복원된 경우입니다.)

클라이언트 수준 에러

  • 105 “Wrong protocol version (CLIENT)” 클라이언트와 서버가 업그레이드 불일치로 인해 다른 버전의 동기화 프로토콜을 사용합니다.

  • 108 “Client file bound in other session (IDENT)” 같은 시점에 클라이언트 측의 Realm 같은 파일에 여러 동기화 세션이 있습니다.

  • 203 “Bad user authentication (BIND, REFRESH)” 서버가 잘못된 토큰을 생성했거나 SDK가 뭔가 잘못되었습니다.

  • 206 “Permission denied (BIND, REFRESH)” 사용자가 주어진 경로의 Realm에 접근할 권한이 없습니다.

충돌 해결

모바일의 특징 중 하나는 언제나 온라인이라고 기대할 수 없다는 것입니다. 접속이 끊어지는 것은 일상이며 네트워크는 느리며 접속은 불안정합니다. 그럼에도 불구하고 사람들은 여전히 앱이 잘 동작하길 원합니다!

두 명 이상의 사용자가 데이터의 같은 부분을 독립적으로 변경하고 충돌을 만드는 상황을 만날 수 있습니다. 연결이 완전해도 폰과 서버의 소통 대기 시간은 충분히 길 수 있고 같은 시점에 충돌 변경을 만들 수 있습니다.

다른 순서로 변경이 적용되더라도 특정 규칙 적용해 양쪽 모두 같은 결과로 수렴되도록 Realm은 병합을 합니다.

전통적인 데이터베이스에서 할 수 있었던 완벽한 일관성(perfect consistency)은 더 이상 존재하지 않으며 이를 “강한 결과적 일관성 (strong eventual consistency)”이라 부릅니다. 원하는 대로 일관된 결과를 얻으려면 인지해야 하는 규칙이 있다는 단점이 있습니다만 몇 가지 규칙만 따른다면 장비들이 완전히 오프라인으로 동작하더라도 여전히 온라인이 되었을 때 의미 있는 결과로 수렴하게 됩니다.

매우 고수준의 규칙은 다음과 같습니다.

  • 삭제는 언제나 이깁니다. 만약 한쪽에서 객체가 삭제가 되면 다른 쪽에서 뒤에 데이터를 변경하더라도 데이터는 언제나 삭제된 채로 있습니다.

  • 마지막 변경이 이깁니다. 양쪽에서 같은 속성을 변경한다면 마지막에 변경된 것으로 값이 결정됩니다.

  • 목록에 삽입은 시간 순으로 됩니다. 만약 두 요소가 같은 위치에 삽입되었다면, 먼저 들어온 요소가 다른 요소보다 먼저 삽입됩니다. 이 말은 양쪽에서 요소들은 목록의 끝에 삽입했다면 이는 삽입 시점에 따라 나타나게 됩니다.

기본키가 있는 객체

객체를 유일하게 하기 위해 기본 키를 대입할 수 있습니다. 전역 “설정” 객체가 있다고 해봅시다. 만약 앱을 시작했는지 확인하고 없을 때만 추가한다면 각 여러 앱 인스턴스가 각자 버전을 추가하기 때문에 둘 이상의 객체를 만나게 됩니다.

해결책은 같은 객체라는 의도 를 알 수 있도록 기본 키를 대입하는 것입니다. 시스템은 기본 값을 인식할 정도로 똑똑하기에 값을 바꾼 속성들이 뒤늦게 들어온 (빈) 객체에 의해 다시 변경되지 않습니다.

문자열

클라이언트 API로는 아직 공개되지 않았습니다

문자열은 스칼라 값이며 문자들의 목록으로 볼 수 있어 특별합니다. 문자열은 다른 새 문자열로 설정(전체 문자열이 대치되는)하거나 문자열을 수정 할 수 있습니다. 여러 사용자가 같은 문자열을 수정할 때 (구글 독스와 같은 곳에서 경험하는 것과 같이) 문자 단위로 충돌을 해결할 수 있습니다.

카운터

클라이언트 API로는 아직 공개되지 않았습니다

숫자를 세기 위해 쓰는 것은 특이한 경우입니다. 많은 프로그래밍 언어는 (v += 1과 같은) 증가 연산을 구현해 값을 읽어 증가시키고 다시 저장하게 합니다. 이는 여러 당사자가 이를 동시에 하는 경우에 명확하게 동작하지 않습니다. (그들은 동시에 10을 읽고 11을 저장시켜서 의도한 12 대신 11이란 병합된 결과를 얻게 합니다).

이런 기본 동작을 제공하기 위해 값을 증가 (혹은 감소) 시킨다는 의도를 표현하고 병합 과정에 올바른 과정을 찾게 해야 합니다. 위의 문자열과 마찬가지로 전체 값의 갱신을 제공하거나 더 많은 의미를 제공하게 편집하거나 충돌 해결에 대한 더 정확한 제어를 허락해야 합니다.

사용자 충돌 해결

사용자 충돌 해결을 하는 표준적인 방법은 값을 목록으로 변경하는 것입니다. 각자 그들의 갱신을 목록에 올릴 수 있고 데이터 모델에 적용하고 싶은 충돌 해결 모델을 적용하는 것입니다.

이런 방법으로 최대 값, 최소 값, 최초 값 승리, 마지막 값 승리 등의 여러분이 원하는 방법을 구현할 수 있습니다.

인증

Realm의 사용자/암호 방법 이상으로 Realm 앱에 대해 접근을 제어하는 제3자 인증 방법을 개발자가 활용하기 위해서는 인증 제공자를 사용한다. Realm은 페이스북, 구글, 애플의 iCloud를 제공한다.

이 제삼자 인증 제공자들은 현재 단일 서버 수준에서 운영되며 주어진 인증 방법을 사용할 필요가 있는 모든 서버에 설정되어야 합니다. 설정은 인증 방법과 요구된 키/비밀키를 확인하고 키 밸류 쌍을 제공해 완료됩니다.

이 정보는 Realm의 configuration.yml 파일의 auth.providers 부분에서 다룹니다.

아래는 제3자 인증 제공자가 각각 어떻게 통합되는지 각 서비스들을 응용하기 위해 연결할 개발자 페이지들을 보여주는 예입니다. 각 인증 제공자를 위한 전체적인 예제는 Realm 오브젝트 서버 configuration.yml 파일에서 찾을 수 있습니다.

암호

  • 사용자 이름/암호 인증은 언제나 활성화되어 있습니다.

Google

구글 OAuth 2.0 API 접근을 하고 google 부분에 클라이언트 ID 키를 입력하세요.

google:
  clientId: '012345678901-abcdefghijklmnopqrstvuvwxyz01234.apps.googleusercontent.com'

페이스북

페이스북 인증은 페이스북 제공자를 활성화하기 위해 어떤 설정을 요구하지 않습니다.

facebook: {}

Realm 오브젝트 서버에 수신된 페이스북 클라이언트 토큰은 페이스북 API들에 의해 검증을 확인하게 됩니다. (그래서 ROS는 이에 접속해야 합니다).

iCloud

iCloud는 애플 플랫폼들(iOS, tvOS, watchOS, macOS)에서만 사용 가능합니다.

Realm 오브젝트 서버를 사용해 CloudKit에 접근하려면 공개 키를 설정하고 애플의 CloudKit 웹 대시보드에 접속하고 애플리케이션을 위한 CloudKit 접근 키를 생성해야 합니다. 이 키들은 구체적인 Realm을 위한 Realm 오브젝트 서버의 CloudKit 인증 모듈의 설정을 위해 사용합니다.

  1. 터미널에서 Realm 모바일 플랫폼 디렉토리를 엽니다.

  2. 다음 OpenSSL 스크립트를 사용해서 개인 키를 생성하세요. openssl ecparam -name prime256v1 -genkey -noout -out cloudkit_eckey.pem

  3. CloudKit 대시보드에 제출할 공개 키를 생성하세요. openssl ec -in cloudkit_eckey.pem -pubout 명령어를 실행하면 base64 공개 키 문자열이 출력됩니다. 복사해서 저장하세요.

  4. CloudKit 접근 키를 생성하세요. 애플 개발자 계정을 사용하기 위해 Apple’s CloudKit Dashboard에 로그인해서 접근 키를 생성하고 싶은 애플리케이션을 선택합니다.

  5. 대시보드의 왼편에서 “API Access”을 선택하고 가운데 부분에서 드롭다운 메뉴를 선택합니다. (기본 설정은 “API Tokens”입니다.) “Server-to-Server Keys”를 선택하고 “Add Server-to-Server Key”를 선택합니다.

  1. 다음 OpenSSL 스크립트를 사용해서 개인 키를 생성하세요. sudo openssl ecparam -name prime256v1 -genkey -noout -out /etc/realm/cloudkit_eckey.pem

  2. CloudKit 대시보드에 제출할 공개 키를 생성하세요. openssl ec -in /etc/realm/cloudkit_eckey.pem -pubout 명령어를 실행하면 base64 공개 키 문자열이 출력됩니다. 복사해서 저장하세요.

  3. CloudKit 접근 키를 생성하세요. 애플 개발자 계정을 사용하기 위해 Apple’s CloudKit Dashboard에 로그인해서 접근 키를 생성하고 싶은 애플리케이션을 선택합니다.

  4. 대시보드의 왼편에서 “API Access”을 선택하고 가운데 부분에서 드롭다운 메뉴를 선택합니다. (기본 설정은 “API Tokens”입니다.) “Server-to-Server Keys”를 선택하고 “Add Server-to-Server Key”를 선택합니다.

CloudKit 대시보드에서 접근 키 생성하기

열린 패널에서 새 키의 이름을 주고 위의 단계 1에서 생성된 공개 키 텍스트를 붙여 넣으세요. 오른쪽 아래 구석에서 “Save”를 클릭합니다.

몇 초 후, 키가 생성되고 페이지 상단의 “Key ID” 부분에 표기됩니다. 이는 Realm CloudKit 인증 모듈 설정에 필요한 키 ID입니다.

보안 안내: Realm CloudKit 인증에 사용하려면 개별 애플리케이션 용 새로운 비밀키를 만드세요. 비밀 키를 재 사용하는 것은 만약 비밀 키 자체가 위험해지거나 해지해야 할 때 공유된 키를 사용하는 전체 Realm이 위험해질 수 있습니다.

애플의 키 ID에 추가로 (대시보드 애플리케이션 페이지에 있는) CloudKit 앱의 CloudKit 컨테이너 이름과 단계 1에서 생성된 비밀키, 앱의 Realm 앱 ID가 필요합니다.

CloudKit이 설정된 전체 예제는 다음과 같습니다.

cloudkit:
  ## CloudKit 키 ID
  key_id: '0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef'

  ## 인증서가 있는 경로
  private_key_path: 'cloudkit_eckey.pem'

  ## 컨테이너 식별자. 도메인 이름 역순 표기.
  container: "iCloud.io.realm.exampleApp.ios"

  ## CloudKit이 사용될 할 환경. 기본은 'development'. 앱 스토어에 제품 배포를 위해서는
  ## 반드시 'production'을 사용해야 한다.
  environment: 'development'

private_key_path 경로가 정확한지 확인하세요. Linux에서 위 단계를 수행했다면 /etc/realm/cloudkit_eckey.pem과 같아야 합니다.

승인

Realm 오브젝트 서버는 특정 Realm들에 대해 읽기와 쓰기 권한을 받을 사용자를 제어할 수 있도록 하는 인증 방법을 포함합니다. 예를 들어 여러 사용자가 같은 Realm을 기록해서 협업하는 앱에 사용될 수 있습니다. 쓰기 유저 한 명이 읽기 권한을 가진 많은 사용자와 자료를 공유하는 출판/구독 시나리오에서 데이터를 공유하는데도 사용할 수 있습니다.

인증 체계의 기술적인 구현은 아래에서 다룹니다. 근본적인 추상은 권한입니다. 이는 사용자와 Realm 사이에 유일한 관계에서 사용자가 Realm을 다룰 때 허가된 것을 세 가지 불린 플래그로 표현합니다.

  • mayRead Realm으로부터 사용자가 읽을 수 있는지를 표기합니다.
  • mayWrite Realm에 사용자가 쓸 수 있는지를 표기합니다.
  • mayManage 사용자가 Realm의 권한을 변경할 수 있는지 여부를 표기합니다.

권한을 명시적으로 바꾸지 않으면 Realm의 소유자만 접근할 수 있습니다. 예외는 관리자들입니다. 그들은 언제나 서버의 모든 Realm의 모든 권한을 가집니다.

Realm의 개별 사용자 권한은 물론 기본 사용자 권한을 바꾸는 것도 가능합니다. 만약 사용자가 개별 사용자 권한이 없는 Realm에 접근한다면 사용자가 인증되어야 하는지를 확인하기 위해 Realm을 위한 기본 사용자 권한을 사용합니다. 만약 개별 사용자 권한과 기본 사용자 권한 모두 생성되지 않았다면 접근은 금지됩니다.

어드민 Realm (Admin Realm)

Realm 오브젝트 서버는 하나의 전역 어드민 Realm을 보유합니다. 이는 서버에 의해 제어되는 사용자와 전체 Realm 파일 권한의 완전한 집합을 가지고 있는 신뢰할 수 있는 데이터 저장소입니다. 오직 Realm 오브젝트 서버만이 이 Realm에 쓸 수 있습니다. 즉, 사용 권한을 수정할 수 있는 권한을 Realm 오브젝트 서버가 독점적으로 갖습니다.

권한 수정

사용 권한이 Realm 오브젝트 서버에서만 수정되지만 Realm에 대한 mayManage 권한을 가진 사용자는 권한을 수정해서 해당 Realm이 쓰기나 읽기 접근 권한을 다른 사용자에게 부여하도록 서버에 요청할 수 있습니다. 이런 요청은 PermissionChange 객체를 만들고 사용자를 위한 매니지먼트 Realm에 이를 쓰는 것으로 수행합니다. 매니지먼트 Realm이 Realm 오브젝트 서버와 동기화되면, PermissionChange 객체가 서버에 의해 처리되고 변경 사항이 어드민 Realm에 저장됩니다.

매니지먼트 Realm (Management Realm)

사용자 특정 매니지먼트 Realm으로 사용자가 어드민 Realm에 저장된 사용 권한 집합을 간접적으로 변경할 수 있습니다. 매니지먼트 Realm에서 생성된 객체의 statusCodestatusMessage 필드에 표시된 상태를 통해 서버에 대한 요청으로 구분됩니다. 서버는 각 객체를 수신한 순서대로 개별적으로 처리하며, 처음에는 요청을 확인하고 유효한 경우에만 수정을 수행합니다. 수정을 성공하면 서버는 statusCode = 0을 설정하고 그 결과에 대한 설명을 statusMessage 필드에 추가할 수 있습니다. 서버가 실패하는 경우 statusCode는 에러 코드 > 0로 표시되고 statusMessage에 에러 메시지가 추가됩니다.

PermissionChange 객체

사용자는 기존 Realm 파일 및 사용자의 권한을 변경하기 위해 매니지먼트 Realm에 PermissionChange를 만들 수 있습니다. Realm 오브젝트 서버는 객체를 만드는 사용자가 기존 Realm 파일에 대해 mayManage 권한을 갖는 경우에만 변경을 수행합니다. 다음 설명에서는 사용자가 기존 Realm에 대한 mayManage 권한을 가지고 있다고 가정하며, PermissionChange 객체는 다음 필드를 포함합니다.

realmUrl 	// string: realm의 URL
userId 		// string: user ID
mayRead		// boolean (선택 사항): realm 사용 권한이 있는가?
mayWrite	// boolean (선택 사항): realm 쓰기 권한이 있는가?
mayManage	// boolean (선택 사항): realm 관리 권한이 있는가?

mayRead, mayWrite, mayManage 세 가지 필드는 선택 사항이며, 지정된 경로의 Realm 파일에 특정 사용자가 가지게 될 새 권한을 나타냅니다. PermissionChange 객체에 플래그가 설정되지 않은 경우에는 기존 값이 유지됩니다.

userId, realmUrl 문자열 필드는 필수입니다. 영향을 받는 사용자와 사용 권한이 변경될 Realm을 결정하는데 사용합니다.

userId='*'는 영향을 받는 Realm에 대한 기본 사용자 권한을, realmUrl='*'는 영향을 받는 사용자에 의해 소유된 모든 Realm의 권한을 나타냅니다. 즉, 사용자가 { realmUrl='*', userId='*', mayRead=true } 필드를 갖는 PermissionChange 객체를 만든다면 기본 사용자 권한은 사용자가 소유한 모든 Realm에 읽기 엑세스를 포함합니다. 단, 기본 사용자의 권한을 변경해도 개인 사용자가 기존에 가진 권한은 영향을 받지 않습니다.

로드 밸런싱

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

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

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

설치

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

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

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

# Realm 엔터프라이즈 저장소를 설정합니다. 이미 ROS 엔터프라이즈를 설치했다면 건너 뛰세요 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 오브젝트 서버에 알립니다.

동기화 작업자는 즉시 작업할 수 있으며, 단일 인스턴스에서 여러 작업자를 시작해야 하거나, 127.0.0.1 이외의 인터페이스를 수신해야 하는 경우에만 추가 구성이 필요합니다.

고가용성

고가용성을 달성하기 위한 방법은 다양하며, 구조, 비즈니스 요구 사항, 예산 등은 애플리케이션을 위한 최선의 선택에 영향을 줍니다. Realm 모바일 플랫폼은 다운타임과 데이터 손실을 줄이기 위한 다양한 옵션 제공을 목표하고 있습니다.

오프라인-우선

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

장애 조치(failover)

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

백업

Realm 오브젝트 서버는 버전에 따라 한 개나 두 개의 백업 시스템을 제공합니다.

  • Realm 모바일 플랫폼 버전에 포함된 수동 백업 시스템은 커맨드 라인 유틸리티를 통해 사용할 수 있습니다. 서버 오퍼레이션 중에 오브젝트 서버의 데이터를 사본을 만드는 작업을 트리거할 수 있습니다.

  • 엔터프라이즈 에디션에서만 제공되는 연속 백업 시스템은 Realm 오브젝트 서버의 메인 프로세스와 함께 실행되는 백업 서버입니다. 모든 동기화 Realm의 변경 사항을 지속적으로 감시하며, 하나 이상의 백업 클라이언트에 변경 사항을 보냅니다.

두 시스템 모두 Realm 오브젝트 서버가 장애 이후 재시작할 수 있는 Realm 디렉토리를 생성합니다. 백업된 데이터에는 사용자 Realm, 모든 사용자 계정 정보와 오브젝트 서버에서 사용하는 모든 메타데이터가 포함됩니다. Realm 오브젝트 서버를 오프라인으로 만들지 않고도 서버 실행 중에 수동 백업이나 연속 백업을 생성할 수 있습니다.

연속 백업

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

연속 백업은 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)에서 설정을 구성합니다. 백업 서버를 위한 키는 다음과 같습니다.

Configuration key Default Description
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) Log 파일 경로, 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

# 백업이 설정된 ROS를 가리키도록 설정 편집. 기본 설정은 ROS와 백업 서버가 동일한 시스템에 있다고 가정.
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

# 백업이 설정된 ROS를 가리키도록 설정 편집. 기본 설정은 ROS와 백업 서버가 동일한 시스템에 있다고 가정.
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

# 백업이 설정된 ROS를 가리키도록 설정 편집. 기본 설정은 ROS와 백업 서버가 동일한 시스템에 있다고 가정.
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.

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

Configuration key Default Description
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) Log 파일 경로, stderr로 보내려면 빈 값

빠른 시작 가이드

빠른 시작 가이드를 따르면 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-object-server-enterprise
sudo yum -y install realm-object-server-backup-client

# ROS 서비스 활성화 및 시작
sudo chkconfig realm-object-server on
sudo service realm-object-server start

# 백업 서버 서비스 활성화 및 시작
sudo chkconfig realm-object-server-backup-server on
sudo service realm-object-server-backup-server start

# 백업 클라이언트 서비스 활성화 및 시작
sudo chkconfig realm-object-server-backup-client on
sudo service realm-object-server-backup-client start

# 파일 동기화 확인
md5sum /var/lib/realm/object-server/0/user_data/__admin.realm
md5sum /var/lib/realm/object-server-backup-client/0/user_data/__admin.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-object-server-enterprise
sudo yum -y install realm-object-server-backup-client

# ROS 서비스 활성화 및 시작
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-backup-client
sudo service realm-object-server-backup-client start

# 파일 동기화 확인
md5sum /var/lib/realm/object-server/0/user_data/__admin.realm
md5sum /var/lib/realm/object-server-backup-client/0/user_data/__admin.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.deb.sh | sudo bash

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

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

# ROS 서비스 활성화 및 시작
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-backup-client
sudo service realm-object-server-backup-client start

# 파일 동기화 확인
md5sum /var/lib/realm/object-server/0/user_data/__admin.realm
md5sum /var/lib/realm/object-server-backup-client/0/user_data/__admin.realm

수동 백업

수동 백업은 Realm의 실행 인스턴스를 백업하는 콘솔 명령어입니다. 서버에서 보관을 위해 장기 저장 장치에 저장할 수 있는 백업을 만들기 위해 이 명령어를 서버를 종료하지 않고 몇 번이던지 실행할 수 있습니다. 백업이 지속되는 방식에 대한 작동 시스템에 대한 아무런 지식이 없더라도 기능을 수행할 수 있도록 하기 위해, 이 명령어는 디스크 오류가 발생했을때 서버가 다시 시작하는데 필요한 모든 것을 포함하는 디렉토리 구조를 만듭니다.

결과 디렉토리를 압축해서 Amazon S3이나 Online C14와 같은 오프 사이트 위치로 전송하는 것을 권장합니다.

Realm이 백업 프로세스 중에 수정될 수 있으므로, 백업 명령어는 Realm의 트랜잭션 기능을 사용해서 각 Realm의 일관적인 스냅샷을 만듭니다. 그러나 서버가 지속적으로 실행되고 있으므로 백업된 Realm은 서버의 특정 시간의 인스턴스 상태를 나타내지는 않습니다. 백업이 진행되는 동안 서버에 추가된 Realm은 백업에서 완전히 제외될 수 있고, 이런 경우 다음 백업에 포함됩니다.

커맨드 라인에서 다음 명령어로 realm-backup을 실행할 수 있습니다.

realm-backup SOURCE TARGET
  • SOURCE는 Realm 오브젝트 서버의 데이터 디렉토리입니다. (일반적으로 storage.root_path 내의 /etc/realm/configuration.yml 에서 설정됩니다.)
  • TARGET은 백업 파일이 저장될 디렉토리입니다. 안전 상의 이유로 이 디렉토리는 백업이 시작될 때 존재하지 않거나 내부가 비어 있어야 합니다.

백업 명령이 완료되면 TARGETSOURCE와 같은 서브 디렉토리 구조와 모든 개별 Realm의 백업을 가진 디렉토리가 됩니다.

백업에서 서버 복구

Realm 오브젝트 서버의 데이터가 손실되거나 손상된 경우 백업된 데이터로 새로운 Realm 오브젝트 서버를 다시 시작할 수 있습니다. 서버를 중지하고 수동 백업 절차의 최신 백업 디렉토리(예를 들어 TARGET 디렉토리나 연속 백업 클라이언트에서 지정한 storage.root_path 디렉토리 등)를 Realm 오브젝트 서버의 데이터 디렉토리(예를 들어 수동 백업 절차의 SOURCE 디렉토리)에 복사해서 간단히 수행할 수 있습니다. 백업이 Realm 오브젝트 서버의 데이터 디렉토리에 모두 복사 되면 서버를 재시작할 수 있습니다.

백업에서 클라이언트 복구

서버가 해당 백업에서 복원될 경우 가장 최근의 백업 이후에 오브젝트 서버에 추가된 데이터는 손실됩니다. 하지만 Realm 모바일 데이터베이스 클라이언트는 오브젝트 서버와 지속적으로 통신하기 때문에 서버 상에 더이상 존재하지 않는 최신 데이터로 업데이트될 수도 있습니다.

이러한 불일치가 발생하면 Realm 오브젝트 서버는 클라이언트에 에러 메시지를 보내고 데이터 동기화를 거부합니다. 동기화 불일치와 관련된 오류 메시지는 다음과 같습니다.

  • 207 “잘못된 서버 파일 식별자 (INTENT)”
  • 208 “잘못된 클라이언트 파일 식별자 (IDENT)”
  • 209 “잘못된 서버 버전 (IDENT, UPLOAD)”
  • 211 “다른 히스토리 분기 (IDENT)”

클라이언트가 이런 오류 메세지를 받은 이후에는 재시작해야만 서버에서 동기화를 지속할 수 있습니다. 오류를 수신한 Realm의 로컬 복사본에 있는 모든 데이터를 지우고 서버와 다시 동기화합니다. 이렇게 해야 클라이언트가 오브젝트 서버에 있는 모든 데이터만을 가지고 일관된 상태가 됩니다.

이런 상황이 발생한 경우 클라이언트는 로컬에만 있던 일관성이 없는 데이터를 잃게 됩니다. 즉, 오브젝트 서버가 손상돼고 백업에서 복원되는 시간 동안 추가된 데이터와 같은 데이터입니다. 이런 잠재적 데이터 손실을 최소화하려면 연속 백업 시스템을 사용하는 것을 권장합니다. 만약 연속 백업 시스템을 사용할 수 없다면 수동 백업 시스템을 자주 실행하세요.

모니터링

이 기능은 프로페셔널과 엔터프라이드 에디션에서만 가능합니다. 이 곳에서 더 많은 기능을 알아보고 무료 시험버전을 시작해보세요.

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

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

realm.example.com.server.connection.accept.succeeded
realm.example.com.server.connection.accept.failed
realm.example.com.server.protocol.bind.received
realm.example.com.auth.password.attempted
realm.example.com.auth.password.failed
realm.example.com.auth.password.failure.username_invalid
realm.example.com.auth.password.failure.password_check_failed

카운터

Realm 오브젝트 서버가 시작될 때마다 아래 카운터가 증가합니다.

  • <prefix>.server.started

아래 카운터는 동기화가 시작되지 않을 때 증가합니다. 이는 클라이언트에서 Realm 파일을 삭제하고 서버로부터 다시 로드해야 함을 나타냅니다.

  • <prefix>.protocol.ident.failure.bad_server_version
  • <prefix>.protocol.ident.failure.diverging_histories
  • <prefix>.protocol.ident.failure.bad_client_file_ident

아래 카운터는 세션 시작과 종료 시점에 증가합니다. 세션은 인증 전, 연결 시점에서 시작되는 것으로 간주합니다.

  • <prefix>.session.started
  • <prefix>.session.terminated

토큰과 관련된 실패를 나타내는 카운터입니다.

  • <prefix>.protocol.client.token.failure.invalid_base64
  • <prefix>.protocol.client.token.failure.invalid_json
  • <prefix>.protocol.client.token.failure.missing_key: a token accepted without authentication because the key is missing
  • <prefix>.protocol.client.token.failure.signature_mismatch
  • <prefix>.protocol.client.token.failure.expired

아래 카운터는 송수신되는 여러 유형의 동기화 프로토콜 메시지를 나타냅니다.

  • <prefix>.protocol.download.sent
  • <prefix>.protocol.bind.received
  • <prefix>.protocol.client.received
  • <prefix>.protocol.ident.received
  • <prefix>.protocol.mark.received
  • <prefix>.protocol.refresh.received
  • <prefix>.protocol.unbind.received
  • <prefix>.protocol.upload.received

아래 카운터는 프로토콜 메시지 처리 중의 오류를 추적합니다.

  • Bind
    • <prefix>.protocol.bind.failure.bad_authentication
    • <prefix>.protocol.bind.failure.illegal_realm_path
    • <prefix>.protocol.bind.failure.permission_denied
    • <prefix>.protocol.bind.failure.reuse_of_session_ident
    • No token_expired counter here, because the token has not been provided yet. But the token provided with the bind message is checked and bad_authentication is raised if it is expired or invalid.
  • Ident
    • <prefix>.protocol.ident.failure.bad_server_file_ident
    • <prefix>.protocol.ident.failure.bound_in_other_session
    • <prefix>.protocol.ident.failure.permission_denied
    • <prefix>.protocol.ident.failure.token_expired
  • Refresh
    • <prefix>.protocol.refresh.failure.bad_authentication
    • <prefix>.protocol.refresh.failure.permission_denied
    • No token_expired counter here, because it is not considered an error to provide a new token while the current one has already expired. But the token provided with the refresh message is checked and bad_authentication is raised if it is expired or invalid.
  • Upload
    • <prefix>.protocol.upload.failure.bad_changeset
    • <prefix>.protocol.upload.failure.bad_client_version
    • <prefix>.protocol.upload.failure.bad_server_version
    • <prefix>.protocol.upload.failure.permission_denied
    • <prefix>.protocol.upload.failure.token_expired
  • Mark
    • <prefix>.protocol.mark.failure.token_expired

하위 레벨 프로토콜 에러를 추적하는 카운터입니다.

  • <prefix>.protocol.read.head.error.bad_message_before_activation
  • <prefix>.protocol.read.head.error.bad_session_ident
  • <prefix>.protocol.read.head.error.bad_syntax
  • <prefix>.protocol.read.head.error.ident_message_after_activation
  • <prefix>.protocol.read.head.error.limits_exceeded
  • <prefix>.protocol.read.head.error.message_after_unbind
  • <prefix>.protocol.read.head.error.premature_ident_message
  • <prefix>.protocol.read.head.error.unknown_message
  • <prefix>.protocol.read.head.error.wrong_protocol_version

프로토콜 에러는 connection.erroredsession.errored에 대해 카운트됩니다.

  • <prefix>.protocol.connection.errored
  • <prefix>.protocol.session.errored

마지막으로 아래 카운터는 연결 이벤트를 추적합니다.

  • <prefix>.connection.accept.failed
  • <prefix>.connection.accept.succeeded
  • <prefix>.connection.read.failure.limits_exceeded
  • <prefix>.connection.read.failed
  • <prefix>.connection.write.failed
  • <prefix>.connection.started
  • <prefix>.connection.terminated
  • <prefix>.connection.removed

게이지

현재 열려있는 연결/세션 수를 나타냅니다. 하나의 연결을 통해 여러 세션을 제공할 수 있습니다.

  • <prefix>.connection.opened
  • <prefix>.session.opened

서버측 스크립팅

Realm 모바일 플랫폼 프로페셔널과 엔터프라이즈 에디션은 Realm 오브젝트 서버에 대한 Node.js 기반 API를 제공합니다. 여기에는 Realm 전체의 변경 사항에 대응하는 이벤트 핸들링 API와 서버 애플리케이션이 관리자 접근을 통해 공유 Realm에 접근하고 이를 변경할 수 있도록 하는 데이터 접근 API가 포함됩니다. 더 자세한 내용은 Realm JavaScript 문서의 관련 섹션을 참고하세요.