Kudu 아키텍처 개요
Kudu는 컬럼 기반 분산 스토리지로, Raft 합의 알고리즘을 기반으로 리더-팔로워 구조를 유지합니다. 마스터 노드와 태블릿 서버 간의 역할 분담을 통해 고가용성을 확보하며, 특정 태블릿에 대해 리더 역할을 수행하는 서버가 다른 태블릿에 대해서는 팔로워로 동작할 수 있습니다.
핵심 구성 요소
- Table: 스키마와 정렬된 기본 키를 가진 데이터 저장 단위. 여러 개의 태블릿으로 분할됨
- Tablet: 테이블의 연속적인 세그먼트로, 여러 태블릿 서버에 복제됨. Raft 합의를 통해 일관성 유지
- Tablet Server: 태블릿을 실제로 저장하고 클라이언트 요청을 처리. 리더는 쓰기를, 리더/팔로워는 읽기를 각각 담당
클러스터 노드 구성
| 호스트명 | 마스터 프로세스 | 태블릿 서버 프로세스 |
|---|---|---|
| node01 | ○ | ○ |
| node02 | ○ | ○ |
| node03 | ○ | ○ |
로컬 YUM 저장소 구축
Cloudera 저장소에서 필요한 RPM 패키지를 내려받아 내부 HTTP 서버로 제공합니다.
패키지 준비 및 압축 해제
cd /data/repository
tar -zxvf cdh5.14.0-centos6.tar.gz
HTTP 서버 설정
# httpd 설치 및 실행
yum -y install httpd
systemctl start httpd
# 저장소 연결
setenforce 0
ln -s /data/repository/cdh/5.14.0 /var/www/html/cdh-repo
YUM 저장소 설정 파일
/etc/yum.repos.d/cdh-local.repo 파일 생성:
[cdh-local]
name=Cloudera CDH Local Repository
baseurl=http://node01/cdh-repo
gpgcheck=0
enabled=1
설정 파일을 모든 노드로 배포:
for host in node02 node03; do
scp /etc/yum.repos.d/cdh-local.repo ${host}:/etc/yum.repos.d/
done
Kudu 패키지 설치
설치 가능한 패키지 목록
| 패키지명 | 설명 |
|---|---|
| kudu | 기본 실행 파일 및 라이브러리 |
| kudu-master | 마스터 서비스 스크립트 및 기본 설정 |
| kudu-tserver | 태블릿 서버 서비스 스크립트 및 기본 설정 |
| kudu-client0 | C++ 클라이언트 공유 라이브러리 |
| kudu-client-devel | C++ 클라이언트 개발 SDK |
전체 노드 설치
# 모든 노드에서 실행
yum install -y kudu kudu-master kudu-tserver kudu-client0 kudu-client-devel
서비스 설정
설치 후 /etc/kudu/conf/ 디렉터리에 마스터와 태블릿 서버 설정 파일을 구성합니다.
마스터 서버 설정
환경 변수 파일 /etc/default/kudu-master:
export FLAGS_log_dir=/var/log/kudu
export FLAGS_rpc_bind_addresses=node01:7051 # 각 호스트에 맞게 수정
구성 파일 /etc/kudu/conf/master.gflagfile:
--fromenv=rpc_bind_addresses
--fromenv=log_dir
--fs_wal_dir=/data/kudu/master/wal
--fs_data_dirs=/data/kudu/master/data
--master_addresses=node01:7051,node02:7051,node03:7051
태블릿 서버 설정
환경 변수 파일 /etc/default/kudu-tserver:
export FLAGS_log_dir=/var/log/kudu
export FLAGS_rpc_bind_addresses=node01:7050 # 각 호스트에 맞게 수정
구성 파일 /etc/kudu/conf/tserver.gflagfile:
--fromenv=rpc_bind_addresses
--fromenv=log_dir
--fs_wal_dir=/data/kudu/tserver/wal
--fs_data_dirs=/data/kudu/tserver/data
--tserver_master_addrs=node01:7051,node02:7051,node03:7051
디렉터리 권한 설정
# Kudu는 기본적으로 kudu 사용자로 실행됨
mkdir -p /data/kudu/{master,tserver}/{wal,data}
chown -R kudu:kudu /data/kudu
# 또는 사용자 정의 계정 사용 시
chown -R deploy:deploy /data/kudu
서비스 운영
시작 및 종료
# 시스템 서비스 방식
sudo service kudu-master start
sudo service kudu-tserver start
# 또는 init.d 스크립트 직접 실행
sudo /etc/init.d/kudu-master start
sudo /etc/init.d/kudu-tserver start
# 종료
sudo service kudu-master stop
sudo service kudu-tserver stop
주의: NTP 시간 동기화가 필수입니다.
ntpd또는chronyd가 정상 실행 중인지 확인하세요.
일반적인 문제 해결
시계 동기화 오류
증상: Cannot initialize clock: Error reading clock. Clock considered unsynchronized
yum -y install ntp
systemctl enable ntpd
systemctl start ntpd
카탈로그 매니저 초기화 실패
증상: Unable to initialize catalog manager: Failed to initialize sys tables async
# 모든 마스터/태블릿 서버 프로세스 중지
# 기존 데이터 디렉터리 초기화 후 재시작
rm -rf /data/kudu/master/*
rm -rf /data/kudu/tserver/*
권한 거부 오류
증상: Permission denied (error 13)
# 디렉터리 소유자 확인
ls -la /data/kudu/
# 필요 시 권한 수정
chown -R kudu:kudu /data/kudu
sudoers 파일 권한 오류
sudo: /etc/sudoers is world writable
# 해결
pkexec chmod 440 /etc/sudoers
웹 관리 콘솔
| 구성 요소 | 접근 URL |
|---|---|
| 마스터 상태 | http://node01:8051/masters |
| 태블릿 서버 목록 | http://node01:8051/tablet-servers |
웹 UI를 통해 태블릿 분배 현황, 리더 선출 상태, 각 노드의 리소스 사용량 등을 모니터링할 수 있습니다.
운영 팁: /var/log/kudu 디렉터리의 로그 파일은 주기적으로 회전 및 삭제 처리하여 디스크 공간 부족 문제를 예방하세요. logrotate 유틸리티를 활용한 자동화를 권장합니다.