認証のために keystone に接続するとタイムアウトが発生するため、さまざまな openstack コマンドが失敗する

Solution Verified - Updated -

Environment

  • Red Hat Enterprise Linux Openstack Platform

Issue

  • 認証のために keystone に接続するとタイムアウトが発生するため、さまざまな openstack コマンドが失敗します。たとえば、以下のようになります。
    • 削除する試みが行われた後に、スタックが DELETE_IN_PROGRESS の状態のままになります。以下のトレースが /var/log/heat/heat-engine.log: に記録されます。
2014-06-17 16:04:39.529 5069 ERROR heat.engine.resource [-] Delete WaitConditionHandle "monsrv_wait_handle"
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource Traceback (most recent call last):
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource   File "/usr/lib/python2.6/site-packages/heat/engine/resource.py", line 565, in delete
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource     handle_data = self.handle_delete()
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource   File "/usr/lib/python2.6/site-packages/heat/engine/signal_responder.py", line 61, in handle_delete
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource     self.keystone().delete_stack_user(self.resource_id)
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource   File "/usr/lib/python2.6/site-packages/heat/common/heat_keystoneclient.py", line 281, in delete_stack_user
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource     raise exception.Error(reason)
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource Error:Timed out trying to delete user
2014-06-17 16:04:39.529 5069 TRACE heat.engine.resource

Resolution

有効期限が切れた keystone トークンを定期的にパージします。

以下のコマンドを実行すると、keystone データベースから有効期限の切れたトークンを手動でフラッシュできます。

# keystone-manage token_flush

管理者は、テーブルが大きくなりすぎないように、すべてのコントローラーから 1 日 1 回このコマンドを定期的に実行する cron ジョブを作成することが推奨されます。cron ジョブを作成する手順は openstack のデプロイ方法によって異なります。

非高可用性デプロイメントの 1 コントローラー

packstack、またはコントローラーを 1 つ持つ Director を使用して環境をデプロイしている場合は、以下の cron ジョブで十分です。

# crontab -e -u keystone
01 * * * * /usr/bin/keystone-manage token_flush >/dev/null 2>&1

高可用性デプロイメント

高可用性デプロイメントには、最低 3 つのコントローラー/keystone ノードがあります。各コントローラーの遅延を調整して cron ジョブを実行するようにスケジュールすることが推奨されます。各コントローラーから実行して、コントローラーが 1 つダウンしてもジョブが実行し続けることを確認します。たとえば、以下のようになります。

コントローラー 1:

# crontab -e -u keystone
01 01 * * * /usr/bin/keystone-manage token_flush >/dev/null 2>&1

コントローラー 2:

# crontab -e -u keystone
01 08 * * * /usr/bin/keystone-manage token_flush >/dev/null 2>&1

コントローラー 3:

# crontab -e -u keystone
01 16 * * * /usr/bin/keystone-manage token_flush >/dev/null 2>&1
  • RHEL-OSP6 インストーラーは、各コントローラーからこの cron ジョブが毎分実行するように設定します。設定を維持するか、上述のように変更します。
  • この (英語版の) 記事の作成時には、RHEL-OSP Director は OSP7 デプロイメントにはこの cron ジョブを設定しません。したがって、これはデプロイメント後に手動で設定する必要があります。
  • 有効期限が切れた keystone トークンが多すぎる場合は、これにより /var/lib/mysql/* のファイルサイズを増やすことができます。
  • keystone への認証要求が多すぎる場合は、有効期限が切れたトークンの数が非常に大きくなります。テーブルのサイズがすぐに大きくなる場合は、上で推奨されたよりも cron ジョブを実行する頻度を多くすることが推奨されます。1 日に 2 回、毎時など、お使いの環境によって異なります。これは、少し遅延した後に各コントローラーから実行されることを確認します。たとえば、以下のようになります。

このジョブを毎時実行する場合は、以下のように、各コントローラーから 20 分遅延させて実行するように設定します。

コントローラー 1: 毎時 1 分: 01 * * * * /usr/bin/keystone-manage token_flush >/dev/null 2>&1
コントローラー 2: 毎時 21 分: 21 * * * * /usr/bin/keystone-manage token_flush >/dev/null 2>&1
コントローラー 3: 毎時 41分: 41 * * * * /usr/bin/keystone-manage token_flush >/dev/null 2>&1

Root Cause

  • 多くのユーザートークンの有効期限が切れるため keystone データベースをクエリーする実行時間が遅れ、コマンドがタイムアウトになります。

Diagnostic Steps

  • 以下のクエリーを実行して、有効期限が切れたトークンが keystone データベースにどのぐらいあるかを確認します。
root@controller # mysql
mysql> use keystone;
mysql> select count(*) from token where token.expires < CURTIME();

This solution is part of Red Hat’s fast-track publication program, providing a huge library of solutions that Red Hat engineers have created while supporting our customers. To give you the knowledge you need the instant it becomes available, these articles may be presented in a raw and unedited form.