Documentation
¶
Index ¶
- Constants
- Variables
- func BackendMemory(connections int, perConnMiB float64) float64
- func BudgetRemaining(objective float64, window, downtime time.Duration) time.Duration
- func ErrorBudget(objective float64, window time.Duration) time.Duration
- func LocalReferences(rng *rand.Rand, total, hot, count int, hotShare float64) []int
- func PoolingCapsBackends(clientConnections, poolSize int) int
- func RecoverInto(walPath string, disk *DiskManager) (int, error)
- func RecoverUntil(walPath string, disk *DiskManager, target int) (int, error)
- func Vacuum(t *MVCCTable, oldestActive XID) int
- func WALLength(walPath string) (int, error)
- type BPlusTree
- type BufferPool
- type DiskManager
- type Filter
- type HeapFile
- type HitStats
- type Index
- type IndexScan
- type MVCCTable
- type Observation
- type Operator
- type Page
- type Plan
- type Planner
- type Project
- type REDStat
- type RecordID
- type SeqScan
- type Snapshot
- type Stats
- type Tuple
- type Tx
- type TxManager
- type USEStat
- type WAL
- type XID
Constants ¶
const FrozenXID = uint32(2)
FrozenXID は、何に対しても過去とみなす特別な番号。 周回の説明のため、64 ビットの XID とは別に、32 ビットの小さなモデルとして閉じてある。
const PageSize = 8192
PageSize は 1 ページの大きさ。PostgreSQL に合わせて 8KB にする。
Variables ¶
var ErrNoFreeFrame = errors.New("no free frame available (all pinned)")
ErrNoFreeFrame は、すべてのフレームが pin されていて、 追い出せるものが一つもないときに返す。
var ErrPageFull = errors.New("page is full")
ErrPageFull はページに空きが足りないときに返す。
var ErrSlotNotFound = errors.New("slot not found")
ErrSlotNotFound は指定したスロットが空、または範囲外のときに返す。
Functions ¶
func BackendMemory ¶
BackendMemory は、接続数と 1 接続あたりのメモリ(MiB)から、見込みの総メモリを返す。 PostgreSQL は接続ごとにプロセスを持つので、メモリは接続数に比例して増える。
func BudgetRemaining ¶
BudgetRemaining は、これまでの停止 downtime を引いた、残りのエラーバジェット。 負になっていたら、約束を破っている。
func ErrorBudget ¶
ErrorBudget は、目標可用率 objective(0 から 1) と期間 window から、許される停止時間を返す。 99.9 パーセントを 30 日で守るなら、許される停止は約 43 分。この 43 分がエラーバジェット。
func LocalReferences ¶
LocalReferences は、偏りのある参照列を作る。 hot 本のページに参照の hotShare を集め、残りを全体へ散らす。 「よく触る一部」と「たまに触る全体」という、現実の偏りの再現。
func PoolingCapsBackends ¶
PoolingCapsBackends は、接続プールを挟んだときの実 backend 接続数を返す。 表側の接続がいくつあっても、backend は poolSize までに収まる。PgBouncer の効き目。
func RecoverInto ¶
func RecoverInto(walPath string, disk *DiskManager) (int, error)
RecoverInto は、ログを先頭から読み、各ページの中身をデータファイルへ書き戻す。 途中で切れた末尾や、壊れたレコードに当たったら、そこで安全に止める。 適用したレコード数を返す。
func RecoverUntil ¶
func RecoverUntil(walPath string, disk *DiskManager, target int) (int, error)
RecoverUntil は、ログを先頭から target 個のレコードまで適用して止める。 target の先にレコードが残っていても、適用しない。ある時点まで進めて、そこで止める。 これが PITR(point-in-time recovery)の骨格。誤った操作の手前まで巻き戻せる。
Types ¶
type BPlusTree ¶
type BPlusTree struct {
// contains filtered or unexported fields
}
BPlusTree は、バッファプールの上に積んだ B+tree の索引。 キー(int64)から RecordID(行の住所、PostgreSQL の ctid に当たる)を引く。
func NewBPlusTree ¶
func NewBPlusTree(bp *BufferPool) (*BPlusTree, error)
NewBPlusTree は空の B+tree を作る。葉だけの根を 1 ページ確保する。 根のページ番号はメモリ上にだけ持つ。再オープン時に引き継ぐための メタページは、まだ作らない(次回以降)。
type BufferPool ¶
type BufferPool struct {
// contains filtered or unexported fields
}
BufferPool は、限られた数のフレームを持ち、ディスクのページをメモリに載せる。 同じページが要るときは、ディスクへ行かずにメモリから返す。
func NewBufferPool ¶
func NewBufferPool(disk *DiskManager, size int) *BufferPool
NewBufferPool は、size 枚のフレームを持つバッファプールを作る。
func (*BufferPool) FetchPage ¶
func (bp *BufferPool) FetchPage(pageID int) (*Page, error)
FetchPage は、ページをメモリに用意して返し、pin する。 すでにメモリにあれば、それを返す(ヒット)。なければディスクから読む(ミス)。
func (*BufferPool) FlushAll ¶
func (bp *BufferPool) FlushAll() error
FlushAll は、書き換えられた全フレームをディスクへ書き戻す。 PostgreSQL のチェックポイントに当たる動き。
func (*BufferPool) FlushPage ¶
func (bp *BufferPool) FlushPage(pageID int) error
FlushPage は、指定ページが書き換えられていれば、ディスクへ書き戻す。
func (*BufferPool) NewPage ¶
func (bp *BufferPool) NewPage() (int, *Page, error)
NewPage は、ディスクに新しいページを足し、それをメモリに載せて返す(pin 済み)。
func (*BufferPool) Unpin ¶
func (bp *BufferPool) Unpin(pageID int, dirty bool)
Unpin は、ページの使用を終える。dirty が true なら、書き換えた印をつける。
type DiskManager ¶
type DiskManager struct {
// contains filtered or unexported fields
}
DiskManager はページ単位でファイルを読み書きする。 ファイルを PageSize ごとに区切り、ページ番号で位置を決める。
func (*DiskManager) AllocatePage ¶
func (d *DiskManager) AllocatePage() (int, error)
AllocatePage は末尾に空のページを足し、その番号を返す。
func (*DiskManager) NumPages ¶
func (d *DiskManager) NumPages() (int, error)
NumPages はファイルが今いくつのページ分あるかを返す。
type Filter ¶
type Filter struct {
// contains filtered or unexported fields
}
Filter は条件で振り分ける段。合うものだけを上へ通す。
type HeapFile ¶
type HeapFile struct {
// contains filtered or unexported fields
}
HeapFile はページを並べてレコードを溜める、いちばん素朴な置き場所。
type HitStats ¶
HitStats は、ページ参照のヒットとミスを数えた結果。
func MeasureHitRate ¶
func MeasureHitRate(disk *DiskManager, size int, refs []int) (HitStats, error)
MeasureHitRate は、ページ参照列 refs を、容量 size のプールに流して、ヒット率を測る。 すでにプールに載っていればヒット、なければディスクから読むのでミス。 各参照はすぐ離す。次の参照で追い出せるようにするため。
func ObserveBuffer ¶
func ObserveBuffer(bp *BufferPool, refs []int) (HitStats, error)
ObserveBuffer は、参照列を bp に流し、ヒット統計を返す。 bp は呼び出し側が保持するので、流したあとの使用率を BufferPoolUSE で読める。
type Index ¶
type Index struct {
// contains filtered or unexported fields
}
Index は、ある列の値から行 ID への索引。第 10 回の B+tree をそのまま使う。 MVCC 表では行のありかは rowID そのものなので、RecordID にはその rowID を入れる。
type IndexScan ¶
type IndexScan struct {
// contains filtered or unexported fields
}
IndexScan は、索引でキーを一点引きし、該当する行だけを返す段。 全件を舐めない。索引が指した行 ID の版だけを、可視性をくぐらせて返す。
func NewIndexScan ¶
NewIndexScan は、表・トランザクション・索引・引くキーを束ねた走査を作る。
type MVCCTable ¶
type MVCCTable struct {
// contains filtered or unexported fields
}
MVCCTable は、行ごとにバージョンの列を持つ表。 書き換えは、古いバージョンを消したことにして、新しいバージョンを足す。
func NewMVCCTable ¶
func NewMVCCTable() *MVCCTable
func (*MVCCTable) DeadVersions ¶
DeadVersions は、どのトランザクションから見ても、もう要らないバージョンの数を返す。 消した番号が、いちばん古い現役のトランザクションより前なら、誰からも見えない。 これが第 14 回の VACUUM が回収する対象、いわゆる不要タプルに当たる。
type Observation ¶
type Observation struct {
Buffer USEStat // 資源:バッファプール
Storage USEStat // 資源:表(不要タプルの溜まり)
Query REDStat // 処理:クエリ
}
Observation は、ある時点の観測をひとまとめにしたもの。 資源は USE、処理は RED。定期的に取れば、状態の移り変わりが読める。
type Page ¶
type Page struct {
// contains filtered or unexported fields
}
Page はスロット付きページ。固定長 PageSize のバイト列として持つ。 レイアウトは、先頭からヘッダ、続いてスロット配列が前へ伸び、 レコード本体がページの末尾から前へ向かって積まれる。
type Plan ¶
type Plan struct {
Node string // "Seq Scan" か "Index Scan"
EstRows int
Cost float64
// contains filtered or unexported fields
}
Plan は、選ばれた計画。走査の種類、見積もり行数、費用、そして実行する段。
type Planner ¶
type Planner struct {
// contains filtered or unexported fields
}
Planner は、表と統計と使える索引を持ち、条件から安い計画を選ぶ。
func NewPlanner ¶
NewPlanner は、表・統計・列ごとの索引を束ねたプランナを作る。
type Project ¶
type Project struct {
// contains filtered or unexported fields
}
Project は列を絞る段。要る列だけを残す。
func NewProject ¶
NewProject は下の段と残す列を束ねた絞り込みの段を作る。
type REDStat ¶
type REDStat struct {
Count int // 流量:処理した数
Errors int // 失敗:失敗した数
TotalTime time.Duration // 所要時間の合計
}
REDStat は、処理(リクエスト)の観測。Rate, Errors, Duration。
func (REDStat) AvgDuration ¶
AvgDuration は、1 件あたりの平均所要時間。
type SeqScan ¶
type SeqScan struct {
// contains filtered or unexported fields
}
SeqScan は表を頭から読む段。第 12 回の可視性をくぐらせ、見える行だけを返す。 PostgreSQL の Seq Scan に当たる。
func NewSeqScan ¶
NewSeqScan は表とトランザクションを束ねた走査の段を作る。
type Snapshot ¶
type Snapshot struct {
// contains filtered or unexported fields
}
Snapshot は、ある時点での「何が見えるか」を固定したもの。 xmax 以上の番号は未来。xip は、その時点で進行中だった番号。どちらも見えない。
type Stats ¶
Stats は、計画を立てるための見積もり材料。表の行数と、列ごとの異なり数。 PostgreSQL では ANALYZE が集めて pg_statistic に貯める情報に当たる。
type Tx ¶
type Tx struct {
// contains filtered or unexported fields
}
Tx は、一つのトランザクション。自分の番号とスナップショットを持つ。
type TxManager ¶
type TxManager struct {
// contains filtered or unexported fields
}
TxManager は、トランザクション番号を配り、各番号の状態を覚える。
func NewTxManager ¶
func NewTxManager() *TxManager
func (*TxManager) OldestActive ¶
OldestActive は、いま回収してよい境界を返す。 いちばん古い現役のトランザクション番号。これより前に消された版は、もう誰からも見えない。 進行中が一つも無ければ、次に配る番号を返す(いま消えている版は全部回収してよい)。
type USEStat ¶
type USEStat struct {
Utilization float64 // 使用率:資源のうち使っている割合。0 から 1
Saturation float64 // 飽和:処理しきれず待たされている度合い
Errors int // エラー:資源が返した失敗の数
}
USEStat は、資源の観測。Utilization, Saturation, Errors。
func BufferPoolUSE ¶
func BufferPoolUSE(bp *BufferPool, s HitStats) USEStat
BufferPoolUSE は、バッファプールを資源として USE で表す。 使用率 = 載っているページ数 / フレーム数。飽和 = ミス率。ミスが多いほど、容量に働きが詰まっている。
func StorageUSE ¶
StorageUSE は、表を資源として USE で表す。 飽和 = 不要タプルの割合。回収が追いつかず溜まっているほど高い。第 14 回の回収の遅れが、ここに出る。
type WAL ¶
type WAL struct {
// contains filtered or unexported fields
}
WAL は、変更を先に記録する追記専用のログ。 データページをディスクに書く前に、まずここへ書いて fsync する。 これが先行書き込み(write-ahead)。落ちても、ログから復旧できる。
func (*WAL) AppendPageImage ¶
AppendPageImage は、ページの新しい中身をログに追記し、fsync する。 1 レコードの形: [payloadLen uint32][crc uint32][pageID int32][image ...] crc を付けるのは、末尾が途中で切れた壊れたレコードを、復旧時に見分けるため。