기본 콘텐츠로 건너뛰기

개발 공부 - Cloud, Database 없이 Instance간 통신 기능 개발 (Hazelcast)

HA 기능 관련 R&D 했던 것을 정리해본다.
기능보다 구현 관련해서 생각했던 점을 merge 하기 위해 써본다.

1. Active-Active 환경이다.

2. Heap 메모리에 데이터를 넣지 않고, 저장소도 경우 및 공유하지 않는 상태에서 통신을 할 것이다.

3. Instance 정보를 동기화하기 위한 목적으로 H/A 기능이 필요하다.

4. Redis, Kafka를 쓰지 않는다.

5. 언어는 Java, Spring Boot 를 쓴다.

6. 별도로 프로세스를 띄우지 않고, 기본적인 환경에서 동작할 수 있도록 한다.

7. 따라서 ZooKeeper를 사용하지 않는 방향으로 진행한다. (따로 인스턴스 띄우지 않기 위해서 미사용한다.)

Summary : Cloud 기능이나 Database 기능이 없이, 서로 통신해서 인스턴스의 local 상태를 공유하는 기능을 만들 것이다.





확장성을 고려하여, active-active 환경에서 인스턴스 정보를 동기화하는 방법으로는 여러가지가 있습니다. 하지만, 데이터를 heap memory에 저장하지 않고, 중간 저장소 없이 통신하는 것이 요구사항이기 때문에, 아래와 같은 방법을 추천해드립니다.

Hazelcast 사용
Hazelcast는 자바 기반의 인-메모리 데이터 그리드 기술을 제공하는 오픈소스 프로젝트입니다. Hazelcast를 사용하면 서로 다른 노드 간에 데이터를 공유할 수 있습니다. Hazelcast는 클러스터링, 분산 맵, 분산 큐 등 다양한 기능을 제공하며, 다수의 클라이언트가 동시에 접속할 수 있습니다.

JGroups 사용
JGroups는 멀티캐스팅과 유니캐스팅을 사용하여 자바 애플리케이션에서 클러스터를 구성할 수 있는 오픈소스 라이브러리입니다. JGroups를 사용하면 서로 다른 노드 간에 메시지를 보내고 받을 수 있으며, 확장성이 높은 클러스터링 기능을 제공합니다.

RMI(Remote Method Invocation) 사용
RMI는 자바 애플리케이션 간에 객체를 공유하고 메소드를 호출하는 기술입니다. RMI를 사용하여 서로 다른 노드 간에 인스턴스 정보를 공유하고 동기화할 수 있습니다. RMI를 사용하면 자바 객체를 직렬화하여 전송할 수 있으므로, 객체의 크기나 복잡도에 제한이 없습니다.

위의 방법들 중 Hazelcast를 추천드리며, Hazelcast를 사용하여 노드 간에 데이터를 공유하면, 중간 저장소 없이도 인스턴스 정보를 동기화할 수 있습니다. 또한, Hazelcast는 클러스터링, 분산 맵, 분산 큐 등 다양한 기능을 제공하며, 확장성이 뛰어나므로, 대규모 애플리케이션에서도 사용할 수 있습니다.



리서치 후에 Chatgpt에게 물어봐도 Hazelcast 를 추천하기에, 이걸로 진행 해보려고 한다.






위 요구사항에 따라 구현할 수 있는 방법 중 하나는 분산 캐시 라이브러리인 Hazelcast를 사용하는 것입니다.

Hazelcast는 분산 캐시 기능뿐만 아니라 분산 데이터 구조, 메시징, 이벤트 등 다양한 기능을 제공합니다. Active-Active 환경에서는 Hazelcast를 사용하여 각 인스턴스의 로컬 상태를 공유하고 동기화할 수 있습니다.

Hazelcast를 Spring Boot 프로젝트에 적용하는 방법은 다음과 같습니다.

1. 의존성 추가

build.gradle 파일에 다음과 같이 의존성을 추가합니다.

```gradle
implementation 'com.hazelcast:hazelcast-spring:4.1.3'
```

2. Hazelcast 설정

application.properties 파일에 다음과 같이 Hazelcast 설정을 추가합니다.

```properties
# Hazelcast 설정
hazelcast:
  instance-name: my-hazelcast-instance
  network:
    join:
      multicast:
        enabled: false
      tcp-ip:
        enabled: true
        members: 127.0.0.1:5701, 127.0.0.1:5702
```

위 설정에서는 인스턴스 이름과 멤버 목록을 설정하였습니다.

3. Hazelcast 캐시 사용

Hazelcast 캐시를 사용하기 위해 Spring Cache Abstraction을 적용하고, `@Cacheable` 어노테이션을 사용하여 캐시를 적용합니다.

```java
@Configuration
@EnableCaching
public class CacheConfig extends CachingConfigurerSupport {
    @Bean
    public HazelcastInstance hazelcastInstance() {
        Config config = new Config();
        config.setInstanceName("my-hazelcast-instance");
        config.getNetworkConfig().getJoin().getTcpIpConfig().setEnabled(true)
          .addMember("127.0.0.1:5701").addMember("127.0.0.1:5702");
        return Hazelcast.newHazelcastInstance(config);
    }

    @Bean
    @Override
    public CacheManager cacheManager() {
        return new HazelcastCacheManager(hazelcastInstance());
    }
}

@Service
public class MyService {
    @Cacheable("my-cache")
    public Object get(String key) {
        // ...
    }
}
```

위 예제에서는 `@Cacheable` 어노테이션을 사용하여 `my-cache` 캐시를 적용하였습니다.

이와 같이 Hazelcast를 사용하여 Active-Active 환경에서 인스턴스 정보를 동기화하고 로컬 상태를 공유할 수 있습니다.





근데 Hazelcast도 성능 다 열어놓고 쓰려면 라이선스 문제가 좀 있어서 default만 사용하는 조건으로만 개발해서 도입할 만 한 것 같다.





참조 : 
사실 getConfig 하는 쪽 찾다가 A-A 상태로 개발하신 분 블로그 찾은 것이 많이 도움이 되었다.



댓글

이 블로그의 인기 게시물

Ebook - 전자책 drm 상관 없이 pdf로 만들기

yes24와 교보문고에서 ebook을 구매 해야 했는데 너무 불편하고, 필기가 매우 화날 정도로 안 좋아서 원시적으로 사용하기로 했다. 1. 목적 : ebook에서 필기 및 사용이 불편하여 pdf로 변환  2. 용도 : 개인 사용 목적이며 화질이 다소 저하되어도 필기만 용이하면 상관 없음 3. 방법 1) 휴대폰 및 카메라로 동영상을 촬영했다. DRM 때문에 프로그램으로는 촬영이 안 되는 것을 확인했다. (사실 개인 사용 목적이면 기본 화면 캡쳐를 사용해도 된다...) 2) 마우스 클릭 해주는 매크로를 사용했다. (1) key_macro.exe > https://blog.daum.net/pg365/250 듀얼 모니터에서 위치 이탈 현상이 있긴 해도 괜찮았다. (2) AutoClick.exe > http://bestsoftwarecenter.blogspot.com/2011/02/autoclick-22.html 이 걸로 잘 사용했다. 3초마다 한 번 클릭하도록 사용했다. 3) 동영상을 이미지로 변경해주는 프로그램을 사용했다. Free Video to JPG Converter > https://www.dvdvideosoft.com/products/dvd/Free-Video-to-JPG-Converter.htm (240826: 다운로드 시 정상적으로 되지 않아서 URL 수정) 일 하면서 듀얼 모니터에 켜 놨는데 속도가 괜찮았다. * Every frame 으로 사용해야 한다. 4) 중복 사진 제거해주는 프로그램을 사용했다. VlsiPics  > http://www.visipics.info/index.php?title=Main_Page 생각보다 느리니 퇴근시에 걸어놓고 가면 된다. 한번 play가 끝나면 Auto-select 하고 Delete 하면 된다. 5) 이미지를 일괄 Crop 작업 해주는 프로그램을 사용했다. JPEGCrops > https://jpegcrops.softonic.kr/ *...

개발 공부 - json JSONObject 사용 시 백슬래시(\), 원화 표시(\) 제거 및 치환

import org.json.simple.JSONObject; String dataString = new String(authData.toJSONString()); dataString = dataString.replaceAll("\\\\", ""); String 으로 안 바뀌는 가 싶어서 String 으로 변환 해 주고 작업 하였다. 사실 toJSONString 해도 정상 동작 해야 하는데 이유를 잘 모르겠음. 그리고 나서 다시 이클립스 구동 하니 toString 도 먹은 걸로 봐서 이상하다고 생각! String dataString = authData.toString(); dataString = dataString.replaceAll("\\\\", ""); 어쨌든 백 슬래시 제거를 해줘야 하는데 \\ 도 아니고 \\\\를 해야 변환이 가능했다는 결말이었습니다. 참고 : https://stackoverflow.com/questions/15450519/why-does-string-replace-not-work/15450539 test =test.replace("KP", "");  replace 후에 담아 주지 않으면 적용이 안 됩니다!

개발 공부 - OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다.

여러 가지 요인이 있지만 PC 이름 변경시 OracleXETNSListener 서비스 시작이 불가능합니다. 고치는 법은 C:\oraclexe\app\oracle\product\11.2.0\server\network\ADMIN 와 같은 설치 경로에서 listener.ora와 tnsnames.ora 의 pc명을 바꾼 PC명으로 바꿔주면 됩니다. 그래도 안 된다면 cmd 창에서 services.msc 를 입력 후 OracleXETNSListener 서비스를 시작 시키면 됩니다. 오류명: OracleXETNSListener 서비스가 로컬 컴퓨터에서 시작했다가 중지되었습니다. 일부 서비스는 다른 서비스 또는 프로그램에서 사용되지 않으면 자동으로 중지됩니다. 참고한 사이트들 1. http://blog.naver.com/visioner7/120165951652 2. http://database.sarang.net/?inc=read&aid=6819&criteria=oracle&subcrit=&id=&limit=20&keyword=ora-12560&page=5 이런 걸 보면 오라클은 앙칼진 시골 아가씨야