- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け今ここ
- Nginx受け口
- アプリ処理
- DB保存
コードを置くことと利用者に効かせることは別の操作です。今回は、一部に効かせた変更を何と比べて判定するかを見ます。
まず結論
カナリアは、新版を一部(カナリア)にだけ出し、残り(対照群)と同じ時刻に比べる手続きです。新版を全体に出してから前後で比べると、時間とともに動く指標の変化まで新版のせいに見えます。
対照群と比べても、偶然の幅と、両群が共有する基盤からの影響は残ります。SRE Workbook は、SLO のような絶対的な尺度も併せて見るよう書いています。
エラー率が時刻とともに少しずつ上がる模擬で、版を何も変えずに前半60分と後半60分を比べました(乱数の種を変えて40本)。結果はどうなったでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
時間で分けるか、母集団で分けるか
新版を一部の利用者にだけ出し、問題が無ければ広げる。これがカナリアの説明として定着している形で、正しい説明です。ただし「問題が無い」を判定するには、何と比べるかが要ります。
SRE Workbook 第16章は、カナリアを比較として定義しています。
The part of the service that receives the change is “the canary,” and the remainder of the service is “the control.” … Canarying is effectively an A/B testing process.
変更を受けた部分と、受けていない残りを並べる。残りの側を対照群と呼びます。
もう1つの比べ方があります。全体を新版に入れ替え、入れ替え前と比べる方式です。Workbook は見出しを Before/After Evaluation Is Risky とし、これを「時間で A/B を分ける方式」(segmenting time instead of segmenting the population)と呼びます。危うい理由は1文です。
Because time is one of the biggest sources of change in observed metrics, it is difficult to assess degradation of performance with before/after evaluation.
指標は、版を変えなくても時刻とともに動きます。例として Workbook は、月曜にリリースして平日と週末を比べてしまう場合を挙げます。前後比較では、この動きと新版の影響が1つの差に混ざります。
- ・同じ時刻に並べると、時刻による変化は両群に同じように乗り、差から外れる
- ・偶然の幅を区間で示す方法は第22期で扱う
何も変えずに、前後と同時刻で比べる
乱数だけで作った模擬で確かめます。実データではありません。設定は次のとおりです。
- 1分に1万件、120分。前半60分を「前」、後半60分を「後」とする
- 基準のエラー率は版と無関係に、1.0% から 1.5% へ時刻とともに直線的に上がる
- カナリアは 5%。不良版はエラー率を +0.5 ポイント足す
列は左から、何も変えない前後差、同じ版同士のカナリア−対照(後半・同時刻)、不良版のカナリア−対照、同じ不良版を全体の指標で見た差です。z は2群の比率の差を標準誤差で割った値です。差が無いときの z は大半(およそ95%)が −2〜+2 に収まるので、絶対値が2を超えると偶然だけでは起きにくい差の目安になります(詳しくは第22期で扱う)。
seed | A/A前後差(pt) z | A/Aカナリア-対照(pt) z | 不良カナリア-対照(pt) z | 全体で見た不良版の差(pt)101 | +0.233 +11.4 | +0.020 +0.29 | +0.622 +8.9 | +0.018102 | +0.291 +14.4 | +0.027 +0.39 | +0.537 +7.8 | +0.005111 | +0.255 +12.6 | -0.001 -0.02 | +0.590 +8.5 | +0.018112 | +0.278 +13.7 | -0.155 -2.25 | +0.364 +5.3 | +0.000113 | +0.221 +10.9 | -0.111 -1.61 | +0.574 +8.2 | +0.062範囲 A/A前後差pt: +0.221 〜 +0.291範囲 z: +10.912 〜 +14.358範囲 A/Aカナリア差pt: -0.155 〜 +0.123範囲 z: -2.246 〜 +1.770範囲 不良カナリア差pt: +0.364 〜 +0.622範囲 z: +5.273 〜 +8.936範囲 全体差pt: -0.001 〜 +0.062
「範囲 A/A前後差pt」の行を見てください。何も変えていないのに、後半は +0.22〜+0.29 ポイント悪化して見えます。 seed 1〜20 の別の20本も +0.235〜+0.290 で、40本すべてが悪化側でした。この設定での前後差の期待値は、計算で +0.252 ポイントです。
同じ後半を、同じ版同士でカナリアと対照に分けたのが「範囲 A/Aカナリア差pt」の行です。差は −0.155〜+0.123 ポイントで、0 をまたぎます。時刻による上昇は両群に同じように乗るので、差から外れます。
ただし差が消えるわけではありません。seed 112 の行では、何も変えていないのに、絶対値が2を超える z = −2.25 が出ました(40本中1本)。対照群があっても、偶然の幅は残ります。
模擬で、版を変えていないのに前後比較が40本すべてで悪化を示した理由として正しいのはどれですか。
対照群と比べても、見えなくなるもの
対照群は時間の問題を外しますが、残るものが2つあります。
1つ目は、両群が同じ基盤を通じて一緒に動くことです。Workbook は the canary population and the control may share backends, frontends, networks, data stores, and other infrastructure. と書き、次の注意を置きます。
Canarying is an A/B comparison, and it’s possible that both A and B can change in tandem; this may cause confusion in the canary evaluation. It is important to also use absolute measures, such as defined SLOs, to ensure the system is operating correctly.
新版が共有のデータストアを重くすれば、対照群も悪くなり、差は小さく見えます。逆に評価が「止めよ」と出ても、the canary deployment isn’t necessarily at fault. です。差の比較だけでなく、SLO のような決めた基準にも照らします。
2つ目は、分けて測らなければ、差そのものが見えないことです。カナリアは流量の一部なので、全体の指標では影響が薄まります。
ここから、2つの言い過ぎを退けられます。「カナリアで問題が出なければ安全」は、共有基盤・薄まり・偶然の幅を見落としています。「5% では少なすぎて何も分からない」も誤りで、次の出力が示すように、件数と不良の大きさが十分なら、分けて測れば小さな割合でも不良は見えます。
同じ不良版を、全体で見るか分けて見るか
同じ模擬の不良版(+0.5 ポイント)の列です。両方の実行から該当する行だけを抜き出しています。
### run 1範囲 不良カナリア差pt: +0.305 〜 +0.644範囲 z: +4.394 〜 +9.189範囲 全体差pt: -0.005 〜 +0.064### run 2範囲 不良カナリア差pt: +0.364 〜 +0.622範囲 z: +5.273 〜 +8.936範囲 全体差pt: -0.001 〜 +0.062
カナリアと対照に分けると、差は +0.31〜+0.64 ポイント、z は 40本すべてで +4.3 を超えました。5%・60分でも、この大きさの不良は見えています。
「範囲 全体差pt」の行は、同じ不良版を全体の指標で見た差です。−0.005〜+0.064 ポイントで、0 に近い値も含みます。期待値は 5% × 0.5 ポイント = +0.025 ポイントで、前後比較に出た時間の変化(+0.25 前後)よりずっと小さい値です。
Workbook は同じ構図を 5% に 20% のエラーの例で書きます。we serve 20% errors for 5% of traffic, resulting in a 1% overall error rate。そして全体を見る監視では it will detect an overall error rate of only 1% で、他のエラーと区別できないこともあると続け、カナリアと対照群を分けて測れることが要ると述べます。
模擬の数値は架空の設定から出たものです。実際のサービスで前後差がどれだけ出るかは、そのサービスの指標の動き方で決まります。
同じ不良版(+0.5 ポイント)を、カナリアと対照群に分けずに全体の指標で見ると、模擬ではどうなりましたか。
台数で分ける(一部のサーバだけ新版)
5% の台に新版を置き、残りの台を対照群にします。同じ時刻に両群を測るので時間の変化は差から外れますが、両群は後ろのデータストアやネットワークを共有しています。Workbook は、1つのクライアントが続けて送った2つのリクエストのうち、1つ目をカナリアが、2つ目を対照が受け、カナリアの応答が2つ目の中身を変えて対照の挙動まで変える例を挙げます(リクエストごとに台へ振り分けるとこうなりうる、は本教材の整理)。
利用者で分ける(クッキーなどで振り分け)
Workbook は母集団の分け方として台数のほかにクッキーなどを挙げます。利用者単位で分ければ1人のリクエストは同じ群に留まりやすい一方、後ろのデータストアやネットワークは両群で共有したままです。
台で分けるカナリアと、利用者で分けるカナリア。分け方は違いますが、どちらも何を外し、何が残っていますか。
「同じ時刻」であることが外すものと、「完全には切り離せない」ことが残すものを、両方で探してください。
この章のまとめ
- カナリアは、変更を受けた一部と、受けていない対照群を同じ時刻に比べる手続き。
- 前後比較は時間で A/B を分けるので、時刻による指標の変化が差に混ざる。模擬では何も変えずに40本すべてが悪化して見えた。
- 対照群と比べても偶然の幅は残る(模擬で40本中1本、A/A で z = −2.25)。区間の示し方は第22期で扱う。
- 両群は基盤を共有して一緒に動く。評価が止めよと出てもカナリアが悪いとは限らず、SLO のような絶対的な尺度も併せて見る。
- 全体の指標では薄まる(5% × 20% = 1%)。件数と不良の大きさが十分なら、分けて測れば小さな割合でも不良は見える。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
SRE Workbook 第16章は、新版に丸ごと入れ替えて前後で比べる方式をどう呼び、なぜ危ういとしていますか。
用語集(3語)
- カナリア / 対照群 (canary / control)
- Workbook 第16章の定義で、変更を受けた部分がカナリア、残りが対照群。カナリアは部分的で期間を限った出し方と、その評価を合わせた手続き。
- 前後比較 (before/after evaluation)
- 全体を新版に入れ替え、入れ替え前後の指標を比べる方式。Workbook は時間で A/B を分ける方式と呼び、時間による指標の変化と区別しにくいとする。
- 絶対的な尺度 (absolute measures)
- 群どうしの差ではなく、決めた基準そのもの(SLO など)に照らした値。両群が一緒に悪くなると差の比較では見えないため併用する。