http://junolab.blogspot.kr/2014/10/open-stack-swift-production-mode.html 의 자료를 기반으로 하되 일부 헷갈리거나 빠진 내용을 보충해서 메모해본다.


리눅스 16.04LTS 64bit version 설치를 기본으로 시작. 하다보면 제일 헷갈리고 까다로운 문제가, 계정 및 권한 문제이다.


<proxy sever 설치 및 설정>


0. swift를 설치할때 ubuntu의 경우 ubuntu 소프트웨어 패키지를 apt-get 으로 설치하는 방법과 swift 최신 소스를 가져다 설치하는 방법이 있다. 우분투 패키지로 설치할 때, 골아픈 점은 system software다 보니까 sudo로 설치하게 되는데, 설치하고 나면 버그인건지, swift 계정은 만들어지지만, 실제로 사용할 수 있는 계정이 아닌지 swift라는 user만 생성되고 암호나 디렉토리는 생성되지 않는다.


그래서 나는 sudo adduser swift 하여 swift 라는 계정을 먼저 만들어 두고 이후에 모두 swift 계정으로 리눅스에 로그인 해서 시작했다.


1. 우선 proxy-server 로 사용할 pc에 우분투 설치하고, 가장 먼저 해야할 일은 소프트웨어 업데이트


sudo apt-get install python-software-properties

sudo apt-get update

sudo apt-get install swift python-swiftclient openssh-server


를 일단 기본으로 시작


2. 스위프트의 설정 파일을 저장할 디렉토리를 만들고 권한 부여하기


sudo mkdir -p /etc/swift

sudo chown -R swift:swift /etc/swift


3. swift.conf 생성 (리눅스는 0에서 만들어둔 swift 계정으로 로긴한 상태여야 한다)


cat > /etc/swift/swift.conf

[swift-hash]

swift_hash_path_prefix="뭔가 unique한 스트링"


여기서 위의 사이트에서는 swift_hash_path_prefix = `od -t x8 -N 8 -A n 이라고 되어있는데 뭔가 오타인지 copy & paste 오류인지 좀 이상해서 내 경우엔 uuid 패키지를 설치해서 uuid를 하나 생성한 것을 썼다.


sudo apt-get install uuid 해서 설치한 후 uuid 실행하면 uuid 스트링이 출력된다. 이를 긁어다가 "뭔가 unique한 스트링" 자리에 넣었다.


그래서 현재 설정되어있는 proxy-server에 있는 /etc/swift/swift.conf 내용은 아래와 같다.


[swift-hash]
swift_hash_path_prefix=b7109ae2-a000-11e6-a588-0bf3277d9993


일단은 keep 해두자. 나중에 storage server에 동일한 위치에 모두 복사해넣어야 한다.


4. 스위프트 구동될때 사용될 임시 디렉토리를 생성한다..


요부분도 자꾸 놓친 부분인데, /var/run/swift 폴더는 시스템이 리부트 되면 삭제되는 영역이기 때문에 /etc/init.d/rc.local 등에서 폴더 생성하고 권한 설정해주도록 추가해주어야 한다.


sudo mkdir -p /var/run/swift

sudo chown swift:swift /var/run/swift


5. swift-proxy 패키지와 memcached를 설치한다.


sudo apt-get install swift-proxy memcached


6. 프록시 서버 캐싱을 위해 memcached를 설정한다.


sudo perl -pi -e "s/-l 127.0.0.1/-l [proxy server ip address]/" /etc/memcached.conf


또는 sudo vi /etc/memcached.conf 해서 -l 127.0.0.1인 줄을 찾아서 자신의 proxy server ip 주소로 변경해준다.


그런 다음 memcached 서비스를 재시작한다.


sudo service memcached restart


7. 스위프트 proxy-server configuration을 변경해준다.


vi /etc/swift/proxy-server.conf


[DEFAULT]
bind_port = 8080
workers = 8
user = swift

[pipeline:main]
pipeline = healthcheck proxy-logging cache tempauth proxy-logging proxy-server

[app:proxy-server]
use = egg:swift#proxy
allow_account_management = true
account_autocreate = true

[filter:proxy-logging]
use = egg:swift#proxy_logging

[filter:tempauth]
use = egg:swift#tempauth
user_system_root = testpass .admin https://$PROXY_LOCAL_NET_IP:8080/v1/AUTH_system

[filter:healthcheck]
use = egg:swift#healthcheck

[filter:cache]
use = egg:swift#memcache
memcache_servers = $PROXY_LOCAL_NET_IP:11211


위의 링크의 설명에서 환경변수로 export 해둔 다음 conf 파일에 저렇게 참조하게 해놨는데, 저렇게 하면 잘 안되고, 직접 ip 주소를 넣어주는게 좋은 것 같다.


8. 스위프트 프록시 노드를 위해 Ring을 구성한다. <-- 요거 중요


cd /etc/swift

swift-ring-builder account.builder create X Y Z

swift-ring-builder container.builder create X Y Z

swift-ring-builder object.builder create X Y Z


X는 max clustering number라는데 뭔지 잘 모르겠고..

Y는 한번 객체가 업로드 되면 Y개의 storage 서버에 복제되어 저장된다.

Z는 하나의 객체가 다른 노드로 이동할 경우 latency 시간이라는데... 말만으로는 뭔소린지 모르겠다..


storage 서버를 하나만 두려면 swift-ring-builder account.builder create 10 1 1 뭐 이렇게 해주면 된다.

난 storage를 두개 만들어 등록하고, account, container, object 모두 2벌씩 복제되게 설치했다.


따라서 다음과 같이 했다.


swift-ring-builder account.builder create 10 2 1

swift-ring-builder container.builder create 10 2 1

swift-ring-builder object.builder create 10 2 1


위와같이 각각의 링을 구성했으면, 실제로 노드를 추가한다.


swift-ring-builder "builder 명" add rAzB-IP:6002/device weight 의 형태로 인자를 지정해서 실행한다.


swift-ring-builder account.builder add r1z1-[STORAGE0_IP]:6002/sdb1 100

swift-ring-builder account.builder add r1z1-[STORAGE1_IP]:6002/sdb1 100

swift-ring-builder container.builder add r1z1-[STORAGE0_IP]:6001/sdb1 100

swift-ring-builder container.builder add r1z1-[STORAGE1_IP]:6001/sdb1 100

swift-ring-builder object.builder add r1z1-[STORAGE0_IP]:6000/sdb1 100

swift-ring-builder object.builder add r1z1-[STORAGE1_IP]:6000/sdb1 100


각각 잘 되었는지 확인하기 위해


swift-ring-builder account.builder

swift-ring-builder container.builder

swift-ring-builder object.builder


해보면 각각 설정된 내용이 dump 된다.


다음은 각 노드들의 rebalance 작업을 수행한다.


swift-ring-builder account.builder rebalance

swift-ring-builder container.builder rebalance

swift-ring-builder object.builder rebalance


시간이 좀 걸린다는데... 이상하게 난 금방 되었다... ㅎㅎ


위의 링크에서는 sudo로 실행을 했기 때문에 생성된 ring.gz 파일의 소유자가 root:root로 되어있을 텐데, 본 글에서 처럼 하면 자연스럽게 swift:swift로 생성된다.


자 일단 여기까지 proxy-server 설정은 되었고


swift-init proxy start 하면 되는데, 그 전에 storage server들을 설치해보자.



<storage 서버 설치 및 설정>


0~2까지는 proxy server 설치 과정과 동일 (swift 계정 생성하고 swift 계정으로 로그인해서 시작)


3. proxy server의 swift.conf 파일을 같은 위치에 복사해준다. (scp가 편리할 것 같다.)


scp swift@proxy_server_ip:/etc/swift/swift.conf /etc/swift/swift.conf


4. 스토리지 노드를 위한 패키지 설치하기


sudo apt-get install swift-account swift-container swift-object xfsprogs


자.. 여기서 위의 링크의 글에서는 물리적인 하드를 통으로 fdisk 해서 사용했는데, 난 loop device를 만들어서 sdb에 마운트 해서 사용했다.. (SAIO 설치 과정 참조 http://docs.openstack.org/developer/swift/development_saio.html#getting-the-code)


원하는 위치에 저장소로 사용할 파일 청크를 원하는 크기로 만든다..


예를 들어 난 swift 계정의 home directory에 100기가짜리 파일 청크를 만들어서 사용했다.


cd ~

truncate -s 100GB swift-disk

mkfs.xfs swift-disk


위의 청크 파일을 /etc/fstab에 추가한다


/home/swift/swift-disk /srv/node/sdb1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0


sudo mkdir -p /srv/node/sdb1

sudo mount /srv/node/sdb1

sudo chown swift:swift /srv/node/sdb1 (요기는... 부팅될 때 자동 처리되는지 확인해봐야 할 거 같다..


5. 스토리지 노드의 싱크를 맞춰주는 rsync 설정하기..


sudo vi /etc/rsyncd.conf


uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = $STORAGE_LOCAL_NET_IP   <-- STORAGE 서버의 IP 주소

[account]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/account.lock

[container]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/container.lock

[object]
max connections = 2
path = /srv/node/
read only = false
lock file = /var/lock/object.lock


위와 같이 conf 파일 생성 후 서비스 활성화


sudo vi /etc/default/rsyncd.conf


에서 RSYNC_ENABLE=false로 되어있는데 false를 TRUE 또는 true로 변경후 저장


sudo service rsync start


이 부분도 부팅때 마다 자동으로 수행되지 않으므로, 부팅 스크립트에 추가해줘야 할 듯하다.


5. 스위프트 계정 정보를 저장하는 account server 설정파일 작성


vi /etc/swift/account-server.conf


[DEFAULT]
bind_ip = $STORAGE_LOCAL_NET_IP <-- 스토리지 서버 IP 주소
workers = 2

[pipeline:main]
pipeline = account-server

[app:account-server]
use = egg:swift#account

[account-replicator]

[account-auditor]

[account-reaper]


6. 스위프트 컨테이너를 저장하는 container  서버 설정 파일 작성


vi /etc/swift/container-server.conf


[DEFAULT]
bind_ip = $STORAGE_LOCAL_NET_IP  --> 스토리지 서버 ip 주소로 대체
workers = 2

[pipeline:main]
pipeline = container-server

[app:container-server]
use = egg:swift#container

[container-replicator]

[container-updater]

[container-auditor]

[container-sync]
 


6. 스위프트 객체 파일 정보를 저장하는 object 서버 설정 파일을 생성 저장한다.


vi /etc/swift/object-server.conf


[DEFAULT]
bind_ip = $STORAGE_LOCAL_NET_IP
workers = 2

[pipeline:main]
pipeline = object-server

[app:object-server]
use = egg:swift#object

[object-replicator]

[object-updater]

[object-auditor]


7. proxy server에서 만들어둔 ring.gz 파일을 복사해온다.


scp swift@proxyserver_ip:/etc/swift/*.ring.gz /etc/swift/



스토리지 서버를 2개로 설정했으므로, 스토리지 서버 설치 과정을 다른 기계에 한번 더 반복..


이제 대략 설정 끝..


각각의 스토리지 서버 구동...


각 스토리지 서버에서 swift-init all start 해서 스토리지 노드를 시작시키고


proxy server에서 swift-init proxy start


하면 된다.


curl 을 이용하여 동작 테스트를 해본다... 매번 커맨드 라인에서 curl 명령 수행하기 귀찮아서 스크립트를 하나 만들었다.. 리눅스 스크립트.. 잘 안 익숙해서 엉터리지만, 테스트 용도로는 그냥 사용할만 하다...


vi swift-test.sh


#!/bin/sh
CONFIG_FILE=/tmp/swift_test.conf

auth_it() {
        TOKEN=$(curl -is -H 'X-Storage-User: '$SWIFT_TENANT:$SWIFT_USER -H 'X-Storage-Pass: '$SWIFT_PASS http://$SWIFT_URL:8080/auth/v1.0 | grep X-Auth-Token: | awk '{print $2}')
        if [ "$TOKEN" = "" ]; then
                echo Check Login information
        else
                echo SWIFT AUTHENTICATED
                XSTORAGE_URL=$(curl -is -H 'X-Storage-User: '$SWIFT_TENANT:$SWIFT_USER -H 'X-Storage-Pass: '$SWIFT_PASS http://$SWIFT_URL:8080/auth/v1.0 | grep X-Storage-Url: | awk '{print $2}')
                echo X-Stroage-Url = $XSTORAGE_URL
        fi
}

is_token_valid() {
        if [ "$TOKEN" = "" ]; then
#               echo Empty TOKEN
                return 1
        else
#               echo Check current token validity
                curl -s -H "X-Auth-Token: $TOKEN" http://$SWIFT_URL:8080/v1/AUTH_$SWIFT_TENANT > /dev/null
#               curl -H "X-Auth-Token: $TOKEN" http://$SWIFT_URL:8080/v1/AUTH_test
                if [ "$?" = "0" ]; then
                        return 0
                else
                        return 1
                fi
        fi
}

check_auth() {
        is_token_valid
        if [ "$?" != "0" ]; then
                echo "TOKEN is not valid"
                auth_it
#       else
#               echo "TOKEN is OK"
        fi
}

list_it() {
        check_auth
        curl -H "X-Auth-Token: $TOKEN" $TEMP_URL
}

download_it() {
        check_auth
        echo Downloading a file from $TEMP_URL
        curl -o $FILE_NAME  -v -H "X-Auth-Token: $TOKEN" $TEMP_URL
        return
}

upload_it() {
        check_auth
        echo URL = $TEMP_URL
        if [ "$UPLOAD_FILE" = "" ]; then
                # create container
                curl -X PUT -H "X-Auth-Token: $TOKEN" -i $TEMP_URL
        else
                curl -X PUT -T $UPLOAD_FILE -H "X-Auth-Token: $TOKEN" -i $TEMP_URL/$UPLOAD_FILE
        fi
}

delete_it() {
        check_auth
        curl -X DELETE -H 'X-Auth-Token: '$TOKEN $TEMP_URL
}

stat_it() {
        check_auth
        echo URL= $TEMP_URL
        curl -X HEAD -H 'X-Auth-Token: '$TOKEN $TEMP_URL | grep "X-Container-Bytes-Used:" | awk '{ print $2 }'
}


if [ -f $CONFIG_FILE ]; then
        source $CONFIG_FILE
        check_auth
fi

case "$1" in
        "show" | "SHOW" )
                                if [ "$SWIFT_URL" = "" ]; then
                                        echo "No server url exists"
                                else
                                        echo "Swift Server URL : $SWIFT_URL"
                                        if [ "$SWIFT_TENANT" = "" ]; then
                                                echo "No swift tenant exists"
                                        else
                                                echo "Swift Tenant $SWIFT_TENANT"
                                        fi
                                        if [ "$SWIFT_USER" = "" ]; then
                                                echo "No Swift Account exists"
                                        else
                                                echo "Swift Account $SWIFT_USER"
                                                echo "Swift Password $SWIFT_PASS"
                                        fi
                                fi
                                exit 0
                                ;;
        "set" | "SET" )
                                if [ "$2" = "" ]; then
                                        echo "Give me swift url"
                                        exit 1
                                else
                                        echo SWIFT_URL=$2
                                        SWIFT_URL=$2
                                        echo export SWIFT_URL=$SWIFT_URL > $CONFIG_FILE
                                fi
                                if [ "$3" = "" ]; then
                                        echo "Give me the tenant name"
                                        exit 1
                                else
                                        echo SWIFT_TENANT=$3
                                        SWIFT_TENANT=$3
                                        echo export SWIFT_TENANT=$SWIFT_TENANT >> $CONFIG_FILE
                                fi
                                if [ "$4" = "" ]; then
                                        echo "Give me swift user as AAAA:BBBB"
                                        exit 1
                                else
                                        echo SWIFT_USER=$4
                                        SWIFT_USER=$4
                                        echo export SWIFT_USER=$SWIFT_USER >> $CONFIG_FILE
                                fi
                                if [ "$5" = "" ]; then
                                        echo "Give me swift pass"
                                        exit 1
                                else
                                        echo SWIFT_PASS=$5
                                        SWIFT_PASS=$5
                                        echo export SWIFT_PASS=$SWIFT_PASS >> $CONFIG_FILE
                                fi
                                auth_it
                                exit 0
                                ;;
        "dir" | "DIR" )
                                TEMP_URL=http://$SWIFT_URL:8080/v1/AUTH_$SWIFT_TENANT
                                if [ "$2" = "" ]; then
                                        echo "> list of containers"
                                else
                                        TEMP_URL+="/$2"
                                        echo "> list of container $2"
                                fi
                                list_it
                                ;;

        "up" | "UP" )
                                if [ "$2" = "" ]; then
                                        echo "> Give me Container name"
                                        exit 1
                                fi
                                TEMP_URL=http://$SWIFT_URL:8080/v1/AUTH_$SWIFT_TENANT/$2
                                UPLOAD_FILE=$3
                                upload_it
                                ;;
        "down" | "DOWN" )
                                if [ "$2" = "" ]; then
                                        echo "> Give me Container name"
                                        exit 1
                                fi
                                TEMP_URL=http://$SWIFT_URL:8080/v1/AUTH_$SWIFT_TENANT/$2
                                if [ "$3" = "" ]; then
                                        echo "> Give me a file to download"
                                        exit 1
                                fi
                                if [ "$4" = "" ]; then
                                        FILE_NAME=$3
                                else
                                        FILE_NAME=$4
                                fi
                                TEMP_URL+=/$3
                                download_it
                                ;;
        "rm" | "RM" )
                                if [ "$2" = "" ]; then
                                        echo "> Give a container name to delete"
                                        exit 1
                                fi
                                TEMP_URL=http://$SWIFT_URL:8080/v1/AUTH_$SWIFT_TENANT/$2
                                if [ "$3" != "" ]; then
                                        TEMP_URL=http://$SWIFT_URL:8080/v1/AUTH_$SWIFT_TENANT/$2/$3
                                fi
                                delete_it
                                ;;
        "stat"|"STAT" )
                                if [ "$2" = "" ]; then
                                        echo "> Give me Container name"
                                        exit 1
                                fi
                                TEMP_URL=http://$SWIFT_URL:8080/v1/AUTH_$SWIFT_TENANT/$2
                                if [ "$3" != "" ]; then
                                        TEMP_URL+=/$3
                                fi
                                stat_it
                                ;;
        * )                     echo "Usage : $0 [command] [param]..."
                                ;;
esac

echo -e "\n"

if [ "$SWIFT_URL" = "" ]; then
        echo "SWIFT_URL is empty"
        exit 1
fi

if [ "$SWIFT_USER" = "" ]; then
        echo "SWIFT_USER is empty"
        exit 1
fi

if [ "$SWIFT_PASS" = "" ]; then
        echo "SWIFT_PASS is empty"
        exit 1
fi




본 스크립의 사용방법은...  우선 ./swift-test.sh set 명령을 이용해서 proxy server url, swift 계정 패스워드 등등을 설정하여 저장하고

이후로는 swift-test dir/up/down 등등의 명령을 이용해서 container를 생성하고 파일을 올리고 내리고 할 수 있다.



참고로 SAIO에서는 tenant 라는 항목에 test, 계정에는 test:tester, 패스워드는 testing, 위의 링크에서는 system, root,  testpass 로 하면 된다..

 

Posted by 켄아자씨
,