몇 가지 도구와 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'와 같은 표현 이름 목록에 매핑하는 사전을 반환합니다.
이러한 함수에는 쿼리를 특정 범위로 제한하는 데 사용할 수 있는 선택적 인수 start와 end가 있습니다. 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
통계 시스템이 새로운 통계 항목을 만들면 기존 통계 항목이 즉시 삭제되지 않습니다. 통계 보기의 일관성을 유지하는 가장 좋은 방법은 최신 timestamp
로 GlobalStat
항목을 쿼리한 후 다른 통계 항목을 가져올 때 이 타임스탬프 값을 필터로 사용하는 것입니다.
통계 항목은 계산된 통계 값에 포함됩니다. 통계 항목은 애플리케이션에서 사용되는 고유한 종류와 속성 이름 수만큼 공간을 사용합니다.
통계 시스템은 각 네임스페이스별 통계도 만듭니다. 애플리케이션이 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"