FastDFS 분산 파일 시스템 고가용성 클러스터 구축 안내
단일 서버 기반 파일 저장 방식은 여러 가지 한계를 가집니다. 특정 서버의 장애 발생 시 전체 서비스 중단, 한정적인 저장 공간으로 인한 확장성 문제, 그리고 높은 트래픽 발생 시 I/O 성능 저하 등이 대표적입니다.
이 가이드는 분산 파일 시스템인 FastDFS를 활용하여 고가용성 및 확장성을 갖춘 소규모 클러스터를 구축하는 방법을 상세히 설명합니다. 이 과정을 통해 여러분은 다음과 같은 시스템을 확보할 수 있습니다.
- 테라바이트(TB) 이상의 대용량 파일 저장 및 관리가 가능한 분산 시스템
- 자동 장애 복구를 지원하는 고가용성 아키텍처
- 로드 밸런싱을 통한 효율적인 파일 접근 및 성능 최적화
- 비즈니스 성장에 유연하게 대응할 수 있는 수평적 확장성
1. FastDFS 클러스터 아키텍처 이해
1.1. 주요 구성 요소
FastDFS 클러스터는 두 가지 핵심 서비스로 구성됩니다.
| 구성 요소 | 역할 | 기본 포트 | 배포 권장 사항 |
|---|---|---|---|
| Tracker Server (트래커 서버) | 스토리지 노드 관리, 로드 밸런싱, 장애 감지 | 22122 | 단일 장애점 방지를 위해 최소 2대 이상 배포 |
| Storage Server (스토리지 서버) | 실제 파일 저장 및 읽기/쓰기 서비스 제공 | 23000 | 데이터 백업 및 이중화를 위해 각 그룹당 최소 2대 이상 배포 |
1.2. 클러스터 토폴로지
FastDFS는 여러 개의 스토리지 그룹으로 구성될 수 있으며, 각 그룹 내에는 여러 스토리지 서버가 존재합니다. 트래커 서버는 이러한 그룹 및 서버의 메타데이터를 관리하며, 클라이언트의 파일 요청을 적절한 스토리지 서버로 라우팅합니다.
1.3. 데이터 동기화 메커니즘
동일한 스토리지 그룹 내의 스토리지 서버들은 파일 업로드 시 자동으로 서로 데이터를 동기화합니다. 이를 통해 한 서버에 장애가 발생하더라도 다른 서버를 통해 파일에 접근할 수 있어 데이터 무결성과 고가용성을 보장합니다.
2. 환경 준비 및 서버 구성 계획
2.1. 권장 하드웨어 사양
| 서버 유형 | CPU | 메모리 | 저장 공간 | 네트워크 | 운영 체제 |
|---|---|---|---|---|---|
| 트래커 서버 | 2코어 | 4GB | 100GB SSD | 기가비트 이더넷 | CentOS 7/8 |
| 스토리지 서버 | 4코어 | 8GB | 1TB+ HDD/SSD | 기가비트 이더넷 | CentOS 7/8 |
2.2. 서버 네트워크 구성
이 가이드에서는 총 6대의 서버를 사용하여 클러스터를 구축합니다 (실제 환경에 따라 축소 가능).
| 서버 역할 | IP 주소 | 호스트명 | 기본 저장 경로 | 설명 |
|---|---|---|---|---|
| 트래커 1 | 192.168.209.121 | tracker01 | /var/fdfs_data/tracker | 메인 트래커 서버 |
| 트래커 2 | 192.168.209.122 | tracker02 | /var/fdfs_data/tracker | 보조 트래커 서버 |
| 스토리지 그룹1-1 | 192.168.209.131 | storage01 | /var/fdfs_data/storage, /mnt/fdfs/store0 | 스토리지 그룹 1의 주 노드 |
| 스토리지 그룹1-2 | 192.168.209.132 | storage02 | /var/fdfs_data/storage, /mnt/fdfs/store0 | 스토리지 그룹 1의 보조 노드 |
| 스토리지 그룹2-1 | 192.168.209.141 | storage03 | /var/fdfs_data/storage, /mnt/fdfs/store0 | 스토리지 그룹 2의 주 노드 |
| 스토리지 그룹2-2 | 192.168.209.142 | storage04 | /var/fdfs_data/storage, /mnt/fdfs/store0 | 스토리지 그룹 2의 보조 노드 |
2.3. 공통 환경 설정
모든 FastDFS 서버에서 다음 명령을 실행하여 필요한 의존성을 설치하고 디렉터리를 생성합니다.
# 시스템 필수 패키지 설치
sudo yum install -y gcc gcc-c++ make libevent libevent-devel perl unzip
# FastDFS 데이터 및 로그 저장 디렉터리 생성
sudo mkdir -p /var/fdfs_data/tracker /var/fdfs_data/storage /mnt/fdfs/store0 /var/log/fdfs
# 디렉터리 권한 설정
sudo chmod -R 755 /var/fdfs_data /mnt/fdfs /var/log/fdfs
3. 트래커 서버 설정
3.1. 트래커 서비스 설치
트래커 서버(192.168.209.121, 192.168.209.122)에 다음 단계를 진행합니다.
# FastDFS 소스 코드 클론
git clone https://gitcode.com/gh_mirrors/fa/fastdfs.git
cd fastdfs
# 컴파일 및 설치
./make.sh
sudo ./make.sh install
# 설정 파일 디렉터리 생성 및 기본 설정 파일 복사
sudo mkdir -p /etc/fdfs
sudo cp conf/tracker.conf /etc/fdfs/
sudo cp conf/client.conf /etc/fdfs/ # 클라이언트 테스트를 위해 복사
3.2. 트래커 설정 파일 (/etc/fdfs/tracker.conf) 상세 설명
/etc/fdfs/tracker.conf 파일을 편집하여 클러스터 환경에 맞게 조정합니다.
# 서비스 활성화 여부
disabled = false
# 트래커 서비스 포트
port = 22122
# 트래커 데이터 및 로그 저장 기본 경로
base_path = /var/fdfs_data/tracker
# 스토리지 선택 정책
# 0: 라운드 로빈, 1: 지정된 그룹, 2: 로드 밸런싱 (권장)
store_lookup = 2
# 스토리지 서버 선택 정책
# 0: 라운드 로빈, 1: 첫 번째 서버, 2: 우선순위 기준
store_server = 0
# 스토리지 경로 선택 정책
# 0: 라운드 로빈, 2: 로드 밸런싱 (남은 공간 기준)
store_path = 0
# 다운로드 서버 선택 정책
# 0: 라운드 로빈, 1: 원본 서버 다운로드
download_server = 0
# 최대 연결 수
max_connections = 1024
# 작업 스레드 수
work_threads = 4
# 스토리지에 예약할 공간 비율 (예: 20%는 사용 불가)
reserved_storage_space = 20%
# 스토리지 노드 활성 상태 확인 간격 (초)
check_active_interval = 120
# 클러스터 내 다른 트래커 서버 주소 (모든 트래커가 서로를 등록해야 함)
tracker_server = 192.168.209.121:22122
tracker_server = 192.168.209.122:22122
# 커넥션 풀 사용 여부
use_connection_pool = true
# 커넥션 풀 최대 유휴 시간 (초)
connection_pool_max_idle_time = 3600
3.3. 트래커 서비스 시작 및 설정
# 트래커 서비스 시작
sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start
# 시스템 재부팅 시 자동 시작 설정 (rc.local 사용)
# 파일이 없다면 생성: sudo touch /etc/rc.local
# 권한 부여: sudo chmod +x /etc/rc.local
echo "/usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf start" | sudo tee -a /etc/rc.local
# 서비스 상태 확인
netstat -unltp | grep fdfs_trackerd
ps -ef | grep fdfs_trackerd
3.4. 방화벽 설정
트래커 서버의 22122 포트를 개방합니다.
# 22122/tcp 포트 허용
sudo firewall-cmd --zone=public --add-port=22122/tcp --permanent
sudo firewall-cmd --reload
# 개방된 포트 확인
sudo firewall-cmd --zone=public --list-ports
4. 스토리지 서버 설정
4.1. 스토리지 서비스 설치
모든 스토리지 서버(192.168.209.131, .132, .141, .142)에 다음 단계를 진행합니다.
# FastDFS 소스 코드 클론 (이미 트래커 서버에서 다운로드했다면 복사 가능)
git clone https://gitcode.com/gh_mirrors/fa/fastdfs.git
cd fastdfs
# 컴파일 및 설치
./make.sh
sudo ./make.sh install
# 설정 파일 디렉터리 생성 및 기본 설정 파일 복사
sudo mkdir -p /etc/fdfs
sudo cp conf/storage.conf /etc/fdfs/
sudo cp conf/client.conf /etc/fdfs/ # 클라이언트 테스트를 위해 복사
4.2. 스토리지 설정 파일 (/etc/fdfs/storage.conf) 상세 설명
/etc/fdfs/storage.conf 파일을 편집하여 각 스토리지 서버의 역할에 맞게 조정합니다.
# 서비스 활성화 여부
disabled = false
# 스토리지 그룹 이름 (각 그룹은 고유해야 하며, 동일 그룹 내 서버들은 이름이 같아야 함)
group_name = group1
# 스토리지 서비스 포트
port = 23000
# 스토리지 데이터 및 로그 저장 기본 경로
base_path = /var/fdfs_data/storage
# 실제 파일을 저장할 경로의 개수
store_path_count = 1
# 실제 파일을 저장할 첫 번째 경로
store_path0 = /mnt/fdfs/store0
# 바인딩할 IP 주소 (비워두면 모든 네트워크 인터페이스에 바인딩)
bind_addr =
# 클라이언트 바인딩 활성화 여부
client_bind = true
# 트래커 서버 주소 (모든 트래커 서버를 여기에 나열)
tracker_server = 192.168.209.121:22122
tracker_server = 192.168.209.122:22122
# 각 저장 경로 내의 서브 디렉터리 수
subdir_count_per_path = 256
# 파일 분산 모드: 0-라운드 로빈, 1-랜덤
file_distribute_path_mode = 0
# 최대 연결 수
max_connections = 1024
# 작업 스레드 수
work_threads = 4
# 디스크 읽기/쓰기 분리 여부
disk_rw_separated = true
# 디스크 읽기 스레드 수
disk_reader_threads = 1
# 디스크 쓰기 스레드 수
disk_writer_threads = 1
# 트래커에 보내는 하트비트 간격 (초)
heart_beat_interval = 30
# 상태 보고 간격 (초)
stat_report_interval = 60
# 동기화 시작/종료 시간
sync_start_time = 00:00
sync_end_time = 23:59
# 동기화 대기 시간 (밀리초)
sync_wait_msec = 50
# 동기화 간격 (초, 0은 즉시 동기화)
sync_interval = 0
4.3. 스토리지 서버별 설정 차이
각 스토리지 서버는 group_name 및 store_path0 설정을 해당 서버의 역할에 맞게 변경해야 합니다.
그룹 1 주 노드 (192.168.209.131) 및 보조 노드 (192.168.209.132):
group_name = group1
store_path0 = /mnt/fdfs/store0
그룹 2 주 노드 (192.168.209.141) 및 보조 노드 (192.168.209.142):
group_name = group2
store_path0 = /mnt/fdfs/store0
4.4. 스토리지 서비스 시작 및 설정
모든 스토리지 서버에서 다음 명령을 실행합니다.
# 스토리지 서비스 시작
sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf start
# 시스템 재부팅 시 자동 시작 설정 (rc.local 사용)
echo "/usr/bin/fdfs_storaged /etc/fdfs/storage.conf start" | sudo tee -a /etc/rc.local
# 서비스 상태 확인
netstat -unltp | grep fdfs_storaged
ps -ef | grep fdfs_storaged
4.5. 방화벽 설정
스토리지 서버의 23000 포트를 개방합니다.
# 23000/tcp 포트 허용
sudo firewall-cmd --zone=public --add-port=23000/tcp --permanent
sudo firewall-cmd --reload
5. 클러스터 상태 모니터링 및 검증
5.1. fdfs_monitor를 이용한 클러스터 상태 확인
아무 트래커 또는 스토리지 서버에서 다음 명령을 실행하여 클러스터 상태를 확인합니다.
# 클러스터 상태 모니터링 (클라이언트 설정 파일을 사용)
fdfs_monitor /etc/fdfs/client.conf
정상적인 출력에는 모든 트래커 및 스토리지 서버가 "ACTIVE" 상태로 표시되고, 스토리지 그룹 정보, 디스크 사용량 등이 포함되어야 합니다.
5.2. 클라이언트 기능 테스트
클라이언트 설정 파일(/etc/fdfs/client.conf)을 수정하여 트래커 서버 정보를 지정합니다.
# /etc/fdfs/client.conf 내용 수정
tracker_server = 192.168.209.121:22122
tracker_server = 192.168.209.122:22122
base_path = /tmp
이제 파일을 업로드, 다운로드, 삭제하여 클러스터 기능을 테스트합니다.
# 테스트 파일 생성
echo "FastDFS 클러스터 테스트" > sample_test.txt
# 파일 업로드
fdfs_upload_file /etc/fdfs/client.conf sample_test.txt
# 예시 출력: group1/M00/00/00/wKgBbF9xxxxxxxxx.txt
# 업로드된 파일 경로를 사용하여 다운로드
fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgBbF9xxxxxxxxx.txt downloaded_sample.txt
# 다운로드된 파일 내용 확인
cat downloaded_sample.txt
# 파일 삭제
fdfs_delete_file /etc/fdfs/client.conf group1/M00/00/00/wKgBbF9xxxxxxxxx.txt
5.3. 장애 복구 테스트
클러스터의 고가용성을 검증하기 위해 다음과 같은 장애 테스트를 수행합니다.
-
트래커 서버 장애 테스트:
# 한 대의 트래커 서버 정지 sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf stop # 파일 업로드/다운로드를 시도하여 서비스가 여전히 작동하는지 확인 fdfs_upload_file /etc/fdfs/client.conf another_test.txt fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/새로운_파일_ID.txt # 새로 업로드된 파일 ID 사용 -
스토리지 서버 장애 테스트:
# 한 대의 스토리지 서버 정지 (예: group1-1) sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf stop # 기존 파일 다운로드를 시도하여 다른 스토리지 서버를 통해 접근 가능한지 확인 fdfs_download_file /etc/fdfs/client.conf group1/M00/00/00/wKgBbF9xxxxxxxxx.txt downloaded_from_other_storage.txt두 테스트 모두에서 파일 작업이 정상적으로 이루어진다면 클러스터의 고가용성이 성공적으로 작동함을 의미합니다.
6. 고급 설정 및 성능 최적화
6.1. 스토리지 경로 확장
단일 스토리지 경로의 공간이 부족해질 경우, storage.conf 파일에 새로운 저장 경로를 추가하여 확장할 수 있습니다.
# storage.conf 파일에 추가
store_path_count = 2 # 저장 경로 개수 증가
store_path0 = /mnt/fdfs/store0 # 기존 경로
store_path1 = /mnt/fdfs/store1 # 새로운 경로
# 새로운 저장 경로 디렉터리 생성 및 권한 설정
sudo mkdir -p /mnt/fdfs/store1
sudo chmod 755 /mnt/fdfs/store1
# 스토리지 서비스 재시작
sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf restart
6.2. 연결 풀 최적화
트래커 및 스토리지 서버의 .conf 파일에서 연결 풀 설정을 조정하여 성능을 향상시킬 수 있습니다.
# 트래커 및 스토리지 설정 파일 공통 적용
use_connection_pool = true
connection_pool_max_idle_time = 3600 # 연결 최대 유휴 시간 (초)
max_connections = 2048 # 최대 연결 수 증가
work_threads = 8 # 작업 스레드 수 증가
6.3. 로그 순환 설정
로그 파일이 과도하게 커지는 것을 방지하기 위해 로그 순환 설정을 활성화합니다.
# tracker.conf 및 storage.conf 파일에 설정
rotate_error_log = true # 에러 로그 순환 활성화
rotate_access_log = true # 접근 로그 순환 활성화
log_file_keep_days = 7 # 로그 파일 보관 일수
compress_old_log = true # 오래된 로그 파일 압축
7. 클러스터 운영 및 일상 관리
7.1. 일상적인 관리 명령어
# 트래커 서비스 관리
sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf {start|stop|restart|status}
# 스토리지 서비스 관리
sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf {start|stop|restart|status}
# 클러스터 전반적인 상태 확인
fdfs_monitor /etc/fdfs/client.conf
# 스토리지 서버 동기화 상태 확인
fdfs_monitor /etc/fdfs/client.conf | grep "Sync"
# 스토리지 디렉터리별 사용량 확인
fdfs_df /etc/fdfs/client.conf
7.2. 클러스터 확장 절차
새로운 스토리지 그룹 추가:
- 새로운 스토리지 서버 준비
- 새 서버에 FastDFS 설치 및 고유한
group_name설정 - 새 스토리지 서버 시작
fdfs_monitor를 통해 새 그룹이 클러스터에 성공적으로 추가되었는지 확인
기존 그룹에 새로운 스토리지 노드 추가:
- 새로운 스토리지 서버 준비
- 새 서버에 FastDFS 설치 및 기존 그룹과 동일한
group_name설정 - 새 스토리지 서버 시작 (자동으로 기존 데이터 동기화 시작)
fdfs_monitor를 통해 새 노드의 상태 확인
7.3. 일반적인 문제 해결
| 문제 현상 | 가능한 원인 | 해결 방안 |
|---|---|---|
| 스토리지 서버 상태 "DOWN" | 서비스가 실행 중이지 않음 | sudo /usr/bin/fdfs_storaged /etc/fdfs/storage.conf start |
| 트래커 연결 불가 | 방화벽에서 포트가 차단됨 | 트래커 서버의 22122 포트 방화벽 규칙 확인 및 추가 |
| 데이터 동기화 실패 | 네트워크 문제 또는 디스크 공간 부족 | 네트워크 연결 상태 및 디스크 여유 공간 확인 |
| 파일 업로드 실패 | 스토리지 그룹에 남은 공간 부족 | 스토리지 그룹 확장 또는 불필요한 파일 정리 |
| 트래커 서버 응답 없음 | 트래커 서비스 비정상 종료 | 트래커 서비스 재시작: sudo /usr/bin/fdfs_trackerd /etc/fdfs/tracker.conf restart |
8. 결론 및 최적화 전략
8.1. 클러스터 배포 권장 사항
- 단일 장애점을 피하기 위해 최소 2대 이상의 트래커 서버를 배포하십시오.
- 데이터 이중화를 위해 각 스토리지 그룹에 최소 2대 이상의 스토리지 서버를 배치하십시오.
- 모든 서버의 시간을 동기화하여 동기화 관련 문제를 방지하십시오.
- 모니터링 도구를 사용하여 클러스터 상태를 주기적으로 확인하십시오.
- 디스크 공간 고갈을 방지하기 위해 적절한 보존 공간(
reserved_storage_space)을 설정하십시오. - 설정 파일을 정기적으로 백업하십시오.
- 문제 발생 시 즉시 감지할 수 있도록 모니터링 경보 시스템을 구축하십시오.
8.2. 성능 최적화 핵심 사항
- 하드웨어 최적화: SSD 사용, 메모리 증설, 여러 디스크를 통한 I/O 분산
- 설정 최적화: 적절한 작업 스레드 수 설정, 연결 풀 사용, 서브 디렉터리 구조 최적화
- 네트워크 최적화: 고대역폭 네트워크 사용, 동일 그룹 서버를 같은 네트워크 세그먼트에 배치, 동일 스토리지 그룹의 광역 분산 회피
이 가이드를 통해 FastDFS 기반의 고가용성 및 확장 가능한 분산 파일 저장 시스템을 성공적으로 구축했을 것입니다. 비즈니스 요구사항에 따라 스토리지 그룹 및 노드를 유연하게 확장하여 끊임없이 증가하는 저장 공간 요구를 충족할 수 있습니다.