Hitachi

uCosminexus Application Runtime for Apache Tomcat ユーザーズガイド


2.2.3 スケールイン開始前にスナップショットログ出力処理時間分の猶予を設ける

Tomcatをオートスケーリング構成のマシン上で使用している場合,uCARTがスナップショットログの収集処理をしている間は,できる限りマシンがスケールインされないようにする必要があります。

ユーザスクリプトによる閉塞をすることで自動的にスケールインされないように構築している場合

このケースに該当する場合は,Tomcatの停止後にスケールインを実行するスクリプトが実行されるように設定してください。これによって,スナップショットログ出力処理が終わるまでスケールインされないようにできます。

systemdを用いてOS起動と同時にTomcatをサービス起動させ,Tomcatの停止後にスケールインを実行する場合のユニットファイル定義例を次に示します。

[Unit]
Description=Apache Tomcat
After=network.target
 
[Service]
Type=forking
ExecStart=<Tomcatインストール先>/bin/startup.sh
ExecStop=<Tomcatインストール先>/bin/shutdown.sh
ExecStopPost=<スケールインを実行するスクリプトのパス>
TimeoutStopSec=700
SuccessExitStatus=143
User=tomcat
Group=tomcat
 
[Install]
WantedBy=multi-user.target

AWSでAmazon EC2 Auto Scalingを使用している場合のスケールインを実行するスクリプトの実装例を次に示します。

#!/bin/bash
 
# Get InstanceID
INSTANCEID=$(curl http://169.254.169.254/latest/meta-data/instance-id/)
echo InstanceID=${INSTANCEID}
 
# Polling Instance status
MAX_POLLING_COUNT=10
RETRY_INTERVAL=60
for ((i=1;i<=${MAX_POLLING_COUNT};i++)); do
    INSTSTATUS=$(aws autoscaling describe-auto-scaling-instances --instance-ids ${INSTANCEID} \ 
        | jq -r '.AutoScalingInstances[].LifecycleState')
    echo InstanceStatus=${INSTSTATUS}
    if [ "${INSTSTATUS}" == "Standby" ]; then
        # Terminate instance
        aws autoscaling terminate-instance-in-auto-scaling-group --instance-id ${INSTANCEID} \
            --no-should-decrement-desired-capacity
        echo "Instance will be terminated."
        exit 0
    fi
    if [ ${i} -eq ${MAX_POLLING_COUNT} ]; then
        echo "Max polling count reached (count = ${i})."
        exit 1
    fi
    echo "InstanceStatus is not STANDBY. Retry after ${RETRY_INTERVAL} seconds (count = ${i})."
    sleep ${RETRY_INTERVAL}s
done

このスクリプトは実装例であり,これをそのまま使用した場合の動作は保証しません。必ずクラウドベンダが提供する最新のドキュメントを参照してユーザ側で適切なスクリプトを記述してください。

オートスケーリンググループからの切り離しと同時にスケールインに遷移するように設定している場合(マネージドサービス側で管理)

スナップショットログの出力に掛かる時間を確保できる,十分な猶予時間を設定してください。猶予時間とは,障害を検知されたマシンがオートスケーリンググループから切り離されてから,OSのシャットダウンが開始されるまでの時間を指します。