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

1.4.2. OpenstackのSwiftの構築(MultiNode)

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

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

プロキシサーバはNovaの管理サーバで動かし認証サーバも同じサーバのKeystoneを利用しようと思いましたが何かうまく動かないです。

オールインワンは既に構築し問題なかったため、ここではストレージサーバ4台で内一台をProxy、Keystoneを利用した環境でSwiftを動作させます。

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

1.4.2.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
$ cd /opt/swift
$ sudo git checkout 1.4.7
$ cd /opt/swift && sudo python setup.py develop

1.4.2.2. (ストレージノード)XFSを利用するためのパッケージをインストール

XFSがSwiftの推奨らしいですが他のファイルシステムでも動作します。でもここではXFSを利用します。Ubuntuのデフォルトだと利用できないため必要なパッケージのインストールを行います。これもストレージノード全てで行います。

$ sudo apt-get install xfsprogs -y

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

$ sudo groupadd swift
$ sudo useradd -g swift swift

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

$ sudo mkdir /etc/swift

1.4.2.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.2.4. (プロキシサーバ)memcachedのインストール

memcachedはプロキシサーバと同じサーバで利用するようにしますのでプロキシサーバになるサーバのみでインストールを行います。

$ sudo apt-get install memcached -y
$ perl -pi -e "s/-l 127.0.0.1/-l 192.168.10.40/" /etc/memcached.conf

1.4.2.5. (ストレージノード)Swiftが利用するディスクの作成

ストレージノード全てで同じディスクを利用するようにします。

ここでは、2台目のHDDを全領域利用するような設定にします。デバイス名の変更が必要であればおこなってください。

$ sudo fdisk /dev/vdb
root@storage01:/opt/swift# sudo fdisk /dev/vdb

Command (m for help): p

Disk /dev/vdb: 107.4 GB, 107374182400 bytes
16 heads, 63 sectors/track, 208050 cylinders, total 209715200 sectors
Units = sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0xde074842

   Device Boot      Start         End      Blocks   Id  System

Command (m for help): n
Command action
   e   extended
   p   primary partition (1-4)
p
Partition number (1-4, default 1):
Using default value 1
First sector (2048-209715199, default 2048):
Using default value 2048
Last sector, +sectors or +size{K,M,G} (2048-209715199, default 209715199):
Using default value 209715199

Command (m for help): w
The partition table has been altered!

Calling ioctl() to re-read partition table.
Syncing disks.

1.4.2.5.1. XFSによるファイルシステムを作成

$ sudo mkfs.xfs -f /dev/vdb1

1.4.2.5.2. マウントポイントの作成

$ sudo mkdir -p /swift/disk0

問題なければOS起動時にマウントするように /etc/fstab に設定を記述しておきます。

1.4.2.5.3. デバイスのマウント

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

$ sudo chown -R swift:swift /swift

1.4.2.6. (ストレージノード)Swiftの各ファイルの設定

ストレージノードの設定です。

1.4.2.6.1. 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

1.4.2.6.2. 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

1.4.2.6.3. 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

1.4.2.6.4. 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

1.4.2.6.5. object-expirer

$ cat << EOF | sudo tee /etc/swift/object-expirer.conf > /dev/null
[DEFAULT]
# swift_dir = /etc/swift
# user = swift
# You can specify default log routing here if you want:
# log_name = swift
# log_facility = LOG_LOCAL0
# log_level = INFO

[object-expirer]
interval = 300

[pipeline:main]
pipeline = catch_errors cache proxy-server

[app:proxy-server]
use = egg:swift#proxy
# See proxy-server.conf-sample for options

[filter:cache]
use = egg:swift#memcache
# See proxy-server.conf-sample for options

[filter:catch_errors]
use = egg:swift#catch_errors
# See proxy-server.conf-sample for options
EOF

1.4.2.7. (認証、プロキシ、ストレージ)Swiftの各ファイルの設定

1.4.2.7.1. swift.conf

プロキシサーバ、認証サーバ、ストレージサーバ全てで同じにしておく必要があります。

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

1.4.2.8. (プロキシサーバ)Swiftの各ファイルの設定

memcachedはプロキシサーバのアドレスを指定します。

1.4.2.8.1. SL証明書の作成

SSLで通信を行わない場合は必要ありません。また設定の cert 部分のコメントと httpshttp に変更しておく必要があります。そしてコマンドは全て https でなく http に置き換えてください。

$ cd /etc/swift
$ sudo openssl req -new -x509 -nodes -out cert.crt -keyout cert.key

1.4.2.8.2. 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
account_autocreate = true

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

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

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

1.4.2.9. (プロキシサーバ)Ringの作成

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

そのためコマンドはプロキシサーバで実施します。

今回はストレージサーバ4台で構築するためアドレスが192.168.10.40〜192.168.10.43になっています。

$ 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-192.168.10.40:6002/disk0 1
$ sudo swift-ring-builder account.builder add z1-192.168.10.41:6002/disk0 1
$ sudo swift-ring-builder account.builder add z2-192.168.10.42:6002/disk0 1
$ sudo swift-ring-builder account.builder add z3-192.168.10.43:6002/disk0 1
$ sudo swift-ring-builder account.builder rebalance
$ sudo swift-ring-builder container.builder add z0-192.168.10.40:6001/disk0 1
$ sudo swift-ring-builder container.builder add z1-192.168.10.41:6001/disk0 1
$ sudo swift-ring-builder container.builder add z2-192.168.10.42:6001/disk0 1
$ sudo swift-ring-builder container.builder add z3-192.168.10.43:6001/disk0 1
$ sudo swift-ring-builder container.builder rebalance
$ sudo swift-ring-builder object.builder add z0-192.168.10.40:6000/disk0 1
$ sudo swift-ring-builder object.builder add z1-192.168.10.41:6000/disk0 1
$ sudo swift-ring-builder object.builder add z2-192.168.10.42:6000/disk0 1
$ sudo swift-ring-builder object.builder add z3-192.168.10.43:6000/disk0 1
$ sudo swift-ring-builder object.builder rebalance

設定の確認 .. code-block:: bash

$ sudo swift-ring-builder account.builder $ sudo swift-ring-builder container.builder $ sudo swift-ring-builder object.builder

1.4.2.10. (プロキシサーバ)プロセスの起動

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

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

1.4.2.11. (ストーレジノード)プロセスの起動

ストーレジノードでSwiftのプロセスを起動します。こちらもRsyncはすでに起動していますが設定ファイルを書き換えたので再起動します。 また、起動する前にプロキシサーバで作成したリングファイルをコピーしておきます。

allで起動しているのでプロキシの設定がない(Unable to locate config for proxy-server)エラーが出力されますので気になる人はひとつずつプロセスを起動してください。

$ scp -p stack@192.168.10.40:/etc/swift/*gz /tmp
$ sudo mv /tmp/*ring.gz /etc/swift
$ sudo chown swift:swift -R /etc/swift
$ sudo /etc/init.d/rsync restart
$ sudo swift-init all start

1.4.2.12. Swiftの確認

確認 Curlが確認に必要なためインストールしておきます。

$ apt-get install curl -y
$ curl -k -v -H 'X-Storage-User: system:root' -H 'X-Storage-Pass: testpass' https://192.168.10.40:8080/auth/v1.0

200 OKが帰ってくればOKです。
* About to connect() to 192.168.10.40 port 8080 (#0)
*   Trying 192.168.10.40... connected
* Connected to 192.168.10.40 (192.168.10.40) port 8080 (#0)
* successfully set certificate verify locations:
*   CAfile: none
  CApath: /etc/ssl/certs
* SSLv3, TLS handshake, Client hello (1):
* SSLv3, TLS handshake, Server hello (2):
* SSLv3, TLS handshake, CERT (11):
* SSLv3, TLS handshake, Server finished (14):
* SSLv3, TLS handshake, Client key exchange (16):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSLv3, TLS change cipher, Client hello (1):
* SSLv3, TLS handshake, Finished (20):
* SSL connection using AES256-SHA
* Server certificate:
*       subject: C=AU; ST=Some-State; O=Internet Widgits Pty Ltd
*       start date: 2012-03-06 05:18:45 GMT
*       expire date: 2012-04-05 05:18:45 GMT
* SSL: unable to obtain common name from peer certificate
> GET /auth/v1.0 HTTP/1.1
> User-Agent: curl/7.21.6 (x86_64-pc-linux-gnu) libcurl/7.21.6 OpenSSL/1.0.0e zlib/1.2.3.4 libidn/1.22 librtmp/2.3
> Host: 192.168.10.40:8080
> Accept: */*
> X-Storage-User: system:root
> X-Storage-Pass: testpass
>
< HTTP/1.1 200 OK
< X-Storage-Url: https://192.168.10.40:8080/v1/AUTH_system
< X-Storage-Token: AUTH_tk7aae2ad679334b41b6376a0b355da048
< X-Auth-Token: AUTH_tk7aae2ad679334b41b6376a0b355da048
< Content-Length: 0
< Date: Tue, 06 Mar 2012 05:26:59 GMT
<
* Connection #0 to host 192.168.10.40 left intact
* Closing connection #0
* SSLv3, TLS alert, Client hello (1):
$ swift -A https://192.168.10.40:8080/auth/v1.0 -U system:root -K testpass stat

まだコンテナやオブジェクトは何も無いので以下のように表示されればOKです。

   Account: AUTH_system
Containers: 0
   Objects: 0
     Bytes: 0
Accept-Ranges: bytes

1.4.2.12.1. 環境変数の設定

-A https://192.168.10.40:8080/auth/v1.0
-U system:root
-K testpass

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

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

1.4.2.12.2. ファイルのアップロード

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

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

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

$ swift list

1.4.2.12.4. 統計情報の表示

$ swift stat

1.4.2.12.5. コンテナを作成

$ swift post container2

1.4.2.12.6. ファイルのダウンロード

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

1.4.2.12.7. コンテナの削除

$ swift delete container1

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

そのうち追加します。

目次

前のトピックへ

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

次のトピックへ

1.4.3. OpenstackのSwiftの構築(認証の変更(Keystone連携)

このページ