高可用性ロードバランサー/リバースプロキシとしてサーバーのペアをセットアップしています。それぞれがUbuntu12.04 x64サーバー、Varnish、Heartbeat、Pacemakerを実行し、Varnishはバックエンドサーバーへのトラフィックを負荷分散します。
いずれかのロードバランサーがフォールオーバーすると、Heartbeat/Pacemakerは仮想IPのグループを他のサーバーに転送し、トラフィックフローが再開されます。このビットは正常に機能します。
私が説明していないのは、Varnishがどちらのサーバーでも実行されていないかどうかです。現在、ハートビート/ペースメーカーから何らかのアクションをトリガーせずにワニスを停止することが可能です。現在のサーバーに動作中のVarnishがないため、(Varnishを再起動しようとするのではなく)バックアップへの移動をトリガーしたいのですが、オンラインで何らかのガイダンスを見つけるのに苦労しています。誰か助けてもらえますか?
元のリクエストとは少し異なる結果になりました。PacemakerはVarnishを一度再起動しようとしますが、失敗すると、すべてのリソースがパッシブノードに移動します。
私のセットアップは、serverA(アクティブ)とserverB(パッシブ)の2つのサーバーです。メッセージングレイヤー(HeartbeatまたはCorosync)が既にセットアップされ、機能していると仮定します。 PacemakerがVarnishを制御できるようにするには、UbuntuのVarnishinitスクリプトを修正する必要があります。
Sudo vim /etc/init.d/varnish
交換:
--start --quiet --pidfile ${PIDFILE} --exec ${DAEMON} -- \
start_varnish_d()関数で:
--start --quiet --pidfile ${PIDFILE} --oknodo --exec ${DAEMON} -- \
したがって、概説されているルールに従って機能します ここ 。次に、2つの仮想IPを使用してserverAに基本的なPacemakerクラスターをセットアップします。
Sudo crm configure property no-quorum-policy=ignore
Sudo crm configure property stonith-enabled=false
Sudo crm configure primitive virtual_ip_1 ocf:heartbeat:IPaddr params ip="192.168.1.134" nic="eth1" cidr_netmask="24" broadcast="192.168.1.255" op monitor interval="10s" timeout="20s"
Sudo crm configure primitive virtual_ip_2 ocf:heartbeat:IPaddr params ip="192.168.1.135" nic="eth1" cidr_netmask="24" broadcast="192.168.1.255" op monitor interval="10s" timeout="20s"
ワニスのプリミティブを追加し、監視頻度と、ワニスを開始および停止するための十分なタイミングを提供します。
Sudo crm configure primitive varnish lsb:varnish op monitor interval="10s" timeout="20s" op
start interval="0" timeout="15s" op stop interval="0" timeout="15s"
ワニスプリミティブを仮想IPとグループ化して、障害が発生した場合にPacemakerがすべてのリソースをパッシブノードに移行するようにします。
Sudo crm configure group cluster virtual_ip_1 virtual_ip_2 varnish
移行しきい値を設定して、Pacemakerがすべてのリソースをパッシブノードに移動する前に2つの障害を許容するようにします。ワニスの場合、これは1回の初期失敗と1回の再起動の失敗を意味します。
Sudo crm_attribute --type rsc_defaults --attr-name migration-threshold --attr-value 2
失敗タイムアウトを設定します。これは2つのことをするようです:
パッシブノードに移行する前に、Pacemakerに1回のVarnish再起動試行の時間を与えます。
障害が発生したノードが30秒後に障害としてマークされるのを防ぎ、障害後にcrmリソースクリーンアップワニスを手動で実行しなくてもリソースをノードに戻すことができます。ノードに重みを設定していないので、これは私のセットアップにとっては良いことですが、別の環境では本当に悪い考えかもしれません。
Sudo crm_attribute --type rsc_defaults --attr-name failure-timeout --attr-value 30s
それだけですが、私が最終的に使用しなかった粘着性についてのコメントについては、以下のダフの回答を参照してください。私が見ることができる唯一の欠点は、ノードを手動でスタンバイ状態にすると、PacemakerがそのノードのVarnishをシャットダウンし、メモリ内キャッシュをクリアすることです。私にとって、それは特に大したことではありません。
クラスターアーキテクチャは私を混乱させます。2つのノードで同時にクラスター管理(Varnishなど)スタンドアロンである必要があるサービスを実行しているようで、クラスターリソースマネージャー(CRM)がIPアドレスを調整するだけです。
クラスター設定で何を達成したいですか?フォールトトレランス?負荷分散?両方?念のために言っておきますが、私はクラスターリソース(Varnish、IPアドレスなど)について話しているのであって、Varnishが負荷を分散するバックエンドサーバーについて話しているのではありません。
私には、フォールトトレランスを提供するアクティブ-パッシブ2ノードクラスターが必要なように思えます。一方のノードはアクティブで、Varnish、仮想IPアドレス、および場合によっては他のリソースを実行します。もう一方のノードはパッシブであり、クラスターリソースマネージャーがリソースをパッシブノードに移動するまで何もしません。パッシブノードでアクティブになります。これは、時間そのものと同じくらい古い、実証済みのアーキテクチャです。ただし、これを機能させるには、CRMにリソースの完全な制御を与える必要があります。 Clusters from Scratch に従い、その後クラスターをモデル化することをお勧めします。
更新された質問の後に編集:CIBは見栄えがよく、Varnish initスクリプトにパッチを適用して、「start」を繰り返し呼び出すと0が返されるようになります。次のプリミティブを追加できます(タイムアウトと間隔を好みに合わせて調整します)。
primitive p_varnish lsb:varnish \
op monitor interval="10s" timeout="15s" \
op start interval="0" timeout="10s" \
op stop interval="0" timeout="10s"
バランサーグループ(リストの最後の要素)に追加することを忘れないでください:
group balancer eth0_gateway eth1_iceman_slider eth1_iceman_slider_ts \
eth1_iceman_slider_pm eth1_iceman_slider_jy eth1_iceman eth1_slider \
eth1_viper eth1_jester p_varnish
編集2:移行のしきい値を下げるには、CIBの最後にリソースのデフォルトセクションを追加し、migration-threshold
プロパティを低い数値に設定します。 1に設定すると、単一障害後にリソースが移行されます。また、ノードの障害(再起動またはシャットダウン)のために移行されたリソースが、後でノードが再び使用可能になったときに自動的に移行されないように、リソースのスティッキネスを設定することもお勧めします。
rsc_defaults $id="rsc-options" \
resource-stickiness="100" \
migration-threshold="1"