OpenStack Server Extended Status Extensionは、イメージの作成(または「スナップショット」)プロセス中にサーバー状態をよりきめ細かく可視化するいくつかの新しいタスク状態を公開しました。この記事では、それらが何であるかを説明し、それらをどのように利用できるかを提案します。
OpenStack Grizzlyがリリースされる前は、サーバーでimageactionの作成をリクエストすると、サーバーは特別なタスク状態になります。 of image_snapshot
、およびイメージが完了するまで、このタスク状態のままになります。この単一のタスク状態は、スナップショット操作には3つの異なるフェーズがあるという事実を隠していました。
- ハイパーバイザーは、サーバーの仮想ハードディスクのイメージを作成します。
- ハイパーバイザーは画像をパッケージ化し、画像ストアにアップロードする準備をします。
- ハイパーバイザーは、パッケージ化された画像を画像ストアにアップロードします。
フェーズ1では、サーバーの仮想ハードディスク上のデータを変更するような操作は避けてください。そうしないと、記録されたスナップショットに、サーバー上の特定のアプリケーションプログラム(主にデータベース)がイメージから起動したときに回復できない可能性のある不整合が含まれる可能性があります。
フェーズ2とフェーズ3の両方で、ハイパーバイザーはサーバーに代わって機能しますが、仮想ハードディスクには何もしません。アップロードが行われる第3フェーズは、完了するまでに最も時間がかかります。
OpenStack Grizzlyリリースでは、image_snapshottask状態のセマンティクスがわずかに変更され、2つの新しいタスク状態が追加されました。これで、サーバーは画像作成アクションの処理中に次のタスク状態を通過します。
- image_snapshot:ハイパーバイザーはサーバーの仮想ハードディスクのイメージを作成します
- image_pending_upload:ハイパーバイザーは画像をパッケージ化し、アップロードの準備をします
- image_uploading:ハイパーバイザーが画像を画像ストアにアップロードします
サーバーがこれらのタスク状態のいずれかである間は、そのサーバーでanothercreateimageアクションを発行することはできません。タスクの状態の説明からわかるように、ハイパーバイザーはイメージ作成アクションの3つのフェーズすべてに関与しているため、ハイパーバイザーがサーバーに割り当てたすべての追加の簿記リソースが使用されています。別のスナップショットを作成する前に、スナップショットプロセス全体が完了してこれらのリソースを解放するまで待つ必要があります。
最初のフェーズが完了すると、サーバーでの操作がスナップショットの有効性を妨げる可能性があることを心配する必要がなくなります。残念ながら、コントロールパネルはサーバーのタスク状態を公開しません。ただし、APIまたはpython-novaclient
を使用して確認できます。 。
APIを使用してサーバータスクの状態を確認します
タスクの状態は、次のサーバー詳細操作の応答に表示されます。
GET /v2/servers/{serverId}
簡略化されたJSONサーバーの詳細応答は次のとおりです。
{
"server": {
"OS-EXT-STS:power_state": 1,
"OS-EXT-STS:task_state": "image_pending_upload",
"OS-EXT-STS:vm_state": "active",
/* ... */
"id": "c2d5da0a-80d7-4ca7-872c-505410ab55d0",
/* ... */
"name": "check-my-task-state",
"progress": 100,
"status": "ACTIVE",
}
}
OS-EXT-STS:task_state
を探します エレメント。 JSONオブジェクトは順序付けされていないため、応答のどこにでも表示される可能性があります。この例に表示されている値から、ハイパーバイザーがサーバーの仮想ハードディスクのイメージの作成を完了し、アップロード用のイメージをパッケージ化して準備していることがわかります。
python-novaclientを使用してサーバータスクの状態を確認します
python-novaclient
コマンドラインから実行できる便利なプログラムです。これまでに使用したことがない場合は、以下のハウツー記事を確認してください。
- LinuxおよびMacOSへのpython-openstackclientのインストール
- Windowsへのpython-novaclientのインストール
これらの記事は、python-novaclient
の概要を提供します オペレーティングシステムにインストールするための完全な手順。
python-novaclient
を使用してサーバーのタスク状態を確認するには 、show
を実行します サーバーでの操作:
$ nova show {serverId}
簡略化された応答は次のとおりです:
+------------------------+---------------------------------------+
| Property | Value |
+------------------------+---------------------------------------+
| status | ACTIVE |
| OS-EXT-STS:task_state | None |
| OS-EXT-STS:vm_state | active |
| id | 933e803f-13b0-4698-a5c7-f74ec424fd38 |
| name | check-my-task-state |
| OS-DCF:diskConfig | MANUAL |
| progress | 100 |
| OS-EXT-STS:power_state | 1 |
| metadata | {} |
+------------------------+---------------------------------------+
この例では、サーバーにタスク状態がないため、image-create
を受け入れることができます。 リクエスト。
次のいずれかのタスクを実行する前に、現在のサーバータスクの状態を確認することをお勧めします。
- データベース管理システムの停止など、ディスクイメージの品質に影響を与える可能性のあるサーバー上のアクティビティを停止します。
- サーバーを発行します
image-create
API、novaclient、またはControlPanelを使用してコマンドを実行します。 - サーバーを監視して、サーバーが
image_snapshot
をいつ終了するかを確認します タスクの状態。 - データベース管理システムを復旧するなど、スナップショットを撮る前に停止したアクティビティを再開します。
サーバーを監視するための簡単なBashスクリプトを作成できます。これが最も関連性の高い部分のサンプルですが、自由に拡張してください。使用する前に、よく読んで、それが何をしているのかを確認してください。 4つのプログラム(curl
)を使用します 、egrep
、sed
、およびdate
)ほとんどのLinux®システムにデフォルトでインストールされます。このフラグメントはかなり原始的であるため、control-Cを使用してスクリプトを停止する必要があります。
# set these vars
#
# the API endpoint, e.g., "https://iad.servers.api.rackspacecloud.com/v2/123456"
API_ENDPOINT=
# your API username, e.g., "fredco"
API_USER=
# your API auth token, obtained from the Identity service
API_AUTH_TOKEN=
# the UUID of the server you want to monitor
API_SERVER=
# how long to pause in between requests, in seconds
SLEEP_TIME=30
# a temporary file, e.g., "/tmp/polling.json"
DETAIL_FIL=
# verify that the server exists
API_RESP_CODE=$(curl -X GET <br>
-k -s <br>
-H "X-Auth-User: $API_USER" <br>
-H "X-Auth-Token: $API_AUTH_TOKEN" <br>
-H "Accept: application/json" <br>
-w "%{http_code}" <br>
-o $DETAIL_FIL <br>
"$API_ENDPOINT/servers/$API_SERVER")
if [ "$API_RESP_CODE" != "200" ] ; then
echo "[error] can't find server $API_SERVER"
exit 1
fi
while [ 0 ] ; do
API_RESP_CODE=$(curl -s -k -X GET <br>
-H "X-Auth-User: $API_USER" <br>
-H "X-Auth-Token: $API_AUTH_TOKEN" <br>
-H "Accept: application/json" <br>
-w "%{http_code}" <br>
-o $DETAIL_FIL <br>
"$API_ENDPOINT/servers/$API_SERVER")
if [ "$API_RESP_CODE" == "404" ] ; then
echo "[info] server $API_SERVER has disappeared!"
break
fi
RAW_STAT=$(egrep -o '"status": (".*?"|null)' $DETAIL_FIL | sed 's/"//g')
VM_STAT=$(egrep -o '"OS-EXT-STS:vm_state": (".*?"|null)' $DETAIL_FIL | sed 's/OS-EXT-STS://;s/"//g')
TASK_STAT=$(egrep -o '"OS-EXT-STS:task_state": (".*?"|null)' $DETAIL_FIL | sed 's/OS-EXT-STS://;s/"//g')
POW_STAT=$(egrep -o '"OS-EXT-STS:power_state": (\d|null)' $DETAIL_FIL | sed 's/OS-EXT-STS://;s/"//g')
TIME=$(date +"%H:%M:%S")
echo "$TIME $RAW_STAT $VM_STAT $TASK_STAT $POW_STAT"
sleep ${SLEEP_TIME:-45}
done
上記のフラグメントを含むスクリプトを開始してからサーバースナップショットを作成すると、次の例のようなものが表示されます。
17:14:41 status: ACTIVE vm_state: active task_state: null power_state: 1
17:14:44 status: ACTIVE vm_state: active task_state: null power_state: 1
17:14:48 status: ACTIVE vm_state: active task_state: image_snapshot power_state: 1
17:14:51 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:14:55 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:14:58 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:15:02 status: ACTIVE vm_state: active task_state: image_pending_upload power_state: 1
17:15:05 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
17:15:09 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
...
17:16:19 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
17:16:23 status: ACTIVE vm_state: active task_state: image_uploading power_state: 1
17:16:26 status: ACTIVE vm_state: active task_state: null power_state: 1
17:16:30 status: ACTIVE vm_state: active task_state: null power_state: 1