목록전체 글 (281)
개발일기
선착순 시스템의 트래픽 문제를 개선해보자현재 운영 중인 서비스에는 매일 특정 시간 동안 사용자들이 선착순으로 사건을 가져갈 수 있는 기능이 있다.평상시에는 문제가 없지만 선착순이 시작되는 시간이 되면 상황이 달라진다.많은 사용자가 짧은 시간 동안 동시에 사건 목록을 조회하면서 트래픽이 집중되고, 자연스럽게 조회 속도가 느려지는 문제가 발생했다.실제로 사용자들로부터 “사건 목록이 너무 늦게 나와요.” 라는 문의가 지속적으로 들어왔다. 해당 문의를 받은 후, DB 접속이나 pinpoint 모니터링 툴을 사용하여 확인해보았다. DB Load까지 걸리는 시간 pinpoint 10초 이상으로 치솟는 응답이 매우 많이 관측되었습니다. 특히 심각한 날에는 10초를 초과하는 응답이 대량으로 발생하는 패턴이 확인됩니..
1. 컨테이너가 사용할 수 있는 리소스 사용량을 제한한다. docker run--cpu={CPUcore 수} 컨테이너가 사용할 최대 CPU코어 수 정의 (호스트 머신의 CPU 성능에 상대적) --memory={메모리용량}컨테이너가 사용할 최대 메모리 정의 (b,k,m,g 단위로 정의 가능) 컨테이너 리소스 사용량을 조회하는 도커 명령어 docker stats (컨테이너명/ID)컨테이너의 리소스 사용량 조회docker eventsHOSTOS에서 발생하는 이벤트 로그 조회 docker run -d --name no-limit nginx docker inspect no-limit | grep -e Memory -e Cpus "Memory": 0, "NanoCpus"..
- 동시에 같은 볼륨을 사용하거나, 각각의 컨테이너에 별도의 볼륨을 연결할 수 있다.- 동시에 같은 볼륨을 사용하면 구성이 간단하지만 볼륨에 문제가 생길 경우 대처가 어렵다. - 동시에 같은 볼륨을 사용하면 볼륨의 성능에 부하가 생길 수 있다.- 각각의 컨테이너에 별도의 볼륨을 연결하면 데이터의 싱크를 맞추는 처리를 별도로 해야 합니다. 출처 :) 쉬운도커 데이터 이중화구조 프라이머리-스탠바이 복제 구조의 경우 프라이머리 서버에만 쓰기 작업을 수행하며, 프라이머리의 상태를 스탠바이에 복제합니다. 스탠바이 서버는 읽기 전용으로만 사용되며, 읽기 전용 스탠바이 서버를 여러 대 사용할 수 있다. 프라이머리-프라이머리 복제 구조의 경우 모든 서버에 읽기/쓰기 작업을 수행합니다. 여러 서버에서 동시에 쓰..
-Dockerfile에 작성된 순서대로 결과 이미지의 레이어가 쌓입니다. - Docker는 각 단계의 결과 레이어를 캐시처리합니다. 지시어가 변경되지 않으면 다음 빌드에서 레이어를 재사용합니다. - COPY , ADD 명령의 경우 빌드 컨텍스트의 파일 내용이 변경되어도 캐시를 사용하지 않는다. - 명령어가 달라지면 그 레이어와 이후의 모든 레이어는 캐시를 사용하지 않고 새로운 레이어가 만들어집니다.FROM node:14WORKDIR /usr/src/appCOPY . . RUN npm ci RUN npm run buildCMD ["npm", "start"] 보통 그래서 어플리케이션의 라이브러리 이미지는 거의 변경이 안되기때문에 가장 상단의 레이어에 위치한다. 화면의 도커 파일에서는 COPY 지시어는 위에..
- Dockerfile에 작성된 지시어 하나 당 레이어가 한 개 추가됩니다. - 불필요한 레이어가 많아지면 이미지의 크기가 늘어나고 빌드 속도가 느려질 수 있습니다. BASE 역할을 하는 node:14는 총 레이어 14개이다. 14개의 레이어에 총 4개의 레이어로 총 18개의 레이어 개수가 늘어난다. - RUN 지시어는 &&을 활용해 최대한 하나로 처리합니다.- 불필요한 명령어를 추가해서 레이어의 개수를 늘리지 않습니다. FROM ubuntu:latestRUN apt-get updateRUN apt-get install -y curlRUN apt-get install -y xz-utilsRUN apt-get install -y gitRUN apt-get cleanRUN 지시어를 5번 수행해 5개..
- 컨테이너가 삭제되거나 재생성될 경우 컨테이너레이어가 초기화된다. 서버를 운영하다보면 데이터를 유지해야 하는 경우가 필요하다. 이러한 경우를 영속성이 필요하다고 표현한다. - 컨테이너 환경에서는 같은 서버의 대수가 여러 개 존재합니다. 컨테이너 상태가 없기 때문에 전체가 삭제 되어야한다. 영속성이 필요한 데이터는 같은 종류의 컨테이너가 모두 공유하고 있어야 한다. 도커는 이렇게 영속성이 필요한 데이터를 위해서 도커 volume이라는 것을 사용한다.컨테이너 자체는 상태를 가지지 않지만 상태를 가져야하는 외부 저장 데이터는 저장하는 것이다. 도커의 volume 기능을 사용하면 컨테이너가 외부에 데이터를 저장하고 다른 컨테이너들과 이를 공유할 수 있다. 컨테이너의 모든 데이터를 저장하는 것이 아닌 컨테..
상태 없음 (Stateless)- 컨테이너는 상태 없음(Stateless) 입니다. 컨테이너가 실행 된 후 발생하는 모든 변경 사항은 컨테이너 레이어에만 있으며 컨테이너가 종료되면 변경 사항이 모두 사라집니다. - 컨테이너는 Stateless하기 때문에 쉽게 개수를 증가시킬 수 있으며 다른 환경에서도 빠르게 배포할 수 있다. - 소프트웨어의 버전 등 컨테이너의 상태 변경이 필요한 경우 새로운 버전의 이미지를 만들어서 배포한다. - 컨테이너는 상태가 없기 때문에 여러 대의 컨테이너를 여러 곳에 빠르게 배포할 수 있습니다. Pert & Cattle- 클라우드 네이티브 환경에서는 MSA 아키텍처에 따라 서버의 개수가 매우 많아집니다. 모던 애플리케이션의 요구사항을 충족시키기 위해 서버 관리 방법론이 변화했습..
도커 네트워크 포트포워딩 docker run -p HostOS포트:컨테이너포트 docker run -d --name nginx nginxnginx가 실행되어도 외부에서 접근이 안된다. 왜냐하면 172.17.0.2로 검색어로 입력해도 해당 IPAddress는 내부 아이피이기 때문이다. docker run -d -p 8001:80 --name nginx2 nginx 이번에는 localhost:8001로 접근하였을 때, 정상적으로 접근이 가능하다. docker run -d -p 8002:3000 --name redColorApp --env COLOR=red devwikirepo/envnodecolorapp docker network create --driver bridge --subnet 10.0.0.0..