Rozšíření OpenStack Server Extended Status Extension odhalilo některé stavy nových úloh, které poskytují jemnější viditelnost stavu serveru během procesu vytváření obrazu (nebo „snímku“). Tento článek popisuje, co to je, a navrhuje, jak je můžete využít.
Před vydáním OpenStack Grizzly, když jste požadovali vytvoření imageaction na serveru, server přešel do speciálního stavu úlohy z image_snapshot
a zůstane v tomto stavu úlohy, dokud nebude obraz dokončen. Tento stav jediné úlohy skryl skutečnost, že operace snímku má tři různé fáze:
- Hypervizor vytvoří obraz virtuálního pevného disku serveru.
- Hypervizor zabalí obrázek a připraví jej k odeslání do úložiště obrázků.
- Hypervizor odešle zabalený obrázek do úložiště obrázků.
Během fáze 1 byste se měli vyvarovat jakýchkoli operací, které by změnily data na virtuálním pevném disku serveru. V opačném případě by zaznamenaný snímek mohl obsahovat nekonzistence, ze kterých některé aplikační programy na vašem serveru, především databáze, nemusí být schopny se při spuštění z bitové kopie obnovit.
V obou fázích 2 a 3 pracuje hypervizor jménem vašeho serveru, ale nedělá nic s vaším virtuálním pevným diskem. Zdaleka nejdéle trvá dokončení třetí fáze, ve které probíhá nahrávání.
Vydání OpenStack Grizzly mírně upravilo sémantiku stavu image_snapshottask a přidalo dva nové stavy úloh. Nyní tedy váš server při zpracování akce vytvoření obrazu prochází následujícími stavy úloh:
- image_snapshot:hypervizor vytvoří obraz virtuálního pevného disku serveru
- image_pending_upload:hypervizor zabalí obrázek a připraví jej k nahrání
- image_uploading:hypervizor nahraje obrázek do úložiště obrázků
Zatímco váš server je v některém z těchto stavů úlohy, nemůžete na tomto serveru zadat další akci vytvoření obrazu. Jak můžete vidět z popisu úkolu, hypervizor je zapojen do všech tří fází akce vytváření obrazu, takže všechny dodatečné účetní prostředky, které hypervizor alokoval vašemu serveru, se používají. Než budete moci vytvořit další snímek, musíte počkat, dokud se celý proces snímku nedokončí a neuvolní tyto prostředky.
Po dokončení první fáze se již nemusíte obávat, že operace na vašem serveru mohou narušit efektivitu vašeho snímku. Ovládací panely bohužel nezobrazují stavy úloh serveru. Můžete je však zkontrolovat pomocí rozhraní API nebo python-novaclient
.
Použití rozhraní API ke kontrole stavu úlohy serveru
Stavy úkolu se zobrazí v následující odpovědi na podrobnou operaci serveru:
GET /v2/servers/{serverId}
Zde je zkrácená odpověď s podrobnostmi o serveru 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",
}
}
Vyhledejte OS-EXT-STS:task_state
živel. Protože objekt JSON není uspořádaný, může se objevit kdekoli v odpovědi. Z hodnoty zobrazené v tomto příkladu můžete vidět, že hypervizor dokončil vytváření obrazu virtuálního pevného disku serveru a nyní balí a připravuje obraz k nahrání.
Použijte python-novaclient ke kontrole stavu úlohy serveru
python-novaclient
je praktický program, který můžete spustit z příkazového řádku. Pokud jste jej dosud nepoužili, zde je několik článků, které si můžete prohlédnout:
- Instalace python-openstackclient v systémech Linux a MacOS
- Instalace python-novaclient v systému Windows
Tyto články poskytují přehled python-novaclient
a úplné pokyny pro instalaci do vašeho operačního systému.
Chcete-li zobrazit stav úlohy pro server pomocí python-novaclient
,udělejte show
operace na serveru:
$ nova show {serverId}
Zde je zkrácená odpověď:
+------------------------+---------------------------------------+
| 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 | {} |
+------------------------+---------------------------------------+
V tomto příkladu můžete vidět, že server nemá žádný stav úlohy, takže by mohl přijmout image-create
žádost.
Dotaz ke kontrole stavu úlohy serveru
Možná budete chtít zjistit aktuální stav úlohy serveru před provedením jedné z následujících úloh:
- Zastavte aktivity na serveru, které by ovlivnily kvalitu obrazu disku, jako je zastavení systému správy databází.
- Vydejte server
image-create
pomocí rozhraní API, novaclient nebo Control Panel. - Sledujte server, abyste viděli, kdy opustí
image_snapshot
stav úkolu. - Restartujte aktivity zastavené před pořízením snímku, jako je obnovení systému správy databází.
Můžete napsat jednoduchý Bash skript pro monitorování vašeho serveru. Zde je ukázka nejdůležitější části, ale neváhejte ji rozšířit. Před použitím si přečtěte a ujistěte se, že víte, co dělá. Používá čtyři programy (curl
, egrep
,sed
a date
), které jsou standardně nainstalovány na většině systémů Linux®. Tento fragment je dosti primitivní, takže k zastavení skriptu musíte použít Ctrl-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
Pokud spustíte skript, který obsahuje předchozí fragment, a poté pořídíte snímek serveru, uvidíte něco podobného jako v následujícím příkladu:
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