このエントリーをはてなブックマークに追加

1.4.1. OpenstackのSwiftの構築(All In One)

Openstackの仮想マシンのイメージの冗長化にSwiftを利用したいので Swift を構築します。OSはUbuntu11.10で行なっています。

Swiftの構成はプロキシサーバ,認証サーバ,ストレージサーバ(最低3台、推奨は5台以上らしい)が必要です。

プロキシサーバはNovaの管理サーバで動かし認証サーバも同じサーバのKeystoneを利用しようと思いましたが何かうまく動かないのでまずは全て同一サーバでKeystoneも使用せずに動作させて見ることにしました。

バージョンは、Diabloを使用します。またSwiftを利用するのに必要なパッケージもインストールします。

Novaと違って仮想マシンを動かすわけではないので仮想マシン上で作業はおこなっても問題ありません。

http://aikotobaha.blogspot.com/2011/12/openstack-swift14x-10rpmyum.html

マルチノードはOpenstackのドキュメントを参考にしてやってたのですが動かないので単体バージョンは上記ブログ参考にさせていただきました。

RedHat系で構築する方は上記URLのほうが参考になります。

1.4.1.1. Swiftに必要なパッケージのインストール

$ sudo apt-get install git python-setuptools python-configobj python-coverage \
python-dev python-nose python-setuptools python-simplejson \
python-xattr python-webob python-eventlet python-greenlet \
debhelper python-all python-openssl python-pastedeploy python-netifaces -y
$ sudo git clone git://github.com/openstack/swift.git /opt/swift -b stable/diablo
$ cd /opt/swift && sudo python setup.py develop

1.4.1.2. XFSを利用するためのパッケージをインストール

XFSがSwiftの推奨らしいですが他のファイルシステムでも動作します。UbuntuでXFSを利用する場合はデフォルトだとパッケージが足りないみたいなのでインストールします。

$ sudo apt-get install xfsprogs -y

Swiftのプロセス起動ユーザを作成します。

$ sudo groupadd swift
$ sudo useradd -g swift swift

コンフィグのディレクトリを作成します。

$ sudo mkdir /etc/swift

1.4.1.3. Rsyncのインストール

データの複製、復旧などにrsyncが利用されているのでインストールします。

$ sudo apt-get install rsync -y

/etc/default/rsyncの設定

$ sudo sed -i 's/RSYNC_ENABLE=false/RSYNC_ENABLE=true/' /etc/default/rsync

1.4.1.4. memcachedのインストール

memcachedはプロキシサーバと同じサーバで利用するようにします。ここでは同じサーバなので特に何もきにしません。

$ sudo apt-get install memcached -y

1.4.1.5. Swiftが利用するディスクイメージの作成

ストレージノードは別々の4台で作成するつもりでforで回してないです。 右脳が。。

$ sudo mkdir -p /swift/disk0
$ sudo mkdir -p /swift/disk1
$ sudo mkdir -p /swift/disk2
$ sudo mkdir -p /swift/disk3
$ sudo dd if=/dev/zero of=/mnt/disk0 bs=1024k count=1024
$ sudo dd if=/dev/zero of=/mnt/disk1 bs=1024k count=1024
$ sudo dd if=/dev/zero of=/mnt/disk2 bs=1024k count=1024
$ sudo dd if=/dev/zero of=/mnt/disk3 bs=1024k count=1024
$ sudo mkfs.xfs /mnt/disk0
$ sudo mkfs.xfs /mnt/disk1
$ sudo mkfs.xfs /mnt/disk2
$ sudo mkfs.xfs /mnt/disk3

デバイスのマウント

$ sudo mount -o noatime,nodiratime,nobarrier,logbufs=8 /mnt/disk0 /swift/disk0
$ sudo mount -o noatime,nodiratime,nobarrier,logbufs=8 /mnt/disk1 /swift/disk1
$ sudo mount -o noatime,nodiratime,nobarrier,logbufs=8 /mnt/disk2 /swift/disk2
$ sudo mount -o noatime,nodiratime,nobarrier,logbufs=8 /mnt/disk3 /swift/disk3

swiftユーザでプロセスを起動するためswiftユーザが利用できるようにオーナーの変更を行います。

$ sudo chown -R swift:swift /swift

起動時にマウントする場合

OS起動時にSwiftの領域をマウントする場合は/etc/fstabに設定しておきます。

$ sudo sh -c "echo /mnt/disk0 /swift/disk0 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0 >> /etc/fstab"
$ sudo sh -c "echo /mnt/disk1 /swift/disk1 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0 >> /etc/fstab"
$ sudo sh -c "echo /mnt/disk2 /swift/disk2 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0 >> /etc/fstab"
$ sudo sh -c "echo /mnt/disk3 /swift/disk3 xfs noatime,nodiratime,nobarrier,logbufs=8 0 0 >> /etc/fstab"

1.4.1.6. Swiftの各ファイルの設定

rsyncd.conf

$ cat << EOF | sudo tee /etc/rsyncd.conf > /dev/null
uid = swift
gid = swift
log file = /var/log/rsyncd.log
pid file = /var/run/rsyncd.pid
address = 0.0.0.0

[account]
max connections = 25
path = /swift
read only = false
lock file = /var/lock/account.lock

[container]
max connections = 25
path = /swift
read only = false
lock file = /var/lock/container.lock

[object]
max connections = 25
path = /swift
read only = false
lock file = /var/lock/object.lock
EOF

account-server

$ cat << EOF | sudo tee /etc/swift/account-server.conf > /dev/null
[DEFAULT]
devices = /swift
bind_ip = 0.0.0.0
workers = 2

[pipeline:main]
pipeline = account-server

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

[account-replicator]

[account-auditor]

[account-reaper]
EOF

container-server

$ cat << EOF | sudo tee /etc/swift/container-server.conf > /dev/null
[DEFAULT]
devices = /swift
bind_ip = 0.0.0.0
workers = 2

[pipeline:main]
pipeline = container-server

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

[container-replicator]

[container-updater]

[container-auditor]

[container-sync]
EOF

object-server

$ cat << EOF | sudo tee /etc/swift/object-server.conf > /dev/null
[DEFAULT]
devices = /swift
bind_ip = 0.0.0.0
workers = 2

[pipeline:main]
pipeline = object-server

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

[object-replicator]

[object-updater]

[object-auditor]
EOF

swift.conf

$ cat << EOF | sudo tee /etc/swift/swift.conf > /dev/null
[swift-hash]
swift_hash_path_suffix = swift20120228
EOF

proxy-server.conf

$ cat << EOF | sudo tee /etc/swift/proxy-server.conf > /dev/null
[DEFAULT]
#cert_file = /etc/swift/cert.crt
#key_file = /etc/swift/cert.key
bind_ip = 0.0.0.0
bind_port = 8080
workers = 8
user = swift

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

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

[filter:tempauth]
use = egg:swift#tempauth
user_system_root = testpass .admin

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

[filter:cache]
use = egg:swift#memcache
memcache_servers = 127.0.0.1:11211
EOF

1.4.1.7. Ringの作成

Ringは、Proxy Serverがストレージサーバのうちどのサーバが実際にデータを持っているのかを参照するのに使用します。

今回は全て同一サーバなのでアドレスが127.0.0.1になっています。

$ cd /etc/swift/
$ sudo swift-ring-builder account.builder create 10 3 1
$ sudo swift-ring-builder container.builder create 10 3 1
$ sudo swift-ring-builder object.builder create 10 3 1
$ sudo swift-ring-builder account.builder add z0-127.0.0.1:6002/disk0 1
$ sudo swift-ring-builder account.builder add z1-127.0.0.1:6002/disk1 1
$ sudo swift-ring-builder account.builder add z2-127.0.0.1:6002/disk2 1
$ sudo swift-ring-builder account.builder add z3-127.0.0.1:6002/disk3 1
$ sudo swift-ring-builder account.builder rebalance
$ sudo swift-ring-builder container.builder add z0-127.0.0.1:6001/disk0 1
$ sudo swift-ring-builder container.builder add z1-127.0.0.1:6001/disk1 1
$ sudo swift-ring-builder container.builder add z2-127.0.0.1:6001/disk2 1
$ sudo swift-ring-builder container.builder add z3-127.0.0.1:6001/disk3 1
$ sudo swift-ring-builder container.builder rebalance
$ sudo swift-ring-builder object.builder add z0-127.0.0.1:6000/disk0 1
$ sudo swift-ring-builder object.builder add z1-127.0.0.1:6000/disk1 1
$ sudo swift-ring-builder object.builder add z2-127.0.0.1:6000/disk2 1
$ sudo swift-ring-builder object.builder add z3-127.0.0.1:6000/disk3 1
$ sudo swift-ring-builder object.builder rebalance

1.4.1.8. プロセスの起動

まず、Rsync、Memcacheを起動します。Rsyncはすでに起動していますが設定ファイルを書き換えたので再起動します。

SwiftはProxy、ストレージサーバも全て同じサーバなのでallで起動します。

$ sudo chown swift:swift -R /etc/swift
$ sudo /etc/init.d/rsync restart
$ sudo /etc/init.d/memcached restart
$ sudo swift-init all start

1.4.1.9. Swiftの確認

環境変数の設定

-A http://127.0.0.1:8080/auth/v1.0
-U system:root
-K testpass

上記設定がSwiftを利用するコマンド入力時に必要ですがコマンドが長くなるため環境変数に設定出来るみたいなのでそうします。

$ export ST_AUTH=http://127.0.0.1:8080/auth/v1.0
$ export ST_USER=system:root
$ export ST_KEY=testpass

ファイルのアップロード テスト用のテキストを作成してアップロードします。

$ cd /tmp
$ echo "SWIFT TEST" > test.txt
$ swift upload container1 test.txt

ファイルリストの一覧を表示

$ swift list

統計情報の表示

$ swift stat

コンテナを作成

$ swift post container2

ファイルのダウンロード

$ cd /tmp
$ swift download container1 test.txt
$ ls -l test.txt

コンテナの削除

$ swift delete container1

1.4.1.10. 起動スクリプトの作成

各コンポーネントはコンフィグが無ければ起動しないだけのため全起動、全停止のもので問題ないと思いますのでそうします。

$ cat << 'SWIFT_INIT' | sudo tee /etc/init/swift-all.conf > /dev/null
description "Swift All"
author "hagix9 <hagihara@fulltrust.co.jp>"

start on runlevel [2345]
stop on runlevel [016]

post-start script
  swift-init all start
end script
post-stop script
  swift-init all stop
end script
SWIFT_INIT