EC2にSwiftをインストール
分散ストレージ的なものを探していたら、OpenStackにSwiftというS3的なストレージがあることを知ったので、まずはどんなものか知るためにインストールしてみることにした。
そのときのインストールメモ。
インストール時に固定IPがあったほうがSwiftの手順に従いやすかったので、Amazon VPC内にEC2インスタンスをたててインストールしてみた。
対象の Linux は Ubuntu 10.04 で、これは Ubuntu のEC2StartersGuide - Community Help Wiki に載っている AMI を利用した。
手順の基本はChapter 3. Installing and Configuring OpenStack Object Storageの通り。若干、EC2のせい(?)なのか修正したところと、ドキュメント通りではうまくいかなかったところもあったので、その部分をメモっておく。
ちなみに、構成としては
- Porxy 兼 Auth ノード1台(IP: 10.0.0.11)
- Storage ノード5台(IP: 10.0.0.12 〜 16)
というドキュメント通りの構成。
なお、Storage ノードについては、EBS 1GB を /dev/sdb としてアタッチした。
Amzon VPC ではNICそのものに割り当てるIPを指定できるのがいいところですね。もっとも、現状だと東京リージョンにないので、US-east を使用。そのため若干コマンドうつのにストレスを感じつつ作業をしましたが。。。あと、micro 使えないので少しお財布を気にする必要もあり。立ち上げっぱなしは個人としては大変!
Ubuntuのapt設定修正
利用したAMIでは /etc/apt/sources.list で指定されている apt サーバが us-east-1.ec2.archive.ubuntu.com を指していたけれど、少なくとも試した時点ではこのサーバがいなかったので、source.list を結局以下のように記述した。
deb http://archive.ubuntu.com/ubuntu/ lucid main universe deb-src http://archive.ubuntu.com/ubuntu/ lucid main universe deb http://archive.ubuntu.com/ubuntu/ lucid-updates main universe deb-src http://archive.ubuntu.com/ubuntu/ lucid-updates main universe deb http://security.ubuntu.com/ubuntu lucid-security main universe deb-src http://security.ubuntu.com/ubuntu lucid-security main universe
python netifaces でのエラー対策
apt-get install swift openssh-server
でswiftのパッケージをインストールすると、依存関係により python-netifaces というのが入る。
EC2 での問題なのかわからないが、あとあとProxyとかのサーバを起動すると /usr/share/pyshared/swift/common/utils.py で
ValueError: You must specify a valid interface name.
というエラーが発生する。
そこで、少し調べてみた。
$ python >>> import netifaces >>> netifaces.interfaces() ['lo', 'eth0', 'dummy0', 'ifb0', 'ifb1', 'eql'] >>> netifaces.ifaddresses('eql') Traceback (most recent call last): File "<stdin>", line 1, in <module> ValueError: You must specify a valid interface name.
どうやら 'eql' というインターフェイス(?)に対して 'netifaces.ifaddresses' でアドレス情報を取得しようとして失敗しているということがわかった。
この 'eql' という文字列が取得されるのが EC2 のせいなのかどうかわからないけれど、以下のように utils.py にパッチをあてることで無理矢理回避を行った。
--- /usr/share/pyshared/swift/common/utils.py.bak +++ utils.py @@ -543,7 +543,9 @@ :returns: list of Strings of ip addresses """ addresses = [] - for interface in netifaces.interfaces(): + interfaces = netifaces.interfaces() + interfaces.remove('eql') + for interface in interfaces: iface_data = netifaces.ifaddresses(interface) for family in iface_data: if family not in (netifaces.AF_INET, netifaces.AF_INET6):
proxy-server.conf
Proxyノードの設定おいて、proxy-server.conf を記述したけれど、Installing and Configuring the Proxy Nodeの通りだと、後ほどの動作テストのときにうまくいかなった。 Wiki 側の情報(今日見たら、内容が変わっていたので、元情報がない)を見て、[filter:swauth] セクションに以下を記述した。
default_swift_cluster = local#https://10.0.0.11:8080/v1
動作確認前まで
あとはドキュメントの通りでいけた。
ちなみにZoneはノード毎にわけたので、ringにデバイスを追加するときのコマンドは以下のように実行した。
swift-ring-builder account.builder add z1-10.0.0.12:6002/sdb1 100 swift-ring-builder account.builder add z2-10.0.0.13:6002/sdb1 100 swift-ring-builder account.builder add z3-10.0.0.14:6002/sdb1 100 swift-ring-builder account.builder add z4-10.0.0.15:6002/sdb1 100 swift-ring-builder account.builder add z5-10.0.0.16:6002/sdb1 100