GCP: Bigtable

# Overview
https://cloud.google.com/bigtable/docs/overview

- Key Value Store: row key
- 低レイテンシー
- 高いRead/Writeスループット
- 行が多いデータに向いている
- HBaseをはじめとするアプリケーションと連携できる
- 1行は10MBいかないくらい
- 時系列、マーケティング、財務、IoT、グラフデータに向いている
- row/columns > column family > column qualifier
- Tabletという隣接する列ごとにシャードされる
- TabletsはColossusというGoogleのファイルシステムに格納される
- row keyがノードで分散するようにするのがコツ
- 関連する行は近くに置く, `WashingtonDC#201803061617`
- データ圧縮は自動で行われる、ただし1MBを超えるものはしない
- インスタンスやテーブルレベルでのセキュリティ管理ができる、行レベル以下ではできない
- encripted at rest

# Instances, clusters and nodes
https://cloud.google.com/bigtable/docs/instances-clusters-nodes

- 1インスタンスは8リージョンまで配置できる
- 各クラスターはユニークなゾーンに配置される
- クラスターを増やしてフェイルオーバーに備えることができる
- クラスターは1つ以上のノードを持つ
- cpu usageやstorage utilizationをモニターできる

# schema
https://cloud.google.com/bigtable/docs/schema-design

- 1インデックス、セカンダリーはない
- row keyで辞書順
- 行レベルでアトミック、行ごとに成否が決まる
- 空の列が多いスパースなテーブルでもよい
- テーブルはたくさん作らない
- セルは10MBまで、行は100MBまでを目安に
- row key
    - 複数行を同時に変更するような操作を避ける
    - リバースドメイン名, com.googleみたいな
    - string identifier
    - timestamp, アクセスの仕方によるが, 何かの名前の後のほうがいい
    - aaa#bbb, みたいな複数の値を格納したもの
    - ニューメリックなユーザーidは避ける
    - 短くする
    - 頻繁に更新が入るものは避ける
    - ハッシュ値は使わない
- columns
    - 関連するcolumnsはfamilyにまとめる
    - familyの名前は短くする
    - バージョンが変わりやすいcolumnは独立させる
    - 不必要にqualifierを分けない
    - qualifierをデータとして使う
    - 1行のcolumnを多くしすぎない
    - データがまとまっているときは[protocol buffer](https://developers.google.com/protocol-buffers/docs/overview)を使う
- マルチテナント
    - 同じデータモデルだがクライアントごとに分けたい場合
    - クライアント名をrow key prefixにする
- Security
    - PIIをキーやファミリーにするのは避ける

# Key Visualizer
https://cloud.google.com/bigtable/docs/keyvis-overview

- Bigtableの利用パターンを分析できる
- row keyに対するアクセスを分析できる
- ホットスポットの発見
- 肥大化した行の発見
- アクセスの分散化
- key rangeでバケット化した分析

# Replication
https://cloud.google.com/bigtable/docs/replication-overview

- クラスターを増やす
- クラスターのゾーンやリージョンを分ける
- クラスターが複数になると結果整合性モデルになる
- single cluster routingで強整合性モデルにできる
- last write wins

# Backups
https://cloud.google.com/bigtable/docs/backups

- データをバックアップして復旧できる
- ゾーンレベルの障害にはレプリケーションで対応するべき
- 自動削除できる
- クラスターレベルでテーブルがバックアップされる
- 別のテーブルに移動するときにも有用

# Manage data
https://cloud.google.com/bigtable/docs/import-export

- Avro, Parquet, Sequenceファイルが可能
- HBaseやcsvからBigtableにインポートできる
- cbtというcliが便利
- client libraryで4種のwriteができる
    - simple write: ある行を変更する
    - incremental and append: 行を追加したり、値を増やしたりする
    - conditional write: 条件に合う行を変更する
    - batch write: 複数の行を変更する
- read
    - single row
    - scan
    - filtered

# Migration

- HBase
- Cassandra

# Performance
https://cloud.google.com/bigtable/docs/performance

- SSD or HDD
- スループットかレイテンシーか
- 高リードか高ライトか
- トラフィックがグローバルかどうか
- アクセスされないとコールド状態になるため、ダミーのリクエストを送ることも考慮

# Autoscaling
https://cloud.google.com/bigtable/docs/autoscaling

- target
    - cpu
    - storage
    - number of nodes

# App profiles
https://cloud.google.com/bigtable/docs/app-profiles

- single cluster routing: リクエストを一つのクラスターに割り振る
- Multi cluster routing: リクエストを近いクラスターに割り振る
- Cluster group routeing: リクエストを同じクラスターグループで近いものに割り振る

# cbt
https://cloud.google.com/bigtable/docs/cbt-overview
https://cloud.google.com/bigtable/docs/managing-tables

# Integration
https://cloud.google.com/bigtable/docs/integrations

- BigQuery
    - https://cloud.google.com/bigquery/docs/external-data-bigtable
    - external tableとしてクエリ
    - permanent / temporary
- Cloud Function
    - https://cloud.google.com/bigtable/docs/use-cloud-functions
    - Bigtableにアクセスできる
- Dataproc
    - https://cloud.google.com/bigtable/docs/creating-hadoop-cluster
    - Bigtableにアクセスできる

# Security

- Audit Logで誰がいつアクセスしたか監視できる
- LogEntry
    - logName, resource, timeStamp, protoPayload
- Googleの暗号化鍵、CMEK

# Pricing

- Bigtable and number of nodes
- amount of storage
- amount of network bandwidth

# 終わり