프로그래밍/기타

멀티테넌시 아키텍쳐

p-a-r-k 2018. 5. 11. 21:57
반응형

용어 정의 : 한글 위키백과 - 소프트웨어 멀티테넌시(software multitenancy)라는 용어는 소프트웨어 아키텍처의 하나를 가리키며, 여기에서 하나의 소프트웨어 인스턴스가 한 대의 서버 위에서 동작하면서 여러 개의 테넌트(tenant)를 서비스한다. 여기에서 테넌트란 소프트웨어 인스턴스에 대해 공통이 되는 특정 접근 권한을 공유하는 사용자들의 그룹이다. 멀티테넌트 구조에서 응용 소프트웨어는 데이터, 구성, 사용자 관리, 테넌트 개별 기능 및 비기능 속성을 포함하여, 모든 테넌트에게 인스턴스의 일부분을 단독적으로 제공하기 위해 설계되어 있다. 멀티테넌시는 개개의 소프트웨어 인스턴스들이 각기 다른 테넌트를 위해 운영되는 멀티인스턴스 구조와는 상반된다."

영문 위키백과 구글번연 - 소프트웨어 다중 점유"라는 용어는 단일 소프트웨어 인스턴스가 서버에서 실행되고 여러 임차인에게 서비스를 제공하는 소프트웨어 아키텍처를 의미합니다. 세입자(tenant)는 소프트웨어 인스턴스에 대한 특정 권한을 가진 공통 액세스를 공유하는 사용자 그룹입니다. 다중 점유 아키텍처를 사용하는 소프트웨어 응용 프로그램은 데이터, 구성, 사용자 관리, 테넌트 개인 기능 및 비 기능 속성을 포함하여 모든 임차인에게 인스턴스의 전용 공유를 제공하도록 설계되었습니다. 멀티 테넌시는 별도의 소프트웨어 인스턴스가 다른 테넌트를 대신하여 작동하는 다중 인스턴스 아키텍처와 대조됩니다.

나의 이해: 홀닥에 한정해서 이해하자면, 가맹점에 속한 사용자들은 해당 가맹점과 관련된 데이터 접근 권한만을 가지는 사용자 그룹이며 이 그룹을 테넌트라 하고 있다. 가맹점 사용자 그룹(이하 테넌트)은 해당 가맹점에 대한 데이터, 구성, 사용자 관리, 태넌트 개별 기능 및 비 기능 속성(보안등)을 포함하여 모든 테넌트에게 제공되는 인스턴스에서 각 테넌트에게 인스턴스의 일부분을 단독으로 제공하기 위한 설계 - 테넌트별 인스턴스가 아님 다만, 모든 테넌트에게 서비스 되는 인스턴스는 똑같은 형태로 다중화 할수는 있음.

중앙식 데이터베이스 형태의 문제점

멀티테넌시는 홀닥과 같이 멀티 가맹점 형태에게 서비스 하는 형태를 말한다. 이 같은 서비스를 위해 독립적인 DB 구조도 있었지만, 관리의 복잡성 때문에 중앙식 데이터베이스 형태로 구조를 잡는 경우가 많아졌다. 그런데...

1. 데이터 관리의 어려움: 데이터의 격리를 위해 조회시 명시적으로 가맹점별 구분이 들어가야 한다. 이같은 구조는 모든 가맹점의 데이터가 노출될 수 있는 보안 취약점이 발생한다. 또한, 개발시에도 늘 신경을 써서 가맹점별 구분을 넣어주어야 하며 이를 놓치면, 데이터 누출, 계산 오류등의 문제가 발생할 수 있다.

2. 시스템 성능의 문제: 80%이상의 기능에서 테넌트 구분이 들어가게 된다. 이로 인해 데이터 베이스에서 검색시 추가적인 부하가 걸릴 수 밖에 없다.

3. 전체 시스템으로의 비화: 데이터에 대한 격리가 용이지 못하여, 특정 고객의 문제가 전체 시스템에 문제를 일으킬 수 있다.

등과 같은 문제가 있다.


테넌트별 데이터 격리의 이점

1. 데이터 관리의 용이함 : 테넌트에 대한 고려없이 애플리케이션을 개발할 수 있다.

2. DB 응답속도 향상: 데이터를 적게 관리함으로써 DB의 응답속도가 향상된다.

3. 테넌트 오류 격리 : 특정 테넌트의 데이터 문제로 인해 다른 테넌트의 문제로 비화되지 않는다. 

테넌트별 DB 할당

테넌트별 DB 할당 방법

테넌트별로 DB를 독립적으로 할당받아서 사용할 경우 위의 3가지 문제점을 어느정도 해소할 수 있다. 다만, DB할당 방식에 따라 그 차이가 있을 것으로 예상된다.

1. DB의 분리 - 테넌트별로 별도 Database를 구성한다.

2. Schema 분리 - 동일 DB를 쓰지만, 테넌트별로 schema를 가진다.

3. Discriminator column을 통한 분리 - discriminator column을 기준으로 파티셔닝을 수행

DB 할당 방법별 예상 문제점

1. DB의 분리 - 테넌트의 증가가 크지 않거나 수십개 수준이라면 가능하지만, 그 이상이면 datasource 관리의 어려움이 예상된다.

2. Schema 분리 - DB 분리와 거의 같은 문제 예상

3. Discriminator 분리 - 많은 수의 테넌트가 생겨도 처리에 문제는 없지만, 파티션을 통한 성능 상의 이점은 기존에도 테넌트에 대한 파티션으로 가능한 수준이며, 오류에 대한 격리도 제한적이다.

Grails의 멀티 테넌시 지원 내용

Grails 관련 문서 

Grails Multitanency : Grails 라기 보다 GORM 차원의 멀티테넌시가 지원된다.

DB 분리 멀티테넌시 예제 프로젝트 : Grails guid 문서에서 다룬 DB 분리형태의 멀티테넌시 예제 프로젝트

Spring Security 사용자 로그인과 tenant 연동 Q&A


멀티 테넌시 적용시 이슈 사항

1. 테넌트 적용이 필요한 도메인과 전체가 대상인 도메인 구분

- Grails에서 도메인별 테넌트 사용여부 지정 가능

2. 테넌트가 필요한 도메인이더라도 필요시 전체 대상 또는 지정한 테넌트 지정 필요

- Grails 테넌트관련 anotation 으로 테넌트 지정 가능 다만, withoutTenant에 대한 이해(테스트) 필요

3. 전체 대상 집계 방법

- db 할당 방법별 테스트 필요

4. 테넌트별 DB, 또는 Schema를 가지는 경우 도메인 변경을 각 테넌트별로 간단히 적용할 방법

- grails db migration 기능을 토대로 적용 테스트 필요

5. 멀티 테넌시 적용후 미적용으로 되돌릴는 것이 얼마나 힘든지?

- 적용, 미적용 영향도 파악을 위한 테스트 필요

6. Rest 적용 테스트

- JWT 적용 확인

반응형