シングルゾーンのCloud SQL Enterprise PlusでNear Zero Downtimeのスケールアップを行ってみた

# はじめに

Cloud SQL Enterprise Plusでは高可用性構成の場合にのみ、「Near Zero Downtimeのメンテナンス」を行うことができましたが、2024/9 のアップデートでシングルゾーンでもNear Zero Downtimeのメンテナンスを行うことができるようになったので、試してみました。(ついでに、Cloud SQL Enterpriseの場合でも試してみたので比較してみます。)

- [Near-zero downtime planned maintenance](https://cloud.google.com/sql/docs/postgres/maintenance#nearzero)



次のように、日本語版だと本日時点(2024/9/14)では高可用性構成が必要、という記載が残っています。

- [ダウンタイムがほぼゼロの計画的メンテナンス](https://cloud.google.com/sql/docs/postgres/maintenance?hl=ja#nearzero)

>「ダウンタイムがほぼゼロの計画的メンテナンス」を利用できる Cloud SQL Enterprise Plus エディションのインスタンスでは、高可用性が構成済みの場合に、計画的メンテナンス中に接続性が失われるのは一般的に 1 秒未満です。

#### Cloud SQL Enterprise Plus

Cloud SQL Enterprise Plusのインスタンスに対して、1秒おきにインサートを行います。

```SQL
:
INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
id |            date            
----+----------------------------
  2 | 2024-09-14 08:30:32.272234

INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id |            date            
----+----------------------------
  3 | 2024-09-14 08:30:33.316934

INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id |           date            
----+---------------------------
  4 | 2024-09-14 08:30:34.35783

:
:
```

シングルゾーンであることを確認し、シェイプの変更を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/f91625b2-adf2-5818-a311-44a7ffc5306b.png)

シェイプ変更が完了しても特にデータの抜けは発生しませんでした。

![02-eeplus-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/6dcdf62b-db53-0347-cd6f-cab06f1fdc3a.png)

```SQL
  id |            date            
-----+----------------------------
:
:
  77 | 2024-09-14 08:31:50.491973
  78 | 2024-09-14 08:31:51.532361
  79 | 2024-09-14 08:31:52.573339
  80 | 2024-09-14 08:31:53.614094
  81 | 2024-09-14 08:31:54.655125
  82 | 2024-09-14 08:31:55.698057
  83 | 2024-09-14 08:31:56.742333
  84 | 2024-09-14 08:31:57.783399
  85 | 2024-09-14 08:31:58.826661
  86 | 2024-09-14 08:31:59.868748
  87 | 2024-09-14 08:32:00.910933
  88 | 2024-09-14 08:32:01.955993
  89 | 2024-09-14 08:32:02.99909
  90 | 2024-09-14 08:32:04.039203
  91 | 2024-09-14 08:32:05.080532
  92 | 2024-09-14 08:32:06.118879
  93 | 2024-09-14 08:32:07.161479
  94 | 2024-09-14 08:32:08.203943
  95 | 2024-09-14 08:32:09.246566
  96 | 2024-09-14 08:32:10.287157
  97 | 2024-09-14 08:32:11.326548
  98 | 2024-09-14 08:32:12.36979
  99 | 2024-09-14 08:32:13.411003
 100 | 2024-09-14 08:32:14.452715
 101 | 2024-09-14 08:32:15.496962
 102 | 2024-09-14 08:32:16.537441
 103 | 2024-09-14 08:32:17.5792
 104 | 2024-09-14 08:32:18.620697
 105 | 2024-09-14 08:32:19.666403
 106 | 2024-09-14 08:32:20.705757
 107 | 2024-09-14 08:32:21.744085
 108 | 2024-09-14 08:32:22.786325
 109 | 2024-09-14 08:32:23.826945
 110 | 2024-09-14 08:32:24.867913
 111 | 2024-09-14 08:32:25.909275
 112 | 2024-09-14 08:32:26.954021
 113 | 2024-09-14 08:32:27.997179
 114 | 2024-09-14 08:32:29.045104
 115 | 2024-09-14 08:32:30.085054
:
:
 307 | 2024-09-14 08:35:50.290709
 308 | 2024-09-14 08:35:51.332733
 309 | 2024-09-14 08:35:52.373584
 310 | 2024-09-14 08:35:53.411497
 311 | 2024-09-14 08:35:54.449459
 312 | 2024-09-14 08:35:55.497958
 313 | 2024-09-14 08:35:56.545272
 314 | 2024-09-14 08:35:57.58681
 315 | 2024-09-14 08:35:58.634688
 316 | 2024-09-14 08:35:59.678955
 317 | 2024-09-14 08:36:00.725457
 318 | 2024-09-14 08:36:01.770305
 319 | 2024-09-14 08:36:02.817774
 320 | 2024-09-14 08:36:03.859615
 321 | 2024-09-14 08:36:04.902332
 322 | 2024-09-14 08:36:05.947013
 323 | 2024-09-14 08:36:06.991783
 324 | 2024-09-14 08:36:08.032881
 325 | 2024-09-14 08:36:09.077041
 326 | 2024-09-14 08:36:10.125152
```


#### Cloud SQL Enterprise

今度は、Cloud SQL Enterpriseのインスタンスに対して、1秒おきにインサートを行います。

```SQL
:
INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
---+----------------------------
  2 | 2024-09-14 08:10:57.280735

INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id |            date            
----+----------------------------
  3 | 2024-09-14 08:10:58.329145

INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id |            date            
----+----------------------------
  4 | 2024-09-14 08:10:59.372783
:
:
```

こちらも、シングルゾーンであることを確認し、シェイプの変更を行います。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/28d4decf-88cc-0ee6-b2f2-3c3b0a11eeb5.png)

そうすると、8:13:04 ~ 8:13:25 辺りで接続エラーが発生してしまいました。

```SQL

:
INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id  |            date            
-----+----------------------------
 123 | 2024-09-14 08:13:03.875275
(1 row)

INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id  |            date            
-----+----------------------------
 124 | 2024-09-14 08:13:04.929557
(1 row)

Sat Sep 14 08:13:04 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:05 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:06 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:07 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:10 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:11 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:12 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:13 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:14 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:15 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?
Sat Sep 14 08:13:16 UTC 2024
psql: could not connect to server: Connection refused
        Is the server running on host "xx.xx.xx.xx" and accepting
        TCP/IP connections on port 5432?

Sat Sep 14 08:13:24 UTC 2024

INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id  |            date            
-----+----------------------------
 125 | 2024-09-14 08:13:25.289754
(1 row)

INSERT 0 1
WARNING:  there is no transaction in progress
COMMIT
 id  |            date            
-----+----------------------------
 126 | 2024-09-14 08:13:26.338274
:
:
 ```

次の通り、8:13:05 ~ 8:13:24 のデータにも抜けが発生していることが確認できます。
 ```SQL

postgres=>  select * from testtbl;
 id  |            date            
-----+----------------------------
:
 120 | 2024-09-14 08:13:00.742286
 121 | 2024-09-14 08:13:01.785839
 122 | 2024-09-14 08:13:02.830101
 123 | 2024-09-14 08:13:03.875275
 124 | 2024-09-14 08:13:04.929557
 125 | 2024-09-14 08:13:25.289754
 126 | 2024-09-14 08:13:26.338274
 127 | 2024-09-14 08:13:27.388409
 128 | 2024-09-14 08:13:28.431221
 129 | 2024-09-14 08:13:29.473938
 130 | 2024-09-14 08:13:30.514398
 131 | 2024-09-14 08:13:31.556157
 132 | 2024-09-14 08:13:32.597185
 133 | 2024-09-14 08:13:33.639737
 134 | 2024-09-14 08:13:34.682312
 135 | 2024-09-14 08:13:35.725259
 136 | 2024-09-14 08:13:36.765478
 137 | 2024-09-14 08:13:37.806958
 138 | 2024-09-14 08:13:38.844922
 139 | 2024-09-14 08:13:39.883058
 140 | 2024-09-14 08:13:40.922187
:
```

シェイプ変更自体は開始から数分で完了しています。

![01-eenormal-02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2313926/d968895b-57d6-5c6a-1339-d54832046f15.png)

# まとめ

シングルゾーンのCloud SQL Enterprise PlusではNear Zero Downtimeが実装されていることが確認できました。
アプリケーションの実行状況によっては（アプリケーションからは）完全に無停止でメンテを行うことも可能になると言えます。
とはいえ、シングルゾーンで運用しているのに無停止が必要、というのは若干矛盾していますが。。

なお、接続し続けている場合には一度接続がCloseされてしまいますので、完全にアプリケーションから無停止にしたい場合には、接続エラーやトランザクション中断に対してハンドリングするなどの対応が必要になります。
```SQL
postgres=> select version();
FATAL:  terminating connection due to administrator command
SSL connection has been closed unexpectedly
The connection to the server was lost. Attempting reset: Succeeded.
psql (10.23, server 16.3)
WARNING: psql major version 10, server major version 16.
         Some psql features might not work.
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)
postgres=> 
postgres=> 
postgres=> select version();
                                         version                                         
-----------------------------------------------------------------------------------------
 PostgreSQL 16.3 on x86_64-pc-linux-gnu, compiled by Debian clang version 12.0.1, 64-bit

```