インフラ
PostgreSQL 実践講座 #5 VACUUM と autovacuum — dead tuple 掃除の原理とチューニング
PostgreSQL 運用知識の中心である VACUUM を扱います。MVCC が残す dead tuple と VACUUM がする仕事(空間の再利用マーク・可視性マップの更新・トランザクション ID 周回の防止)、普段は autovacuum に任せればいい理由と既定のしきい値の限界(大きいテーブルほど掃除が遅れる)、テーブル単位のスケールファクタ調整、掃除を妨げる長時間トランザクション、肥大化の確認クエリ、そして VACUUM FULL の危険性まで扱います。
SRE 実践 #3 アラート設計 — 症状ベースの通知とマルチウィンドウ・バーンレート
深夜に人を起こす価値のあるアラートだけを残す設計を扱います。原因ベースのアラート(CPU 高負荷)ではなく症状ベースのアラート(ユーザーリクエストの失敗)へ移行すべき理由、ページとチケットを分ける基準、バーンレートアラートを短いウィンドウと長いウィンドウの組み合わせで作り誤検知と見逃しを同時に減らすマルチウィンドウ構成、アラート疲れを測定して減らす運用ルーチンまで扱います。
Terraform 基礎 #6 依存関係と繰り返し — depends_on、count と for_each、dynamic ブロック
参照がそのまま依存関係になり、作成順序が決まる仕組みと、depends_on が必要になる例外的な場面を整理します。count でリソースを複製するときにリストの途中削除が引き起こす再作成の落とし穴、キーベースだから安全な for_each との使い分けの基準、そしてネストしたブロックを繰り返す dynamic ブロックまで扱います。
PostgreSQL 実践講座 #4 インデックス戦略の応用 — 部分・複合・カバリング、そして GIN・BRIN
基礎第 4 回の B-tree の基本の上に実戦の戦略を積みます。WHERE 条件までインデックスに入れる部分インデックス、テーブルアクセスを省略するカバリングインデックス(INCLUDE)と Index Only Scan の条件、B-tree 以外の選択肢(GIN・GiST・BRIN)を選ぶ基準、使われていないインデックスを pg_stat_user_indexes で見つけて整理する方法、インデックスの肥大化と REINDEX CONCURRENTLY まで扱います。
SRE 実践 #2 エラーバジェット運用 — ポリシー文書とバーンレート
エラーバジェットを概念から運用ツールへ変える方法を扱います。バジェットが尽きたとき何をするかを障害の前に合意しておくエラーバジェットポリシー文書、フィーチャーフリーズが実際に機能するための経営層の合意、バジェットが減る速度を表すバーンレートの計算、速い消費と遅い消費を区別して対応する方法、リリース判断にバジェットをつなぐ実務パターンまで扱います。
Terraform 基礎 #5 state の正体 — tfstate ファイルの構造と plan が変更を計算する仕組み
terraform.tfstate ファイルを実際に開いて構造を確認し、plan がコード、state、実際のインフラの 3 つを比較して変更を計算する仕組みを整理します。state に機密情報が平文で残る問題とコミット禁止のルール、state list と show、mv、rm といった操作コマンド、state を失ったときに起きることまで扱います。
PostgreSQL 実践講座 #3 性能診断のルーチン — pg_stat_statements で遅いクエリを見つける
「DB が遅い」から犯人のクエリまで辿り着く標準ルーチンを作ります。いま何が起きているかを見る pg_stat_activity(アクティブなクエリ・待ち・長引くトランザクション)、累積統計で高くつくクエリを見つける pg_stat_statements の導入と主要カラム(total_exec_time・mean_exec_time・calls)、合計上位と平均上位が指す別々の犯人、スロークエリログ(log_min_duration_statement)の設定、そして EXPLAIN への受け渡しまで扱います。
SRE 実践 #1 SLI・SLO 設計 — 何を測り、いくつの 9 を約束するか
SRE 実践シリーズの第 1 回として、SLI と SLO を実際に設計するプロセスを扱います。ユーザージャーニーから測定対象を選ぶ方法、良い SLI が good/total の比率になる理由、ロードバランサー・サーバー・クライアントのどこで測るかのトレードオフ、SLO の数値を現在の性能から出発させるべき理由、測定ウィンドウの選択、そして SLO 仕様書に必ず書くべき項目まで扱います。
Terraform 基礎 #4 データソースと式 — 作らずに読み取る、条件式と for
Terraform が作っていない既存リソースの情報を読み取る data ブロックを、最新 AMI の検索を例に扱います。条件式で環境ごとの分岐を作り、for 式とスプラットでリストとマップを加工する方法も整理します。よく使う組み込み関数と、式の実験場である terraform console まで扱います。
PostgreSQL 実践講座 #2 コネクションプール — max_connections の誤解と PgBouncer
トラフィックが増えると必ずぶつかるコネクション問題を扱います。PostgreSQL のコネクションがプロセス 1 つで高くつく理由、max_connections を上げるのが答えではない理由(多すぎるコネクションはむしろスループットを下げます)、アプリケーションのプールと PgBouncer のような外部プーラーの役割分担、PgBouncer transaction モードの効果と制約(セッション状態の機能が使えない)、そして適正なプールサイズの感覚まで扱います。
Terraform 基礎 #3 変数・出力・ローカル値 — ハードコーディングを取り除く 3 つの道具
variable ブロックで値をコードの外に切り出す方法と、tfvars ファイル、-var フラグ、環境変数という 4 つの入力パスの優先順位を整理します。validation で誤った値を入り口で止め、output で結果を取り出し、locals で内部の計算に名前を付けるところまで、同じコードで複数の環境を作る土台を固めます。
PostgreSQL 実践講座 #1 スキーマ・マイグレーション — サービスを止めずにテーブルを変える
実践編の始まりは、稼働中のテーブルを変える技術です。マイグレーションをコードで管理すべき理由(順序・再現性)、DDL もトランザクションになる PostgreSQL の強み、ロックを長く握る危険な変更と安全な変更の区別、NOT NULL の追加を段階に分ける方法、CREATE INDEX CONCURRENTLY、そしてカラム名の変更・型変更を拡張-移行-縮小(expand-contract)で解く戦略まで扱います。