제2의 비엔지니어 인생관을 꿈꾸며

Posted
Filed under MSSQL

사용자 삽입 이미지
우리가 흔히 시스템에서 이중화라는 말을 하곤합니다. 서비스 이중화인지 데이터의 이중화인지는 관련업무 서비스가 어떻게 진행되느냐에 따라 달라지곤 하겠죠.
일일이 백업을 배치로 걸어놓느냐 아니면 클러스터를 하느냐 여러가지 DB 이중화에 대한 고민을 하게 됩니다. 그래서 MSSQL2005 이상부터는 DB 미러링이라는 기능이 있습니다. 정말 정말 좋은 기능중의 하나라고 장담합니다. 필자가 클러스터보다 더 매력을 느끼는 기능이 바로 미러링 기능입니다.
사용자 삽입 이미지
일단 클러스터는 공유볼륨을 구성하는 스토리지가 있어야 한다는것입니다. 비용 많이 듭니다. 하지만 미러링의 장점은 위 그림과 같이 PC든 가상화든 트랙잭션 I/O가 실시간으로 아주 심하지만 않으면(대규모 엔터프라이즈가 아닌한 이럴일이 거의 없다) 공간의 제한을 받지 않는다는것입니다. 레이드 미러링 처럼 DB도 미러링이 실시간으로 된다는것이 참 신기 하기만 합니다. 요즘 기가빗 네트워크 망을 이용하기 때문에 대여폭 걱정도 없습니다. 기가빗 대여폭을 감당하기에 디스크 I/O 성능 부터 걱정이 되니까요...
사용자 삽입 이미지
DB미러링도 Failover 기능이 가능합니다. MS에 기술 관계자에게 물어본 결과 위 내용을 들었습니다. 실질적으로 해본건 닷넷2.0 환경에서 해봤다고 하고 나머지는 테스트 시뮬레이션을 해보지 않았다고 합니다. 그럼 사이트를 닷넷 2.0이상만 해야되는 건가?라는 말을 하다가 기술 담당자는 ODBC,JDBC 다 된다고 전해주었습니다. 해당 링크 사이트도 전달해주더군요. 필자가 테스트 해본건 Native Client 커넥트를 사용했습니다. 개발자의 도움을 얻었죠.친한 개발자라 적극적으로 도와준 덕분에 이 결과를 얻었습니다.

<%

 connstr = "Provider=SQLNCLI10.1;Password=db_pass;Persist Security Info=True;User ID=dbuser_id;Initial Catalog=DB name;Data Source=ip address A;Failover Partner=ip address B"


 set dbo = server.CreateObject("ADODB.Connection")
 dbo.open(connstr)
 
 set rs = dbo.Execute("select top 200 * FROM [DB].[table_id].[xxx]")

  
 do while Not rs.Eof

 Response.Write(rs(0) & "<BR>")
 Response.Write(rs(0).Name & "<BR>")
 rs.MoveNext


 loop

%>

위 커넥트를 참조하여 셀렉트 쿼리문을 날리고 출력이 되면 바로 DB에 연결이 되는거죠. 필자는 주 서버를 바로 죽여서 스탠바이 서버가 주서버로 변경되고 난후 다시 사이트 접속을 해봤습니다. IP접속 활성화 상태가 바로 Partner B서버로 넘어가는게 보였습니다. 클러스터보다 더 빨리 쉽게 넘어간걸 보고 너무 놀라웠습니다만 다시 원래 주서버로 원복을 시켰을때는 DB서버에 연결이 되지 않았습니다. 즉 웹서비스라면 재시작을 해줘야만 연결이 가능했죠. 한번 Failover는 가능했지만 두번 다시 Failover 는 되지 않았습니다. 어플리케이션 단에서 DB 접속 Retry 옵션이 있어야만 가능하다는 말을 들었지만 클러스터처럼 VIP를 바라보는게 아니기 때문에 이부분에 대해서는 많은 연구와 테스트가 필요하다는 결론을 내려봅니다. 위그림처럼 DB미러링은 데이터의 완전성을 위한것이지 서비스의 완전성을 위한건 아니라는 결론입니다. 장애 대책을 임시나마 이용하면 더더욱 좋은 기능이지만 이걸 주목적으로 사용하다간 위험하다는거죠.

대부분의 데이타베이스 관리나 운영자들이 미러링 기능을 사용하지 않는거 같습니다. 전략적으로 좋은 기능인거 같다는 생각을 해봅니다만 비용상 효율적인 DB관리 솔루션은 미러링이 짱이다?라는 글을 남겨봅니다.

2010/02/28 03:40 2010/02/28 03:40