분산 캐시 시스템의 Spring Boot 클라이언트 애플리케이션입니다. Consistent Hashing 알고리즘을 사용하여 여러 Memcached 노드에 데이터를 분산 저장하고, Apache Zookeeper를 통해 노드 상태를 관리합니다.
- ZookeeperConfig: Zookeeper 연결 설정 및 Bean 등록
- ZookeeperConnection: Zookeeper 클라이언트 초기화 및 이벤트 핸들러 등록
- ZKEventHandler: Zookeeper 노드 변화 이벤트 처리
- HashingManager: Consistent Hashing 기반 노드 분산 관리
- CacheManager: 캐시 데이터 저장/조회/삭제 인터페이스
- 분산 캐시 저장: Consistent Hashing을 통한 효율적인 데이터 분산
- 동적 노드 관리: Zookeeper를 통한 실시간 노드 추가/제거 감지
- 자동 리밸런싱: 노드 변화 시 해시 링 자동 재구성
- REST API: HTTP 기반 캐시 조작 인터페이스
- Java 17 이상
- Apache Zookeeper 3.x
- Memcached 1.4 이상
- Docker (Memcached 노드 실행용)
# Zookeeper 다운로드 및 실행
wget https://downloads.apache.org/zookeeper/zookeeper-3.8.3/apache-zookeeper-3.8.3-bin.tar.gz
tar -xzf apache-zookeeper-3.8.3-bin.tar.gz
cd apache-zookeeper-3.8.3-bin
# 설정 파일 복사
cp conf/zoo_sample.cfg conf/zoo.cfg
# Zookeeper 실행
bin/zkServer.sh start
# 첫 번째 Memcached 노드
docker run -d --name memcached1 -p 11211:11211 memcached:latest
# 두 번째 Memcached 노드
docker run -d --name memcached2 -p 11212:11211 memcached:latest
# 세 번째 Memcached 노드
docker run -d --name memcached3 -p 11213:11211 memcached:latest
# Zookeeper CLI 접속
bin/zkCli.sh
# Memcached 경로 생성
create /memcached ""
# 노드 등록 (데이터에 host:port 형식으로)
create /memcached/node1 "127.0.0.1:11211"
create /memcached/node2 "127.0.0.1:11212"
create /memcached/node3 "127.0.0.1:11213"
# 프로젝트 빌드 및 실행
./gradlew bootRun
curl -X POST http://localhost:8080/api/cache/mykey \
-H "Content-Type: application/json" \
-d '"Hello, World!"'
curl -X GET http://localhost:8080/api/cache/mykey
curl -X DELETE http://localhost:8080/api/cache/mykey
curl -X GET http://localhost:8080/api/cache/status
curl -X GET http://localhost:8080/api/cache/health
src/main/resources/application.yml
:
# Zookeeper Configuration
zookeeper:
address: localhost:2181
memcached:
path: /memcached
# Server Configuration
server:
port: 8080
# Logging Configuration
logging:
level:
com.DSC.distributedCache: INFO
org.apache.curator: WARN
net.spy.memcached: WARN
# Application Configuration
spring:
application:
name: distributed-cache-server
# Health Check Configuration
management:
endpoints:
web:
exposure:
include: health,info
endpoint:
health:
show-details: always
- Client → CacheManager: addData(key, value)
- CacheManager → HashingManager: getNode(key)
- HashingManager → CacheManager: MemcachedClient
- CacheManager → MemcachedClient: set(key, expire, value)
- MemcachedClient → CacheManager: isAdded
- Client → CacheManager: getData(key)
- CacheManager → HashingManager: getNode(key)
- HashingManager → CacheManager: MemcachedClient
- CacheManager → MemcachedClient: get(key)
- MemcachedClient → CacheManager: data
- Zookeeper → ZKEventHandler: childEvent()
- ZKEventHandler → HashingManager: addNode() or removeNode()
- HashingManager: 해시 링 재구성
# 새 Memcached 노드 실행
docker run -d --name memcached4 -p 11214:11211 memcached:latest
# Zookeeper에 노드 추가
bin/zkCli.sh
create /memcached/node4 "127.0.0.1:11214"
# Zookeeper에서 노드 제거
bin/zkCli.sh
delete /memcached/node4
# Memcached 컨테이너 중지
docker stop memcached4
- Zookeeper 서버 상태 확인:
bin/zkServer.sh status
- 방화벽 설정 확인
- 포트 2181 사용 가능 여부 확인
- Docker 컨테이너 상태 확인:
docker ps
- 포트 바인딩 확인
- Memcached 로그 확인:
docker logs <container_name>
- 애플리케이션 재시작
- Zookeeper 노드 등록 상태 확인:
ls /memcached
com.DSC.distributedCache/
├── config/
│ └── ZookeeperConfig.java
├── zookeeper/
│ ├── ZookeeperConnection.java
│ └── ZKEventHandler.java
├── hashing/
│ └── HashingManager.java
├── cache/
│ └── CacheManager.java
├── controller/
│ └── CacheController.java
└── DistributedCacheApplication.java
- 다른 해싱 알고리즘:
HashingManager.hashing()
메서드 수정 - 추가 캐시 백엔드:
CacheManager
에 새로운 클라이언트 추가 - 모니터링: Spring Actuator를 통한 메트릭 추가
- 보안: Spring Security를 통한 인증/인가 추가
이 프로젝트는 MIT 라이선스를 따릅니다.