NDB 관리

몇 가지 도구와 API를 사용하여 애플리케이션의 저장된 데이터를 보다 쉽게 관리할 수 있습니다.

Google Cloud 콘솔

Google Cloud 콘솔을 사용할 경우 NDB는 Datastore memcache를 통해 구현된다는 점을 기억해야 합니다. NDB는 값을 '읽을' 때 먼저 Memcache를 확인합니다. Memcache에서 값을 찾을 수 없는 경우에만 Datastore에서 읽습니다.

따라서 Google Cloud 콘솔을 사용하여 Datastore의 항목을 편집할 경우 값이 Memcache에 있으면 애플리케이션은 여전히 '이전' 값을 사용할 가능성이 있습니다. memcache를 삭제하면 이 문제를 해결할 수 있습니다. 하지만 이 방법은 다소 부정적인 영향이 있습니다. 종종 '수동으로' 값을 수정해야 하는 경우 이를 위해 애플리케이션에 NDB 클라이언트 라이브러리를 통해 값을 쓰는 UI를 설정할 수 있습니다. NDB를 통해 값을 쓸 경우에는 Cloud Datastore와 memcache가 동기화 상태로 유지됩니다.

메타데이터 쿼리

NDB는 메타데이터 쿼리 API를 지원합니다. 이 API를 사용하면 애플리케이션이 Datastore 사용에 대한 일반적인 정보를 얻을 수 있습니다. 이 API는 google.appengine.ext.ndb.metadata 모듈에 있습니다. 이 API의 함수는 다음과 같습니다.

  • get_namespaces(start=None, end=None): 네임 스페이스 이름 목록을 반환합니다.
  • get_kinds(start=None, end=None): 종류 이름 목록을 반환합니다.
  • get_properties_of_kind(kind, start=None, end=None): 지정된 종류 이름의 속성 이름 목록을 반환합니다.
  • get_representations_of_kind(kind, start=None, end=None): 지정된 종류 이름의 속성 이름을 'STRING', 'BOOLEAN' 또는 'INT64'와 같은 표현 이름 목록에 매핑하는 사전을 반환합니다.

이러한 함수에는 쿼리를 특정 범위로 제한하는 데 사용할 수 있는 선택적 인수 startend가 있습니다. start는 지정된 값을 포함하며 end는 지정된 값을 제외합니다. 둘 다 기본값은 None입니다. 예를 들어 소문자로 시작하는 모든 네임스페이스를 가져오려면 get_namespaces('a', chr(ord('z') + 1))를 호출하면 됩니다. get_namespaces()를 제외한 모든 함수는 암시적으로 현재 네임스페이스로 제한됩니다. 메타데이터 가져오기 및 쿼리는 Datastore 가져오기 및 쿼리와 동일한 방식으로 청구됩니다.

통계 쿼리

Datastore는 지정된 종류의 항목 수 또는 지정된 유형의 속성 값에서 사용된 공간 등 애플리케이션에 저장된 데이터에 대한 통계를 유지관리합니다. Google Cloud Console의 대시보드 페이지에서 이러한 통계를 볼 수 있습니다.

또한 Datastore API를 사용하여 항목의 특정 이름을 쿼리하면 애플리케이션 내부에서 프로그래매틱 방식으로 이러한 값에 액세스할 수도 있습니다. 각 통계는 종류 이름이 밑줄 2개로 시작하고 끝나는 형식의 항목으로 액세스할 수 있습니다. 예를 들어 각 앱에는 Datastore의 모든 항목 총계에 대한 통계를 나타내는 __Stat_Total__ 종류 항목이 정확히 한 개 있습니다. 각 통계 항목에는 다음과 같은 속성이 있습니다.

  • count: 통계에서 인식된 항목 수(긴 정수)
  • bytes: 이 통계 항목의 총 크기(긴 정수)
  • timestamp: 통계가 최근 업데이트된 시간(날짜-시간 값)

일부 통계 종류에는 아래에 나열된 추가 속성도 포함됩니다.

애플리케이션은 google.appengine.ext.ndb.stats 패키지에서 제공한 모델링 클래스를 사용하여 통계 항목에 액세스할 수 있습니다.

from google.appengine.ext.ndb import stats

global_stat = stats.GlobalStat.query().get()
print 'Total bytes stored: %d' % global_stat.bytes
print 'Total entities stored: %d' % global_stat.count

통계 시스템이 새로운 통계 항목을 만들면 기존 통계 항목이 즉시 삭제되지 않습니다. 통계 보기의 일관성을 유지하는 가장 좋은 방법은 최신 timestampGlobalStat 항목을 쿼리한 후 다른 통계 항목을 가져올 때 이 타임스탬프 값을 필터로 사용하는 것입니다.

통계 항목은 계산된 통계 값에 포함됩니다. 통계 항목은 애플리케이션에서 사용되는 고유한 종류와 속성 이름 수만큼 공간을 사용합니다.

통계 시스템은 각 네임스페이스별 통계도 만듭니다. 애플리케이션이 Datastore 네임스페이스를 사용하지 않으면 네임스페이스별 통계가 생성되지 않습니다. 네임스페이스별 통계는 통계가 지정된 네임스페이스에서 확인할 수 있습니다. 네임스페이스별 통계의 종류 이름은 프리픽스 __Stat_Ns_로 시작하고 애플리케이션 전반의 통계 종류에 해당되는 동일한 서픽스로 끝납니다.

수천 개의 네임스페이스, 종류 또는 속성 이름이 포함된 애플리케이션에는 수많은 통계 항목이 필요합니다. 통계 저장 및 업데이트의 오버헤드를 합리적인 수준으로 유지하도록 Datastore는 다음 순서에 따라 통계 항목을 점진적으로 삭제합니다.

  • 네임스페이스별, 종류별, 속성별 통계: __Stat_Ns_PropertyName_Kind__, __Stat_Ns_PropertyType_PropertyName_Kind__
  • 종류별 및 속성별 통계: __Stat_PropertyName_Kind__, __Stat_PropertyType_PropertyName_Kind__
  • 네임스페이스별, 종류별 통계: __Stat_Ns_Kind__, __Stat_Ns_Kind_IsRootEntity__, __Stat_Ns_Kind_NotRootEntity__, __Stat_Ns_PropertyType_Kind__
  • 종류별 통계: __Stat_Kind__, __Stat_Kind_IsRootEntity__, __Stat_Kind_NotRootEntity__, __Stat_PropertyType_Kind__
  • 네임스페이스별 통계: __Stat_Namespace__, __Stat_Ns_Kind_CompositeIndex__, __Stat_Ns_PropertyType__, __Stat_Ns_Total__

요약 통계 항목(__Stat_Kind_CompositeIndex__, __Stat_PropertyType__, __Stat_Total__)은 절대 삭제되지 않습니다.

사용 가능한 통계의 전체 목록은 다음과 같습니다.

통계 통계 항목 종류 설명
모든 항목 __Stat_Total__
Python 클래스: GlobalStat
네임스페이스별 항목:
__Stat_Ns_Total__
Python 클래스: NamespaceGlobalStat
모든 항목. 추가 속성:

entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
builtin_index_bytes: 바이트 단위로 측정된 내장 색인 항목의 저장용량
builtin_index_count: 내장 색인 항목 수
composite_index_bytes: 바이트 단위로 측정된 복합 색인 항목의 저장용량
composite_index_count: 복합 색인 항목 수
네임스페이스의 모든 항목 __Stat_Namespace__
Python 클래스: NamespaceStat
__Stat_Namespace__ 항목은 각 네임스페이스에 대해 생성되며 비어 있는 문자열 네임스페이스에서만 확인됩니다.
네임스페이스의 모든 항목

subject_namespace: 나타내는 네임스페이스(문자열)
entity_bytes바이트 단위로 측정된 항목 테이블의 저장용량
builtin_index_bytes: 바이트 단위로 측정된 내장 색인 항목의 저장용량
builtin_index_count: 내장 색인 항목 수
composite_index_bytes: 바이트 단위로 측정된 복합 색인 항목의 저장용량
composite_index_count: 복합 색인 항목 수
애플리케이션에서 정의된 색인의 모든 항목 __Stat_Kind_CompositeIndex__
네임스페이스별 항목: __Stat_Ns_Kind_CompositeIndex__

Python 클래스: KindStat
복합 색인 테이블의 항목(저장된 각 항목 종류당 하나의 통계 항목). 추가 속성:

index_id, 색인 ID
kind_name: 나타내는 종류 이름(문자열)
종류 항목 __Stat_Kind__
Python 클래스: KindStat
네임스페이스별 항목:
__Stat_Ns_Kind__
Python 클래스: NamespaceKindStat
종류의 항목(저장된 각 항목 종류당 하나의 통계 항목) 추가 속성:

kind_name, 나타내는 종류 이름(문자열)
entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
builtin_index_bytes: 바이트 단위로 측정된 내장 색인 항목의 저장용량
builtin_index_count: 내장 색인 항목 수
composite_index_bytes: 바이트 단위로 측정된 복합 색인 항목의 저장용량
composite_index_count: 복합 색인 항목 수
종류의 루트 항목 __Stat_Kind_IsRootEntity__
Python 클래스: KindRootEntityStat
네임스페이스별 항목:
__Stat_Ns_Kind_IsRootEntity__
Python 클래스: NamespaceKindRootEntityStat
항목 그룹 루트 항목(상위 없음)인 종류 항목(저장된 항목의 각 종류당 하나의 통계 항목). 추가 속성:

kind_name, 나타내는 종류 이름(문자열)
entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
종류의 비 루트 항목 __Stat_Kind_NotRootEntity__
Python 클래스: KindNotRootEntityStat
네임스페이스별 항목:
__Stat_Ns_Kind_NotRootEntity__
Python 클래스: NamespaceKindNotRootEntityStat
항목 그룹 루트 항목(상위 있음)이 아닌 종류 항목(저장된 항목의 각 종류당 하나의 통계 항목). 추가 속성:

kind_name, 나타내는 종류 이름(문자열)
entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
유형 속성 __Stat_PropertyType__
Python 클래스: PropertyTypeStat
네임스페이스별 항목:
__Stat_Ns_PropertyType__
Python 클래스: NamespacePropertyTypeStat
모든 항목의 값 유형 속성(값 유형당 통계 항목 한 개). 추가 속성:

property_type, 값 유형 이름(문자열)
entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
builtin_index_bytes: 바이트 단위로 측정된 내장 색인 항목의 저장용량
builtin_index_count: 내장 색인 항목 수
종류별 유형 속성 __Stat_PropertyType_Kind__
Python 클래스: KindPropertyTypeStat
네임스페이스별 항목:
__Stat_Ns_PropertyType_Kind__
Python 클래스: NamespaceKindPropertyTypeStat
특정 종류 항목 전반에 적용되는 값 유형 속성(값 유형 및 종류 조합당 하나의 통계 항목). 추가 속성:

property_type, 값 유형 이름(문자열)
kind_name: 나타내는 종류 이름(문자열)
entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
builtin_index_bytes: 바이트 단위로 측정된 내장 색인의 저장용량
builtin_index_count: 내장 색인 항목 수
이름이 포함된 속성 __Stat_PropertyName_Kind__
Python 클래스: KindPropertyNameStat
네임스페이스별 항목:
__Stat_Ns_PropertyName_Kind__
Python 클래스: NamespaceKindPropertyNameStat
특정 종류의 항목 전반에 이름을 지정하는 속성(고유한 속성 이름 및 종류 조합당 하나의 통계 항목). 추가 속성:

property_name, 속성 이름(문자열)
kind_name: 나타내는 종류 이름(문자열)
entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
builtin_index_bytes: 바이트 단위로 측정된 내장 색인 항목의 저장용량
builtin_index_count: 내장 색인 항목 수
이름이 포함된 유형 속성 __Stat_PropertyType_PropertyName_Kind__
Python 클래스: KindPropertyNamePropertyTypeStat
네임스페이스별 항목:
__Stat_Ns_PropertyType_PropertyName_Kind__
Python 클래스: NamespaceKindPropertyNamePropertyTypeStat
특정 종류 항목 전반에 특정 이름 및 특정 값 유형을 적용하는 속성(Datastore에 존재하는 속성 이름, 값 유형, 종류 조합당 하나의 통계 항목). 추가 속성:

property_type, 값 유형 이름(문자열)
property_name, 속성 이름(문자열)
kind_name, 나타내는 종류 이름(문자열)
entity_bytes: 바이트 단위로 측정된 항목 테이블의 저장용량
builtin_index_bytes: 바이트 단위로 측정된 내장 색인 항목의 저장용량
builtin_index_count: 내장 색인 항목 수

일부 통계는 이름별 Datastore 속성 값 유형을 문자열로 참조합니다. 이러한 이름은 다음과 같습니다.

  • "Blob"
  • "BlobKey"
  • "Boolean"
  • "Category"
  • "Date/Time"
  • "Email"
  • "Float"
  • "GeoPt"
  • "IM"
  • "Integer"
  • "Key"
  • "Link"
  • "NULL"
  • "PhoneNumber"
  • "PostalAddress"
  • "Rating"
  • "ShortBlob"
  • "String"
  • "Text"
  • "User"