Backend 44

도커 네트워크

네트워크에서 IP 주소의 고갈을 막기 위해 사설 IP와 공인 IP를 나누는 NAT이라는 개념이 등장했다. 도커에서도 이와 유사하게 하나의 컴퓨터에서 여러 개의 컨테이너를 구동하는 경우, 각 컨테이너마다 IP 주소가 할당되는데, 이 IP 주소는 도커가 설치된 호스트 내에서만 쓸 수 있는 IP로 외부와의 통신이 불가능하다. 그러면 각 컨테이너는 어떻게 외부와의 네트워크 통신이 가능한 걸까? eth0호스트의 eth0은 실제 우리가 외부와 연결할 때 사용하는 호스트 네트워크 인터페이스이다.컨테이너 안에 eth0은 veth 가상 인터페이스를 통해 외부와 통신할 수 있게 되는 것이다.veth컨테이너가 시작될 때마다 호스트에 veth(virtual eth)라는 가상의 네트워크 인터페이스가 생성된다.컨테이너가 외부와 ..

Backend/Docker 2024.06.25

도커 알아보기

하나의 컴퓨터 위에서 여러가지 응용 프로그램을 실행시키고 싶을 수 있다. 이는 운영체제도 마찬가지이다. 맥 위에서 윈도우를 실행시키고 싶을 수도 있고, 반대로 윈도우 위에서 리눅스를 실행시키고 싶을 수도 있다. 동시에 여러가지를 실행시키는 가장 단순한 방법으로, 하드웨어를 여러 개 사서 하나에 하나씩 돌리는 무식한 방법이 있다. 그러면 하드웨어에 상관없이 하나의 하드웨어 위에 여러 개의 응용 프로그램을 돌리는 방법을 알 수 있다면 모든 것이 해결되지 않을까? 따라서 하나의 컴퓨터 자원을 마치 여러 개인 것처럼 가상으로 쪼개서 사용할 수 있도록 하는 가상화 기술이 필요하다.가상화가상화는 하나의 물리적 컴퓨터에서 다수의 독립적인 가상 시스템을 생성하고 실행할 수 있게 해주는 기술이다. 그리고 이 가상화를 통..

Backend/Docker 2024.06.25

센티널 로컬과 도커에 적용해보기

로컬에 적용이전 글에서 레디스의 복제와 센티널에 대해 알아봤다. 이번 글에서는 이들을 로컬 환경과 도커 환경에서 직접 적용해보자. 우선 로컬에 적용해보자. 레디스 서버는 다음과 같다.마스터: 6379 포트슬레이브: 6380 포트그리고 레디스 센티널 서버는 다음과 같다.센티널 서버 1: 26379 포트센티널 서버 2: 26380 포트센티널 서버 3: 26381 포트레디스 서버 띄우기(복제 환경)우선 복제 환경을 구성하기 위해 레디스 마스터와 슬레이브 서버를 띄워보자.  /etc/redis 경로에 다음 두 개의 파일을 만들어뒀다. sudo nano /etc/redis/master.confsudo nano /etc/redis/slave.confmaster.confport 6379masterauth 1234re..

Backend/Redis 2024.05.31

레디스 복제(Replication)와 센티널(Sentinel)

고가용성가용성이란 일정 기간 동안 서비스를 정상적으로 사용할 수 있는 시간의 비율을 뜻하며, 이 값이 클수록 가용성이 높다고 한다. 서비스를 안정적으로 운영하기 위해서는 가용성을 높일 수 있는 방안을 도입해야 한다.  레디스는 고가용성을 확보하기 위해 다음 두 가지 기능을 제공한다.복제: 마스터 노드의 데이터를 복제본 노드로 실시간 복사하는 기능이다. 따라서 마스터 노드의 서버에 장애가 생겨 데이터가 유실된다고 해도 복제본 노드에서 데이터를 확인할 수 있다.자동 페일오버: 마스터 노드에서 발생한 장애를 감지해 레디스로 들어오는 클라이언트 연결을 자동으로 복제본 노드로 리다이렉션하는 기능이다. 따라서 마스터 노드의 서버에 장애가 발생했을 때 빠른 조치가 가능하다.복제(Replication)복제를 하는 이유..

Backend/Redis 2024.05.30

프로젝트에서 레디스를 사용하며 한 고민들

RDB 레디스는 인메모리 기반의 데이터베이스이다. 따라서 서버가 꺼지면 데이터는 모두 휘발된다. 만약 레디스의 데이터를 영구 저장하고 싶으면 레디스가 제공하는 AOF와 RDB 기능을 사용하면 된다. 두 기능에 대한 설명은 https://olsohee.tistory.com/115 이 글에 나와있다. 간략히 두 방식을 비교하면 데이터 손실이 없어야 하면 AOF를, 어느정도의 데이터 손실이 발생해도 괜찮으면 RDB를 사용하면 될 것 같다. 나의 경우, 레디스에 있는 인기글과 사용자 정보를 백업해야 하는 상황인데, 이는 어느정도의 데이터 손실이 발생해도 괜찮기 때문에 그 대신 적은 데이터 크기와 빠른 복구의 이점을 얻을 수 있는 RDB를 사용했다. RDB를 사용하면 일정 시간마다 스냅샷을 찍어 데이터 백업이 진..

Backend/Redis 2024.05.24

RabbitMQ

메시지 브로커가 필요한 이유RabbitMQ는 AMQP(Advanced Message Queuing Protocol)라는 표준 프로토콜을 사용하는 메시지 브로커로, 송신자로부터 전달받은 메시지를 수신자로 전달해주는 중간 역할을 한다. 즉, 메시지 큐를 관리하고 애플리케이션 간에 메시지를 송수신할 수 있게 해준다. 그런데 이러한 메시지 브로커가 필요한 이유가 뭘까? 즉, 애플리케이션 간에 직접적인 통신이 아니라, 굳이 중간에 메시지 브로커를 두는 이유가 뭘까?비동기 처리를 통해 애플리케이션 간 결합도를 낮출 수 있다. 만약 메시지 브로커를 사용하지 않고 송신 측과 수신 측이 직접적으로 통신한다면 어떻게 될까? 동기적 통신의 경우, 송신 측은 수신 측에게 작업을 요청하고 요청에 대한 응답이 돌아올 때까지 블로..

Backend/RabbitMQ 2024.05.02

깃허브 액션, 도커, EC2, RDS를 통해 배포하기

도커를 처음 사용해보며 3일 간 많이 헤맸지만 그만큼 많이 배운 거 같다. 다음에 같은 실수를 반복하지 않기 위해 이번에 도커를 사용한 과정을 기록하고자 한다.배포 과정1. RDS 생성, EC2 서버 구축 및 설정우선 AWS의 RDS와 EC2를 생성해야 한다.  그리고 EC2 서버에 도커 컨테이너를 통해 자바 프로그램을 실행시킬 것이기 때문에 EC2 서버에 도커를 설치해야 한다. ssh를 통해 EC2 서버에 접속한 다음, 이 블로그를 따라 서버에 도커를 설치하면 된다. 설치 후에는 docker --version을 통해 설치된 도커 버전을 확인할 수 있다. 이어서 자바 프로그램 외에도 redis도 도커 컨테이너로 띄워야 하므로, docker pull redis 명령어를 통해 redis 이미지를 pull 받..

Backend/Docker 2024.04.26

도커(Docker) 사용하기

도커를 통해 프로젝트 구동시키기1. 서버에 Docker 설치하기다음 블로그 (https://everydayyy.tistory.com/121)를 따라 서버에 Docker를 설치하면 된다.2. 이미지 생성하기도커에는 스프링부트 프로젝트, MySQL, Redis가 각각 컨테이너로 생성되어야 한다. 그리고 컨테이너를 실행시키기 위해서는 도커 이미지가 필요하다.2-1. 스프링부트 프로젝트 이미지 생성우선 스프링부트 프로젝트를 기반으로 도커 이미지를 생성해보자. 이를 위해서는 프로젝트 내에 도커 파일을 생성해줘야 한다. 도커 파일은 도커가 이해할 수 있는 설정 파일로, 도커 이미지를 만드는데 필요한 정보를 담고 있다. 따라서 어떤 자바를 사용할 것인지, 어떤 jar 파일을 사용할 것인지 등을 설정해줘야 한다. 내가..

Backend/Docker 2024.04.24

스프링부트에서 Redis 사용하기

Redis와 직렬화/역직렬화 레디스의 데이터 저장 형식은 byte array 형태이며, 사용하는 쪽에서 포맷을 지정하여 저장 및 조회할 수 있다. Spring Data Redis는 자주 쓰는 포맷을 편리하게 사용할 수 있도록 미리 Serializer 클래스를 정의해뒀다. 대표적인 Serializer 클래스를 살펴보자. JdkSerializationRedisSerializer 디폴트 Serializer이며 다른 Serializer를 지정하지 않으면 기본으로 사용된다. JdkSerializationRedisSerializer가 사용되면 레디스에는 바이너리 형태로 데이터가 저장된다. StringRedisSerializer redisTemplate.setKeySerializer(new StringRedisSer..

Backend/Redis 2024.02.17

Redis 알아보기

Redis 캐시로 사용하기 캐시란 데이터의 원래 소스보다 더 빠르고 효율적으로 액세스할 수 있는 임시 데이터 저장소이다. 이때 자주 액세스되고, 자주 변하지 않는 데이터가 캐시로 적합한 데이터이다. 레디스는 캐시로 적합한데 그 이유는 다음과 같다. 레디스는 인메모리 기반의 데이터 저장소로, 처리 속도가 빠르다. 따라서 단순한 Get/Set 명령어의 경우 초당 10만 TPS를 갖는다(1초당 10만개의 명령 처리 가능). (*인메모리: 데이터를 메인 메모리(=랜덤 액세스 메모리(RAM))에 저장하여 처리하는 방식) 레디스는 다양한 자료구조를 지원한다. 따라서 적절한 자료구조를 사용하여 데이터를 용이하게 관리할 수 있다. 캐싱 전략 읽기 전략 - Look Aside 데이터를 찾을 때 우선 캐시를 조회한다(Ca..

Backend/Redis 2024.02.16