ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [시스템 설계] 사용자가 늘어난다면 어떻게 할까? (1)
    프로그래밍 2022. 9. 15. 00:45

     

    본 포스팅은 가상 면접 사례로 배우는 대규모 시스템 설계 기초(알렉스 쉬 지음, 이병준 옮김) 을 보고 개인적인 복기를 위해 간단히 정리한 내용입니다. 따라서 개인적인 학습으로는 적절치 않으니, 책을 직접 참고하시길 바랍니다. 
    말씀드린 책은 대규모 시스템 설계 기초를 쉽게 설명한 좋은 책이므로 꼭 한 번 읽어보시길 추천드립니다.


     

     

    단일서버에서 시작하는 시스템

    한 시스템이 있다. 
    한 시스템은 아래와 같은 구조이다. 
    사용자(client)가 도메인 이름을 입력하면 DNS에서 그에 맞는 IP 주소를 알려주고, 
    IP 주소에 따른 서버에서 사용자가 원하는 요청을 수행한다. 
    그 중 데이터베이스에서 데이터가 필요하다면 데이터베이스에서 데이터를 가져와 요청에 따른 응답을 반환한다. 

    데이터베이스 이야기

    어떤 데이터베이스를 사용할까?

    데이터베이스는 관계형 데이터베이스 시스템(RDBMS)비관계형데이터베이스 시스템 이 두가지 중에서 선택할 수 있다.

    관계형 데이터베이스는 흔히들 아는 MySQL, Oracle, PostgreSQL 등이 있다. 
    관계형 데이터베이스는 자료들이 테이블, 열, 행 구조로 되어 있고 데이터를 관계에 따라 Join 을 할 수 있다. 

    비관계형 데이터베이스는 NoSQL 이라고도 한다. 
    NoSQL은 HBase, Amazon DynamoDB, MongoDB 등이 있다. 
    비관계형 데이터베이스는 키값 저장소, 그래프 저장소, 칼럼 저장소, 문서 저장소 네가지 부류로 나눌 수 있는데
    일반적으로 Join연산은 지원하지 않는다


    보통 시스템은 전통적인 관계형 데이터베이스를 사용하지만, 때로는 비관계형 데이터베이스도 필요할 때가 있는데 
    그것이 아래와 같은 경우이다. 

    - 아주 낮은 응답 지연시간(latency)이 요구될 때

    - 다루는 데이터가 비정형이라 관계형 데이터가 아닐 때

    - 데이터(JSON, YAML, XML 등)를 직렬화, 역직렬화할 수 있기만 하면 될 때

    - 아주 많은 양의 데이터를 저장할 필요가 있을 때

     

    서버 확장 이야기

    사용자가 점점 늘어나면 서버를 확장할 필요가 있을 텐데, 이때 두가지 방법으로 서버를 확장할 수 있다. 
    바로 수직적 규모 확장수평적 규모 확장이다.

    수직적 규모확장은 scale up 이라고도 하는데, 
    이는 서버에 더 좋은 CPU, 더 많은 RAM 등 고사양 자원을 추가하는 행위이다. 

    수평적 규모확장은 scale out 이라고도 하며, 
    더 많은 서버를 추가하여 성능을 개선하는 행위이다. 

    수직적 규모확장의 경우엔 증설에 물리적 한계가 있다. 
    또한 장애에 대한 자동복구(failover) 이나 다중화(redundancy) 방안을 제시하지 않아 서버에 장애가 발생하면 서비스는 중단된다.
    따라서 대규모 애플리케이션에는 수평적 규모확장법이 적절한데, 이때 나오는 것이 로드밸런서이다. 

     

    부하를 분산시켜주는 로드밸런서

    로드밸런서는 부하분산집합에 속한 웹 서버들에게 트래픽 부하를 고르게 분산한다. 
    앞서 보았던 시스템에 로드밸런서를 추가하면 아래와 같은 모습이 된다. 

    로드밸런서는 client로부터 받은 public IP 를 받지만, 각 서버와 통신할 때에는 private IP(사설 IP 주소) 를 이용한다. 
    사설 IP 주소는 같은 네트워크에 속한 서버 사이의 통신에서만 쓰일 수 있는 IP 이며 인터넷을 통해 접속할 수 없다. 
    로드밸런서는 웹서버와 통신하기 위해 해당 사설 IP 주소를 사용한다. 

    이를 통해 서버 하나가 다운되면 모든 트래픽은 나머지 살아있는 서버로 넘어가게 되기 때문에 서비스 전체가 다운되는 일을 방지할 수 있다. 또한 추가적으로 부하 방지를 위해 서버를 새롭게 추가할 수도 있다. 

    이렇게 웹계층에서는 부하를 분산시켜 많은 트래픽을 대처할 수 있다. 
    그렇다면 데이터 계층은 어떻게 할까?

     

    데이터베이스를 다중화하여 부하를 분산하기

    보통 애플리케이션은 읽기 연산이 쓰기 연산보다 더 많이 일어난다. 
    데이터베이스를 주(Master) - 부(Slave) 관계로 나누어 놓고 원본은 주 서버, 사본은 부 서버에 저장하여 
    쓰기 연산은 주 서버에서만, 읽기 연산은 주 서버에서 사본을 전달받는 부 서버가 담당하도록 하는 것이 데이터베이스 다중화이다. 

    이 경우에도 한 쪽이 다운되더라도 살아있는 한쪽이 역할을 수행할 수 있다. 
    그런데 만약 주 데이터베이스 서버가 다운되는 경우에, 부 데이터베이스가 한 대 밖에 없다면 해당 부 데이터베이스가 주 데이터베이스 서버가 되며 모든 데이터베이스 연산을 맡게 된다. 

     

    위에서 본 로드밸런서와 데이터베이스 다중화 모두 적용시킨 시스템을 그림으로 보면 아래와 같다. 

    - 사용자(client)는 DNS 로부터 로드밸런서의 공개 IP 주소를 받는다. 
    - 사용자는 해당 IP로 로드밸런서에 접속한다. 
    - 로드밸런서는 서버 1 혹은 서버2에 요청을 전달한다. 
    - 웹 서버는 사용자의 데이터를 부 데이터베이스 서버에서 읽는다. 
    - 웹 서버는 데이터 변경 연산은 부 데이터베이스 서버로 전달한다. 

     


     

    이 다음으로 볼 것은 응답시간(latency) 개선이다. 
    응답시간의 개선은 포스팅2편에서 캐시와 CDN(콘텐츠 전송 네트워크)를 자세히 살펴볼 예정이다. 


    포스팅 2편으로 이어서 .... 

    댓글

Designed by Tistory.