GRD & cache fusion : 한 인스턴스가 변경하려는 블록이 다른 인스턴스에 의해 동시에 변경되지 않도록 보장 하고 인스턴스 수가 증가 할수록 이러한 문제가 더 복잡해지지 않도록 함
RAC 초기 버전(OPS)은 일반적으로 하나의 락이 넓은 범위를 관리.
RAC 최신 버전은 하나의 락 = 하나의 블록이 기본 접근 방식 (fine-grained locking), READ-ONLY TABLESPACE 같은 특별한 경우에는 넓은 범위(파일)를 관리하기 위해 하나의 락이 사용됨
GES/GCS 리소스 확인
SQL> select resource_name, current_utilization, max_utilization
from v$resource_limit
where resource_name like '%g_s%'
order by resource_name;
RESOURCE_NAME CURRENT_UTILIZATION MAX_UTILIZATION
----------------- ------------------- ---------------
gcs_resources 6615 6615
gcs_shadow 9716 9716
ges_cache_ress 1218 1364
ges_locks 4911 5071
ges_ress 7772 7872
SQL> select *
from v$sgastat
where name like '%gcs%'
or name like '%ges%'
order by name;
POOL NAME BYTES
------------ -------------------------- ---------------
shared pool gcs resource 4927120
shared pool gcs shadows 3630512
shared pool ges resource 2602392
shared pool ges enqueues 5171824
-- v$resource_limit 는 ges_locks 를, v$sgastat 는 ges enqueues 를 보여줌, GCS 에 대한 enqueue(lock) 정보는 없음
-- 캐시 처리 빈도수가 훨씬 많고, 전송되는 패킷의 크기도 훨씬 크기 때문에, 캐시 처리와 일반적인 enqueue 처리를 분리 함 : global cache resources 를 위한 분리 구조 (gcs RESOURCE, gcs SHADOWS)
-- 오라클은 리소스를 제어(mastering)하기 위한 권한을 모든 인스턴스에게 동등하게 공유 하나, master 를 제외한 인스턴스는 master 리소스로 부터 중요한 정보의 일부를 포함하는 shadow 리소스를 유지.
리소스 마스터링
리소스 식별자에 해시 함수를 적용하여 임의로 분배 (예: XYZ 테이블에 락을 설정하려면, 테이블의 OBJ_ID 를 이용하여 몇가지 연산을 수행한 후, 해당 테이블의 마스터 TM 리소스를 소유한 노드 확인 후, 락 설정 시도)
리소스 조회 데모
-- WRH$_LATCH (OBJ_ID:6334,0x18be) 의 TM 리소스 조회
select *
from gv$dlm_ress
where resource_name like '%0x18be%TM%';
select *
from gv$ges_enqueue
where resource_name1 like '%0x18be%TM%';
-- 세 개의 모든 노드에서 관련된 이름의 리소스가 존재, enqueue 의 할당(gv$ges_enqueue)는 노드 1에서만 보여짐
-- INST_ID = 1 : TM 리소스의 마스터 노드, 두개의 인스턴스(OWNER_NODE IN (1, 2))가 리소스를 사용 (OWER_NODE 는 0 부터 시작)
-- GRANT_LEVEL, REQUEST_LEVEL : KJUSERCW(concurrent write), v$lock 에서 보여지는 row-exclusive 와 같음
INST_ID : 1
HANDLE : 000000008D2537C0
GRANT_LEVEL : KJUSERCW
REQUEST_LEVEL : KJUSERCW
RESOURCE_NAME1 : [0x18be][0x0],[TM][ext 0x0,0x0
RESOURCE_NAME2 : 6334,0,TM
STATE : GRANTED
OWNER_NODE : 2
--------------
INST_ID : 1
HANDLE : 000000008D256E60
GRANT_LEVEL : KJUSERCW
REQUEST_LEVEL : KJUSERCW
RESOURCE_NAME1 : [0x18be][0x0],[TM][ext 0x0,0x0
RESOURCE_NAME2 : 6334,0,TM
STATE : GRANTED
OWNER_NODE : 1
--------------
-- 리소스 유형이 다르면 약간은 다르게 동작할 수 있음 (특히 버퍼캐시, 아래 예는 히스토그램과 관련된 딕셔너리 캐시 유형)
-- GRANT_LEVEL : KJUSERPR (protected read, v$lock 의 모드 4), INST_ID = 2 가 이 리소스의 마스터, INST_ID IN (1, 3) 은 SHADOW
SELECT INST_ID, OWNER_NODE, GRANT_LEVEL, RESOURCE_NAME1
FROM GV$GES_ENQUEUE
WHERE RESOURCE_NAME1 LIKE '%[0xf13e8525][0xa660035f],[QQ]%'
ORDER BY INST_ID, OWNER_NODE;
INST_ID OWNER_NODE GRANT_LEV RESOURCE_NAME1
--------- ---------- --------- -------------------------
1 0 KJUSERPR [0xf13e8525][0xa660035f],[QQ][
2 0 KJUSERPR [0xf13e8525][0xa660035f],[QQ][
1 KJUSERPR [0xf13e8525][0xa660035f],[QQ][
2 KJUSERPR [0xf13e8525][0xa660035f],[QQ][
3 2 KJUSERPR [0xf13e8525][0xa660035f],[QQ][
3노드 클러스터에 대한 master 와 shadow 의 관계
리소스 유형 별 정보
-- 3 노드 클러스터의 한 노드에서 인스턴스가 기동된 후 몇 분 후에 수행
SQL> select -- resource
substr(resource_name, instr(resource_name, ',')+2, 2), count(*)
from v$dlm_ress
group by substr(resource_name, instr(resource_name, ',')+2, 2)
order by count(*);
SUBSTR(R COUNT(*)
-------- --------
...
TM 558
QC 1061 -- dictionary cache, segments
BL 2802
QQ 3899 -- dictionary cache, histograms
QI 3959 -- dictionary cache, objects
SQL> select -- enqueues
substr(resource_name2, -2), grant_level, request_level, count(*)
from v$ges_enqueue
group by substr(resource_name2, -2), grant_level, request_level
order by count(*);
SUBSTR(R GRANT_LEV REQUEST_L COUNT(*)
-------- --------- --------- ----------
...
QC KJUSERPR KJUSERPR 1060
BL KJUSEREX KJUSERNL 2552
BL KJUSERPR KJUSERNL 3891
QI KJUSERPR KJUSERPR 4888
QQ KJUSERPR KJUSERPR 6140
-- 다수의 파티션을 가진 파티션 테이블이 존재하고 히스토그램이 많은 경우 딕셔너리 캐시를 의미하는 Qx 리소스가 많아짐
-- 블록을 관리하는 BL 유형이 Qx 유형 보다 적으나 데이터베이스가 운영 되면서 증가 하게 됨
-- BL 리소스는 하나의 블록을 관리 (예외: GLOBAL TEMPORARY TABLE, READ-ONLY TABLESPACE)
-- 블록이 인스턴스 중 하나의 버퍼캐시에 적재되면 관련된 BL 리소스가 존재 하게 됨
-- 이론상 마스터 BL 리소스 수 = 전 시스템의 버퍼 수, 실제로 마스터 BL 리소스 수 < 전 시스템의 버퍼 수 (하나의 블록에 대한 여러 개의 복사본을 가지고 있으므로)
RAC 에서 블록을 보호하기 위해 BL 리소스 유형을 사용 함
4노드 클러스터 내의 3-way 블록 전송 / 처리순서
4노드 클러스터 내의 3-way 블록 전송 / 처리결과
구분 | 리소스에 대한 마스터가 될 확률 | 마스터 & 블록 소유 확률 | 비고 |
---|---|---|---|
3 노드 RAC | 1/3 | 1/2 | 2-WAY / 3-WAY |
4 노드 RAC | 1/4 | 1/3 |
2-WAY / 3-WAY 동작 테스트
Event Waits Time_outs Csec Avg Csec Max Csec
----- ----- --------- ---- -------- -----
gc cr block 2-way 98 0 4 .043 0
gc current block 2-way 98 0 4 .044 0
gc cr block 2-way 49 0 2 .036 2
gc cr block 3-way 47 0 3 .063 0
gc current block 2-way 48 0 2 .033 0
gc current block 3-way 46 0 2 .053 0
gc cr block 2-way 50 0 2 .049 0
gc cr block 3-way 47 0 3 .064 1
gc current block 2-way 50 0 2 .035 0
gc current block 3-way 46 0 2 .051 5
RAC 는 블록 전송시 디스크보다 빠른 네트워크를 활용 함, 이는 RAC 구성 선택에 따른 비용이며 최적화는 필요하나 오버헤드는 아님
블록들의 상태 확인
SQL> select state, count(*) from x$bh group by state;
-- 가장 흔히 볼 수 있는 상태는 0-free, 1-XCUR, 2-SCUR, 3-CR, 8-PI 임
이상현상
alter system flush buffer_cache 수행하면, 모든 인스턴스의 캐시를 flush 한다. 그리고 11.2 에서 PI 블록의 다른 버전이 없다면, PI 블록은 FLUSH 되지 않고 CR 상태로 변경됨. (버그로 추정)