事象について

OpenStackObject Storage である Swift のステータスは、swift stat コマンドで確認できます。

ステータスだけ見ると、正常に見えますが、Proxy ログ を確認してみるとエラーが吐かれています。

ちなみに、例として、Proxy ログ に出てくる IP アドレスは、以下の通りです。

  • Controller Node の IP : 10.0.0.1
  • Proxy Node のメモリキャッシュ用のローカル IP : 192.168.0.1
Controller Node : swift ステータス確認Raw Code(S)Raw Code(T)
$ source ~/admin-openrc.sh

$ swift stat
      Account: AUTH_4bc9e2b503a04cab949dcd8490df64e3
   Containers: 0
      Objects: 0
        Bytes: 0
Accept-Ranges: bytes
  X-Timestamp: 1441268169.78677
   X-Trans-Id: tx840c2357d7dc452ea07e2-0055ed0be6
 Content-Type: text/plain; charset=utf-8
Proxy Node : swift-proxy ログ確認Raw Code(S)Raw Code(T)
# tail -f /var/log/syslog
Sep  7 13:00:38 openstack-swift-proxy01 proxy-server: STDOUT: ERROR:root:Error connecting to memcached: 192.168.0.1:11211#012Traceback (most recent call last):#012  File "/usr/lib/python2.7/dist-packages/swift/common/memcached.py", line 239, in _get_conns#012    fp, sock = self._client_cache[server].get()#012  File "/usr/lib/python2.7/dist-packages/swift/common/memcached.py", line 135, in get#012    fp, sock = self.create()#012  File "/usr/lib/python2.7/dist-packages/swift/common/memcached.py", line 128, in create#012    sock.connect((host, int(port)))#012  File "/usr/lib/python2.7/dist-packages/eventlet/greenio.py", line 194, in connect#012    socket_checkerr(fd)#012  File "/usr/lib/python2.7/dist-packages/eventlet/greenio.py", line 46, in socket_checkerr#012    raise socket.error(err, errno.errorcode[err])#012error: [Errno 111] ECONNREFUSED (txn: tx840c2357d7dc452ea07e2-0055ed0be6) (client_ip: 10.0.0.1)
Sep  7 13:00:38 openstack-swift-proxy01 proxy-server: 10.0.0.1 10.0.0.1 07/Sep/2015/04/00/38 HEAD /v1/AUTH_4bc9e2b503a04cab949dcd8490df64e3 HTTP/1.0 204 - python-swiftclient-2.3.0 bea90045a16a4520... - - - tx840c2357d7dc452ea07e2-0055ed0be6 - 0.0106 - - 1441598438.534590006 1441598438.545237064
Sep  7 13:17:01 openstack-swift-proxy01 CRON[8476]: (root) CMD (   cd / && run-parts --report /etc/cron.hourly)

解決方法

Swift Proxy において、メモリキャッシュ設定が必要なファイルは、以下の 2つのファイルです。

  • /etc/memcached.conf
  • /etc/swift/proxy-server.conf

デフォルト設定では、メモリキャッシュサーバの IP アドレスとして、両方とも 127.0.0.1 が設定されていて、全て受け付けるようになっているのですが、メモリキャッシュ用の IP アドレスを別途用意して使いたい場合に、片方だけ設定を入れてしまったりすると上記のようなエラーになります。

以下のように、2つの設定ファイルに、メモリキャッシュ用の IP アドレスポート番号 を合わせて設定してあげる必要があります。

そうすると事象は、改善されます。

以下の例では、メモリキャッシュ用の IP アドレスとして 192.168.0.1 とポート番号 11211 を設定しています。

Proxy Node : memcache 設定Raw Code(S)Raw Code(T)
# cat /etc/memcached.conf | grep -v "^#" | grep -v "^$"
-d
logfile /var/log/memcached.log
-m 64
-p 11211
-u memcache
-l 192.168.0.1

# cat /etc/swift/proxy-server.conf | grep -v "^#" | grep "memcache_servers"
memcache_servers = 192.168.0.1:11211

設定が終わったら、memcachedswift-proxy サービスを再起動し、設定を反映します。

Proxy Node : サービス再起動Raw Code(S)Raw Code(T)
# service memcached restart
# service swift-proxy restart

再度、Controller Node 上で、swift stat を実行し、Siwft のステータスを確認します。

Controller Node : swift ステータス確認Raw Code(S)Raw Code(T)
$ source ~/admin-openrc.sh

$ swift stat
      Account: AUTH_4bc9e2b503a04cab949dcd8490df64e3
   Containers: 0
      Objects: 0
        Bytes: 0
Accept-Ranges: bytes
  X-Timestamp: 1441268169.78677
   X-Trans-Id: tx5ba7181014b642e791c05-0055ed1820
 Content-Type: text/plain; charset=utf-8

これだけじゃ怪しいので、本当に問題ないか Proxy Node でログを出して、エラーが出てないことを確認します。

以下のように、Auth Token confirmed が出力されていれば、大丈夫です。

Proxy Node : swift-proxy ログ確認Raw Code(S)Raw Code(T)
# tail -f /var/log/syslog
Sep  7 13:52:48 openstack-swift-proxy01 proxy-server: Auth Token confirmed use of v2.0 apis
Sep  7 13:52:48 openstack-swift-proxy01 proxy-server: 10.0.0.1 10.0.0.1 07/Sep/2015/04/52/48 HEAD /v1/AUTH_4bc9e2b503a04cab949dcd8490df64e3 HTTP/1.0 204 - python-swiftclient-2.3.0 814658644d3e4356... - - - tx5ba7181014b642e791c05-0055ed1820 - 0.0116 - - 1441601568.211607933 1441601568.223206997

終わりに

私の場合には、なるべく Node を分けて構築するようにしているので、説明の中に、Controller NodeProxy Node 二つのノードが出てきてます。

OpenStack 公式ドキュメント内では、Proxy サーバController Node に入れてしまっているので、ドキュメント通り構築している方は、全て Controller Node 上で試してみてください。

以上、OpenStack : Error connecting to memcached の対処方法でした。