내부 단편화란 할당한 용량보다 메모리를 적게 사용하여 메모리가 남게 되는 것을 말한다. 리눅스에서 메모리 페이징으로 메모리를 관리하기 때문에 어느정도는 발생할 수 밖에 없다. redis는 in memory data store로, 캐시로도 많이 쓰이기 때문에 메모리 관리가 중요하다. 여러 지표중에서 Fragmentation Ratio에 대해서 알아보자 redis-cli에서 INFO 명령어로 Fragmentation Ratio를 확인할 수 있다.redis> INFO "# Server redis_version:7.0.5redis_git_sha1:00000000 redis_git_dirty:0redis_build_id:383256aa4e712b9dredis_mode:standalone os:Linux 5...
backend
Redis는 데이터를 영구적으로 저장하는 AOF/RDB 방식의 DB 백업 용도로 사용되고 있으며, 주로 인메모리 캐시다보니 캐시 저장 용도로 많이 사용되고 있다. 레디스는 시스템 성능을 높이는데 많은 역할을 하는 좋은 솔루션이다. 그렇지만, 레디스는 메모리 측면에서 제대로 관리하지 않게 된다면 이는 곧 장애로 이어지기도 한다. Swap레디스는 메모리에 데이터를 저장한다. 그렇기에 물리 메모리(RAM) 용량보다 더 많은 데이터를 사용하게 된다면 메모리 부족으로 swap 발생하여 Redis의 성능 저하를 일으킬 수 있다. 위의 그림처럼 데이터를 물리 메모리의 용량보다 더 많이 사용하게 된다면 swap이 발생한다. 운영체제에서 swap space의 주요 기능은 물리메모리의 양이 가득차고 더 많은 메모리의 양이..
자바로 프로젝트를 진행할 때, 보통 에러 처리의 일관성과 가독성, 로깅, 디버깅, 예외 처리 유연성을 위해서 CustomException 클래스를 정의하여 자주 사용한다. 그러나 여러 이점들이 있음에도, 자바에서는 Exception의 처리 비용이 매우 비싸다는 문제가 있다. 이번 글에서는 JVM이 Exception을 처리하는 순서와 생성 비용이 비싼 이유, 마지막으로 비용 절감 방법에 대해서 알아보도록 하겠다. JVM Exception 처리 순서이 글을 참고해보면, Exception이 발생하면 다음과 같이 JVM에서 Exception을 수행한다. 예외 발생: 예외가 발생하면 JVM은 예외 객체를 생성하고, 예외를 발생시킨 메서드의 호출 스택을 추적한다.예외 객체 전파: JVM은 해당 예외를 발생시킨 메서..
Kafka의 리밸런싱 븡식은 적극적 리밸런싱과 협력적 리밸런싱이 나뉘며 각각 4가지의 파티션 할당 종류가 존재한다. 범위(Range) 파티션 할당 전략 - 적극적 리밸런싱 라운드 로빈(RoundRobin) 파티션 할당 전략 - 적극적 리밸런싱 스티키(Sticky) 파티션 할당 전략 - 적극적 리밸런싱 협력적 스티키(CooperativeSticky) 파티션 할당 전략 - 협력적 리밸런싱 하나씩 알아보도록 하자 범위(Range) 파티션 할당 전략 범위 파티션 할당 전략은 카프카 v2.4 버전 이전에 기본으로 설정된 적극적 리밸런싱 방식의 파티션 할당 전략이다. 범위 파티션 할당 전략은 다음과 같은 프로세스를 거친다. 구독중인 파티션과 컨슈머를 순서대로 나열한다. 이후 각 컨슈머가 받아야할 파티션의 수를 결정..
카프카 컨슈머는 토픽의 각 파티션에서 메시지를 처리하는 역할을 한다. 그런데, 특정 컨슈머가 문제를 겪게 되면 그 컨슈머가 처리하던 파티션의 소유관은 다른 컨슈머로 넘어가게 된다. 이런 과정을 리밸런싱이라고 부르며 주로 아래와 같은 상황에서 발생한다. 컨슈머 그룹에 새로운 컨슈머가 추가 될 때 (+) 기존 컨슈머가 그룹에서 나가게 될 때 (-) 구독하는 토픽에 새로운 파티션이 생길 때 컨슈머가 구독하는 토픽이 변경될 때 리밸런싱이 가장 많이 일어나는 일반적인 상황은 애플리케이션 배포 상황이다. 기존 애플리케이션이 종료 후에 애플리케이션이 실행되면서, 기존 컨슈머가 삭제되고 새로운 컨슈머가 생성되기 때문이다. 이 과정에서 리밸런싱은 최소 두번 이상 발생한다. 리밸런싱은 아래와 같은 문제점을 동반한다. do..
MongoDB에서는 트랜잭션을 지원하지 않는다. 그렇기에 데이터 복구가 안된다는 한계가 있다. 여러 환경에서 데이터 복구를 구현하려면 어떻게 해야하고 어떤 것을 지원하고 있는지 알아보겠다. UNDO - 복구, 원상태 롤백 REDO - 복구, 실패시 재시도 몽고디비에서는 UNDO와 REDO가 존재하지 않는다 -> DB가 보장되지 않음 (정보가 100퍼센트 정확하하지 않는다.) 해결하기 위해서는? -> 이런 경우에는 프로그래밍 레벨에서도 처리해줄 수는 있다. (try catch 같은 것으로 실패했을 경우 다시 update, insert) 하지만 위와 같은 방법을 해도 몽고 디비가 데이터를 보장해주지는 않는다. 그렇다면 몽고디비에서는 undo, redo를 프로그래밍으로 처리할 수 밖에 없는가? 그건 아니고 방..
오늘은 MySQL에서 TEXT와 VARCHAR에 대해서 알아보고 차이점도 함께 보겠습니다. VARCHAR VARCHAR를 통해 컬럼 타입을 지정해준다고 했을때 VARCHAR(10), VARCHAR(1000) 이렇게 각각 다르게 지정해주었을 때 성능상의 차이점이 있을까요? 그냥 다 크게 잡아버리면 안될까요? 한 번 VARCHAR를 엄청 길게 잡고 테이블을 생성해보면 mysql> CREATE TABLE tb_long_varchar (id INT PRIMARY KEY, fd1 VARCHAR(1000000)); ERROR 1074 (42000): Column length too big for column 'fd1' (max = 16383); use BLOB or TEXT instead mysql> CREATE ..
1부에서 언급한바와 같이 신입 개발자들이 갖출 역량중에 가장 중요한 역량중 하나가 바로 이러한 개념적인 역량들일 것이다. 정말 중요할까? 라는 질문을 남기는 분들이 꽤 있으실 것이다. "별로 안중요해~", "그런거 몰라도 실무 할 수 있어~" 이런말이 있다? 도대체 난 이러한말을 누가 말한 것일까 난 지금까지 많은 개발자 분들을 만나와봤지만 단.한.명.도 그런말을 하시는 개발자들은 존재하지 않았다. 오히려 개념의 중요성을 강조해주시기만 했지.. "개념을 몰라도 실무를 할 수 있어" 라는 말은 과연 실무가 가능은 하지만 개념은 중요하다는 의도로 말해주신 조언인지 과연 개념을 아예 몰라도 괜찮다는 뜻의 조언인지 잘 파악해서 들어라, 대부분 전자가 맞을거다. 어 그래 개념 중요하다 당장 책피고 읽자.. ㅋ 그..
신입 개발자거나 취준생으로서 가장 중요한 역량이 바로 기초 개념과 같은 부분들일 것이다. 물론 이러한 개념들은 실무 개발하면서 그렇게 엄청나게 많은 부분은 관여하지 않는다. 사실 나는 정말 중요하다고 생각하는데 많은 신입, 주니어들이 별로 그렇게 안느껴지는 이유가 신입들한테는 그러한 딥한 업무를 주지 않아서이지 않을까라고 생각이 들긴 한다. 어쨋든 개념은 정말 중요하다! 포트폴리오로 어필을 잘 해놨더라도 기술면접에서 망하면 말짱도루묵이니까! 이제 한번 이러한 역량들을 강화하기 위한 방법들을 한 번 소개해보겠다. 개발자의 성장 곡선 개발자의 성장곡선을 한번 봐보도록 하자 물론 모두가 이렇지는 않지만 대게 취업까지 골인하신 개발자분들은 다음과 같은 성장 곡선일 것이다. 가로선이 시간이고 세로선이 성장 수치로..