AWS EC2 on MongoDBでレプリカセットをsystemdを使って自動起動させてみた

## mongodbレプリカセットとは

![img-products-mongodb.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3904291/7f777972-0e74-f22d-9cb6-5100a189a2ab.png)

>MongoDBは、JSONライクなドキュメントを使用する動的スキーマのNoSQLデータベースです。一般に、データベースを運用する際には、データベースサーバーの1つが故障したときの対応策を常に用意しておくのがベストプラクティス。補足ですが、WordPressサイトで優れた管理ツールを活用することで、このような事態が発生する可能性を軽減することができます。

> レプリカセットとは、レプリケーションを介して同じデータセットを維持するサーバー群です。またレプリケーションは、ロードバランシングの一部としても使用することができます。書き込みと読み込みの操作は、ユースケースに応じてすべてのインスタンスに分散されます。

## **この記事でわかる・できること**

- **EC2内にmongodbレプリカセットプロセスを立ち上げる方法**
- **mongodbレプリカセットプロセスをsystemdで管理する方法**

## **動作環境・使用するツールや言語**

- **OS バージョン**
  - amazonlinux2

- **言語 バージョン**
  - mongodb 5系

## **前提**

- mongodbがインストール済であること

## **手順**

### **mongodプロセス立ち上げ**

1. mongod設定ファイル配置ディレクトリ作成

    ```linux:
    $ mkdir -p /usr/data/db{1,2,3}
    ```

2. mongod設定ファイル作成

    ```linux:
    $ vi /usr/data/db1/mongod.conf
    $ cat /usr/data/db1/mongod.conf
    $ cp -p /usr/data/db1/mongod.conf /usr/data/db2/
    $ cp -p /usr/data/db1/mongod.conf /usr/data/db3/
    $ vi /usr/data/db2/mongod.conf
    $ cat /usr/data/db2/mongod.conf
        →path,dbPathは「db2」,portは「28018」に変更
    $ vi /usr/data/db3/mongod.conf
    $ cat /usr/data/db3/mongod.conf
        →path,dbPathは「db3」,portは「28019」に変更
    ```

    ```linux: mongod.conf
    systemLog:
        destination: file
        path: /usr/data/db1/mongod.log
        logAppend: true
    storage:
        dbPath: /usr/data/db1
    net:
        bindIp: 0.0.0.0
        port: 28017
    replication:
        replSetName: rs0
    processManagement:
        fork: true
    ```

3. 設定ファイル適用

    ```linux:
    $ mongod -f /usr/data/db1/mongod.conf
    $ mongod -f /usr/data/db2/mongod.conf
    $ mongod -f /usr/data/db3/mongod.conf
    ```

4. プライマリインスタンスに接続
    ```linux:
    $ mongosh localhost:28017
    ```

5. レプリカセットのメンバー追加(プライマリー→セカンダリー)
    ```linux:
    $ rs.initiate({ _id: "rs0", members: [{ _id: 0, host: "localhost:28017"},{_id: 1, host: "localhost:28018"},{_id: 2,host:"localhost:28019"}]})
    ```

6. メンバーの追加状況確認
    ```linux:
    $ rs.status()
    ```

### **systemdによる自動起動**

1. systemdで実行するシェルスクリプトを作成

    ```linux:
    $ mkdir -p /opt/mongo
    $ vi /opt/mongo/mongod.sh
    $ cat /opt/mongo/mongod.sh
    $ chmod 0755 /opt/mongo/mongod.sh
    ```

    ```linux: mongod.sh
    #! /bin/bash
    mongod  -f /usr/data/db1/mongod.conf
    mongod  -f /usr/data/db2/mongod.conf
    mongod  -f /usr/data/db3/mongod.conf
    ```

2. systemdのunit定義ファイル作成

   ```linux:
    $ vi /etc/systemd/system/mongod-replicasets.service
    $ cat /etc/systemd/system/mongod-replicasets.service
   ```

   ```linux: mongod-replicasets.service
    [Unit]
    Description = mongodb replicasets

    [Service]
    ExecStart = /opt/mongo/mongod.sh
    Restart = always
    Type = simple
    RemainAfterExit = yes

    [Install]
    WantedBy = multi-user.target
    ```

3. systemdにユニットファイルを追加・更新したことを通知する

   ```linux:
    $ systemctl daemon-reload
    ```

4. unitsがserviceとして認識されたか確認

   ```linux:
    $ systemctl list-unit-files --type=service | grep mongo
    ```

5. サービス起動、自動起動設定ON

   ```linux:
    $ systemctl start mongod-replicasets
    $ systemctl enable mongod-replicasets
    $ systemctl status mongod-replicasets
    ```

6. EC2再起動 or mongod のプロセスをすべてkill

   ```linux:
    EC2再起動
    or
    $ ps aux | grep mongod
    $ kill <プロセスID>
    ```

7. 再起動後動作確認

   ```linux:
    $ ps aux | grep mongod
    $ mongo localhost:28017
    ```

## **参考資料**

[ローカル環境でMongoDBのReplicationを構成する方法](https://note.shiftinc.jp/n/nfa34d7bd6715)
[Systemdを使ってさくっと自作コマンドをサービス化してみる](https://qiita.com/DQNEO/items/0b5d0bc5d3cf407cb7ff)

## **おわりに・まとめ**

mongodbレプリカセットについて構築手順をまとめてみました。
他にも構築中にあったエラーの解消やアクセス制御の方法などを記事にできればと思います