개요 서비스에서 380만 정도 Key에 21GB 정도의 메모리가 할당되어 운영되고 있습니다. 메모리 DB 라는 관점에서, 21GB 라는 메모리는 큰 편이라고 볼 순 없지만 AWS EC2 환경에서 r5.2xlarge 타입으로 운영되고 있고 Scale Up 을 하는순간 추가 비용이 발생하는 문제와 디스크처럼 여유롭게 공간을 확보하기 힘들기 때문에 개선이 필요할 것으로 보았습니다. 개선방법 포스팅에서 다루지 않을 개선 방법 가장 편한 방법은 필요없는 데이터를 삭제하는 것과 위에서 말한것처럼 Scale Up 을 하는 것 입니다. ( 사실 라이브 상황에서 이건 쉬운 방법이 아닙니다.. ㅠㅠ ) Scale Up 을 하는동안의 DownTime 을 감당해야 하고 (이중화로 구성되어 있기 때문에 서비스 다운은 아니지만요..
분류 전체보기
개요 Redis 와 Sentinel 로 구성된 레디스가 있습니다. Jedis 를 사용하는 어플리케이션에서 Sentinel 에서 마스터 IP 를 조회하여 Redis 에 접속하고 있습니다. sentinel failover 를 수행한 후 어플리케이션에서 새로운 마스터를 인지하지 못하는 상황이 발생했습니다. 모든 Sentinel 에서는 새로운 마스터 IP 로 변경되어 있는 상태였습니다. 원인에 대한 범위 좁히기 왜 어플리케이션에서 새로운 마스터를 찾지 못했을까 Jedis 라이브러리를 사용하는 어플리케이션에서 Pub/Sub 기능을 이용하여 Sentinel 의 메시지를 받고 이 Sentinel 메시지 중 +switch-master 의 메시지를 받으면 Failover 가 수행되도록 쓰레드로 구현이 되어 있습니다. 그..
개요 Redis 에서는 Sentinel 기능이라는 마스터/슬레이브를 모니터링 하는 기능을 제공합니다. Sentinel 은 일명 모니터를 하는 기능으로 마스터/슬레이브를 정해주며 마스터 노드가 Failover 되었을 때 슬레이브 노드를 마스터로 구동 후, 마스터로 접속할 수 있도록 해주는 기능입니다. Jedis 라이브러리에서는 이렇게 Failover 되었을 때 센티넬로부터 새로운 마스터 정보를 얻어와서 변경된 마스터로 접속할 수 있도록 제공하고 있습니다. 테스트 환경 테스트를 하기 위한 환경은 아래와 같고 모든 테스트는 리눅스 환경에서 이루어졌습니다. Jedis 를 사용한 자바 코드도 리눅스 환경에서 동작합니다. OS Ubuntu 18.04 Redis Master 127.0.0.1 6161 Redis Sl..
개요 Java 에서 Jedis 혹은 Lettuce 를 사용하여 Redis 에 접속할 수 있습니다. 이 중 Jedis 를 다뤄볼 예정이고 Jedis 는 Redis 기능을 사용할 수 있는 여러 기능들을 모아놓은 라이브러리라고 보시면 됩니다. 테스트 환경 Jedis 기능을 테스트하기 위해서 Ubuntu 환경에서 진행했습니다. Windows 환경에서 Jedis 기능을 사용하려는 분들에게는 이 포스팅이 적절하지 않을 수 있습니다. OS Ubuntu 18.04 Java openjdk 1.8.0_275 Redis 2.8.21 Jedis 2.9.0 사전에 진행된 부분 1. Ubuntu 에 Java (jdk)가 설치되어 있어야 합니다. 2. Ubuntu 에 Redis 가 설치되어 있어야 합니다. Java 와 Jedis ..
상황 Ubuntu 환경에서 apt 명령어를 사용하여 자동으로 설치진행하는 도중 아래와 같은 오류가 발생했습니다. 'kr.archive.ubuntu.com' 의 주소를 알아낼 수 없습니다. 해결방안 1차 해결방안 저 같은 경우는 좀 특이한 케이스인데 VM 에서 호스트전용 어댑터로 설정만 해서 발생하는 문제였습니다. ( 외부와의 통신이 불가능한 상태 ) VM 에서 '호스트전용 어댑터'와 'NAT' 어댑터 2개를 설정한 후 interface 설정을 변경하였습니다. Step 1. enp0s3 는 '호스트전용 어댑터' enp0s8 은 'NAT' 으로 설정되어 있는 상태입니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 root@psh-VirtualBox:~# ifconfig ..
상황 우분투에서 yum 명령어 설치를 진행하려고 하던 도중 아래와 같은 에러가 발생했습니다. E: /var/lib/dpkg/lock-frontend 잠금 파일을 얻을 수 없습니다 - open (11: 자원이 일시적으로 사용 불가능함) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is another process using it? E: /var/lib/dpkg/lock-frontend 잠금 파일을 얻을 수 없습니다 - open (11: 자원이 일시적으로 사용 불가능함) E: Unable to acquire the dpkg frontend lock (/var/lib/dpkg/lock-frontend), is anothe..
인터페이스란 인터페이스를 상속받는 다수의 서브클래스에서 같은 기준으로 구현하도록 하기위한 기본 밑그림으로 보시면 편할 것 같습니다. 인터페이스를 상속받는 서브클래스는 다수개가 될 수 있습니다. 서브클래스마다 각각의 함수로 구현을 한다면 나중에 호환이 되지 않아서 오류가 발생할 수 있습니다. 이런 오류를 방지하고자 기본틀을 만들어 주는 기능이 인터페이스 입니다. 인터페이스 구조 인터페이스 선언 시 class 명칭 대신 interface 명칭을 사용합니다. 인터페이스는 필드와 메소드를 가질수 있지만 생성자를 가질수는 없습니다. 일반적으로 인터페이스 멤버에는 어떠한 제한자도 붙이지 않습니다. 그러나 필드는 public static final, 메소드는 abstract 제한자를 붙인것과 동일하게 적용됩니다. 즉..
instanceof 연산자 객체의 클래스를 알아내는 연산자 입니다. 추상클래스를 사용하다 보면 많은 양의 서브 클래스를 다뤄야 하는 경우가 있습니다. 이럴 때 instanceof 연산자를 사용하여 어떤 서브클래스 객체를 사용하는지 알아낼 수 있습니다. instanceof 연산자를 사용하면 좌변의 변수가 가리키는 객체의 클래스가 오른쪽과 같은 클래스인지 여부를 확인할 수 있습니다. 예제 코드 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 public class instanceofTest { public static void main(String[] args) { // TODO Aut..
추상클래스란 일반적인 방식의 객체생성 불가 일반적인 방식으로 객체를 생성할 수 없는 클래스를 의미합니다. 따라서 new 명령어로 객체 생성이 불가능합니다. 배열 방식으로의 객체 생성 위에서 '일반적인 방식'으로를 언급한 이유는 배열로는 new 연산자로 객체생성이 가능합니다. 이유는 추상클래스로 객체를 만들수는 없지만 그 클래스의 변수나 배열에 서브 클래스의 객체를 담을 수 있기 때문입니다. 추상클래스 사용방법 추상클래스를 사용하기 위해서는 클래스 명 앞에 abstract 를 명시해 주어야 합니다. 또한 추상클래스에서는 추상메소드를 사용할 수 있는데 추상메소드란 몸체가 없는 메소드를 가질 수 있는 함수를 의미합니다. 추상메소드 명 앞에는 abstract 를 명시해 주어야 합니다. 추상클래스 사용이유 그렇다..
오버로딩과 오버라이딩의 차이점 오버로딩과 오버라이딩의 개념은 다음과 같습니다. 개념 설명 오버로딩 메소드 이름이 같지만 인수의 형과 개수가 다른 메소드를 정의 오버라이딩 슈퍼클래스와 서브클래스에서 메소드이름 인수의 형 개수가 모두 똑같은 메소드를 정의 예제 코드 오버로딩 같은 메소드 명에 인자 수가 다른 메소드를 사용하는 방법입니다. 이런 경우에는 인자와 타입에 맞는 메소드가 호출됩니다. 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 public class overloadingTest { public static void main(String[] args) { // TODO Auto-generated method stub ol col = new ol(); col.s..