Google Cloud Professional Cloud Database Engineer ベータ版勉強メモ

データベースの新しい試験がβリリースされたので、チャレンジ！
https://cloud.google.com/certification/guides/cloud-database-engineer

受験に向けた勉強のメモです。
試験の結果はまだまだ判らないし、試験を受けてみて過不足はあったものの、全く的外れではなかった気がするので、誰かの役に立てればと共有しておきます。
※具体的な試験問題がどうだったかとかは、規約違反になるためここでは触れません。

勉強は以下の流れでやることにしました。
[公式の学習プログラム](https://www.cloudskillsboost.google/paths/22)も提供されているので、そっちの方が効率的かもですが、今回はクレジットを節約するため、学習プログラムも自前で検討しました。
- 求められる知識のセルフチェック　→ 知識が曖昧なこと（重点学習箇所）をピックアップ。あまりに網羅率が低ければ試験をリスケ。
- 重点学習箇所を"英語で"調べる　→ β試験は英語なものの、英語苦手なので慣れるため。
- 日本語で改めてドキュメントを読み直し答え合わせ　→ 英語読解のミス洗い出しと関連知識の補填。

知識のセルフチェックは試験の概要に記載の内容から、出題範囲を確認するとともに、自分自身の理解が弱そうなところに当たりをつけました。


# Databaseサービスの種類

## Relational databases
Cloud SQL, Cloud Spanner, Bare Metal。
ACID特性。

## Non-Relational databases

ACID特性でない。ただし、Firestoreは特殊な形でACIDを提供。
Document DB: Firestore
Key-value: Bigtable, Memorystore
In-memory: Memorystore
Wide-column DB: Bigtable, (Cassandra, HBase)
Graph DB: (JanusGraph + )Bigtable <ストレージとして使用>
() ... 非Google Cloudサービス

## 移行
Database Migration Service。様々なソースDBからCloudSQLへの移行
Datastream。サーバーレスで使いやすい変更データキャプチャ（CDC）とレプリケーションのサービス。OracleやMySQLなどから様々なDBサービスへの取り込み。

※ <TBD> DatastreamはDMSを包含するように見えるが、ユースケース例では、GCSに取り込むまでで、DataflowやPub/Subと組み合わせていることが多い。使い分けについてもう少し理解が必要。

## 選択基準
このページを眺めておく。

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

# サービス一覧
各サービスのドキュメントから別表にまとめる。

| Categories     | Points                            | Cloud SQL                                                                                                        | Cloud Spanner                                                                                                        | Bare Metal                                                                                              | Firestore                                                                       | Memorystore                                                                                        | Cloud Bigtable                                                                                                                                         | Firebase Realtime Database | 
| -------------- | --------------------------------- | ---------------------------------------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | -------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------ | -------------------------- | 
| Availabity     | Choices                           | - Single Zone<br>- High HA                                                                                       | Region<br>- Multi Region<br>- Single Region<br>Replica<br>- Read / Write<br>- Read<br>- Witness                      | N/A                                                                                                     | - Multi-Region<br>- Regional                                                    | - Basic tire (no Read Replica)<br>- Standard tire (Read Replica on the other Zone)                 | Multi-cluster<br><br>Instance Replication<br>- Multi Region<br>- Multi Zone                                                                            | TBA                        | 
| Availabity     | Fail Over                         | Not available for a minutes                                                                                      | Automaticaly with no disable time. But you can change leader region.                                                 | N/A                                                                                                     | Automaticaly. You can't change default region.                                  | Automaticaly. Not available for any secounds and disconnected existing connection.                 | - Multi-cluster<br>automatic failover.<br>- Single-cluster<br>manual failover.                                                                         | TBA                        | 
| Encryption     | At rest                           | - client-side<br>Row-level. Use 'Tink' library.<br>- CMEK<br>Instance-level.                                     | - CMEK                                                                                                               | SVM                                                                                                     | - server-side<br>AES-256<br>- client-side<br>Both O.K.                          | - client-side<br>Use 'Tink' library with KMS.                                                      | CMEK                                                                                                                                                   | TBA                        | 
| Encryption     | In transit                        | Use SSL/TLS certification                                                                                        | API default encripted.                                                                                               | Interconnect, VPN                                                                                       | TLS                                                                             | TLS (limit by Instance Type)                                                                       | TLS                                                                                                                                                    | TBA                        | 
| Cost           | Factor                            | CPU, Memory, Storage, Type(MySQL, Postgres, or SQL Server)                                                       | Compute, Storage, NW Egress                                                                                          | Subscribe. Contct sales.                                                                                | Storage, Bandwidth, Operation(Write, Read, Delete)                              | Tire, Storage, Region, Num of Nodes                                                                | Type(SSD, HDD), Num of Instances, Storage, Egress NW(Free same region)                                                                                 | TBA                        | 
| Cost           | Commited Usage                    | Yes (1Year, 3Years)                                                                                              | Yes (1Year, 3Years)                                                                                                  | ?                                                                                                       | No                                                                              | No                                                                                                 | No                                                                                                                                                     | TBA                        | 
| Authentication | IAM Role                          | cloudsql.xxx<br>(admin, editor, viewer, client, instanceUser)<br>client ... from Auth Proxy and GAE<br>use tags. | spanner.xxx<br>(admin, backupAdmin, backupWriter, databaseAdmin, databaseReader, databaseUser, restoreAdmin, viewer) | baremetalsolution.XXX<br>(admin, editor, viewer, instanceXXX, storageadmin, networksadmin, nfsshareXXX) | datastore.xxx<br>(owner, user, viewer, importExportAdmin, indexAdmin)           | redis.xxx<br>memcache.xxx<br>(admin, editor, viewer, instances.xxx, locations.xxx, operations.xxx) | bigtable.xxx<br>(admin, user, reader, viewer, locations.xxx, instances.xxx, appProfiles.xxx, backups.xxx, clusters.xxx, tables.xxx, keyvisualizer.xxx) | TBA                        | 
| Authentication | Connect as DB Usser               | - Cloud SQL user (=root@)<br>- MySQL(or else) user<br>- IAM database authenication                               | - API<br>- psql (with PGAdapter)                                                                                     | N/A                                                                                                     | Security Rules                                                                  | Redis AUTH                                                                                         | N/A                                                                                                                                                    | TBA                        | 
| Backup         | Managed                           | - On-demand / Automated<br>Retain up to 365 days.<br>- Point-in-time Recovery<br>1 day.                          | - On-demand / Automated<br>Retain up to 365 days.<br>- Point-in-time Recovery<br>1 day.                              | N/A                                                                                                     | N/A<br>(For automate, export using Cloud Scheduler)                             | N/A<br>(For automate, export using Cloud Scheduler)                                                | Table backup.                                                                                                                                          | TBA                        | 
| Backup         | Import / Export                   | CSV / Dump files                                                                                                 | Arvo / CSV                                                                                                           | N/A                                                                                                     | LebelDB                                                                         | RDB Backup                                                                                         | Arvo, Parquet, Sequence                                                                                                                                | TBA                        | 
| Monitoring     | Primary Cloud Monitoring metrixis | CPU, Storage, e.t.c.                                                                                             | CPU, Latency, e.t.c.                                                                                                 | N/A                                                                                                     | Document xxx, Active Connection, e.t.c.                                         | memory usage                                                                                       | CPU, Disk usage                                                                                                                                        | TBA                        | 
| Monitoring     | Not Cloud Monitoring              | - Instance Logs(Cloud Logging)<br>- Recommender<br>- Insight                                                     | - Key Visualizer<br>- OpenCensus (Client-side)                                                                       | - gcloud (bms XXX describe)                                                                             | - Key Visualizer<br>- Usage DashBoard<br>- Security Rule Usage<br>- Daily Quota | N/A                                                                                                | log4j                                                                                                                                                  | TBA                        | 


# データベースサービスごとのメモ
## Cloud SQL

フルマネージドなSQLデータベースサービス。
MySQL, PostgreSQL, SQL Serverに対応。
ストレージの自動拡張可能あり。

### データベースフラグ
データベースエンジンのパラメータ。
変更することで再起動されることもある。レプリカも同様。

### データベース認証
パスワード認証とIAM認証（MySQL, PostgreSQL）がある。

#### IAM認証
期限は１時間。SSL必須。
リードレプリカを作る場合は、作成時に明示的に有効にする必要がある。
バックアップから復元する場合は、同一プロジェクトでは同じ設定が引き継がれるが、別プロジェクトでは新たに設定する必要がある。

##### プリンシパル
ユーザーアカウントとサービスアカウントのみ。Groupなどはサポートしない。
##### Role
cloudsql.instances.login 
##### リソース
デフォルトはプロジェクトレベル。

### IAM

roles/cloudsql.client
```
Cloud SQL Client
Connectivity access to Cloud SQL instances from App Engine and the Cloud SQL Auth proxy. Not required for accessing an instance using IP addresses.
cloudsql.instances.connect
cloudsql.instances.get
```


roles/cloudsql.instanceUser
```
Cloud SQL Instance User	Role allowing access to a Cloud SQL instance.

cloudsql.instances.get
cloudsql.instances.login
```
https://cloud.google.com/sql/docs/mysql/iam-logins

### Best Practice

https://cloud.google.com/sql/docs/mysql/best-practices#tuning-monitoring


### SSL / TLS
#### サーバー証明書
インスタンス作成時に自動的に生成。server-ca.pem。
10年の期限。期限までに管理は不要（差し替え可能だが、しなくてもいい）。

#### クライアント証明書
インスタンスごとに10個まで作成可能。
Cloud SQL Admin IAM ロールが必要。
クライアント側の証明は必須ではないが、相互証明を推奨。

### Cloud SQL Auth proxy

安全にCloud SQLに接続する仕組み。GAEからは不要。
IAM認証が可能になる。
また、private IPアドレスでアクセスできる。
Cloud SQLと同じVPCにデプロイする必要がある。

### 暗号化
#### クライアントサイド暗号化
暗号化してから書き込む。列レベルの暗号化では必須。
KMSとTink(ライブラリ)で実現。

#### CMEK
既存のインスタンスには不可。
レプリカ・クローンに引き継がれる。
インポート/エクスポートするために、GCSバケットにCMEKを設定しておく。

### Backup
#### Point-in-time Recovery

```
gcloud sql instances clone SOURCE_INSTANCE_NAME \
NEW_INSTANCE_NAME \
--point-in-time 'TIMESTAMP'
```

## Spanner
### Replica
#### Read/Write Replica
- 全データ持ち
- 書き込み可能
- Leader昇格可能
#### Read-only Replica
- 全データ持ち
- 書き込み不可
- Leader昇格不可
#### Witness Replica
- データなし
- 書き込み可能
- Leader昇格不可

### Failover
https://cloud.google.com/blog/ja/topics/developers-practitioners/reduce-latency-with-cloud-spanner-multi-region-leader-placement

### Quantity
100 ~ 1,000。

### パフォーマンス
- ホットスポットの削減
- UUIDv4の使用
- ハッシュ結合の検討
- ある程度まとめてコミット
- パーティションをノード数の10倍
- 

### Backup
#### Backup
- パフォーマススに影響なし
- 期間最大1年
#### Inport / Export
- パフォーマススに影響あり
- 期間無制限

### 暗号化（CMEK）
- 作成時に指定（既存のDBには適用できない）
- Backupにも使われる

### エミュレータ
コストの節約のため、ローカルでのAPI検証が可能なエミュレータが提供されている。

## Firestore

### Mode
- Datastore 
- Native

### ベストプラクティス
- １秒に１回以上、一つのドキュメントを更新しない
- ホットスポットを避ける

### Refernce vs Snapshot
前者は参照（更新などの操作可能）。後者はデータのコピーのため操作不能。

## Memorystore

### Type
- for Redis
- for Memcached

### Upgrade
Basic tireでは一時的に利用不可。RDB Snapshotを使わない場合は、一度全てデータが消える。
Standard tireでは可用性は維持。

## Bigtable

### 構成
インスタンス、クラスタ、ノードで構成（左ほど上位）。クラスタはゾーンに依存。

### 暗号化（CMEK）
- 作成時に指定（既存のDBには適用できない）
- Backupにも使われる
- Cluster単位（テーブルなどには指定できない）

### TLS
http://opentsdb.net/docs/build/html/user_guide/backends/bigtable.html

### SSD vs HDD
通常はSSD。10TB以上でレイテンシが遅くてもいい場合のみHDD（安い）を検討。

#### Convert
直接的にはできない。Backupデータ経由。

### FailOver
- 数秒間の遮断
- エンドポイントは引き継がれるのでアプリ側の変更は不要

### 接続
- Direct peering ... VPC Peering
- Private services access ... Shared VPC, Inter connect, VPN

### IAM
#### reader vs viewer
viewerはデータにアクセスできない

### Garbage Collection
期限切れデータの削除

# 移行
## Database Migration Service
オンプレDBからCloud SQLや、GCSへ移行するサーバーレスサービス。

## Datastream
OracleからCloud SQL for MySQLへ移行などのようなサーバーレスサービス。

![1631549411928.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/51320/5275808c-2c3d-83fa-5ec2-c10e753473c8.png)

### Data Fusionとの比較
https://cloud.google.com/blog/ja/products/vmware-engine/visual-data-with-bigquery-and-google-cloud-vmware-engine

## 移行先ごとのパターン
### to Cloud Spanner

https://cloud.google.com/architecture/migrating-mysql-to-spanner

### DynamoDB to Spanner

バッチ処理
1. S3にロード
1. S3からCloud Storageに移行（DMS）
1. Cloud StorageからDataflowへ
1. DataflowでSpannerへ

ストリーム処理
1. LambdaでPub/Subへ
1. Pub/SubからDataflowへ
1. DataflowでSpannerへ

https://cloud.google.com/architecture/migrating-dynamodb-to-cloud-spanner

### HBase to Bigtable

1. snapshot と hash を Cloud Storageに格納
1. Bigtableで空のテーブルを作る
1. snapshotをインポート
1. hashで検証

https://cloud.google.com/architecture/hadoop/hadoop-gcp-migration-data-hbase-to-bigtable

# 参照
https://cloud.google.com/architecture/running-janusgraph-with-bigtable
https://cloud.google.com/blog/topics/developers-practitioners/your-google-cloud-database-options-explained

https://www.youtube.com/watch?v=ORxMMo7it_Y