sql >> データベース >  >> NoSQL >> MongoDB

高可用性のためにMongoDB用のPerconaサーバーをデプロイする方法

    本番環境で重要なサービスを実行する場合、高可用性は必須です。これは、データベース層を含むすべての単一障害点を排除することで実現できます。したがって、複数のWebサーバー/アプリケーションがすべて1つのデータベースインスタンスにヒットするセットアップに遭遇するたびに、私たちの驚きを想像することができます。

    MongoDBの高可用性サービスは、レプリケーションによって実現できます。レプリカセットという用語は、複数のMongoDBプロセスが実行され、同じデータを維持するセットアップを表します。このブログでは、高可用性を実現するためにPercona ServerforMongoDBをデプロイする方法について説明します。

    MongoDB用のPerconaサーバーのデプロイ

    高可用性を実現するには、少なくとも3つのノードが必要です。レプリカセットは、1つのプライマリノードと2つのセカンダリノードで構成されます。 1つのプライマリノードと1つのセカンダリノードの2つのノードを使用できますが、3番目のノードとしてアービターが必要です。アービターは、データをコピーして保存しないMongoDBノードですが、フェイルオーバーが発生したときに新しいプライマリーの選出プロセスに関与します。

    この例では、オペレーティングシステムとしてCentOS Linuxリリース7.3を使用して3つの仮想環境を実行しており、インストールにはPercona ServerforMongoDBバージョン4.2を使用します。以下のIPアドレス:

    • mongo-node8:10.10.10.17
    • mongo-node9:10.10.10.18
    • mongo-node10:10.10.10.19

    インストールに入る前に、すべてのノードが各ノードの/ etc/hostsファイルですでに構成されていることを確認してください。

    [[email protected] ~]# cat /etc/hosts
    
    127.0.0.1 mongo-node9 mongo-node9
    
    127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
    
    ::1         localhost localhost.localdomain localhost6 localhost6.localdomain6
    
    10.10.10.17 mongo-node8
    
    10.10.10.18 mongo-node9
    
    10.10.10.19 mongo-node10

    次に、各ノードでPerconaリポジトリを構成する必要があります。その後、以下に示すように、psmdb42のリポジトリを有効にします。

    [[email protected] ~]# percona-release setup psmdb42
    
    * Disabling all Percona Repositories
    
    * Enabling the Percona Server for MongoDB 4.2 repository
    
    * Enabling the Percona Tools repository
    
    <*> All done!

    次に、Percona Server for MongoDBパッケージのインストールを続行します:

    [[email protected] ~]# yum install percona-server-mongodb*
    
    Loaded plugins: fastestmirror
    
    Loading mirror speeds from cached hostfile
    
     * base: centos.mirror.angkasa.id
    
     * extras: centos.mirror.angkasa.id
    
     * updates: centos.mirror.angkasa.id
    
    Resolving Dependencies
    
    --> Running transaction check
    
    ---> Package percona-server-mongodb.x86_64 0:4.2.9-10.el7 will be installed
    
    --> Processing Dependency: cyrus-sasl-gssapi for package: percona-server-mongodb-4.2.9-10.el7.x86_64
    
    --> Processing Dependency: numactl for package: percona-server-mongodb-4.2.9-10.el7.x86_64
    
    ---> Package percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7 will be installed
    
    ---> Package percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7 will be installed
    
    --> Processing Dependency: libcrypto.so.10(OPENSSL_1.0.2)(64bit) for package: percona-server-mongodb-mongos-4.2.9-10.el7.x86_64
    
    ---> Package percona-server-mongodb-server.x86_64 0:4.2.9-10.el7 will be installed
    
    ---> Package percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7 will be installed
    
    ---> Package percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7 will be installed
    
    --> Running transaction check
    
    ---> Package cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7 will be installed
    
    --> Processing Dependency: cyrus-sasl-lib(x86-64) = 2.1.26-23.el7 for package: cyrus-sasl-gssapi-2.1.26-23.el7.x86_64
    
    ---> Package numactl.x86_64 0:2.0.12-5.el7 will be installed
    
    ---> Package openssl-libs.x86_64 1:1.0.1e-60.el7_3.1 will be updated
    
    --> Processing Dependency: openssl-libs(x86-64) = 1:1.0.1e-60.el7_3.1 for package: 1:openssl-1.0.1e-60.el7_3.1.x86_64
    
    ---> Package openssl-libs.x86_64 1:1.0.2k-19.el7 will be an update
    
    --> Running transaction check
    
    ---> Package cyrus-sasl-lib.x86_64 0:2.1.26-20.el7_2 will be updated
    
    ---> Package cyrus-sasl-lib.x86_64 0:2.1.26-23.el7 will be an update
    
    ---> Package openssl.x86_64 1:1.0.1e-60.el7_3.1 will be updated
    
    ---> Package openssl.x86_64 1:1.0.2k-19.el7 will be an update
    
    --> Finished Dependency Resolution
    
    
    
    Dependencies Resolved
    
    
    
    ================================================================
    
     Package                      Arch   Version         Repository
    
                                                               Size
    
    ================================================================
    
    Installing:
    
     percona-server-mongodb       x86_64 4.2.9-10.el7    psmdb-42-release-x86_64
    
                                                              4.9 k
    
     percona-server-mongodb-debuginfo
    
                                  x86_64 4.2.9-10.el7    psmdb-42-release-x86_64
    
                                                              885 M
    
     percona-server-mongodb-mongos
    
                                  x86_64 4.2.9-10.el7    psmdb-42-release-x86_64
    
                                                               10 M
    
     percona-server-mongodb-server
    
                                  x86_64 4.2.9-10.el7    psmdb-42-release-x86_64
    
                                                               22 M
    
     percona-server-mongodb-shell x86_64 4.2.9-10.el7    psmdb-42-release-x86_64
    
                                                               12 M
    
     percona-server-mongodb-tools x86_64 4.2.9-10.el7    psmdb-42-release-x86_64
    
                                                               30 M
    
    Installing for dependencies:
    
     cyrus-sasl-gssapi            x86_64 2.1.26-23.el7   base  41 k
    
     numactl                      x86_64 2.0.12-5.el7    base  66 k
    
    Updating for dependencies:
    
     cyrus-sasl-lib               x86_64 2.1.26-23.el7   base 155 k
    
     openssl                      x86_64 1:1.0.2k-19.el7 base 493 k
    
     openssl-libs                 x86_64 1:1.0.2k-19.el7 base 1.2 M
    
    
    
    Transaction Summary
    
    ================================================================
    
    Install  6 Packages (+2 Dependent packages)
    
    Upgrade             ( 3 Dependent packages)
    
    
    
    Total download size: 960 M
    
    Is this ok [y/d/N]:
    
    . . . .
    
    Installed:
    
      percona-server-mongodb.x86_64 0:4.2.9-10.el7
    
      percona-server-mongodb-debuginfo.x86_64 0:4.2.9-10.el7
    
      percona-server-mongodb-mongos.x86_64 0:4.2.9-10.el7
    
      percona-server-mongodb-server.x86_64 0:4.2.9-10.el7
    
      percona-server-mongodb-shell.x86_64 0:4.2.9-10.el7
    
      percona-server-mongodb-tools.x86_64 0:4.2.9-10.el7
    
    
    
    Dependency Installed:
    
      cyrus-sasl-gssapi.x86_64 0:2.1.26-23.el7
    
      numactl.x86_64 0:2.0.12-5.el7
    
    
    
    Dependency Updated:
    
      cyrus-sasl-lib.x86_64 0:2.1.26-23.el7
    
      openssl.x86_64 1:1.0.2k-19.el7
    
      openssl-libs.x86_64 1:1.0.2k-19.el7
    他のノードでインストールを繰り返します。インストールが完了したら、以下に示すように、/ etc/mongod.confのbindIP構成をローカルホストIPアドレスからすべてのプライベートIPアドレスに変更してください。

    # network interfaces
    
    net:
    
      port: 27017
    
      bindIp: 0.0.0.0

    セキュリティ上の理由から、bindIPパラメータのIPアドレスを制限することもできます。区切り文字としてセミコロンを使用してIPアドレスを追加するだけです。

    以下の例に示すように、3つのノード間でMongoDBインスタンスに接続できることを確認してください。

    [[email protected] ~]# mongo --host 10.10.10.19 --port 27017
    
    Percona Server for MongoDB shell version v4.2.9-10
    
    connecting to: mongodb://10.10.10.19:27017/?compressors=disabled&gssapiServiceName=mongodb
    
    Implicit session: session { "id" : UUID("99afee8f-a194-4d0a-963a-6dfdc17f5bee") }
    
    Percona Server for MongoDB server version: v4.2.9-10
    
    Server has startup warnings:
    
    2020-10-30T04:38:46.244+0000 I  CONTROL  [initandlisten]
    
    2020-10-30T04:38:46.244+0000 I  CONTROL  [initandlisten] ** WARNING: Access control is not enabled for the database.
    
    2020-10-30T04:38:46.244+0000 I  CONTROL  [initandlisten] **          Read and write access to data and configuration is unrestricted.
    
    2020-10-30T04:38:46.244+0000 I  CONTROL  [initandlisten] **          You can use percona-server-mongodb-enable-auth.sh to fix it.
    
    2020-10-30T04:38:46.244+0000 I  CONTROL  [initandlisten]

    次のステップは、MongoDBでレプリカセットを構成することです。以下に示すように、ファイル/etc/mongod.confを編集してレプリケーションセクションのコメントを解除し、パラメーターreplSetNameを追加する必要があります。

    replication:
    
      replSetName: "my-mongodb-rs"

    このインストールでは、レプリカセット名my-mongodb-rsを使用します。レプリケーション構成を追加したら、mongodbサービスを再起動します。

    $ service mongod restart
    他のノードで構成を繰り返します。

    完了したら、ノードの1つでレプリケーションを初期化する必要があります。以下に示すように、mongodbに接続し、rs.initiate()コマンドを実行します。

    > rs.initiate()
    
    {
    
    "info2" : "no configuration specified. Using a default configuration for the set",
    
    "me" : "mongo-node8:27017",
    
    "ok" : 1,
    
    "$clusterTime" : {
    
    "clusterTime" : Timestamp(1604036305, 1),
    
    "signature" : {
    
    "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    
    "keyId" : NumberLong(0)
    
    }
    
    },
    
    "operationTime" : Timestamp(1604036305, 1)
    
    }
    
    my-mongodb-rs:OTHER>
    
    my-mongodb-rs:PRIMARY>

    ノードでわかるように、レプリケーションを開始する最初のノードがPRIMARYノードになります。レプリケーションに参加するには、残りのノードを追加する必要があります。

    次のように、PRIMARYノードでrs.add()コマンドを使用して他のノードを追加します。

    my-mongodb-rs:PRIMARY> rs.add("mongo-node9:27017");
    
    {
    
    "ok" : 1,
    
    "$clusterTime" : {
    
    "clusterTime" : Timestamp(1604037158, 1),
    
    "signature" : {
    
    "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    
    "keyId" : NumberLong(0)
    
    }
    
    },
    
    "operationTime" : Timestamp(1604037158, 1)
    
    }
    
    my-mongodb-rs:PRIMARY> rs.add("mongo-node10:27017");
    
    {
    
    "ok" : 1,
    
    "$clusterTime" : {
    
    "clusterTime" : Timestamp(1604037170, 1),
    
    "signature" : {
    
    "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    
    "keyId" : NumberLong(0)
    
    }
    
    },
    
    "operationTime" : Timestamp(1604037170, 1)
    
    }

    initialize()コマンドを使用してレプリカセットを開始する別のオプションは、以下に示すように、すべてのノードのノードのIPアドレス情報を渡すことです。

    rs.initiate( {
    
           _id: "my-mongodb-rs",
    
           members: [
    
           { _id: 0, host: "mongo-node8:27017" },
    
           { _id: 1, host: "mongo-node9:27017" },
    
           { _id: 2, host: "mongo-node10:27017" }
    
           ] })

    任意のクラスターノードでrs.status()コマンドを使用して、現在のレプリカセットクラスターを確認できます。

    my-mongodb-rs:PRIMARY> rs.status()
    
    {
    
    "set" : "my-mongodb-rs",
    
    "date" : ISODate("2020-10-30T06:27:41.693Z"),
    
    "myState" : 1,
    
    "term" : NumberLong(1),
    
    "syncingTo" : "",
    
    "syncSourceHost" : "",
    
    "syncSourceId" : -1,
    
    "heartbeatIntervalMillis" : NumberLong(2000),
    
    "majorityVoteCount" : 2,
    
    "writeMajorityCount" : 2,
    
    "optimes" : {
    
    "lastCommittedOpTime" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "lastCommittedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
    
    "readConcernMajorityOpTime" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "readConcernMajorityWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
    
    "appliedOpTime" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "durableOpTime" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "lastAppliedWallTime" : ISODate("2020-10-30T06:27:28.305Z"),
    
    "lastDurableWallTime" : ISODate("2020-10-30T06:27:28.305Z")
    
    },
    
    "lastStableRecoveryTimestamp" : Timestamp(1604039245, 1),
    
    "lastStableCheckpointTimestamp" : Timestamp(1604039245, 1),
    
    "electionCandidateMetrics" : {
    
    "lastElectionReason" : "electionTimeout",
    
    "lastElectionDate" : ISODate("2020-10-30T05:38:25.155Z"),
    
    "electionTerm" : NumberLong(1),
    
    "lastCommittedOpTimeAtElection" : {
    
    "ts" : Timestamp(0, 0),
    
    "t" : NumberLong(-1)
    
    },
    
    "lastSeenOpTimeAtElection" : {
    
    "ts" : Timestamp(1604036305, 1),
    
    "t" : NumberLong(-1)
    
    },
    
    "numVotesNeeded" : 1,
    
    "priorityAtElection" : 1,
    
    "electionTimeoutMillis" : NumberLong(10000),
    
    "newTermStartDate" : ISODate("2020-10-30T05:38:25.171Z"),
    
    "wMajorityWriteAvailabilityDate" : ISODate("2020-10-30T05:38:25.180Z")
    
    },
    
    "members" : [
    
    {
    
    "_id" : 0,
    
    "name" : "mongo-node8:27017",
    
    "health" : 1,
    
    "state" : 1,
    
    "stateStr" : "PRIMARY",
    
    "uptime" : 3014,
    
    "optime" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "optimeDate" : ISODate("2020-10-30T06:27:28Z"),
    
    "syncingTo" : "",
    
    "syncSourceHost" : "",
    
    "syncSourceId" : -1,
    
    "infoMessage" : "",
    
    "electionTime" : Timestamp(1604036305, 2),
    
    "electionDate" : ISODate("2020-10-30T05:38:25Z"),
    
    "configVersion" : 7,
    
    "self" : true,
    
    "lastHeartbeatMessage" : ""
    
    },
    
    {
    
    "_id" : 1,
    
    "name" : "mongo-node9:27017",
    
    "health" : 1,
    
    "state" : 2,
    
    "stateStr" : "SECONDARY",
    
    "uptime" : 226,
    
    "optime" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "optimeDurable" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "optimeDate" : ISODate("2020-10-30T06:27:28Z"),
    
    "optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
    
    "lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
    
    "lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.519Z"),
    
    "pingMs" : NumberLong(0),
    
    "lastHeartbeatMessage" : "",
    
    "syncingTo" : "mongo-node8:27017",
    
    "syncSourceHost" : "mongo-node8:27017",
    
    "syncSourceId" : 0,
    
    "infoMessage" : "",
    
    "configVersion" : 7
    
    },
    
    {
    
    "_id" : 2,
    
    "name" : "mongo-node10:27017",
    
    "health" : 1,
    
    "state" : 2,
    
    "stateStr" : "SECONDARY",
    
    "uptime" : 201,
    
    "optime" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "optimeDurable" : {
    
    "ts" : Timestamp(1604039248, 1),
    
    "t" : NumberLong(1)
    
    },
    
    "optimeDate" : ISODate("2020-10-30T06:27:28Z"),
    
    "optimeDurableDate" : ISODate("2020-10-30T06:27:28Z"),
    
    "lastHeartbeat" : ISODate("2020-10-30T06:27:40.520Z"),
    
    "lastHeartbeatRecv" : ISODate("2020-10-30T06:27:40.688Z"),
    
    "pingMs" : NumberLong(0),
    
    "lastHeartbeatMessage" : "",
    
    "syncingTo" : "mongo-node8:27017",
    
    "syncSourceHost" : "mongo-node8:27017",
    
    "syncSourceId" : 0,
    
    "infoMessage" : "",
    
    "configVersion" : 7
    
    }
    
    ],
    
    "ok" : 1,
    
    "$clusterTime" : {
    
    "clusterTime" : Timestamp(1604039248, 1),
    
    "signature" : {
    
    "hash" : BinData(0,"AAAAAAAAAAAAAAAAAAAAAAAAAAA="),
    
    "keyId" : NumberLong(0)
    
    }
    
    },
    
    "operationTime" : Timestamp(1604039248, 1)
    
    }

    ClusterControlを使用してMongoDBにPerconaサーバーをデプロイする

    ClusterControlは、MongoDB用のPerconaServerのデプロイをサポートしています。サポートされているバージョンには、3.4、3.6、4.0、および4.2が含まれます。デプロイは簡単です。デプロイに移動し、以下に示すようにMongoDBレプリカセットタブを選択するだけです。

    SSHユーザー、パスワード、ポート、およびクラスター名を入力します。 ClusterControlでは、インストールする前に、コントローラーノードとターゲットデータベースノードの間にパスワードなしのSSHを設定する必要があります。すべての情報を入力したら、[続行]をクリックします。以下に示すような別のページがあります:

    ベンダーとしてPerconaを選択し、インストールするバージョンを選択します。カスタムMongoDBデータディレクトリがある場合は、それを指定する必要があります。 MongoDBの管理者ユーザーとパスワードを設定します。デフォルト(re。27017)を使用する代わりに別のポートを使用する場合は、別のポート番号に変更できます。最後のステップは、[ノードの追加]コンボボックスにターゲットデータベースノードのIPアドレスを入力することです。

    すべてが終了したら、[デプロイ]ボタンをクリックするだけです。以下に示すように、MongoDBクラスターをデプロイするジョブがトリガーされます。

    デプロイが完了すると、既に表示されている[概要]ページが表示されます。稼働中のMongoDB用PerconaServerの3つのインスタンス。

    以下のトポロジビューは、1つのプライマリノードと2つのセカンダリノードがあることを示しています。


    1. ベンダーロックインなしのMongoDB4.2管理と監視

    2. データベースを更新した後にredisを更新するにはどうすればよいですか?

    3. Redis:データベースのサイズ/キーのサイズを表示

    4. redisサブスクリプションの出力をリダイレクトする方法