Postgresのrecovery_prefetchが本番障害を引き起こす仕組み
Postgres recovery_prefetch can cause outages
Postgresのrecovery_prefetchは、プライマリの大規模なシーケンシャルI/Oをレプリカ側で8KBのランダム読み取りに変換し、IOPSを最大16倍に増幅させる。これが同期レプリケーションと組み合わさると、ネットワーク障害時にスタンバイが追いつくまでWALストリーミングに戻れず、書き込みが数時間停止する。著者は500 IOPSのクラウドディスク上でこの障害を再現し、recovery_prefetchを無効化することで解消できると報告している。
障害を引き起こすレシピは、単に「十分な不運」だ。書き込み活動のバーストと同時にストリーミングレプリケーションを中断させるネットワークの不具合が起きることである。