전체 글 140

개발자가 반드시 알아야하는 데이터베이스 - Master와 Slave에 쿼리 분산(Feat. MMM 구조)

개요저번 서버 회의시간에, @Transaction(readonly = true) 옵션에 대해 얘기를 하던 중, slave DB의 dataSource 을 따로 생성해서, Select 쿼리는 slave로 그외 나머지 쿼리는 master로 보내는 방법이 나왔었다. 관련해서 현재 게임 DB는 어떻게 구성되어 있고, 위 방법을 사용할 수 있는지, 알아보았다. MMM (Multi-Master Replication Manager) 구조리얼환경에서 사용중인 DB는 Master 1대와 Slave 2대로 구성되어 있다.Slave 중 1대는 Master와 VIP로 묶여있다. 그렇다면, VIP로 묶은 이유가 장애 대응 때 사용되는 것인지, 로드밸런싱 ip인지(부하분산) DBA분께 물어봤다. mmm vip로, 장애대응을 위해서..

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 4장(처리율 제한 장치의 설계)

처리율 제한 장치 네트워크 시스템에서 처리율 제한 장치는 클라이언트 또는 서비스가 보내는 트래픽의 처리율을 제어하기 위한 장치이다. API 요청 횟수가 제한 장치에 정의된 임계값을 넘어서면 추가 API들은 버려지거나, 중단된다. 아래에는 몇가지 예시이다. 사용자는 초당 2회 이상의 새 글을 올릴 수 없다. 같은 IP 주소로는 하루에 10개 이상의 계정을 생성할 수 없다. 같은 디바이스로는 주당 5회 이상 리워드를 요청 할 수 없다. 처리율 제한 장치를 두면 좋은점은 아래와 같다. DOS 공격에 의한 자원 고갈을 방지할 수 있다. (트위터는 3시간 동안 300개 트윗 제한, 등등) 비용을 절감한다. 추가요청에 대한 처리를 제한하면 서버를 많이 두지 않아도 되고, 우선순위가 더 높은 API에게 자원을 할당할..

JAVA - 리플렉션의 모든 것

아래 코드는 스프링을 사용한 BookService 코드이다. @Service public class BookService { @Autowired BookRepository bookRepository; } 질문 bookRepository 인스턴스는 어떻게 null이 아닌걸까? 스프링은 어떻게 BookService 인스턴스에 BookRepository 인스턴스를 넣어준 것일까? 리플렉션 API - 클래스 정보 조회 리플렉션의 시작은 Class 이다. Class에 접근하는 방법 모든 클래스를 로딩 한 다음 Class의 인스턴스가 생긴다. “타입.class”로 접근할 수 있다. 모든 인스턴스는 getClass() 메소드를 가지고 있다. “인스턴스.getClass()”로 접근할 수 있다. 클래스를 문자열로 읽어오..

스프링 부트 2.x 에서 3.x 로 버전 업 시 발생하는 이슈

개요 스프링 부트 2.x 에서 3.x 로 마이그레이션하면서, 여러 이슈가 있었는데, 그 중org.apache.httpcomponents.client5 의존성은 개인적으로 까다롭고, 바뀐 버전에 대해 정확히 알아보고 사용해야 할 것 같아 정리한다. pom.xml 수정 BEFORE org.apache.httpcomponents httpclient 4.5.13 AFTER org.apache.httpcomponents.client5 httpclient5 5.2.1 RestTemplate 버전 업 이후, RestTemplate설정 부분에서 에러가 발생하였다. 원인은 Spring Framework 6(스프링 부트 3.x)에서 HttpClient 4 라이브러리가 삭제되었기 때문이다. 아래 스프링 공식문서 참고 Dep..

JVM & 클래스 로더란?

JVM (Java Virtual Machine) 자바 가상 머신으로 자바 바이트 코드(.class 파일)를 OS에 특화된 코드로 변환(인터프리터와 JIT 컴파일러)하여 실행한다. JRE (Java Runtime Environment): JVM + 라이브러리 자바 애플리케이션을 실행할 수 있도록 구성된 배포판. JVM과 핵심 라이브러리 및 자바 런타임 환경에서 사용하는 프로퍼티 세팅이나 리소스 파일을 가지고 있다. 개발 관련 도구는 포함하지 않는다. (그건 JDK에서 제공) JDK (Java Development Kit): JRE + 개발 툴 JRE + 개발에 필요할 툴 소스 코드를 작성할 때 사용하는 자바 언어는 플랫폼에 독립적. 오라클은 자바 11부터는 JDK만 제공하며 JRE를 따로 제공하지 않는다...

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 3장(시스템 설계 면접 공략법)

효과적인 면접을 위한 4단계 접근법 책에서 제시하는 효과적인 면접을 위한 4단계 접근법이 있다. 해당 내용은 면접에도 유용하게 사용될 수 있지만, 문제 해결이나, 토론, 회의 등에도 유용하게 사용할 수 있는 방법론인 것 같다. 1단계 문제 이해 및 설계 범위 확정 먼저 시스템을 구축 OR 어떤 질문에 대한 답을 하기 전에, 구체적인 요구사항을 질문하는 것이 좋다. 아래는 몇가지 예시이다. 구체적으로 어떤 기능을 만들어야하는지? 사용자 수는 얼마나 되는지 회사 규모는? 기한은 언제까지인지? 회사가 주로 사용하는 기술 스택은 무엇이고, 어떤 모듈들을 사용중에 있는지? 2단계 개략적인 설계안 제시 및 동의 구하기 해당 단계에서 초점을 맞추어야 할 것은 개략적인 설계안을 제시하고 면접관의 동의를 얻는 것이다. ..

개발자가 반드시 알아야하는 데이터베이스 - MYSQL IS NULL 조건문 쿼리 최적화 하기

개요저번 글에서 스카우터를 활용하여 API의 성능을 측정할 수 있는 Summary 기능을 소개했었다.https://code-killer.tistory.com/190해당 기능을 이용하여 slow 쿼리를 발견하였는데, 아래와 같았다.select * from temp t where t.col is null단순한 구문이라, 인덱스을 활용하여 쿼리 성능을 높이려고 했다.근데, 문득 null 값을 허용하는 컬럼도 인덱스 성능의 효과가 있을까? 라는 의문이 들어, 관련 내용을 찾아보고, 실험도 직접 해봤다.먼저 DB 환경에 따라 달라진다.오라클오라클은 인덱스에 null 값을 저장하지 않는다고 한다.즉 아래와 같은 null을 이용한 쿼리에 인덱스를 타지 않고, Full Scan을 진행한다.select * from te..

직렬화 매개변수로 ArrayList는 되고, List는 안되는 이유

개요 프로젝트를 진행하면서, 직렬화 된 객체를 매개변수로 받는 메서드를 만들었다. public void putData(String key, Serializable data) { data.put(key, data); } 해당 메서드를 사용하는데, List 타입으로 직렬화 변수를 넣으면 컴파일 에러가 발생하였고, ArrayList 타입을 넣었을 때는 정상적으로 동작한다. // 정상동작 ArrayList newData = new ArrayList(); newData.putData(key, newData); // Type 컴파일 에러 발생 List newData = new ArrayList(); newData.putData(key, newData); 선언은 다르지만 어쨋든 new ArrayList()을 할당 했..

ELK - 엘라스틱 서치에 L4 붙일 때 문제점

개요 로그 수집 용도로 ELK를 사용하고 있었는데, 원래 보안 용도로 클라이언트에서 서버를 거쳐 로그를 수집하고 있었다. 로그 양이 많아지니, 서버의 부하가 몰려 성능 이슈가 발생할 수도 있었다. 방지를 위해, 클라에서 ELK로 바로 쏘도록 구조를 변경할 필요성을 느꼈고, VIP와 L4을 추가하도록 하였다. 원래 Elasticsearch는 자체 로드밸런싱 기능이 있어서, 1개의 머신으로 보내도 로드밸런싱을 하지만, 트래픽 양이 많을 때도, 제대로 작동할 지 몰라, 앞단에 로드밸런스를 놓기로 하였다. 문제 사내에서 ELK 구조는 머신 6대를 클러스터로 구성하여 사용하고 있다. 또한, 사용하는 L4 방식이 proxy 방식이다. 아래는 elasticsearch.yml의 일부 내용이다. bootstrap.mem..

가상 면접 사례로 배우는 대규모 시스템 설계 기초 - 2장(개략적인 규모 추정)

2의 제곱수 모든 프로그래머가 알아야 하는 응답지연 값 메모리는 빠르지만 디스크는 아직도 느리다. 디스크 탐색은 가능한 피하라 단순한 압축 알고리즘은 빠르다. 데이터를 인터넷으로 전송하기 전에 가능하면 압축하라 데이터 센터는 보통 여러지역에 분산되어 있고, 센터들 간에 데이터를 주고 받는데에 시간이 걸린다. 통신할 때, 데이터를 압축하거나, 용량을 줄이는 것에 대해는 와닿는다. 예를 들어, 이미지를 저장하는데, 클라 -> 서버 -> 이미지서버라면, 2번의 통신에 용량이 큰 이미지가 들어갈 것이다. 용량이 큰 이미지는 클라이언트에서 바로 이미지 서버로 전송하는 것이 더 효율적일 것이다. 가용성에 관계된 수치들 고가용성(High availability)는 시스템이 오랜 시간 동안 지속적으로 중단 없이 운영될..

728x90