작성
·
225
1
잘이해가 안되는게 있는데요.
1. instance끼리 통신?
Instance1과 instance2가 서로 물리적인 통신?이 가능하다고 했는데
만약 두 인스턴스가 하나의 db서버에서 생성되는거라면
process끼리 서로 데이터를 주고 받는건가요?
그냥 드는 생각으로는 이런 instance끼리 데이터를 주고받는 관리비용이 더 많이 들거같은데 뭔가 좋은 기술이 있나 궁금하네여.
2. 급증하는 사용자에 대한 대응?
운영체제로 따지면 인스턴스를 프로세스? 스레드? 개념으로 봐야하는건지... 그럼 사용자가 급증하면 1개의 서버만으로는 좀 감당하기가 힘들지 않나요..?
웹 개발자자라 잘 이해가 안되는게 많습니다. 답변 부탁드립니다~ㅎㅎ
답변 2
1
1
안녕하십니까,
인스턴스는 사실 RAC접하기 전까진 명확하게 DB와 분리해서 이해하긴 어려울 수 있습니다. RAC외의 일반 DB는 1개의 DB가 1개의 인스턴스로 구성되어 있기 때문입니다. RAC는 1개의 DB와 여러개의 인스턴스로 구성됩니다.
인스턴스는 SGA와 Background Process들의 구성이라고 생각하시면 됩니다. 즉 공유 메모리와 이들을 관리하는 Background Process들(서버 프로세스들이 아닙니다)을 통틀어서 지칭합니다. 오라클은 공유 메모리(Buffer cache, shared pool, redo log들)이 잘 돌아갈 수 있게 많은 background process들이 동작하고 있으며, 서버 프로세스들은 이들 공유 메모리에서(물론 공유 메모리에 데이터가 없을 경우에는 스토리지에서) 데이터를 액세스하는 작업을 수행합니다.
운영 체제로 따지자면 인스턴스는 활성화된 메모리(즉 데이터가 올라가 있어서 많은 서버 프로세스들이 접근 가능한 메모리)라고 보시는게 더 적합할 수 있습니다.
좀 더 간략화해서(Background process빼고) 인스턴스를 SGA라고 하고, 2개의 물리적인 H/W 서버에서 2개의 인스턴스를 구동해서 RAC를 만들 수 있습니다. 이렇게 구성하면 1번 H/W 서버의 Buffer Cache에 올라가 있는 데이터를 2번 H/W 서버에서 네트웍으로 가져올 수가 있습니다. 2번 H/W서버에 접속한 서버 프로세스가 원하는 데이터를 가져 올때 먼저 자기의 SGA에 해당 데이터가 있는지 확인하고, 없으면 스토리지에서 가져오는게 일반적인 로직이지만 스토리지 액세스 비용이 비싸므로 1번 H/W의 SGA에 해당 데이터가 있는지 확인해서 있으면 1번 SGA에서 데이터를 가져옵니다. 이렇게 하는게 데이터 액세스를 더 빠르게 할 수 있습니다.
물론 이렇게 하려면 두개의 인스턴스간 통신이 매우 빨라야 합니다. 그래서 보통은 2개 H/W간 10G 광케이블 기반의 전용 Router 구성(오직 인스턴스간 통신을 위한 구간입니다)을 합니다.
2. 보통 급증하는 사용자 증가를 H/W적으로 수용하는 방법은 Scale Up과 Scale Out이 있습니다.
scale up은 1개의 H/W내에서 H/W Component 성능을 증가시키는 것입니다. 예를 들어 CPU Core 증가나 Memory크기 증대, Storage 성능 향상 등입니다. scale out은 2개이상의 H/W로 사용자 증가 로드를 분리하는 것입니다. 다만 RAC는 스토리지를 공유하는 개념이기 때문에 Sharding과 같이 완전히 스토리지까지 분리된 Scale out은 아닙니다.
보통 대용량의 동시접속 사용자가 있는 경우 중요 고객사이트들은 오라클 RAC를 적용합니다. 2개 그리고 많으면 8개까지(국내에 그 이상도 있었는데 잘 기억나진 않습니다)도 구성하는 경우가 있습니다. 그리고 사용자 접속은 부하 상황을 Listener가 모니터링 하면서 1번 인스턴스 또는 2번 인스턴스에 접속을 자동으로 해줍니다(접속시 CPU부하가 낮은 인스턴스로 ROUTING 시켜줍니다)
이렇게 사용자 부하를 RAC를 통해서 분산 시켜줄 수 있습니다. 하지만 상호 인스턴스간에 너무 많은 데이터를 가져오는 성능이 크게 향상 되지 않을 수 있습니다. 따라서 RAC 구성 시에는 업무적인 분배를 잘해서 웬만하면 인스턴스간에 데이터 교환을 최소로 하기 위해 노력합니다.
감사합니다.