티스토리 뷰

Back-end/JAVA

Lock - 다중서버

지나짱-* 2023. 1. 31. 21:55

어플리케이션에서 다중서버 중 하나의 서버에서만 작동하도록 lock을 걸어야 하는 경우가 있다. 

 

데이터베이스(MySQL, PostgreSQL 등)를 사용하여 lock을 저장하고 각 서버가 시작하기 전에 lock 상태를 확인한다.

  1. 테이블 생성: lock 정보를 저장할 테이블을 데이터베이스에 생성한다.
  2. Lock 저장: 특정 서버가 lock을 걸려면 데이터베이스의 lock 테이블에 lock 정보를 저장한다.
  3. Lock 확인: 각 서버가 시작하기 전에 데이터베이스의 lock 테이블에서 lock 정보를 확인합니다. 그리고 lock이 이미 걸려있을 경우, 다른 서버에서 동작 중인 것으로 판단하고 종료한다.
  4. Lock 해제: 특정 서버가 lock을 해제할 때, 데이터베이스의 lock 테이블에서 lock 정보를 제거한다.

자바에서 JDBC를 사용하여 데이터베이스와 통신할 수 있다.

 

분산 락 프레임워크(ZooKeeper, Consul 등)를 사용하여 한 번에 하나의 서버만 lock을 획득할 수 있는 락 기능을 제공한다.

ZooKeeper 분산 락 프레임워크를 사용하는 예시:

  1. 서버 프로세스는 ZooKeeper 서버에 lock node를 생성한다.
  2. 서버 프로세스는 lock node에 대한 접근 권한을 요청한다.
  3. ZooKeeper가 권한을 할당하면 한 번에 하나의 서버만 lock을 획득할 수 있다.
  4. 작업이 완료되면 서버 프로세스는 lock node를 제거한다.

Consul 분산 락 프레임워크를 사용하는 예시:

  1. 서버 프로세스는 Consul 서버에 lock session을 생성한다.
  2. 서버 프로세스는 lock key를 생성하고 lock session ID를 함께 저장한다.
  3. 서버 프로세스는 lock key를 확인하여 lock session ID가 현재 lock session ID와 일치하는지 확인한다.
  4. 작업이 완료되면 서버 프로세스는 lock session을 종료한다.

분산 캐시(Hazelcast, Apache Ignite 등)를 사용하여 lock 관리자를 구현하여 분산 lock 기능을 제공한다.

  1. Hazelcast: HazelcastInstance의 getLock(String lockKey) 메서드를 사용하여 lock 객체를 얻은 후 lock() 메서드를 호출하여 lock을 얻을 수 있다.
HazelcastInstance instance = Hazelcast.newHazelcastInstance();
Lock lock = instance.getLock("myLock");
lock.lock();
try {
   // critical section
} finally {
   lock.unlock();
}

2. Apache Ignite: IgniteCache의 lock(Object key) 메서드를 사용하여 lock 객체를 얻은 후 lock() 메서드를 호출하여 lock을 얻을 수 있다.

Ignite ignite = Ignition.start();
IgniteCache<Object, Object> cache = ignite.getOrCreateCache("myCache");
try (Transaction tx = ignite.transactions().txStart()) {
    cache.lock("myKey");
    // critical section
    tx.commit();
}

메시지 큐(RabbitMQ, Apache Kafka 등)를 사용하여 lock 기능을 구현하여 각 서버가 lock이 해제될 때까지 기다려야 한다.

- 메시지 (RabbitMQ, Apache Kafka ) 사용하면 서버가 lock 요청하고, lock 해제될 때까지 대기하는 기능을 구현할 있다.

예를 들어, 서버가 lock 요청하는 메시지를 보내고, lock 획득된 서버는 lock 해제 메시지를 보내면 다른 서버는 lock 획득할 있게 된다. 이러한 과정은 메시지 큐에서 처리되기 때문에 서버의 lock 상태를 제어할 있다.

'Back-end > JAVA' 카테고리의 다른 글

Spring Scheduler  (0) 2023.02.02
스케줄링(Scheduling)  (0) 2023.02.01
etcd  (0) 2023.01.31
Lock - StampedLock  (0) 2023.01.30
Lock - ReentrantReadWriteLock  (0) 2023.01.30
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2025/05   »
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
글 보관함