030 레일스에서 마스터/슬래이브 데이터베이스 사용하기
November 20th, 2007
029 5회 루비 세미나는 12월에 열릴 예정 / 절대 주관적인 루비 뉴스
한 때, 레일스에서는 하나의 데이터베이스만 사용할 수 있다는 사실 때문에 큰 논쟁이 일었던 적이 있다. 그 진원지는 다름아닌 트위터(레일스로 만든 사이트 중 가장 많은 트래픽을 받고 있다) 개발자의 인터뷰였다.
At this point in time there’s no facility in Rails to talk to more than one database at a time.
DHH의 대답은 루비로 75라인 정도면 금방 만들 수 있는 거라며, 레일스는 그 어떤 프레임워크보다 확장이 쉽다고 했다.
In my mind, that's the crux of the story. That extending Rails to do what you want is often much simpler than you think. That you can't compare extending a high-level framework written in a language like Ruby to, say, patching Apache or MySQL. The barriers of entry are simply not in the same sport.
아, 잠시 삼천포로 흘렀다. 아무튼 레일스에서도 데이터베이스 클러스터를 활용할 방법이 얼마든지 있다. 먼저 위 논쟁에서 거론된 Dr Nic의 플러그인 Magic Multi-Connections를 들 수 있다. 하지만 이 플러그인은 매번 어떤 데이터베이스를 사용할지 모듈로 지정해줘야한다는 불편함이 있다. 그리고 몇가지 문제점도 보고되고 있는 듯 하다.
여기서 좀 더 나가면, 모델별로 데이터베이스를 분리하는 것이 가능하다. 바로 Active Delegate 플러그인이다. 하지만 여기도 단점이 있는데 조인이나 Association 확장등을 사용할 경우 그 범위가 모호해지는 경우가 생긴다. Edge case 들이 문제가 된다.
오 늘 새로운 아이디어가 소개되었다. 바로 데이터베이스를 마스터와 슬래이브로 구분하고, 쓰기(CREATE, UPDATE, DELETE)는 마스터에 보내고, 읽기에만 슬래이브에 보내는 방식이다. 물론 마스터와 슬래이브는 복제되고 있을 것이다.
구현에 사용한 아이디어는 간단하다. 레일스의 기본 DB를 슬레이브로 설정하고 DB를 변경하는 메서드를 모두 마스터로 위임하는 것이다.
- delegate :insert, :update, :delete, :create_table, :rename_table, :drop_table, :add_column, :remove_column,
:change_column, :change_column_default, :rename_column, :add_index, :remove_index, :initialize_schema_information,
:dump_schema_information, :to => :master
설명만큼 잘만 동작해주면 큰 도움이 될 것 같다. 이 플러그인은 단지 63줄의 루비 소스로 구성되어 있다. DHH가 말한 '쉬운 확장'을 잘 느낄 수 있다.
- 2007/11/19 00:04:21




Leave a Reply