Professional Cloud Database Engineerの学習メモ

# はじめに
Google CloudのProfessional Cloud Database Engineerに合格したので、そのときの学習中のメモとなります。
本試験は現在**英語**での試験のみとなっています。

https://cloud.google.com/learn/certification/cloud-database-engineer?hl=ja

# 試験の感想
英語が得意ではないので後回しにしていましたが、合格できました。
この資格がProfessionalの最後の資格だったので、正直難しいという印象はなかったです。
むしろProfessional資格では簡単な部類なのではと感じました。
問題の英語の部分に関しては、模擬問題集などで出てくる頻出単語を理解したり英語の文章に慣れておくと、比較的スムーズに試験を受けられると思います。
(この試験受験の2週間前に英語のProfessional Machine Learning Engineerを受験していて、英語の文章に慣れていたというのもあります。)

# 各DBの使い分け
各DBの特徴を以下Google Cloudのブログで理解する。

https://cloud.google.com/blog/ja/topics/developers-practitioners/your-google-cloud-database-options-explained

# Cloud SQL関連

## Database Migration Service
Cloud SQLへの移行を行う。
継続的なレプリケーションを管理し、移行オペレーションのステータスを提供する。

https://cloud.google.com/database-migration/docs/overview?hl=ja

## Cloud SQLのストレージ変更
Cloud SQLインスタンス作成後は、HDD↔SSDの変更は不可。
変更したい場合は、新たなインスタンスを作成しデータをインポートする。

https://cloud.google.com/sql/docs/mysql/choosing-ssd-hdd?hl=ja#switching

## Cloud SQLのフェイルオーバーテスト
Cloud SQLのフェイルオーバーの動作確認や障害テストをしたい場合は、以下のコマンドでできる。

```bash
gcloud sql instances failover PRIMARY_INSTANCE_NAME
```

https://cloud.google.com/sdk/gcloud/reference/sql/instances/failover

## クエリタグで非効率なクエリを特定
アプリケーションのトラブルシューティングを行うには、SQLクエリにクエリタグを追加する。
Query Insightsで、これらのタグを使ってクエリをフィルタリングし、どのアプリケーションからのクエリが問題を引き起こしているかを特定できる。

https://cloud.google.com/sql/docs/postgres/using-query-insights?hl=ja#filter_by_query_tags

## スロークエリの確認
スロークエリのログを出力するように設定する。
その際、指定した時間より長くかかったクエリがログファイルに出力されるようになる。
MySQLの場合は、`slow_query_log`オプションを使用する。

https://dev.mysql.com/doc/refman/8.0/ja/slow-query-log.html

# Cloud Spanner関連

## Cloud Spannerのクエリパラメータ
クエリパラメータとは、クエリ内の特定の値を変数（パラメータ）に置き換えること。
パラメータ化によって Spanner での実行プランのキャッシュ保存され、呼び出し毎に高速化される。

https://cloud.google.com/spanner/docs/sql-best-practices?hl=ja#query-parameters

## Cloud Spannerのホットスポット(hotspots)対策
ホットスポットとは、同じサーバーに多くのリクエストが送信され、遅延が大きくなっている状況のこと。
その対策として以下がある。
- 主キーにUUIDを使用する
- 主キーに連続した値をビット順逆転する
- カーディナリティ(データの種類)が高い属性を主キーの先頭にする
    - カーディナリティが低い属性を先頭にするとデータ分散が不均一になる

https://cloud.google.com/spanner/docs/schema-design?hl=ja

## Cloud Spannerのインターリーブテーブル
親子関係を定義するときには、インターリーブテーブルを使用する。
インターリーブを使用すると、Spannerはストレージ内の子行と親行を物理的に配置して、パフォーマンスが向上する。

https://cloud.google.com/spanner/docs/schema-and-data-model?hl=ja#parent-child

## Cloud SpannerでJSON データ型を扱うことが可能
Cloud Spannerでは、半構造化データのJSON データ型を扱うことが可能。
JSON データ型では、リレーショナル テーブルに適さないデータを柔軟に管理できる。

https://cloud.google.com/blog/ja/products/databases/manage-semi-structured-data-in-cloud-spanner-with-json

## マルチリージョンのCloud Spannerの書き込みパフォーマンス向上
書き込みは、デフォルトのリーダー リージョンで最初に処理される。
書き込みの多いワークロードのコンピューティングリソースをデフォルトのリーダーリージョン内またはその近くに配置することで、パフォーマンスが向上する。

https://cloud.google.com/spanner/docs/instance-configurations?hl=ja#multi-region-best-practices

# BigTable関連

## BigtableのKey Visualizer
Key Visualizer は、Bigtable の使用パターンの分析に役立つツール。
ホットスポットになっている行やCPUの過剰使用を確認することができる。

https://cloud.google.com/bigtable/docs/keyvis-overview?hl=ja

# FireStore関連

## FireStoreのデータモードの使い分け
FireStoreには2つのデータモードがある。
- Nativeモード
    - モバイルアプリやウェブアプリの場合
- Datastoreモード
    - 新しいサーバー プロジェクトの場合

https://cloud.google.com/firestore/docs/firestore-or-datastore?hl=ja#choose_a_database_mode

## Firestoreのオフラインデータ
アプリが使用している Firestore データのコピーがキャッシュに保存され、デバイスがオフラインであっても、アプリはデータにアクセス可能。
デバイスがオンラインに戻ると、アプリがローカルで行った変更と Firestoreバックエンドが同期される。
`PersistenceEnabled`オプションを`True`にする。

https://cloud.google.com/firestore/docs/manage-data/enable-offline?hl=ja

# メンテナンスの影響を最小限に抑える方法
メンテナンス中に発生するエラーには、接続の切断や処理中のトランザクションの失敗がある。
- 接続の切断による影響を最小限に抑えるには、接続プールを使用する
    - アプリケーションとプーラーの間の接続は保持される
- 復旧するために指数バックオフで再試行する
    - 過大な負荷を軽減できる

https://cloud.google.com/sql/docs/postgres/maintenance?hl=ja#impact

# その他

## Bare Metal Solutionでインターネットへアクセスする方法
Bare Metal Solution にはインターネット接続は付いていない。
Cloud NATを使用して、プロキシサーバーとして機能するCompute Engine VM経由でのトラフィックのルーティングを行うことで、インターネット接続ができるようになる。

https://cloud.google.com/bare-metal/docs/bms-setup?hl=ja#bms-access-options

## Datastream
Datastreamは、サーバーレスで変更データキャプチャ(CDC)およびレプリケーションサービス。
運用データベースから BigQuery にデータをシームレスに複製可能。
Dataflowと統合することで、データ書き込みも可能。

https://cloud.google.com/datastream/docs/overview?hl=ja