나그네소
Goldilocks Cluster Performance View 본문
[ table sharding key 조회 ]
gSQL> select * from user_shard_key_columns;
TABLE_SCHEMA TABLE_NAME COLUMN_NAME COLUMN_POSITION
------------ ---------- ----------- ---------------
PUBLIC T1 C1 1
PUBLIC T2 C1 1
[ local member 확인 ]
select local_member_name() from dual;
==============================
LOCAL_MEMBER_NAME()
G1N1
[ \ddl_cluster ]
cluster 정보 출력.
[ sharding key, 속성 확인 ]
gSQL> select SHARDING_STRATEGY from DEFINITION_SCHEMA.TABLES where table_name='CUSER';
SHARDING_STRATEGY
-----------------
HASH SHARDING
[shard 배치 정보]
SELECT group_name, COUNT(*) AS shard_count
FROM USER_TAB_SHARDS
WHERE TABLE_NAME = 'T1'
GROUP BY group_name;
- data 분배 정보
SELECT CLUSTER_GROUP_NAME, COUNT(*) AS row_count
FROM t1
GROUP BY CLUSTER_GROUP_NAME;
[ X$CLUSTER_DISPATCHER ]
gSQL> select * from X$CLUSTER_DISPATCHER ;
DISPATCHER_ID RX_BYTES TX_BYTES RX_JOBS TX_JOBS
------------- -------- -------- ------- -------
0 221691 80043 3224 1620
0 80262 221691 3231 1632
RX_BYTES : dispatcher받는량 (byte) / Member 와 Member간의 cdispatcher간의 받는량을 확인 할 수 있다.
TX_BYTES : dispatcher보낸량 (byte) / Member 와 Member간의 cdispatcher간의 보낸량을 확인 할 수 있다.
정리 : 실제 1초 기록 60초후 기록 60-1초간의 받은/보낸 전송량을 측정 하여 비교 할 수 있을 것으로 보인다.
[X$CLUSTER_SERVER]
gSQL> select * from X$CLUSTER_SERVER;
NAME ID OS_PROC_ID PROCESSED_JOBS NUMA_STREAM_ID
----------- -- ---------- -------------- --------------
MASTER 0 5835 1 -1
MASTER 1 5837 2 -1
MASTER 2 5839 2 -1
MASTER 3 5841 2 -1
MASTER 4 5843 1 -1
MASTER 5 5845 0 -1
MASTER 6 5847 1 -1
MASTER 7 5849 1 -1
MASTER 8 5851 1 -1
MASTER 9 5853 0 -1
SYNC 0 5855 0 -1
SYNC 1 5857 0 -1
SYNC 2 5859 0 -1
COMMIT 0 5863 1 -1
COORDINATOR 0 5865 1537 -1
URGENT 0 5861 0 -1
MASTER 0 62408 5 -1
MASTER 1 62410 7 -1
MASTER 2 62412 5 -1
MASTER 3 62414 8 -1
MASTER 4 62416 6 -1
MASTER 5 62418 5 -1
MASTER 6 62420 9 -1
MASTER 7 62422 6 -1
MASTER 8 62424 7 -1
MASTER 9 62426 4 -1
SYNC 0 62428 0 -1
SYNC 1 62430 0 -1
SYNC 2 62432 0 -1
COMMIT 0 62436 0 -1
COORDINATOR 0 62438 1524 -1
URGENT 0 62434 0 -1
[X$CL_SYSTEM_INFO]
global commit 조회 하는 view
gSQL> select * from X$CL_SYSTEM_INFO;
NAME VALUE CATEGORY COMMENTS
-------------------- ----- -------- -----------------------------------------
GLOBAL_COMMIT_COUNT 0 0 globally committed count
CM_BUFFER_MISS_COUNT 0 0 latch miss count on communication buffer
FAILOVER_ENV_ID 46 0 environment identifier of cluster monitor
GLOBAL_COMMIT_COUNT 0 0 globally committed count
CM_BUFFER_MISS_COUNT 0 0 latch miss count on communication buffer
FAILOVER_ENV_ID 46 0 environment identifier of cluster monitor
CM_BUFFER_MISS_COUNT : CM Buffer에 데이터를 넣기 위하여 spin lock try 하는데 이에 실패 시 count가
증가 한다. hash type이나 replica에서 전송 시 위의 값이 증가 한다면 성능이 지연 될 수 있다. 그리고 session이
여러개 한꺼번에 접속 시 증가 한다.
[X$CLUSTER_LOCATION]
gSQL> select * from X$CLUSTER_LOCATION ;
MEMBER_NAME HOST PORT
----------- ------------- -----
G1N1 192.168.0.222 10101
[X$CLUSTER_MEMBER]
cluster 관계가 정상 적으로 설정 되어 있는지 확인.
gSQL> select * from X$CLUSTER_MEMBER ;
MEMBER_ID MEMBER_POSITION LOGICAL_CONNECTION PHYSICAL_CONNECTION SERIAL IS_GLOBAL_COORD IS_DOMAIN_COORD LOCAL_SCN AGABLE_STMT_SCN
--------- --------------- ------------------ ------------------- ------ --------------- --------------- --------- ---------------
1 0 ACTIVE ACTIVE 2 TRUE TRUE 0.473.10 0.473.10
1 row selected.
[x$instance]
gSQL> select * from x$instance;
VERSION STARTUP_TIME STATUS OS_USER_ID IS_CLUSTER LOCAL_GROUP_ID LOCAL_MEMBER_ID LOCAL_MEMBER_NAME LOCAL_MEMBER_POSITION
--------------------------------- -------------------------- ------ ---------- ---------- -------------- --------------- ----------------- ---------------------
Debug Trunk.3.1.0 revision(19944) 2016-11-04 00:53:24.666821 OPEN 507 TRUE 2 2 G2N1 1
Debug Trunk.3.1.0 revision(19944) 2016-11-04 00:46:42.611737 OPEN 503 TRUE 1 1 G1N1 0
2 rows selected.
[X$CLUSTER_QUEUE]
gSQL> select * from X$CLUSTER_QUEUE ;
NAME ID QUEUED FULL_COUNT TOTALQ
-------------- -- ------ ---------- ------
MASTER_IN 0 0 0 11
MASTER_OUT 0 0 0 1276
SYNC_IN 0 0 0 0
SYNC_IN 1 0 0 0
SYNC_IN 2 0 0 0
COMMIT_IN 0 0 0 1
COORDINATOR_IN 0 0 0 0
URGENT_IN 0 0 0 1251
RECOVER_OUT 0 0 0 1
MASTER_IN 0 0 0 23
MASTER_OUT 0 0 0 1285
SYNC_IN 0 0 0 0
SYNC_IN 1 0 0 0
SYNC_IN 2 0 0 0
COMMIT_IN 0 0 0 0
COORDINATOR_IN 0 0 0 0
URGENT_IN 0 0 0 1238
RECOVER_OUT 0 0 0 1
[X$CONTROLFILE_CLUSTER_MEMBER]
gSQL> select * from X$CONTROLFILE_CLUSTER_MEMBER;
MEMBER_NAME IS_LOCAL_MEMBER GROUP_ID MEMBER_ID MEMBER_POSITION
----------- --------------- -------- --------- ---------------
G1N1 FALSE 1 1 0
G2N1 TRUE 2 2 1
G1N1 TRUE 1 1 0
G2N1 FALSE 2 2 1
4 rows selected.
[X$CL_LATENCY_STAT]
cdispatcher에 패킷 전송 시간 확인
gSQL> select * from X$CL_LATENCY_STAT@local where TOTAL_LATENCY > 0;
SESSION_ID COMMAND_TYPE REQ_QUEUEING1 REQ_TRANSMISSION REQ_QUEUEING2
---------- ------------ ------------- ---------------- -------------
REQ_PROCESSING RES_QUEUEING1 RES_TRANSMISSION RES_QUEUEING2 TOTAL_LATENCY
-------------- ------------- ---------------- ------------- -------------
4 5 2 58 36
23 1 58 7 186
4 5 48 408 35
23 1 408 29 953
4 5 2 639 36
25 1 639 28 1370
4 5 50 152 35
22 1 152 10 422
4 5 2 1273983 40
26 1 1273983 30 2548065
4 5 1 77 7
--> 전송 시간이 엄청 많네 (transmission 마이크로초) 요걸로 현재 네트워크에 문제가 있다고 판단할 수 있다.
[local member 확인]
select local_member_name() from dual;
LOCAL_MEMBER_NAME()
=====================
G1N1
gSQL> select LOCAL_GROUP_NAME() from dual;
LOCAL_GROUP_NAME()
------------------
G2
gSQL> select LOCAL_MEMBER_ID() from dual;
LOCAL_MEMBER_ID()
-----------------
2
gSQL> select LOCAL_GROUP_ID() from dual;
LOCAL_GROUP_ID()
----------------
2
[ 스키마 확인 ]
gSQL> select * from definition_schema.catalog_name@local;
CATALOG_ID CATALOG_NAME IS_CLUSTER LOCAL_MEMBER_NAME CHARACTER_SET_ID
---------- ------------ ---------- ----------------- ----------------
CHARACTER_SET_NAME CHAR_LENGTH_UNITS_ID CHAR_LENGTH_UNITS TIME_ZONE_INTERVAL
------------------ -------------------- ----------------- ------------------
DEFAULT_DATA_TABLESPACE_ID DEFAULT_TEMP_TABLESPACE_ID CREATED_TIME
-------------------------- -------------------------- --------------------------
MODIFIED_TIME COMMENTS
-------------------------- --------------
1 TEST_DB TRUE G10N 1
UTF8 2 OCTETS +00 09:00:00
2 3 2016-11-04 16:48:31.380000
2016-11-04 16:48:31.380000 sundb database
1 row selected.
1) DEFINITION_SCHEMA.CLUSTER_GROUP
column | type | 비고 |
GROUP_ID | BIGINT | primary key |
GROUP_NAME | VARCHAR(128) | unique key |
ORDINAL_POSITION | INTEGER | 1-base |
CREATED_TIME | TIMESTAMP(2) | not null |
MODIFIED_TIME | TIMESTAMP(2) | not null |
COMMENTS | VARCHAR(1024) |
gSQL> select * from DEFINITION_SCHEMA.CLUSTER_GROUP;
GROUP_ID GROUP_NAME CREATED_TIME MODIFIED_TIME COMMENTS
-------- ---------- -------------------------- -------------------------- --------
1 G1 2016-09-20 17:40:53.030000 2016-09-20 17:40:53.030000 null
2 G2 2016-09-20 17:40:55.380000 2016-09-20 17:40:55.380000 null
1 G1 2016-09-20 17:40:53.030000 2016-09-20 17:40:53.030000 null
2 G2 2016-09-20 17:40:55.380000 2016-09-20 17:40:55.380000 null
2) DEFINITION_SCHEMA.CLUSTER_MEMBER
column | type | 비고 |
GROUP_ID | BIGINT | foreign key references ( SERVER_GROUP.GROUP_ID ) |
MEMBER_ID | BIGINT | primary key |
MEMBER_NAME | VARCHAR(128) | unique key |
ORDINAL_POSITION | INTEGER | 1-base |
IP_ADDRESS | VARCHAR(128) | ip address 가 변경되면 어떡하지? |
CLUSTER_PORT | INTEGER | |
CREATED_TIME | TIMESTAMP(2) | |
MODIFIED_TIME | TIMESTAMP(2) | |
COMMENTS | VARCHAR(1024) |
gSQL> select * from DEFINITION_SCHEMA.CLUSTER_MEMBER2 ;
GROUP_ID MEMBER_ID MEMBER_NAME MEMBER_POSITION IS_LEFT CREATED_TIME MODIFIED_TIME COMMENTS
-------- --------- ----------- --------------- ------- -------------------------- -------------------------- --------
1 1 G1N1 0 FALSE 2016-09-20 17:40:53.030000 2016-09-20 17:40:53.030000 null
2 2 G2N1 1 FALSE 2016-09-20 17:40:55.380000 2016-09-20 17:40:55.380000 null
1 1 G1N1 0 FALSE 2016-09-20 17:40:53.030000 2016-09-20 17:40:53.030000 null
2 2 G2N1 1 FALSE 2016-09-20 17:40:55.380000 2016-09-20 17:40:55.380000 null
3) DEFINITION_SCHEMA.LOCAL_CLUSTER_MEMBER
column | type | 비고 |
GROUP_ID | BIGINT | my server group id, references CLUSTER_GROUP.GROUP_ID |
MEMBER_ID | BIGINT | my server node id, references CLUSTER_MEMBER.MEMBER_ID |
gSQL> select * from DEFINITION_SCHEMA.LOCAL_CLUSTER_MEMBER;
MAX_GROUP_ID MAX_MEMBER_ID NODE_GROUP_ID NODE_MEMBER_ID CLUSTER_SIGNATURE
------------ ------------- ------------- -------------- --------------------------------
2 2 1 1 F0A935707F0D11E687997199B2A884CE
2 2 2 2 F0A935707F0D11E687997199B2A884CE
[ data 분배 정보 ]
SELECT CLUSTER_GROUP_NAME, COUNT(*) AS row_count
FROM t1
GROUP BY CLUSTER_GROUP_NAME;
[ table shard 정보 ]
gSQL> select table_name, SHARDING_STRATEGY from definition_schema.tables where table_name='CUSER';
TABLE_NAME SHARDING_STRATEGY
---------- -----------------
CUSER HASH SHARDING
CUSER HASH SHARDING
CUSER HASH SHARDING
[ shard key 정보 출력 ]
select o.username, t.table_name, c.column_name, t. SHARDING_STRATEGY, a.ORDINAL_POSITION
from definition_schema.columns@local c, DEFINITION_SCHEMA.SHARD_KEY_COLUMN_USAGE@local a, definition_schema.tables@local t, all_users o
where c.COLUMN_ID = a.COLUMN_ID and a.table_id = t.table_id and a.owner_id = o.user_id;
USERNAME TABLE_NAME COLUMN_NAME SHARDING_STRATEGY ORDINAL_POSITION
-------- ---------- ----------- ----------------- ----------------
TEST CUSER USER_ID HASH SHARDING 1
TEST T1 C1 HASH SHARDING 1
--> cluster 정보 출력
[ DEFINITION_SCHEMA.SHARD_LIST ]
cluster list에 대한 정보를 확인 할 수 있다.
[ DEFINITION_SCHEMA.SHARD_RANGE ]
cluster range 관련 된 정보를 확인 할 수 있다.
gSQL> select * from DEFINITION_SCHEMA.SHARD_RANGE@local;
OWNER_ID SCHEMA_ID TABLE_ID SHARD_NO SHARD_NAME GROUP_ID VALUE_STRING VALUE_COUNT VALUE_BUFFER_SIZE VALUE_BINARY
-------- --------- -------- -------- ---------- -------- ------------ ----------- ----------------- ----------------------------------------------------
6 7 100283 0 S1 1 ( 2 ) 1 8 0700000008000000020000000000000070953ED9097F0000C103
6 7 100283 1 S2 2 ( 3 ) 1 8 07000000080000000200000000000000B8993ED9097F0000C104
6 7 100283 2 S3 3 ( 4 ) 1 8 07000000080000000200000000000000009E3ED9097F0000C105
6 7 100283 3 S4 3 ( MAXVALUE ) 1 1 07000000010000000000000000000000C89E3ED9097F0000
[ DEFINITION_SCHEMA.CLUSTER_GROUP ]
cluster group에 대한 정보를 확인 할 수 있다.
gSQL> select * from DEFINITION_SCHEMA.CLUSTER_GROUP@local;
GROUP_ID GROUP_NAME CREATED_TIME MODIFIED_TIME COMMENTS
-------- ---------- -------------------------- -------------------------- --------
1 G1 2016-11-11 20:20:53.100000 2016-11-11 20:20:53.100000 null
2 G2 2016-11-11 20:20:59.960000 2016-11-11 20:20:59.960000 null
3 G3 2016-11-11 20:26:58.150000 2016-11-11 20:26:58.150000 null
[ definition_schema.cluster_member ]
cluster member 정보에 대하여 확인 할 수 있다.
gSQL> select group_id,member_id,member_name,member_position from definition_schema.cluster_member@local;
GROUP_ID MEMBER_ID MEMBER_NAME MEMBER_POSITION
-------- --------- ----------- ---------------
1 1 G1N1 0
2 2 G2N1 1
3 3 G3N1 2
[ DEFINITION_SCHEMA.LOCAL_CLUSTER_MEMBER ]
local group member에 대한 정보를 확인 할 수 있다.
gSQL> select * from DEFINITION_SCHEMA.LOCAL_CLUSTER_MEMBER@local;
MAX_GROUP_ID MAX_MEMBER_ID NODE_GROUP_ID NODE_MEMBER_ID CLUSTER_SIGNATURE
------------ ------------- ------------- -------------- --------------------------------
3 3 2 2 E83AB924A80011E686D739D90B7DF6EC
[ DEFINITION_SCHEMA.SHARD_KEY_COLUMN_USAGE ]
사용되는 shard key 값에 대한 정보를 확인 할 수 있다.
gSQL> select * from DEFINITION_SCHEMA.SHARD_KEY_COLUMN_USAGE@local ;
OWNER_ID SCHEMA_ID TABLE_ID COLUMN_ID ORDINAL_POSITION
-------- --------- -------- --------- ----------------
6 7 100281 102832 1
6 7 100282 102844 1
- 위의 schema 이용하여 아래의 결과 도출
select o.username, t.table_name, c.column_name, t. SHARDING_STRATEGY, a.ORDINAL_POSITION
from definition_schema.columns@local c, DEFINITION_SCHEMA.SHARD_KEY_COLUMN_USAGE@local a, definition_schema.tables@local t, all_users o
where c.COLUMN_ID = a.COLUMN_ID and a.table_id = t.table_id and a.owner_id = o.user_id;
--> cluster 정보 출력
[ OFFLINE 된 테이블 확인 ]
select * from TABLE_MEMBER_MAP@local;
gSQL> select * from TABLE_MEMBER_MAP@local;
OWNER_ID SCHEMA_ID TABLE_ID GROUP_ID MEMBER_ID IS_OFFLINE
-------- --------- -------- -------- --------- ----------
2 3 100131 1 1 FALSE
2 3 100131 4 4 FALSE
2 3 100131 5 5 FALSE
2 3 100131 6 6 FALSE
2 3 100137 1 1 FALSE
2 3 100137 4 4 FALSE
2 3 100137 5 5 FALSE
2 3 100137 6 6 FALSE
2 3 100131 2 2 TRUE
2 3 100131 3 3 TRUE
2 3 100134 2 2 TRUE
2 3 100134 3 3 TRUE
2 3 100137 2 2 TRUE
2 3 100137 3 3 TRUE
2 7 100325 2 2 TRUE
2 7 100325 3 3 TRUE
2 3 100134 1 1 FALSE
2 3 100134 4 4 FALSE
2 3 100134 5 5 FALSE
2 3 100134 6 6 FALSE
2 7 100325 1 1 FALSE
2 7 100325 4 4 FALSE
2 7 100325 5 5 FALSE
2 7 100325 6 6 FALSE
--> IS_OFFLINE에 TRUE로 되어 있으면 테이블이 OFF로 되어 있는 것이다. 이 때에는 rebalance를 하여
정상화 시켜 준다.
gSQL> alter database rebalance;
Database altered.
[ USER_IND_PLACE ]
gSQL> select * from USER_IND_PLACE@local;
INDEX_SCHEMA INDEX_NAME TABLE_OWNER TABLE_SCHEMA TABLE_NAME GROUP_ID GROUP_NAME MEMBER_ID MEMBER_NAME DISTINCT_KEYS SAMPLE_SIZE BLOCKS LAST_ANALYZED
------------ ------------------------- ----------- ------------ ---------- -------- ---------- --------- ----------- ------------- ----------- ------ -------------
PUBLIC CUSER_PK_IDX TEST PUBLIC CUSER 2 G2 2 G2N1 null null 64 null
PUBLIC CDRLOAD_PRIMARY_KEY_INDEX TEST PUBLIC CDRLOAD 2 G2 2 G2N1 null null 64 null
--> 정확히 뭔지 모르겠음?????
[ USER_COL_PLACE ]
cluster column 정보를 확인 할 수 있는 것으로 보임 정확히는 모르겠음 ???
gSQL> select * from USER_COL_PLACE@local;
TABLE_SCHEMA TABLE_NAME COLUMN_NAME GROUP_ID GROUP_NAME MEMBER_ID MEMBER_NAME MEMBER_OFFLINE NUM_DISTINCT LOW_VALUE HIGH_VALUE NUM_NULLS AVG_COL_LEN SAMPLE_SIZE LAST_ANALYZED
------------ ---------- --------------- -------- ---------- --------- ----------- -------------- ------------ --------- ---------- --------- ----------- ----------- -------------
PUBLIC CUSER USER_ID 1 G1 1 G1N1 FALSE null null null null null null null
PUBLIC CUSER USER_ID 2 G2 2 G2N1 FALSE null null null null null null null
PUBLIC CUSER USER_ID 3 G3 3 G3N1 FALSE null null null null null null null
PUBLIC CUSER ACCT_ID 1 G1 1 G1N1 FALSE null null null null null null null
PUBLIC CUSER ACCT_ID 2 G2 2 G2N1 FALSE null null null null null null null
PUBLIC CUSER ACCT_ID 3 G3 3 G3N1 FALSE null null null null null null null
PUBLIC CUSER IMSI 1 G1 1 G1N1 FALSE null null null null null null null
PUBLIC CUSER IMSI 2 G2 2 G2N1 FALSE null null null null null null null
PUBLIC CUSER IMSI 3 G3 3 G3N1 FALSE null null null null null null null
PUBLIC CUSER MSISDN 1 G1 1 G1N1 FALSE null null null null null null null
PUBLIC CUSER MSISDN 2 G2 2 G2N1 FALSE null null null null null null null
PUBLIC CUSER MSISDN 3 G3 3 G3N1 FALSE null null null null null null null
PUBLIC CUSER HOME_CITY 1 G1 1 G1N1 FALSE null null null null null null null
PUBLIC CUSER HOME_CITY 2 G2 2 G2N1 FALSE null null null null null null null
[ USER_TAB_PLACE ]
cluster 에서 현재 사용 하고 있는 테이블에 대한 상태를 확인 할 수 있다.
gSQL> select * from USER_TAB_PLACE@local;
TABLE_SCHEMA TABLE_NAME GROUP_ID GROUP_NAME MEMBER_ID MEMBER_NAME MEMBER_OFFLINE SCN NUM_ROWS BLOCKS LAST_ANALYZED
------------ ---------- -------- ---------- --------- ----------- -------------- ---------- -------- ------ -------------
PUBLIC CUSER 2 G2 2 G2N1 FALSE 3750.0.873 null 512 null
PUBLIC T1 2 G2 2 G2N1 FALSE 3751.0.873 null 512 null
PUBLIC CDRLOAD 2 G2 2 G2N1 FALSE 3754.0.874 null 64 null
PUBLIC T3 2 G2 2 G2N1 FALSE 3755.0.874 null 64 null
--> MEMBER_OFFLINE : FALSE으면 현재 정상 적인 상태로 분배가 되어 있다는 것을 알 수 있다.
만약 2by2로 구성 후 2by1에서 비정상 종료가 발생 되고 다시 2by1 restart 한 후 상태를 보면
해당 MEMBER_OFFLINE : TRUE로 되어 있어 2by2와의 balance가 필요한 상태가 되어 있다는 것을
위의 정보를 확인 할 수 있으며 위의 TRUE->FALE 상태로 alter system rebalance 명령어로 맞츄어
주면 다시 FALSE 상태로 변경이 되면 이후 부터 정상 적으로 업무 처리를 진행 할 수 있다.
[ USER_CLUSTER_TABLES ]
cluster table에 대한 정보를 확인 할 수 있다.
select * from USER_CLUSTER_TABLES;
TABLE_SCHEMA TABLE_NAME SHARD_STRATEGY SHARD_PLACEMENT SHARD_COUNT SHARD_KEY_COUNT
------------ ---------- -------------- ---------------- ----------- ---------------
PUBLIC CUSER HASH SHARDING AT CLUSTER WIDE 24 1
PUBLIC T1 HASH SHARDING AT CLUSTER WIDE 24 1
PUBLIC CDRLOAD RANGE SHARDING AT CLUSTER GROUP 4 1
PUBLIC T3 LIST SHARDING AT CLUSTER GROUP 3 1
[ USER_SHARD_KEY_COLUMNS ]
cluster column에 대한 정보를 확인 할 수 있다.
gSQL> select * from USER_SHARD_KEY_COLUMNS;
TABLE_SCHEMA TABLE_NAME COLUMN_NAME COLUMN_POSITION
------------ ---------- ----------- ---------------
PUBLIC CUSER USER_ID 1
PUBLIC T1 C1 1
PUBLIC CDRLOAD NODE_NUM 1
PUBLIC T3 CITY 1
[ USER_TAB_SHARDS ]
cluster shard key에 관련 된 정보를 확인 할 수 있다.
gSQL> select * from USER_TAB_SHARDS
TABLE_SCHEMA TABLE_NAME SHARD_STRATEGY SHARD_NAME SHARD_NUMBER SHARD_DEFINITION GROUP_ID GROUP_NAME
------------ ---------- -------------- ------------ ------------ ------------------------------------ -------- ----------
PUBLIC CUSER HASH SHARDING SHARD_000000 0 null 1 G1
PUBLIC CUSER HASH SHARDING SHARD_000001 1 null 2 G2
PUBLIC CUSER HASH SHARDING SHARD_000002 2 null 3 G3
PUBLIC CUSER HASH SHARDING SHARD_000003 3 null 2 G2
SELECT group_name, COUNT(*) AS shard_count
FROM USER_TAB_SHARDS
WHERE TABLE_NAME = 'T1'
GROUP BY group_name;
GROUP_NAME SHARD_COUNT
---------- -----------
G2 8
G3 8
G1 8
[ table sharding key 조회 ]
gSQL> select * from user_shard_key_columns;
TABLE_SCHEMA TABLE_NAME COLUMN_NAME COLUMN_POSITION
------------ ---------- ----------- ---------------
PUBLIC T1 C1 1
PUBLIC T2 C1 1
[ user_tab_place ]
사용자가 접근 가능한 cluster table 의 배치 정보
gSQL> select * from user_tab_place where table_name = 'T1';
TABLE_SCHEMA TABLE_NAME GROUP_ID GROUP_NAME MEMBER_ID MEMBER_NAME MEMBER_OFFLINE
------------ ---------- -------- ---------- --------- -----------
--------------
SCN NUM_ROWS BLOCKS LAST_ANALYZED
--------- -------- ------ -------------
PUBLIC T1 1 G1 1 G1N1 FALSE
486.2.19 null 512 null
PUBLIC T1 1 G1 2 G1N2 FALSE
486.2.883 null 512 null
PUBLIC T1 2 G2 3 G2N1 FALSE
486.0.883 null 512 null
PUBLIC T1 2 G2 4 G2N2 FALSE
486.0.883 null 512 null
PUBLIC T1 3 G3 5 G3N1 FALSE
486.0.883 null 512 null
PUBLIC T1 3 G3 6 G3N2 TRUE
485.0.878 null 512 null
6 rows selected.
[ shard 배치 정보 ]
SELECT group_name, COUNT(*) AS shard_count
FROM USER_TAB_SHARDS
WHERE TABLE_NAME = 'T1'
GROUP BY group_name;
<< cluster view >>
1. CLUSTER_GROUP_ID Pseudo Column
CLUSTER_GROUP_ID pseudo column은 레코드 저장된 server의 Group 식별자를 반환한다.
gSQL> SELECT T1.C1, T1.CLUSTER_GROUP_ID FROM T1;
C1 T1.CLUSTER_GROUP_ID
-- -------------------
A 1
B 2
C 3
--> row 단위 cluster group 정보를 알 수 있다.
2. CLUSTER_MEMBER_ID Pseudo Column
CLUSTER_MEMBER_ID pseudo column은 레코드 저장된 server의 Member 식별자를 반환한다.
gSQL> SELECT T1.C1, T1.CLUSTER_MEMBER_ID FROM T1;
C1 T1.CLUSTER_MEMBER_ID
-- --------------------
A 1
B 3
C 5
--> row 단위 cluster member 정보를 알 수 있다.
3. CLUSTER_GROUP_NAME Pseudo Column
CLUSTER_GROUP_NAME pseudo column은 레코드 저장된 server의 Group 이름을 반환한다.
gSQL> SELECT T1.C1, T1.CLUSTER_GROUP_NAME FROM T1;
C1 T1.CLUSTER_GROUP_NAME
-- ---------------------
A G1
B G2
C G3
--> cluster group name 알 수 있다.
4. CLUSTER_MEMBER_NAME Pseudo Column
CLUSTER_MEMBER_NAME pseudo column은 레코드 저장된 server의 Member 이름을 반환한다.
gSQL> SELECT T1.C1, T1.CLUSTER_MEMBER_NAME FROM T1;
C1 T1.CLUSTER_MEMBER_NAME
-- ----------------------
A G1N1
B G2N1
C G3N1
--> cluster member name 알 수 있다.
<< dba_ view >>
DBA_CLUSTER : cluster 를 구성하는 cluster group, cluster member 의 객체 정보
DBA_CLUSTER_COMMENTS : cluster group 과 cluster member 의 주석 정보
<< ALL_ view >>
- ALL_CLUSTER_TABLES : 사용자가 접근 가능한 cluster table 의 정보
gSQL> select * from all_cluster_tables;
OWNER TABLE_SCHEMA TABLE_NAME SHARD_STRATEGY SHARD_PLACEMENT SHARD_COUNT SHARD_KEY_COUNT HAS_GSI
----- ----------------- ------------------------ -------------- --------------- ----------- --------------- -------
SYS DICTIONARY_SCHEMA DBC_TABLE_TYPE_INFO CLONED AT CLUSTER WIDE null null YES
SYS DICTIONARY_SCHEMA JDBC_CLIENT_PROPS CLONED AT CLUSTER WIDE null null YES
SYS DICTIONARY_SCHEMA IMPLEMENTATION_INFO_BASE CLONED AT CLUSTER WIDE null null YES
TEST PUBLIC T3 CLONED AT CLUSTER WIDE null null YES
TEST PUBLIC T4 CLONED AT CLUSTER WIDE null null YES
TEST PUBLIC T5 CLONED AT CLUSTER WIDE null null YES
- ALL_SHARD_KEY_COLUMNS : 사용자가 접근 가능한 cluster table 의 shard key column 정보
- ALL_TAB_PLACE : 사용자가 접근 가능한 cluster table 의 배치 정보
gSQL> select * from all_tab_place;
OWNER TABLE_SCHEMA TABLE_NAME GROUP_ID GROUP_NAME MEMBER_ID MEMBER_NAME MEMBER_OFFLINE SCN NUM_ROWS BLOCKS LAST_ANALYZED
----- ----------------- ------------------------ -------- ---------- --------- ----------- -------------- ---------- -------- ------ -------------
SYS DICTIONARY_SCHEMA DBC_TABLE_TYPE_INFO 1 G2 1 G2N1 FALSE 870.2.68 null 64 null
SYS DICTIONARY_SCHEMA DBC_TABLE_TYPE_INFO 2 G3 2 G3N1 FALSE 870.3.927 null 64 null
SYS DICTIONARY_SCHEMA JDBC_CLIENT_PROPS 1 G2 1 G2N1 FALSE 878.2.71 null 64 null
SYS DICTIONARY_SCHEMA JDBC_CLIENT_PROPS 2 G3 2 G3N1 FALSE 878.3.930 null 64 null
SYS DICTIONARY_SCHEMA IMPLEMENTATION_INFO_BASE 1 G2 1 G2N1 FALSE 887.2.78 null 64 null
SYS DICTIONARY_SCHEMA IMPLEMENTATION_INFO_BASE 2 G3 2 G3N1 FALSE 887.3.937 null 64 null
TEST PUBLIC T3 1 G2 1 G2N1 FALSE 562.1.30 null 64 null
TEST PUBLIC T3 2 G3 2 G3N1 FALSE 562.3.888 null 64 null
- ALL_TAB_SHARDS : 사용자가 접근 가능한 cluster table 의 shard 정보
[ cluster 유효 함수 ]
- LOCAL_GROUP_ID
사용자 질의를 받아 수행하는 Server에 대한 Cluster Group ID를 반환하는 함수
gSQL> SELECT LOCAL_GROUP_ID() FROM DUAL;
LOCAL_GROUP_ID()
----------------
1
- LOCAL_GROUP_NAME
사용자 질의를 받아 수행하는 Server에 대한 Cluster Group Name을 반환하는 함수
gSQL> SELECT LOCAL_GROUP_NAME() FROM DUAL;
LOCAL_GROUP_NAME()
------------------
G1
- LOCAL_MEMBER_ID
사용자 질의를 받아 수행하는 Server에 대한 Cluster Member ID를 반환하는 함수
gSQL> SELECT LOCAL_MEMBER_ID() FROM DUAL;
LOCAL_MEMBER_ID()
-----------------
1
- LOCAL_MEMBER_NAME
사용자 질의를 받아 수행하는 Server에 대한 Cluster Member Name을 반환하는 함수
gSQL> SELECT LOCAL_MEMBER_NAME() FROM DUAL;
LOCAL_MEMBER_NAME()
-------------------
G1N1
- ROWID_GRID_BLOCK_ID
GRID Block ID를 반환하는 함수
gSQL> SELECT C1, ROWID_GRID_BLOCK_ID( ROWID ) FROM T1;
C1 ROWID_GRID_BLOCK_ID( ROWID )
-- ----------------------------
1 52
2 52
3 52
- ROWID_GRID_BLOCK_SEQ
GRID Block Sequence를 반환하는 함수
gSQL> SELECT C1, ROWID_GRID_BLOCK_SEQ( ROWID ) FROM T1;
C1 ROWID_GRID_BLOCK_SEQ( ROWID )
-- -----------------------------
1 747465
2 747466
3 747467
GRID : global record id를 의미 하는데 global index에서 사용하기 위한 key를 말한다.
GRID 구조 : (memberid,member block id, member block sequence) 위와 같은 구조로 되어 있다.
위에서 ROWID_GRID_BLOCK_SEQ GRID에서 member lock sequence를 가져 올 때 사용한다.
- ROWID_MEMBER_ID
해당 Row에 대한 Member ID를 반환하는 함수
gSQL> SELECT C1, ROWID_MEMBER_ID( ROWID ) FROM T1;
C1 ROWID_MEMBER_ID( ROWID )
-- ------------------------
1 1
2 1
3 1
- ROWID_SHARD_ID
해당 Row에 대한 Shard ID를 반환하는 함수
gSQL> SELECT C1, ROWID_SHARD_ID( ROWID ) FROM T1;
C1 ROWID_SHARD_ID( ROWID )
-- -----------------------
1 0
2 1
3 2
- SHARD_GROUP_ID
[구문]
SHARD_GROUP_ID( table_name, shard_key_value [, ... ] )
[설명]
SHARD_GROUP_ID 함수는 table_name에 Shard Strategy가 정의된 경우 shard_key_value 값을 저장할 수 있는
Shard를 관리하는 Group ID를 반환한다.
입력인자 table_name은 identifier로 기술하여야 하며, table_name에 해당하는 객체가 Base Table이 아니거나
Shard Strategy가 정의되지 않은 경우 에러가 발생한다.
입력인자 shard_key_value는 table_name에 정의된 Shard Strategy의 Shard Key Column 순으로 나열되어야 한
다. shard_key_value 개수와 Shard Key Column 개수가 불일치할 경우 에러가 발생한다.
--> row data가 어느 group에 속해 있는지를 확인 할 수 있다. (좋은 정보이다.)
gSQL> select t1.c1 , shard_group_id(t1,t1.c1) from t1;
C1 SHARD_GROUP_ID(T1,T1.C1)
-- ------------------------
90 2
1 1
50 1
30 1
10 1
- SHARD_ID
[구문]
SHARD_ID( table_name, shard_key_value [, ... ] )
[설명]
SHARD_ID 함수는 table_name에 Shard Strategy가 정의된 경우 shard_key_value 값을 저장할 수 있는
Shard에 대한 ID를 반환한다. 입력인자 table_name은 identifier로 기술하여야 하며, table_name에
해당하는 객체가 Base Table이 아니거나 Shard Strategy가 정의되지 않은 경우 에러가 발생한다.
입력인자 shard_key_value는 table_name에 정의된 Shard Strategy의 Shard Key Column 순으로 나열되어야
한다. shard_key_value 개수와 Shard Key Column 개수가 불일치할 경우 에러가 발생한다.
--> 해당 row data가 어떤 shard 규칙에 포함 되어 있는지 알 수 있다.
gSQL> select t1.c1, shard_id(t1,t1.c1) from t1;
C1 SHARD_ID(T1,T1.C1)
-- ------------------
90 18
1 1
50 2
30 6
10 10
- STATEMENT_VIEW_SCN_DCN
현재 STATEMENT의 VIEW SCN 의 DCN(Domain Change Number) 값을 얻는다.
gSQL> SELECT STATEMENT_VIEW_SCN_DCN() FROM dual;
STATEMENT_VIEW_SCN_DCN()
------------------------
658
--> domain scn를 볼 수 있따.
- STATEMENT_VIEW_SCN_GCN
현재 STATEMENT의 VIEW SCN 의 GCN(Global Change Number) 값을 얻는다.
STATEMENT_VIEW_SCN_GCN()
------------------------
17697
--> global scn을 볼 수 있다.
- STATEMENT_VIEW_SCN_LCN
현재 STATEMENT의 VIEW SCN 의 LCN(Local Change Number) 값을 얻는다.
gSQL> SELECT STATEMENT_VIEW_SCN_LCN() FROM dual;
STATEMENT_VIEW_SCN_LCN()
------------------------
17880
--> Local scn을 볼 수 있다.
[ cluster 성능 지연 시 체크 ]
[x$cluster_queue]
gSQL> select * from x$cluster_queue@local;
NAME ID QUEUED FULL_COUNT WAIT_COUNT TOTALQ
----------------- --- ------ ---------- ---------- -------
MASTER_IN 0 0 0 0 0
MASTER_OUT 0 0 0 0 9302
MASTER_OUT 100 0 0 0 1611319
MASTER_OUT 200 0 0 0 1481908
SYNC_IN 0 0 0 0 0
SYNC_IN 1 0 0 0 0
SYNC_IN 100 0 0 0 0
SYNC_IN 101 0 0 0 0
SYNC_IN 200 0 0 0 0
COMMIT_IN 0 0 0 0 39500
COMMIT_SLAVE_IN 0 0 0 0 0
COORDINATOR_IN 0 0 0 0 39500
URGENT_IN 0 0 0 0 3647
RECOVER_OUT 0 0 0 0 0
LOCATOR_AGENT_OUT 0 0 0 0 0
HEARTBEAT 0 0 0 0 0
- 평상시
MASTER_OUT ID 0 번인것만 TOTALQ가 증가
URGENT_IN TOTALQ가 증가
MASTER_OUT : Insert 처리 시 다른 group에 처리 할 것이 있으면 TOTALQ가 version에
따라 1나 또는 2가 증가.
commit 처시 시 다른 group에 commit 처리 할 것이 있으면 1증가.
MASTER_IN : insert 처리 시 cluster를 통해 다른 group에서 들어 오는 것이 있으면
version에 따라 1 또는 2가 증가.
COMMIT_IN : commit 처리 시 외부 group에서 들어 오는 것이 있으면 totalq 1증가.
SYNC_IN : replica을 통하여 전송 받은 totalq(slave 쪽에서 증가)
위의 4가지 정보를 이용하여 실제 전송 되고 오가는 Transaction을 알 수 있다.
--> local Transaction 처리 시 증가 하지 않는다.
참고]
coordinator,commit cpu 100%를 사용하고 있을 때 정말 cpu가 모자르다면 WAITP_COUNT(누적치)로 계속 증가 하는지
를 확인 할 수 있고 QUEUE는 현재 쌓여 있는 값으로 현재 상황을 모니터링 할 때 사용 할 수 있다.
[x$cl_latency_stat]
select * from X$CL_LATENCY_STAT@local where TOTAL_LATENCY > 0;
gSQL> \desc X$CL_LATENCY_STAT
COLUMN_NAME TYPE IS_NULLABLE
------------------- -------------- -----------
SESSION_ID NATIVE_INTEGER FALSE
COMMAND_TYPE NATIVE_INTEGER FALSE
LOCAL_REQ_QUEUEING NATIVE_INTEGER FALSE
REQ_TRANSMISSION NATIVE_INTEGER FALSE
REMOTE_REQ_QUEUEING NATIVE_INTEGER FALSE
REQ_PROCESSING NATIVE_INTEGER FALSE
REMOTE_RES_QUEUEING NATIVE_INTEGER FALSE
RES_TRANSMISSION NATIVE_INTEGER FALSE
LOCAL_RES_QUEUEING NATIVE_INTEGER FALSE
TOTAL_LATENCY NATIVE_INTEGER FALSE
--> cdispatcher에 패킷 전송 시간 확인
--> 전송 시간이 엄청 많네 (transmission 마이크로초) 요걸로 현재 네트워크에 문제가 있다고 판단할 수 있다.
[X$CONTROLFILE_CLUSTER_MEMBER]
gSQL> select * from X$CONTROLFILE_CLUSTER_MEMBER;
MEMBER_NAME IS_LOCAL_MEMBER GROUP_ID MEMBER_ID MEMBER_POSITION
----------- --------------- -------- --------- ---------------
G1N1 FALSE 1 1 0
G2N1 TRUE 2 2 1
G1N1 TRUE 1 1 0
G2N1 FALSE 2 2 1
4 rows selected.
gSQL> select * from X$CL_LATENCY_STAT@local where TOTAL_LATENCY > 0;
SESSION_ID COMMAND_TYPE REQ_QUEUEING1 REQ_TRANSMISSION REQ_QUEUEING2
---------- ------------ ------------- ---------------- -------------
REQ_PROCESSING RES_QUEUEING1 RES_TRANSMISSION RES_QUEUEING2 TOTAL_LATENCY
-------------- ------------- ---------------- ------------- -------------
4 5 2 58 36
23 1 58 7 186
4 5 48 408 35
23 1 408 29 953
4 5 2 639 36
25 1 639 28 1370
4 5 50 152 35
22 1 152 10 422
4 5 2 1273983 40
26 1 1273983 30 2548065
4 5 1 77 7
--> 전송 시간이 엄청 많네 (transmission 마이크로초) 요걸로 현재 네트워크에 문제가 있다고 판단할 수 있다.
[X$CL_SYSTEM_INFO]
select * from X$CL_SYSTEM_INFO;
gSQL> select * from X$CL_SYSTEM_INFO;
NAME VALUE CATEGORY COMMENTS
-------------------- ----- -------- -----------------------------------------
GLOBAL_COMMIT_COUNT 0 0 globally committed count
CM_BUFFER_MISS_COUNT 0 0 latch miss count on communication buffer
FAILOVER_ENV_ID 46 0 environment identifier of cluster monitor
GLOBAL_COMMIT_COUNT 0 0 globally committed count
CM_BUFFER_MISS_COUNT 0 0 latch miss count on communication buffer
FAILOVER_ENV_ID 46 0 environment identifier of cluster monitor
--> CM_BUFFER_MISS_COUNT : CM Buffer에 데이터를 넣기 위하여 spin lock try 하는데 이에 실패 시 count가
증가 한다. hash type이나 replica에서 전송 시 위의 값이 증가 한다면 성능이 지연 될 수 있다. 그리고
session이 여러개 한꺼번에 접속 시 증가 한다.
--> global commit 조회
[x$cluster_dispatcher]
select * from x$cluster_dispatcher;
<< Function 표 >>
- list find view
X$BUILTIN_FUNCTION
X$PSEUDO_FUNCTION
- example
select func_name from X$BUILTIN_FUNCTION@local where func_name like '%SHARD%';
- example
gSQL> select func_name from X$PSEUDO_FUNCTION@local;
FUNC_NAME
-------------------
CURRVAL
NEXTVAL
ROWID
CLUSTER_GROUP_ID
CLUSTER_MEMBER_ID
CLUSTER_GROUP_NAME
CLUSTER_MEMBER_NAME
ROWNUM
<< global transaction 관련 조회 >> |
gSQL> select * from x$global_transaction@local;
gSQL> select * from x$global_lock_wait@local;
gSQL> select * from x$cluster_server@local;
gSQL> select * from x$session@local where program like '%peer%';
<< MEMBER NAME 조회 >> |
gSQL> SELECT A.MEMBER_ID, (SELECT MEMBER_NAME FROM USER_GSI_PLACE@LOCAL WHERE MEMBER_ID = A.MEMBER_ID LIMIT 1) , PHYSICAL_CONNECTION FROM X$CLUSTER_MEMBER@LOCAL A;
MEMBER_ID (SELECT MEMBER_NAME FROM USER_GSI_PLACE@LOCAL WHERE MEMBER_ID = A.MEMBER_ID LIMIT 1) PHYSICAL_CONNECTION
--------- ------------------------------------------------------------------------------------ -------------------
1 G1N1 INACTIVE
2 G1N2 ACTIVE
3 G2N1 ACTIVE
4 G2N2 ACTIVE
4 rows selected.
<< v$tablespace_stat >> |
tablespace 통계 정보를 보여 준다.
gSQL> select * from v$tablespace_stat;
TBS_NAME TBS_ID TOTAL_EXT_COUNT USED_META_EXT_COUNT USED_DATA_EXT_COUNT FREE_EXT_COUNT EXTENT_SIZE
-------------- ------ --------------- ------------------- ------------------- -------------- -----------
DICTIONARY_TBS 0 8191 1 1722 6468 65536
MEM_UNDO_TBS 1 16383 1 258 16124 65536
MEM_DATA_TBS 2 20479 1 1526 18952 262144
MEM_TEMP_TBS 3 8191 1 1436 6754 262144
DISK_DATA_TBS 4 799 1 0 798 262144
MEM_AUX_TBS 5 799 1 12 786 262144
MEM_TRANS_TBS 6 1 1 0 0 262144
참고 : MEM_TRANS_TBS global transaciton 상태를 저장할 때 사용 하는 것으로 실제 user 단에서 사용 하는 것은
아니며 FREE_EXT_COUNT 0인것은 신경 쓰지 마라 정상 이다.
(10240 * member 수)
'sunjesoft > Goldilocks Cluster' 카테고리의 다른 글
Goldilocks Cluster Install 가이드 (0) | 2021.08.17 |
---|---|
Goldilocks Cluster 운영 가이드 (0) | 2021.08.17 |