Erlang(および定義上Elixir)の機能の1つは、ホットコードスワップを実行できることです。ただし、これはDockerとは奇妙に思われます。そこでは、インスタンスを停止し、新しいコードを保持する新しいイメージで新しいインスタンスを再起動する必要があります。これは本質的に誰もがしていることのようです。
そうは言っても、1つの隠れノードを使用して、ネットワークを介して他のすべてのノードに更新を配布することが可能であることも知っています。もちろん、それはトラブルを求めているように聞こえますが...
私の質問は次のようになります:ホットコードスワッピングを可能にするErlang/Elixir用のDockerベースのインフラストラクチャをセットアップするために合理的な成功を収めた人はいますか?もしそうなら、すべきこと、すべきでないこと、警告は何ですか?
ストーリー
携帯電話やモバイルデータアクセスを処理するシステムを想像してみてください(これがErlangの目的です)。通話中はユーザーセッションを維持するゲートウェイサーバー、またはデータアクセスセッション(今後はセッションと呼びます)があります。これらのサーバーは、セッションがアクティブである(ユーザーが接続されている)限り、セッションのメモリ内表現を持ちます。
ここで、通話または転送されたデータに対してユーザーに請求する金額を計算する別のシステムがあります(通話PDF -- ポリシー決定関数 )。両方のシステムが接続されていますゲートウェイサーバーがTCP PDFへの接続をいくつか作成し、それらがTCPの場合、ユーザーセッションをドロップするような方法で=接続がダウンします。ゲートウェイは一度に数十万の顧客を処理できます。ユーザーに課金が必要なイベント(次のデータ転送、通話のもう1分)が発生すると、ゲートウェイは通知しますPDF事実について、PDFはユーザーアカウントから特定の金額を差し引きます。ユーザーアカウントが空の場合PDFはゲートウェイに通知します通話を切断します(お金が足りなくなったので、補充する必要があります)。
あなたの質問
最後に、この文脈であなたの質問について話しましょう。 PDFノードをアップグレードしたいのですが、ノードはDockerで実行されています。新しいバージョンのソフトウェアで新しいDockerインスタンスを作成しますが、古いバージョンをシャットダウンすることはできません(そこにあります)。通話の途中で数十万人のお客様がいるため、接続を切断することはできません)。ただし、お客様を古いPDFから新しいバージョンに移動する必要があります。したがって、古いPDFの代わりに更新されたノードとの新しい接続を作成するためのゲートウェイノード。顧客はおしゃべりになる可能性があり、一部の顧客は長時間実行されるデータ接続(Windows 10 isoのダウンロード)を持っている可能性があるため、操作全体に2〜3日かかります重大なバグが発生した場合に、ソフトウェアのあるバージョンを別のバージョンにアップグレードするのにかかる時間です。このようなサーバーは数十あり、それぞれが数十万の顧客を処理している可能性があります。
しかし、代わりにErlangリリースハンドラーを使用した場合はどうなりますか?新しいバージョンのソフトウェアを使用してrelupファイルを作成します。適切にテストし、PDFノードにデプロイします。各ノードはインプレースでアップグレードされます。アプリケーションの内部状態が変換され、ノードは新しいバージョンのソフトウェアを実行します。しかし、最も重要なのは、TCPゲートウェイサーバーとの接続が切断されていないため、システムのアップグレード中に、お客様は喜んで通話を継続するか、最新のWindowsISOをダウンロードしています。すべてが10秒で完了します。 2〜3日。
答え
これは、特定の要件を持つ特定のシステムの例です。 Dockerと Erlangのリリース処理 は直交技術です。どちらかまたは両方を使用できます。要約すると、次のようになります。
両方のアプローチを予測可能にテストするのに十分なリソースと、どちらの方法を使用してシステムを展開できるように運用チームに教えるのに十分な忍耐力がありますか?テスト施設の費用が数百万ポンド(ハードウェアが必要なため)で、一度に2つの方法のうち1つしか使用できない場合(テストサイクルに数日かかるため)はどうなりますか?
実用的なアプローチは、最初にDockerを使用してノードをデプロイし、次に Erlangリリースハンドラー (最初にDockerを使用する必要がある場合)でノードをアップグレードすることです。または、アップグレード中にシステムを使用可能にする必要がない場合(例PDFシステムのように))、Dockerを使用して常に新しいバージョンをデプロイすることを選択し、リリース処理を忘れることができます。または、リリースハンドラーに固執し、オンザフライで迅速で信頼性の高い更新が必要な場合はDockerを忘れて、Dockerは初期デプロイメントにのみ使用されることをお勧めします。