kikumotoのメモ帳

インフラ・ミドル周りを中心に、興味をもったことを適当な感じで。twitter : @takakiku

EC2にSwiftをインストール

分散ストレージ的なものを探していたら、OpenStackSwiftというS3的なストレージがあることを知ったので、まずはどんなものか知るためにインストールしてみることにした。

そのときのインストールメモ。

インストール時に固定IPがあったほうがSwiftの手順に従いやすかったので、Amazon VPC内にEC2インスタンスをたててインストールしてみた。

対象の LinuxUbuntu 10.04 で、これは UbuntuEC2StartersGuide - 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

動作確認

動作確認 において指定するURLは以下のようにした。

swauth-prep -K swauthkey -A https://10.0.0.11:8080/auth/

要は、https を指定したということ。

これで、一通りの動作確認までできた。

実際の運用のためのオペレーションについてはまた機会があれば調べてみたい。