ApsaraDB for MongoDBを使ってみる【AlibabaCloud 接続編】

前の記事はこちら！　[ApsaraDB for MongoDBを使ってみる【事前準備編】](https://qiita.com/maipippi/items/1781bc525d0e1a9c0e4c)

### ApsaraDB for MongoDB

Alibaba CloudにはマネージドのMongo DBであるApsaraDB for MongoDBがある。

まずはアーキテクチャについて。

[ApsaraDB for MongoDB のアーキテクチャとコンポーネント](https://www.alibabacloud.com/help/en/mongodb/product-overview/architecture-of-apsaradb-for-mongodb?spm=a2c63.p38356.0.0.177224dbmjk5zK)

![](https://storage.googleapis.com/zenn-user-upload/b5d5e26734cf-20240718.png)

そも、ApsaraDB for MongoDBには[読み取り専用ノード](https://www.alibabacloud.com/help/en/mongodb/product-overview/read-only-nodes?spm=a2c63.p38356.0.0.52b41fc2lL9nYZ)が存在している。

> ApsaraDB for MongoDB は、インスタンスがプライマリ ノードとセカンダリ ノードから読み取りワークロードをオフロードできるように、独立した接続文字列 Uniform Resource Identifier (URI) を持つ読み取り専用ノードを提供します。読み取り専用ノードは、プライマリ ノードとセカンダリ ノードが大量の読み取り要求を処理する場合に、独立したシステムに直接接続するのに適しています。
> 

だそうで、スループット向上のためにプライマリ、セカンダリノードの他に提供されている。

![](https://storage.googleapis.com/zenn-user-upload/989cd6f8f814-20240718.png)


主な機能として以下があるらしい

- 読み取り専用ノードは、oplog を使用して、待ち時間が最も短いプライマリ ノードまたはセカンダリ ノードからデータを同期します。読み取り専用ノードは、大量の読み取り要求を受信するビジネス シナリオで、プライマリ ノードとセカンダリ ノードの読み取りワークロードを軽減するために使用できます。
- 読み取り専用ノードには、インスタンス用の独立した接続文字列 URI があります。読み取り専用ノードは、分析サーバーなどの分析プログラムへの直接接続に適しています。読み取り専用ノードは、既存のプライマリ ノードとセカンダリ ノードへの接続を中断しません。
- インスタンスに 2 つ以上の読み取り専用ノードがある場合は、読み取り専用接続文字列 URI を使用して、読み取り専用ノードが受信する読み取り要求のバランスをとることができます。

セカンダリノードとの明確な差も載ってた

![](https://storage.googleapis.com/zenn-user-upload/e50c3eb083f7-20240718.png)


ちなみにレプリカセットインスタンスとシャードクラスターインスタンスで使えて、最大5つ作れるみたい。

次はインスタンスの種類について。

スタンドアロンとレプリカセットとシャードクラスターの3種類あるらしい。それぞれの特徴をかいていく。

- [スタンドアロンインスタンス](https://www.alibabacloud.com/help/en/mongodb/product-overview/standalone-instances?spm=a2c63.p38356.0.0.50c224dbHO4S2y)

> コスト効率が非常に高く、重要なビジネス データの保存を必要としないシナリオに適しています。たとえば、開発、テスト、学習、トレーニングなどのシナリオでスタンドアロン インスタンスを使用できます。
> 

> 障害からの回復に長い時間がかかり、サービス レベル アグリーメント (SLA) の保証がありません。
> 

> 特定のリージョンとゾーンにのみデプロイできます。
> 

> MongoDB 4.0 および 3.4 のみをサポートします。
> 

> データの読み取りと書き込みに使用されるノードを 1 つだけ提供します。
> 

- [レプリカセットインスタンス](https://www.alibabacloud.com/help/en/mongodb/product-overview/replica-set-instances?spm=a2c63.p38356.0.0.581e1fc2wkZPv4)

> レプリカ セット インスタンスは、プライマリ ノード、1 つ以上のセカンダリ ノード、非表示ノード、および 1 つ以上のオプションの読み取り専用ノードで構成されます。
> 

> レプリカ セット インスタンスは、災害復旧やフェイルオーバーなどの高度な機能を提供します。
> 

> たとえば、オンライン読書サービスを提供する Web サイトを運営しているか、注文クエリを提供するシステムを実行しているとします。これらの Web サイトとシステムは、大量の読み取り操作と少数の書き込み操作を処理します。さらに、突発的なイベントにより、これらの Web サイトまたはシステムでの操作数が急増する可能性があります。このようなシナリオでは、セカンダリ ノードまたは読み取り専用ノードを追加または削除して、レプリカ セット インスタンスの読み取り機能を調整できます。
> 

![](https://storage.googleapis.com/zenn-user-upload/2c919809b308-20240718.png)


- [シャードクラスターインスタンス](https://www.alibabacloud.com/help/en/mongodb/product-overview/sharded-cluster-instances?spm=a2c63.p38356.0.0.1e1d428ev9ZXut)

> mongos、shard、Configserver ノードの 3 種類のコンポーネントで構成されます。mongos および shard ノードの構成と数を選択して、さまざまなパフォーマンス機能を持つ
> 

![](https://storage.googleapis.com/zenn-user-upload/ac6f5d844476-20240718.png)

![](https://storage.googleapis.com/zenn-user-upload/97ba2f015a9c-20240718.png)

表をみる感じスタンドアロンのMongoコンポーネントがリクエストのクエリに応じて書き込み先のシャードノードにルーティングするみたい

シャードノードはレプリカセットを持っていて、configserverがシャードのメタデータをもっている　と。

まとめると、開発用はスタンドアロンで、本番はレプリカセット使う

レプリカセットで捌けないレベルならシャーディングクラスターを使う

みたいな感じ？

とりあえずコンソールから立ち上げてみる！

![https://storage.googleapis.com/zenn-user-upload/6081cb363d70-20240329.png](https://storage.googleapis.com/zenn-user-upload/6081cb363d70-20240329.png)

今回はレプリカセットのインスタンスにする。

![https://storage.googleapis.com/zenn-user-upload/282e949ce814-20240329.png](https://storage.googleapis.com/zenn-user-upload/282e949ce814-20240329.png)

![https://storage.googleapis.com/zenn-user-upload/698f12c5b80f-20240329.png](https://storage.googleapis.com/zenn-user-upload/698f12c5b80f-20240329.png)

VPCとVSwitchを設定する欄があるので、これらも新規でつくってみる。

![https://storage.googleapis.com/zenn-user-upload/772847739eb5-20240329.png](https://storage.googleapis.com/zenn-user-upload/772847739eb5-20240329.png)

MongoのデフォルトゾーンがCだったので、VSwtichもZone Cでつくる。

![https://storage.googleapis.com/zenn-user-upload/4aef46e112f4-20240329.png](https://storage.googleapis.com/zenn-user-upload/4aef46e112f4-20240329.png)

![https://storage.googleapis.com/zenn-user-upload/a6939cee4dbf-20240509.png](https://storage.googleapis.com/zenn-user-upload/a6939cee4dbf-20240509.png)

![https://storage.googleapis.com/zenn-user-upload/671f2aab0f79-20240329.png](https://storage.googleapis.com/zenn-user-upload/671f2aab0f79-20240329.png)

できた！

![https://storage.googleapis.com/zenn-user-upload/5a79c64e5f09-20240509.png](https://storage.googleapis.com/zenn-user-upload/5a79c64e5f09-20240509.png)

![https://storage.googleapis.com/zenn-user-upload/6728ec288c78-20240510.png](https://storage.googleapis.com/zenn-user-upload/6728ec288c78-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/89635f415809-20240510.png](https://storage.googleapis.com/zenn-user-upload/89635f415809-20240510.png)

### ローカルからApsaraDB for MongoDBインスタンスに接続する

先ほど作ったAPIの中でMongoの繋ぎ先をインスタンスにしてみる。

[connect-to-an-apsaradb-for-mongodb-instance-over-the-internet](https://www.alibabacloud.com/help/en/mongodb/user-guide/connect-to-an-apsaradb-for-mongodb-instance-over-the-internet?spm=a2c63.p38356.0.0.3b52143dLCM7rg)
を参考に繋ぐ。

まずローカルPCのパブリックIPをApsaraDB for MongoDBインスタンスのホワイトリストに追加する。

![https://storage.googleapis.com/zenn-user-upload/e370fc56e719-20240510.png](https://storage.googleapis.com/zenn-user-upload/e370fc56e719-20240510.png)

次に、インターネット接続するためにインスタンスのパブリックアドレスの設定する。

![https://storage.googleapis.com/zenn-user-upload/4df4a65f4f3a-20240510.png](https://storage.googleapis.com/zenn-user-upload/4df4a65f4f3a-20240510.png)

APIのなかのMongoClientの接続先を変更し、アクセスしてみる。

![https://storage.googleapis.com/zenn-user-upload/7a90bdcfd8f3-20240510.png](https://storage.googleapis.com/zenn-user-upload/7a90bdcfd8f3-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/2b336a5d01c9-20240510.png](https://storage.googleapis.com/zenn-user-upload/2b336a5d01c9-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/770f0751ff3d-20240510.png](https://storage.googleapis.com/zenn-user-upload/770f0751ff3d-20240510.png)

アクセスできた！

ちなみにAlibaba Cloudには統合されたDBサービスのDMSというのがあるようなので、ついでに使ってみる。

### DMS

> データ管理 (DMS) は、データ管理、ユーザー認証、セキュリティ監査、ロックフリーの変更、データ追跡、データ視覚化などの機能をサポートしています。
> 

だそうで、これでAlibaba Cloud内の各種DBをまとめて管理できるらしい。めっちゃ便利そう。

[DMS を介したレプリカセット ApsaraDB for MongoDB インスタンスへの接続](https://www.alibabacloud.com/help/en/mongodb/getting-started/connect-to-an-apsaradb-for-mongodb-replica-set-instance-by-using-dms#concept-xdd-13v-cgb) を参考に使ってみる。

まずは下準備でMongoインスタンスのホワイトリストにDMSのIPを追加する。

![https://storage.googleapis.com/zenn-user-upload/aa4f57f80d2a-20240510.png](https://storage.googleapis.com/zenn-user-upload/aa4f57f80d2a-20240510.png)

データベースのログインを押下してSecondaryとPrimaryのどちらかを選択　今回はSecondaryにしてみる。

![https://storage.googleapis.com/zenn-user-upload/7c22d120a60e-20240510.png](https://storage.googleapis.com/zenn-user-upload/7c22d120a60e-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/45bc50a4448c-20240510.png](https://storage.googleapis.com/zenn-user-upload/45bc50a4448c-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/7dc57b7d53c3-20240510.png](https://storage.googleapis.com/zenn-user-upload/7dc57b7d53c3-20240510.png)

接続文字列アドレスは自動で入ってくれているので、アカウントとパスワードを入力する。

管理モードが3つあり、個人向けは無料操作or安定した変更で企業向けはセキュリティコラボレーションみたい。

![https://storage.googleapis.com/zenn-user-upload/ec12c271ec21-20240510.png](https://storage.googleapis.com/zenn-user-upload/ec12c271ec21-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/b1652d6d3c32-20240510.png](https://storage.googleapis.com/zenn-user-upload/b1652d6d3c32-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/a99ecc23c314-20240510.png](https://storage.googleapis.com/zenn-user-upload/a99ecc23c314-20240510.png)

セキュリティコラボレーションだとロールバックできるのと、セキュリティルールで各アカウントの権限管理ができそう

今回は個人なので安定した変更つまりStable Changeモードにしていざログイン！

![https://storage.googleapis.com/zenn-user-upload/87b01a10c4eb-20240510.png](https://storage.googleapis.com/zenn-user-upload/87b01a10c4eb-20240510.png)

なんかいろいろ書いてあるけど一旦インスタンスをみてみる

![https://storage.googleapis.com/zenn-user-upload/b8a032bdcf1c-20240510.png](https://storage.googleapis.com/zenn-user-upload/b8a032bdcf1c-20240510.png)

![https://storage.googleapis.com/zenn-user-upload/b16aa563083d-20240510.png](https://storage.googleapis.com/zenn-user-upload/b16aa563083d-20240510.png)

testが今回作ったやつ！ある！
しかしちょっと反映に時間差があったので注意。
テーブルの詳細をみてみるとデータプレビューできそうだったが、制御モードをアップグレードしないと見られないらしい。

![https://storage.googleapis.com/zenn-user-upload/197324e64fcb-20240510.png](https://storage.googleapis.com/zenn-user-upload/197324e64fcb-20240510.png)

ので、素直にクエリを実行してデータ参照してみる。

![https://storage.googleapis.com/zenn-user-upload/48237a9a7a42-20240510.png](https://storage.googleapis.com/zenn-user-upload/48237a9a7a42-20240510.png)

自動で全データ抽出してくれた！便利〜。

とりあえずデータ参照できたのでいちいちローカルのクライアントから繋いでみる手間が省けてめちゃめちゃ楽。
他のDBもまるっと管理できるのは本当にすごい！！！最高。
画面のレイアウトというか表示項目たくさんで慣れるまで時間はかかりそうだけど、できることも多いということだな。

次はACKをいじってみる。

次の記事はこちら！　[ACKをApsaraDB for MongoDBとともに使ってみる](https://qiita.com/maipippi/items/963badd50816fa1c5e5c)