6. RAC 캐시 퓨전

조회 수 4113 추천 수 0 2010.08.03 00:44:09
토시리 *.42.166.122
제목 작성자 날짜
6. RAC 캐시 퓨전 (current) 토시리 2010.08.03 00:44:09
복원
<p><span style="font-weight: bold;">동시사용자가 많은</span> 시스템의 데이터베이스를 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">부하분산 목적으로 물리적으로 나누는</span></span> 등의 노력이 기울여져왔다.</p><p>그러나, 데이터베이스를 물리적으로 나눌시 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">데이터의 실시간 동기화</span></span>를 위해서는 많은 우라작업이 필요하므로<span style="color: rgb(255, 0, 0);"> </span><span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">실제적인 부하분산효과를 보기가 어렵다</span></span><span style="color: rgb(255, 0, 0);">.</span></p><p>최근에는 다시 <span style="font-weight: bold;"><span style="color: rgb(0, 158, 37);">데이터베이스를 하나로 통합</span></span>하고 이를 <span style="color: rgb(0, 158, 37); font-weight: bold;">액세스하는 인스턴스를 여러개 두는</span> <span style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255);">공유 디스크방식</span></span>이 도입되기 시작했다.</p><p>그중 가장 진보적인 기술로 평가받는 오라클의 <span style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255);">RAC</span></span>에 대해 알아보자.&nbsp;</p><p><br /></p><blockquote class="q7"><ul><li><span style="font-weight: bold; color: rgb(255, 0, 0);">글로벌 캐시</span>라는 개념을 사용, 접근하는 <span style="color: rgb(255, 0, 0);"><span style="font-weight: bold;">인스턴스노드들의 버퍼 캐시를</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">하나의 버퍼 캐시로</span></span><span style="color: rgb(0, 0, 0);"> 간주</span>하고 사용.</li><li>즉, 읽으려는 데이터블록이 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">다른 인스턴스노드 </span></span><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">어딘가에 캐싱</span></span>되어 있나 찾아본 후, <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">캐싱되어 있다면</span></span> 그 데이터를 그대로 읽음. <span style="color: rgb(0, 0, 255);">(디스크 I/O를 피함)</span></li><li>만약, 어떤 노드에도 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">캐싱되어 있지 않다면</span></span> 비로소, 디스크의 읽기권한을 부여받은 뒤 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">디스크에서 읽음</span></span>. <span style="color: rgb(0, 0, 255);">(디스크 I/O발생)</span><br /></li></ul></blockquote><p><br /></p><blockquote class="q7"><p style="text-decoration: underline; font-weight: bold;"><span style="color: rgb(0, 0, 255);">RAC환경에서 Current블록</span></p><ul><li> <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">Shared Mode Current (SCur)</span></span><br /><ol><li>동시에 <span style="color: rgb(255, 0, 0);">여러노드에 캐싱</span> 가능.</li><li>자주 사용되는 데이터 블록이 SCur모드로 각 노드에 캐싱될 때가 최상의 효율.</li><li>단, 그중 한 노드가 XCur모드로 업그레드를 요청하는 순간 나머지 노드에 캐싱되 있던 SCur블록들은 모두 Null다운그레이드로 더 이상 사용불가가 됨.<br /></li></ol></li><li><span style="font-weight: bold; color: rgb(255, 0, 0);">Exclusive Mode Current (XCur)</span><br /><ol><li><span style="color: rgb(255, 0, 0);">단 하나의 노드에만 존재</span>할 수 있다.</li></ol></li></ul></blockquote><p><br /></p><p>RAC 노드간 버퍼 캐시를 공유하는 캐시퓨전 원리에 대해 자세히 알아보자.</p><p><br /></p><p><br /></p><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(1) 전송 없는 읽기 (디스크직접읽기, SCur모드)<br /></span></p><p><img editor_component="image_link" src="files/attach/images/3965/957/005/6-01.JPG" alt="6-01.JPG" width="600" height="259" />&nbsp;</p><ol><li>노드A가 SCur모드로 K블록을 읽으려, 그 블록 리소스 마스터인 노드B에 요청을 보내 <span style="color: rgb(0, 158, 37);"><span style="color: rgb(255, 0, 0);">캐싱여부를 확인</span></span>.</li><li>노드B는 K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">존재하지 않기에 노드A에 디스크일기 권한부여.</span></li><li>노드A는 <span style="color: rgb(255, 0, 0);">디스크에서 K블록을 읽고 로컬에 캐싱</span>.</li></ol><br /><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(2) 읽기/읽기 전송 (</span><span style="color: rgb(0, 0, 255); font-size: 14px;">SCur모드)</span></p><p><img editor_component="image_link" src="files/attach/images/3965/957/005/6-02.JPG" alt="6-02.JPG" width="600" height="296" />
<br /></p>
<ol><li>노드C가 SCur모드로 K블록을 읽으려, 그 블록 리소스 마스터인 노드B에 요청을 보내 <span style="color: rgb(255, 0, 0);">캐싱여부를 확인</span>.</li><li>노드B는 K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">노드A에 존재확인</span>, 노드A에게 노드C로 <span style="color: rgb(255, 0, 0);">전송 지시</span>.</li><li><span style="color: rgb(255, 0, 0);"><span style="font-weight: bold;">노드A는</span> 노드C로 해당블록을 <span style="font-weight: bold;">전송</span></span>.</li><li>노드C는 전송받은 블록을 SCur모드로 <span style="color: rgb(255, 0, 0);">캐싱한후, 마스터인 노드B에게 메세지를 보냄</span>.</li></ol><br /><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(3) 읽기/쓰기 전송 (XCur모드)<br />
</span></p><p>&nbsp;<img editor_component="image_link" src="files/attach/images/3965/957/005/6-03.JPG" alt="6-03.JPG" width="600" height="299" />
<br /></p><ol><li><span style="color: rgb(255, 0, 0);">노드C가 K블록을 갱신하려고</span>, 그 블록 리소스 마스터인 노드B에 XCur모드로 업그레이드 요청을 함.</li><li>노드B는
K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">캐싱하고 있는 노드</span><span style="color: rgb(255, 0, 0);">A</span><span style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">에</span>게</span> 해당블록의 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">Null모드 다운그레이드를 지시</span></span>.</li><li>노드A는 해당블록을 <span style="color: rgb(255, 0, 0);">Null모드로 다운그레이드</span>후, 작업상황을 노드C에게 알림.</li><li>노드C는 해당블록을 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">XCur모드로 업그레이드</span></span>하고 결과를 마스터인 노드B에게 알림.(타노드 Null다운그레드 상황도 알려줌)</li></ol><p><br /></p><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(4) 쓰기/쓰기 전송 (XCur모드)<br />
</span></p><p>&nbsp;&nbsp;
<img editor_component="image_link" src="files/attach/images/3965/957/005/6-04.JPG" alt="6-04.JPG" width="600" height="304" /></p>
<ol><li><span style="color: rgb(255, 0, 0);">노드A가 K블록을 갱신하려고</span>, 그
블록 리소스 마스터인 노드B에 XCur모드로&nbsp; 요청을 함.</li><li>노드B는
K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">캐싱하고 있는 노드</span><span style="color: rgb(255, 0, 0);">A</span><span style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">에</span>게</span> 해당블록의 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">Null모드
다운그레이드를 지시</span></span>.</li><li>노드A는 해당블록을 <span style="color: rgb(255, 0, 0);">Null모드로 다운그레이드</span>후, 작업상황을 노드C에게 알림.</li><li>노드C는
해당블록을 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">XCur모드로 업그레이드</span></span>하고 결과를 마스터인 노드B에게 알림.(타노드 Null다운그레드 상황도
알려줌)</li></ol><br /><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(5) 쓰기/읽기 전송 (SCur모드)<br /></span></p><p>&nbsp;&nbsp;<img editor_component="image_link" src="files/attach/images/3965/957/005/6-05.JPG" alt="6-04.JPG" width="600" height="304" /></p><ol><li><span style="color: rgb(255, 0, 0);">노드C가 K블록을 읽기위해</span>, 그 블록 리소스 마스터인 노드B에 SCur모드로 읽기
요청을 함.</li><li>노드B는 K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">캐싱하고 있는 노드</span><span style="color: rgb(255, 0, 0);">A</span><span style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">에</span>게</span>
해당블록의 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">전송을 지시</span></span>.</li><li>노드A는 해당블록을 노드C에 전송하고 자신의 캐싱정보를 <span style="color: rgb(255, 0, 0);">SCur모드로 다운그레이드 </span>함.<span style="color: rgb(120, 32, 185);"></span><br /></li><li>노드C는 해당블록을 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">SCur모드로
캐싱</span></span>하고 결과를 마스터인 노드B에게 알림.(타노드 Null다운그레드 상황도 알려줌)</li></ol>
토시리 2010.07.18 23:53:43
복원
<p><span style="font-weight: bold;">동시사용자가 많은</span> 시스템의 데이터베이스를 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">부하분산 목적으로 물리적으로 나누는</span></span> 등의 노력이 기울여져왔다.</p><p>그러나, 데이터베이스를 물리적으로 나눌시 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">데이터의 실시간 동기화</span></span>를 위해서는 많은 우라작업이 필요하므로<span style="color: rgb(255, 0, 0);"> </span><span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">실제적인 부하분산효과를 보기가 어렵다</span></span><span style="color: rgb(255, 0, 0);">.</span></p><p>최근에는 다시 <span style="font-weight: bold;"><span style="color: rgb(0, 158, 37);">데이터베이스를 하나로 통합</span></span>하고 이를 <span style="color: rgb(0, 158, 37); font-weight: bold;">액세스하는 인스턴스를 여러개 두는</span> <span style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255);">공유 디스크방식</span></span>이 도입되기 시작했다.</p><p>그중 가장 진보적인 기술로 평가받는 오라클의 <span style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255);">RAC</span></span>에 대해 알아보자.&nbsp;</p><p><br /></p><blockquote class="q7"><ul><li><span style="font-weight: bold; color: rgb(255, 0, 0);">글로벌 캐시</span>라는 개념을 사용, 접근하는 <span style="color: rgb(255, 0, 0);"><span style="font-weight: bold;">인스턴스노드들의 버퍼 캐시를</span><span style="color: rgb(0, 0, 0);"> </span><span style="color: rgb(0, 0, 0);">하나의 버퍼 캐시로</span></span><span style="color: rgb(0, 0, 0);"> 간주</span>하고 사용.</li><li>즉, 읽으려는 데이터블록이 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">다른 인스턴스노드 </span></span><span style="color: rgb(255, 0, 0);"><span style="color: rgb(0, 0, 0);">어딘가에 캐싱</span></span>되어 있나 찾아본 후, <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">캐싱되어 있다면</span></span> 그 데이터를 그대로 읽음. <span style="color: rgb(0, 0, 255);">(디스크 I/O를 피함)</span></li><li>만약, 어떤 노드에도 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">캐싱되어 있지 않다면</span></span> 비로소, 디스크의 읽기권한을 부여받은 뒤 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">디스크에서 읽음</span></span>. <span style="color: rgb(0, 0, 255);">(디스크 I/O발생)</span><br /></li></ul></blockquote><p><br /></p><blockquote class="q7"><p style="text-decoration: underline; font-weight: bold;"><span style="color: rgb(0, 0, 255);">RAC환경에서 Current블록</span></p><ul><li> <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">Shared Mode Current (SCur)</span></span><br /><ol><li>동시에 <span style="color: rgb(255, 0, 0);">여러노드에 캐싱</span> 가능.</li><li>자주 사용되는 데이터 블록이 SCur모드로 각 노드에 캐싱될 때가 최상의 효율.</li><li>단, 그중 한 노드가 XCur모드로 업그레드를 요청하는 순간 나머지 노드에 캐싱되 있던 SCur블록들은 모두 Null다운그레이드로 더 이상 사용불가가 됨.<br /></li></ol></li><li><span style="font-weight: bold; color: rgb(255, 0, 0);">Exclusive Mode Current (XCur)</span><br /><ol><li><span style="color: rgb(255, 0, 0);">단 하나의 노드에만 존재</span>할 수 있다.</li></ol></li></ul></blockquote><p><br /></p><p>RAC 노드간 버퍼 캐시를 공유하는 캐시퓨전 원리에 대해 자세히 알아보자.</p><p><br /></p><p><br /></p><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(1) 전송 없는 읽기 (디스크직접읽기, SCur모드)<br /></span></p><p><img editor_component="image_link" src="files/attach/images/3965/957/005/6-01.JPG" alt="6-01.JPG" width="600" height="259" />&nbsp;</p><ol><li>노드A가 SCur모드로 K블록을 읽으려, 그 블록 리소스 마스터인 노드B에 요청을 보내 <span style="color: rgb(0, 158, 37);"><span style="color: rgb(255, 0, 0);">캐싱여부를 확인</span></span>.</li><li>노드B는 K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">존재하지 않기에 노드A에 디스크일기 권한부여.</span></li><li>노드A는 <span style="color: rgb(255, 0, 0);">디스크에서 K블록을 읽고 로컬에 캐싱</span>.</li></ol><br /><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(2) 읽기/읽기 전송 (</span><span style="color: rgb(0, 0, 255); font-size: 14px;">SCur모드)</span></p><p><img editor_component="image_link" src="files/attach/images/3965/957/005/6-02.JPG" alt="6-02.JPG" width="600" height="296" />
<br />&nbsp;</p>
<ol><li>노드C가 SCur모드로 K블록을 읽으려, 그 블록 리소스 마스터인 노드B에 요청을 보내 <span style="color: rgb(255, 0, 0);">캐싱여부를 확인</span>.</li><li>노드B는 K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">노드A에 존재확인</span>, 노드A에게 노드C로 <span style="color: rgb(255, 0, 0);">전송 지시</span>.</li><li><span style="color: rgb(255, 0, 0);"><span style="font-weight: bold;">노드A는</span> 노드C로 해당블록을 <span style="font-weight: bold;">전송</span></span>.</li><li>노드C는 전송받은 블록을 SCur모드로 <span style="color: rgb(255, 0, 0);">캐싱한후, 마스터인 노드B에게 메세지를 보냄</span>.</li></ol><br /><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(3) 읽기/쓰기 전송 (XCur모드)<br />
</span></p><p>&nbsp;<img editor_component="image_link" src="files/attach/images/3965/957/005/6-03.JPG" alt="6-03.JPG" width="600" height="299" />
<br />&nbsp;</p>
<ol><li><span style="color: rgb(255, 0, 0);">노드C가 K블록을 갱신하려고</span>, 그 블록 리소스 마스터인 노드B에 XCur모드로 업그레이드 요청을 함.</li><li>노드B는
K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">캐싱하고 있는 노드</span><span style="color: rgb(255, 0, 0);">A</span><span style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">에</span>게</span> 해당블록의 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">Null모드 다운그레이드를 지시</span></span>.</li><li>노드A는 해당블록을 <span style="color: rgb(255, 0, 0);">Null모드로 다운그레이드</span>후, 작업상황을 노드C에게 알림.</li><li>노드C는 해당블록을 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">XCur모드로 업그레이드</span></span>하고 결과를 마스터인 노드B에게 알림.(타노드 Null다운그레드 상황도 알려줌)</li></ol><br /><p style="font-weight: bold; text-decoration: underline;"><span style="color: rgb(0, 0, 255); font-size: 14px;">(4) 쓰기/쓰기 전송 (XCur모드)<br />
</span></p><p>&nbsp;&nbsp;
<img editor_component="image_link" src="files/attach/images/3965/957/005/6-04.JPG" alt="6-04.JPG" width="600" height="304" /></p><p><br />
</p>
<ol><li><span style="color: rgb(255, 0, 0);">노드A가 K블록을 갱신하려고</span>, 그
블록 리소스 마스터인 노드B에 XCur모드로&nbsp; 요청을 함.</li><li>노드B는
K블록의 캐싱상태를 확인(全노드), <span style="color: rgb(255, 0, 0);">캐싱하고 있는 노드</span><span style="color: rgb(255, 0, 0);">A</span><span style="color: rgb(255, 0, 0);"><span style="color: rgb(255, 0, 0);">에</span>게</span> 해당블록의 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">Null모드
다운그레이드를 지시</span></span>.</li><li>노드A는 해당블록을 <span style="color: rgb(255, 0, 0);">Null모드로 다운그레이드</span>후, 작업상황을 노드C에게 알림.</li><li>노드C는
해당블록을 <span style="font-weight: bold;"><span style="color: rgb(255, 0, 0);">XCur모드로 업그레이드</span></span>하고 결과를 마스터인 노드B에게 알림.(타노드 Null다운그레드 상황도
알려줌)</li></ol>
토시리 2010.07.18 23:33:29