メッセージサービスの高可用性

メッセージサービスの高可用性

AMQP (Advanced Message Queuing Protocol) 互換メッセージバスが、システム内のジョブ実行を調整するために、ほとんどの OpenStack コンポーネントに必要となります。

OpenStack 環境に使用される最も一般的な AMQP ソフトウェアは RabbitMQ です。

RabbitMQ ノードは、アプリケーションとインフラ層の両方においてフェイルオーバーします。

アプリケーション層は、複数 AMQP ホスト向けの oslo.messaging 設定オプションにより制御されます。AMQP ノードが故障したとき、アプリケーションが、指定された再接続間隔で、設定された次のノードに再接続します。

インフラ層では、SLA は RabbitMQ クラスターが再構成されるまでの時間です。いくつかの場合では実現できます。Mnesia keeper ノードは、対応する RabbitMQ 用 Pacemaker リソースのマスターです。停止したとき、結果として AMQP クラスターの停止時間になります。通常、その SLA は、数分間より長くなることはありません。対応する RabbitMQ 用 Pacemaker リソースのスレーブになっている、他のノードの停止により AMQP クラスターが停止することはありません。

RabbitMQ サービスを高可用性にすることは、以下の手順が関連します。

注釈

Access to RabbitMQ is not normally handled by HAProxy. Instead, consumers must be supplied with the full list of hosts running RabbitMQ with rabbit_hosts and turn on the rabbit_ha_queues option. For more information, read the core issue. For more detail, read the history and solution.

RabbitMQ のインストール

RabbitMQ のインストールコマンドは、使用している Linux ディストリビューションにより異なります。

Ubuntu、Debian の場合:

# apt-get install rabbitmq-server

RHEL、Fedora、CentOS の場合:

# yum install rabbitmq-server

openSUSE の場合:

# zypper install rabbitmq-server

SLES 12 の場合:

# zypper addrepo -f obs://Cloud:OpenStack:Kilo/SLE_12 Kilo
[Verify the fingerprint of the imported GPG key. See below.]
# zypper install rabbitmq-server

注釈

SLES 12 の場合、パッケージは GPG キー 893A90DAD85F9316 により署名されています。使用する前に、インポートした GPG キーのフィンガープリントを検証すべきです。

Key ID: 893A90DAD85F9316
Key Name: Cloud:OpenStack OBS Project <Cloud:OpenStack@build.opensuse.org>
Key Fingerprint: 35B34E18ABC1076D66D5A86B893A90DAD85F9316
Key Created: Tue Oct  8 13:34:21 2013
Key Expires: Thu Dec 17 13:34:21 2015

詳細はディストリビューションの公式インストールガイドを参照してください。

高可用性 キュー用の RabbitMQ の設定

以下のコンポーネントやサービスは、HA キューを用いて動作できます。

  • OpenStack Compute
  • OpenStack Block Storage
  • OpenStack Networking
  • Telemetry

エクスチェンジとバインドは個々のノード障害に耐えられますが、キューとそのメッセージは、あるノードに置かれるため、失われることを考慮してください。このノードを失うとき、キューも失われます。

RabbitMQ のキューミラーは、障害耐性があるので、サービスの可用性を改善します。

本番サーバーは、(少なくとも) 3 つの RabbitMQ サーバーを実行すべきです。しかしながらテストやデモの目的の場合、サーバーを 2 つだけ実行することもできます。このセクションでは、rabbit1rabbit2 という 2 つのノードを設定します。ブローカーを構築するために、すべてのノードがきちんと同じ Erlang クッキーファイルを持ちます。

  1. RabbitMQ を停止して、1 番目のノードから他のノードにクッキーをコピーします。

    # scp /var/lib/rabbitmq/.erlang.cookie root@NODE:/var/lib/rabbitmq/.erlang.cookie
    
  2. 各ターゲットノードにおいて、 erlang.cookie の所有者、所有グループ、パーミッションが正しいことを確認します。

    # chown rabbitmq:rabbitmq /var/lib/rabbitmq/.erlang.cookie
    # chmod 400 /var/lib/rabbitmq/.erlang.cookie
    
  3. すべてのノードにおいてメッセージキューサービスを起動し、システム起動時に起動するよう設定します。Ubuntu の場合、デフォルトで設定されます。

    CentOS、RHEL、openSUSE、SLES の場合:

    # systemctl enable rabbitmq-server.service
    # systemctl start rabbitmq-server.service
    
  4. そのノードが動作していることを検証します。

    # rabbitmqctl cluster_status
    Cluster status of node rabbit@NODE...
    [{nodes,[{disc,[rabbit@NODE]}]},
     {running_nodes,[rabbit@NODE]},
     {partitions,[]}]
    ...done.
    
  5. 1 番目のノード以外の各ノードで以下のコマンドを実行します。

    # rabbitmqctl stop_app
    Stopping node rabbit@NODE...
    ...done.
    # rabbitmqctl join_cluster rabbit@rabbit1
    # rabbitmqctl start_app
    Starting node rabbit@NODE ...
    ...done.
    

注釈

The default node type is a disc node. In this guide, nodes join the cluster as disc nodes. Also, nodes can join the cluster as RAM nodes. For more details about this feature, check Clusters with RAM nodes.

  1. クラスターの状態を確認します。

    # rabbitmqctl cluster_status
    Cluster status of node rabbit@NODE...
    [{nodes,[{disc,[rabbit@rabbit1]},{ram,[rabbit@NODE]}]}, \
        {running_nodes,[rabbit@NODE,rabbit@rabbit1]}]
    

    クラスターが動作していると、キューのユーザー名とパスワードを作成できます。

  2. 自動生成された名前を持つキューを除いて、すべてのキューがすべての動作中のノードで確実にミラーするために、以下のコマンドをどこかのノードで実行して、 ha-mode ポリシーキーを all に設定します。

    # rabbitmqctl set_policy ha-all '^(?!amq\.).*' '{"ha-mode": "all"}'
    

詳細は RabbitMQ のドキュメントにあります。

注釈

RabbitMQ を高可用化する別の選択肢として、RabbitMQ バージョン 3.5.7 以降、Pacemaker クラスターリソースエージェント向けの OCF スクリプトが含まれます。アクティブ/アクティブ RabbitMQ クラスターにミラーキューを提供します。詳細は Auto-configuration of a cluster with a Pacemaker を参照してください。

RabbitMQ HA キューを使用するための OpenStack サービスの設定

2 つ以上の RabbitMQ ノードを使用するよう、OpenStack のコンポーネントを設定します。

これらの手順を使用して、RabbitMQ を使用するすべてのサービスを設定します。

  1. RabbitMQ HA cluster Transport URL using [user:pass@]host:port format:

    transport_url = rabbit://RABBIT_USER:RABBIT_PASS@rabbit1:5672,
    RABBIT_USER:RABBIT_PASS@rabbit2:5672
    

    Replace RABBIT_USER with RabbitMQ username and RABBIT_PASS with password for respective RabbitMQ host. For more information, see oslo messaging transport.

  2. RabbitMQ の接続を再試行します。

    rabbit_retry_interval=1
    
  3. RabbitMQ に接続するとき再試行するまでにバックオフする間隔:

    rabbit_retry_backoff=2
    
  4. RabbitMQ に接続を試行する最大回数 (デフォルトで無制限):

    rabbit_max_retries=0
    
  5. RabbitMQ での永続キューの使用:

    rabbit_durable_queues=true
    
  6. RabbitMQ における HA キューの使用 (x-ha-policy: all):

    rabbit_ha_queues=true
    

注釈

HA キューを使用していない古いセットアップから設定を変更した場合、サービスを再起動します。

# rabbitmqctl stop_app
# rabbitmqctl reset
# rabbitmqctl start_app
Creative Commons Attribution 3.0 License

Except where otherwise noted, this document is licensed under Creative Commons Attribution 3.0 License. See all OpenStack Legal Documents.