Ubuntu 16.04でアクセス制御にキーファイルを使用してMongoDB 3.4に高可用性のレプリカセットをデプロイする

2009年の構想以来、MongoDBはNoSQL業界をリードしてきました。MongoDBのコアコンセプトの1つはレプリカセットです。そのため、作業する前にまずコンセプトを確認してください。

レプリカセットについて

データベースのレプリケーションで使用される最も単純な通信モデルは、マスタースレーブアーキテクチャです。その名前が示すように、このモデルには2つの役割があり、一意のマスターと多くのスレーブに分散しています。マスターの役割は、クライアントによって実行される読み取り操作と書き込み操作を処理することであり、スレーブはマスターのレプリカとして扱われます。

このモデルの最も重要な利点は、マスターのパフォーマンスがバックアップ操作によって損なわれず、バックアップ操作が非同期で行われることであり、マスターノードに障害が発生すると、これが深刻な問題になる可能性があります。スレーブノードは読み取り専用であり、手動でマスターノードに昇格する必要があるため、今回はデータが失われる可能性があります。

可用性の問題を解決する1つのオプションは、アーキテクチャに複数のマスターを含めることですが、これにより、これらのインスタンス間のデータの一貫性と構成の複雑さが増すという別の問題が発生する可能性があります。

ここで、コンテキストを指定して、MongoDBのレプリカセットテクノロジーを紹介できます。レプリカセットは、自動フェイルオーバーを備えたマスタースレーブアーキテクチャの名前です。そのため、マスター(現在の名前はprimary)が正しく機能しなくなったときに、electionがトリガーされ、残りのスレーブ(現在はsecondaries)と呼ばれます。

プライマリノード

プライマリノードは書き込み操作を実行する唯一のノードです。デフォルトでは、読み取り操作もプライマリによって処理されますが、この動作は後で変更できます。

操作はoplog(操作ログ)に記録され、セカンダリノードはコンテンツのコンテンツに基づいて非同期でコンテンツを更新しますoplog

注:oplogは上限付きのコレクションです。これは、コレクションに制限があることを意味し、local.oplog.rs任意のセットメンバーのmongoシェル内でこのコレクションのコンテンツを確認できます。

セカンダリノード

セカンダリノードには、データベースの適切なバックアップを行う役割の他に、次の役割があります。

  • 必要に応じて読み取り操作を受け入れることができます。
  • プライマリノードに障害が発生した場合に選択をトリガーできます。
  • 選挙で投票できます。
  • 必要に応じて、新しいプライマリになることができます。

これらの特性により、さまざまなタイプのセカンダリノードを使用できます。

  • 優先度0:これらのノードはになることはprimaryで���ず、選択をトリガーすることもできませんが、選択に投票でき、完全なレプリカを持ち、読み取り操作を受け入れることができます。これらは、マルチデータセンターの展開に役立ちます。
  • 非表示:これらはPriority 0メンバーですが、さらに読み取り操作を処理できません。必要に応じて投票することができます。これらのメンバーの優先タスクは、レポートとバックアップです。
  • 遅延:これらのノードは、時間単位で遅延されることにより、「履歴データ」を担当します。遅延メンバーはpriority 0ノードである必要があり、それらもhiddenメンバーであることが推奨されます。

前提条件

  • 同じサーバーサイズでUbuntu 16.04 x64のインスタンスを3つ以上実行できること。

レプリカセットを設計する

インフラストラクチャを展開する前にそれを設計することが重要であり、この設計には考慮すべき点があります。

メンバー数の選択

レプリカセットを作成するための要素の最小数は3であることに注意してください。3つのタイプのノードを少なくとも1つのプライマリノードと1つのセカンダリノードで混在させることができます。

このガイドでは、1つのプライマリと2つの標準セカンダリの3つのメンバーを展開しています。

注:アービターとセカンダリメンバーが混在する最大7名の投票メンバーがいることをお勧めします。

名前を選択してください

名前は参照用ですが、セットの構成で使用しています。本番環境では複数のレプリカセットを使用できるため、セットの名前を無視しないでください。

このチュートリアルでは、ユーザーにセットの名前を選択するように勧めています。

異なるデータセンターでのメンバーの分布

このチュートリアルでは、通信の問題を回避できるように、同じデータセンターにデプロイすることをお勧めします。

注:異なるデータセンターに展開する場合は、ノードをVPNで囲むことをお勧めします

導入手順

ステップ1:インフラストラクチャの最小ノードをデプロイする

Ubuntu 16.04 x64の3つのノードを起動します。可能な場合は、カスタマーポータルと同じリージョンにあります。対処するプロジェクトのタイプに応じて名前を付けることを忘れないでください。また、これらすべてのノードで同じサーバーサイズになるようにしてください。

3つのノードを展開したら、すべてのノードが残りのノードと通信できることを確認する必要があります。2つのノードにSSHで接続し、を使用して他のノードに到達する必要がありますping -c 4 EXAMPLE_IPEXAMPLE_IPノードの実際のIPに変更します。

ここでは、2つのノード間の正常な通信の例を確認できます。

root@foo_node:~# ping -c 4 EXAMPLE_IP
PING EXAMPLE_IP (EXAMPLE_IP) 56(84) bytes of data.
64 bytes from EXAMPLE_IP: icmp_seq=1 ttl=59 time=0.594 ms
64 bytes from EXAMPLE_IP: icmp_seq=2 ttl=59 time=0.640 ms
64 bytes from EXAMPLE_IP: icmp_seq=3 ttl=59 time=0.477 ms
64 bytes from EXAMPLE_IP: icmp_seq=4 ttl=59 time=0.551 ms

--- EXAMPLE_IP ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3021ms
rtt min/avg/max/mdev = 0.477/0.565/0.640/0.064 ms

ステップ2:インフラストラクチャの各ノードにMongoDBをインストールする

一般に、UbuntuのMongoDBパッケージを使用できますが、常に最新であるため、公式のコミュニティリポジトリを使用することをお勧めします。このリポジトリには、次のパッケージが含まれています。

  • mongodb-orgは、4つのコンポーネントを囲むグループパッケージです。
  • mongodb-org-server、これにはmongodデーモン(データ要求を処理するプライマリプロセス)が含まれます。
  • mongodb-org-mongos、これにはmongosデーモン(共有デプロイメントのルーティングサービス)が含まれます。
  • mongodb-org-shell、これはmongo shellJavaScriptインターフェースです。
  • mongodb-org-tools、管理活動のためのいくつかのツール。

パッケージのインストールに進みます。

公開鍵をパッケージ管理システムにインポートします。

sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv 0C49F3730359A14518585931BC711F9BA15703C6

MongoDBのリストファイル「/etc/apt/sources.list.d/mongodb-org-3.4.list」を作成します。

echo "deb [ arch=amd64,arm64 ] http://repo.mongodb.org/apt/ubuntu xenial/mongodb-org/3.4 multiverse" | sudo tee /etc/apt/sources.list.d/mongodb-org-3.4.list

パッケージデータベースを更新します。

sudo apt-get update

MongoDBメタパッケージをインストールします。

sudo apt-get install -y mongodb-org

MongoDBサービスを開始します。

sudo service mongod start

これmongo shellで、任意のbashセッションでを開くことができます。これを行うには、mongoコマンドを使用する必要があります。あなたはこれに似た何かによって迎えられるでしょう。

MongoDB shell version v3.4.7
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.7
Welcome to the MongoDB shell.
For interactive help, type "help".
For more comprehensive documentation, see http://docs.mongodb.org/
Questions? Try the support group
http://groups.google.com/group/mongodb-user
Server has startup warnings:
*Some extra logs are cut by the way*
>

sudo service mongod stop後でmongodいくつかのパラメータを使用して再び開始するため、でサービスを停止することを忘れないでください。セットの3つのノードすべてでこのプロセスを繰り返します。

手順3:アクセスキーファイルを構成する

キーファイルを使用すると、レプリカセット管理で2つの概念が強制されます。最初はInternal Authenticationです。デフォルトではmongo shell、ユーザーを使用せずにセッションを開始でき、このセッションはデータベースを完全に制御できますが、認証にキーファイルを使用すると、mongo shellセッションはという状態になりlocalhost exceptionます。この状態では、管理者ユーザーとレプリカセットのみを作成できます。2番目の概念はRole-Based Access Control、つまり、承認です。これは、レプリカセットの管理レベルを管理するために適用されます。

キーファイルを作成する

キーファイルは、セットで使用するパスワードです。このパスワードは、セットのすべてのメンバーで同じである必要があります。セキュリティを強化するには、任意のツールでランダムキーを使用することが重要です。

コンテンツの長さは6〜1064文字にする必要があります。またread only、キーファイルの権限を設定する必要があります。

chmod 400 PATH_OF_YOUR_KEYFILE
キーファイルを各セットメンバーに配置する

キーファイルをすべてのセットメンバーにコピーします。将来の参照のために一貫したフォルダーを使用し、リムーバブルメディアに保存しないでください。

また、mongodアクセスできるファイルのフォルダを使用してください。

レプリカセットのキーファイルの使用を強制する

このステップではmongod daemon 、すべてのセットメンバーでを開始する必要があります。mongodプロセスを開始するには、設定ファイルを使用する方法とコマンドラインを使用する方法の2つがあります。どちらも非常に簡単な方法ですが、簡単にするために、このチュートリアルではコマンドラインバージョンを使用しています。

コマンドライン構成

このコマンドで前に選択した名前を使用します。

mongod --keyFile PATH_OF_YOUR_KEYFILE --replSet "YOUR_SET_NAME"

デフォルトでmongodは、デーモンとして実行されません。--forkパラメータを使用するか、upstartを使用してデーモンとして完全に実行する必要があります。このチュートリアルではmongod、デーモンとして実行することはお勧めしません。ターミナルに直接ログを表示できます。

注:作成したレプリカセットは変更できないため、レプリカセットの名前は慎重に入力してください。

ステップ4:セットメンバーの1つからlocalhostインターフェイスに接続する

注:mongodデーモン以外のプロセスとして実行する場合、作業を続行するには別のssh接続を開く必要があります。

mongoコマンドを使用してを開く必要がありますmongo shell。これは、セットの任意のメンバーで実行できます。

現在、私たちはと呼ばれる状態にありlocalhost exceptionます。キーmongodファイルを使用してプロセスを設定する場合、読み取り/書き込み操作を適用する前にデータベース管理者を作成する必要がありますが、これについては後で説明します。

手順5:レプリカセットを開始する

これはデリケートな部分です。ステップ4のrs.initiate()内のコマンドを使用してmongo shellいます。このコマンドを使用する前に確認してみましょう。

rs.initiate(
  {
    _id : <replicaSetName>,
    members: [
      { _id : 0, host : "example1.net:27017" },
      { _id : 1, host : "example2.net:27017" },
      { _id : 2, host : "example3.net:27017" }
    ]
  }
)

最初の_idフィールドは文字列で、--replSet以前にに渡されたと一致する必要がありますmongod。また、の各値hostは、レプリカセットの各メンバーのIPまたはドメイン名である必要があります。mongoインスタンスが各メンバーで使用しているポートを追加することを忘れないでください。

データを使用してコマンドを実行します。これによりがトリガーelectionされ、プライマリが自動的に選択されます。

ここで、シェルカーソルがYOUR_SET_NAME:PRIMARY>またはに変更されていることに注意してくださいYOUR_SET_NAME:SECONDARY。これは、セットの作成が成功したことを意味します。

作業を続けるprimaryには、もちろんが見つからない場合はを見つける必要があります。rs.status()コマンドを使用してレプリカセットの情報を表示し、を見つけますprimary。あなたは物件を探しています"stateStr" : "PRIMARY"

ステップ6:管理者を作成する

を見つけたらprimary、を入力mongo shellし、データを使用して次のコマンドを実行します。

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "YOUR_USER",
    pwd: "YOU_PASSWORD",
    roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
  }
)

このadmin = db.getSiblingDB("admin")部分でadminは、別のデータベースから書き込むことができます。これにより、というエイリアスが作成されるadminため、代わりにそれを使用してコマンドを実行できます。

操作が成功すると、ユーザーが追加されたという通知が表示されます。

Successfully added user: {
    "user" : "YOUR_USER",
    "roles" : [
        {
            "role" : "userAdminAnyDatabase",
            "db" : "admin"
        }
    ]
}

この時点では、すべてのサーバーの管理者しかいませんが、レプリカセットを持っていると、clusterAdmin役割を持つユーザーが必要になります。問題を分離するために、その役割のみを持つ別のユーザーを作成します。

ステップ7:管理者としての認証

の制限に達したlocalhost exceptionため、1ステップ前に作成したユーザーの認証を変更する必要があります。

内のユーザーmongo shellは次のように変更できます。

db.getSiblingDB("admin").auth("YOUR_ADMIN", "YOUR_PASSWORD" )

にまだ接続していない場合は、mongo shell代わりにこのコマンドを使用してください。

mongo -u "YOUR_ADMIN" -p "YOUR_PASSWORD" --authenticationDatabase "admin"

ユーザーの変更が通知され、次のステップに進むことができます。

ステップ8:クラスターマスターの作成

このclusterAdmin役割により、ユーザーはレプリカセットを完全に制御できます。作成は、adminユーザーを作成するのと同じくらい簡単です。

db.getSiblingDB("admin").createUser(
  {
    "user" : "YOUR_USER",
    "pwd" : "YOUR_PASSWORD",
    roles: [ { "role" : "clusterAdmin", "db" : "admin" } ]
  }
)

今回はロールがに変更されていることに注意してくださいclusterAdmin

手順9:データをレプリカセットに挿入する

現在、2人の管理者ユーザーがいます。1人はサーバーを完全に制御し、もう1人はレプリカセットレベルの管理タスクにアクセスします。ただし、データベースを「使用」するアクセス権を持つユーザーが不足しているため、ここでそのユーザーを作成します。

admin = db.getSiblingDB("admin")
admin.createUser(
  {
    user: "YOUR_USER",
    pwd: "YOUR_PASSWORD",
    roles: [ { role: "userAdminAnyDatabase", db: "cars" } ]
  }
)

今回はdbパーツを変更していることに注意してください。ここでは、ユーザーがデータベースにアクセスできるようにしています。この場合は、という名前のデータベースを使用していますcars

データベースはまだ作成されていません。そのためには、いくつかのコマンドを入力して暗黙的に作成する必要があります。carsデータベースに切り替えます。

use cars

通知が届きますswitched to db cars

データベースはまだ作成されていないため、データベースに何かを書き込む必要があります。次の例を使用しています。

db.models.insert({ make: "Dodge", model: "Viper", year: 2010 })

今回はで通知されWriteResult({ "nInserted" : 1 })ます。

必要に応じて、次のメソッドを使用して、データベース内のすべてのオブジェクトを取得できますfind()

db.models.find()
{ "_id" : ObjectId("59acd8b55334882863541ff4"), "make" : "Dodge", "model" : "Viper", "year" : 2010 }

_id出力は異なりますが、他のデータは同じであることに注意してください。十分な時間が与えられると、このデータは他のメンバーに複製されます。

結論

理解しなければならない情報がたくさんあるため、レプリカセットの作成は最初は難しいかもしれませんが、その背後にあるアイデアを理解したら、簡単にそれを展開できるので、初めて理解できない場合でも諦めないでください。レプリカセットは、ロードバランシングなどの高度な機能を追加する可能性を開くため、MongoDBの管理において重要であることを覚えておいてください。



Leave a Comment

MongoDBの保護

MongoDBの保護

MongoDBはデフォルトでは安全ではありません。MongoDBをインストールし、認証用に構成せずにMongoDBを起動する場合は、時間がかかります

CentOS 7にLaravel GitScrumをインストールする方法

CentOS 7にLaravel GitScrumをインストールする方法

Laravel GitScrum(GitScrum)は、開発チームがスクラム手法を同様の方法で実装できるように設計されたオープンソースの生産性ツールです。

Arch LinuxにPostgreSQL 11.1をインストールする方法

Arch LinuxにPostgreSQL 11.1をインストールする方法

前提条件最新のArch Linuxを実行しているVultrサーバー(この記事を参照してください。)Sudoアクセス。rootとして実行する必要のあるコマンドには、先頭に#が付いています。

OpenBSD 6でMariaDBを設定する

OpenBSD 6でMariaDBを設定する

この記事では、MariaDBをOpenBSD 6にインストールし、chrootされたWebサーバー(ApacheまたはNginx)からアクセスできるように構成する方法を紹介します。あなたはアルになります

Ubuntu 16.04にArangoDBをインストールして使用する方法

Ubuntu 16.04にArangoDBをインストールして使用する方法

別のシステムを使用していますか?はじめにArangoDBは、ドキュメント、グラフ、Key-Valueの柔軟なデータモデルを備えたオープンソースのNoSQLデータベースです。です

MySQLデータベースのバックアップ

MySQLデータベースのバックアップ

MySQLは、データベースに使用されている世界で最も人気のあるソフトウェアです。データベースのバックアップがあることを確認することは非常に重要です。この練習により

複数のMySQLまたはMariaDBデータベースを自動的にバックアップ

複数のMySQLまたはMariaDBデータベースを自動的にバックアップ

はじめにこの記事では、カスタムbashスクリプトを使用して、同じマシン上にある複数のMySQLまたはMariaDBデータベースをバックアップする方法を順を追って説明します。

CentOS 7にApache Cassandra 3.11.xをインストールする方法

CentOS 7にApache Cassandra 3.11.xをインストールする方法

別のシステムを使用していますか?Apache Cassandraは無料でオープンソースのNoSQLデータベース管理システムであり、スケーラビリティと高度な機能を提供するように設計されています

CentOS 7にArangoDBをインストールして構成する方法

CentOS 7にArangoDBをインストールして構成する方法

別のシステムを使用していますか?はじめにArangoDBは、ドキュメント、グラフ、Key-Valueの柔軟なデータモデルを備えたオープンソースのNoSQLデータベースです。です

Debian 7に新しいバージョンのMongoDBをインストールする

Debian 7に新しいバージョンのMongoDBをインストールする

MongoDBは高速で強力なNoSQLデータベースです。ただし、Debianリポジトリは更新が遅く、非常に古いバージョンのパッケージが含まれていることがよくあります。このtutoria

Arch LinuxにMariaDB 10.3またはMySQL 8.0をインストールする方法

Arch LinuxにMariaDB 10.3またはMySQL 8.0をインストールする方法

前提条件最新のArch Linuxを実行しているVultrサーバー(この記事を参照してください。)Sudoアクセス:rootとして実行する必要のあるコマンドには、先頭に#が付いています。

Arch LinuxにMongoDB 4.0をインストールする方法

Arch LinuxにMongoDB 4.0をインストールする方法

前提条件最新のArch Linuxを実行しているVultrサーバー(この記事を参照)Sudoアクセス:rootとして実行する必要のあるコマンドには、先頭に#が付いています。

CentOS 7にphpRedisAdminをインストールする方法

CentOS 7にphpRedisAdminをインストールする方法

phpRedisAdminは、直感的なグラフィックユーザーインターフェイスでRedisデータベースを管理するWebアプリケーションです。このチュートリアルでは、インストール方法を説明します

Debian 9にApache Cassandra 3.11.xをインストールする方法

Debian 9にApache Cassandra 3.11.xをインストールする方法

別のシステムを使用していますか?Apache Cassandraは無料でオープンソースのNoSQLデータベース管理システムであり、スケーラビリティと高度な機能を提供するように設計されています

Ubuntu 15.10にRedisをインストールする方法

Ubuntu 15.10にRedisをインストールする方法

RedisはKey-Valueデータストレージソリューションであり、NoSQLデータベースと呼ばれることもあります。インメモリbuであるため、非常に高い読み取り/書き込み速度を実現できます。

Linux(CentOS、Debian、Fedora、Ubuntu)にMyCLIをインストールする方法

Linux(CentOS、Debian、Fedora、Ubuntu)にMyCLIをインストールする方法

はじめにMyCLIは、MySQLおよびMariaDBのコマンドラインクライアントであり、オートコンプリートを可能にし、SQLコマンドの構文を支援します。MyCL

Ubuntu 16.04でMySQL / MariaDBデータベースをバックアップ、復元、転送する方法

Ubuntu 16.04でMySQL / MariaDBデータベースをバックアップ、復元、転送する方法

バックアップは、データベースを扱う上で重要な部分です。企業サイトを運営している場合でも、WordPressをホストしている場合でも、バックアップすることが重要です。

RedisでWordPressを設定する方法

RedisでWordPressを設定する方法

Redisはデータ構造ストアです。キャッシング時の最適化されたアプローチにより、パフォーマンスが大幅に向上するため、WordPressサイトで人気があります。

Dockerを使用してCentOS 7でSQL Server 2017(MS-SQL)を開始する

Dockerを使用してCentOS 7でSQL Server 2017(MS-SQL)を開始する

前提条件Dockerエンジン1.8以降。最低4GBのディスク容量。4GB以上のRAM。ステップ1. DockerをインストールするSQL-Serverをインストールするには、Docker mus

Snortを使用してBarnyard 2をセットアップする

Snortを使用してBarnyard 2をセットアップする

Barnyard2は、Snortからのバイナリ出力をMySQLデータベースに保存および処理する方法です。始める前にいびきがない場合は注意してください

ヘルスケア2021における人工知能の影響

ヘルスケア2021における人工知能の影響

ヘルスケアにおけるAIは、過去数十年から大きな飛躍を遂げました。したがって、ヘルスケアにおけるAIの未来は、日々成長を続けています。

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

macOS Catalina 10.15.4サプリメントの更新により、解決するよりも多くの問題が発生しています

最近、Appleは問題を修正するための補足アップデートであるmacOS Catalina 10.15.4をリリースしましたが、このアップデートにより、Macマシンのブリックにつながる問題がさらに発生しているようです。詳細については、この記事をお読みください

原子力が必ずしも悪ではないことを証明する5つの例

原子力が必ずしも悪ではないことを証明する5つの例

原子力は、過去の出来事のために私たちが決して尊重しないことを常に軽蔑していますが、それは必ずしも悪ではありません。詳細については、投稿をお読みください。

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

AIはどのようにしてプロセス自動化を次のレベルに引き上げることができますか?

これを読んで、人工知能が小規模企業の間でどのように人気を博しているか、そして人工知能がどのように成長し、競合他社に優位に立つ可能性を高めているかを理解してください。

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

ジャーナリングファイルシステムとは何ですか、そしてそれはどのように機能しますか?

私たちのコンピューターは、ジャーナリングファイルシステムと呼ばれる組織化された方法ですべてのデータを保存します。これは、検索を押すとすぐにコンピューターがファイルを検索して表示できるようにする効率的な方法です。https://wethegeek.com/?p = 94116&preview = true

ビッグデータは人工知能をどのように変えていますか?

ビッグデータは人工知能をどのように変えていますか?

ビッグデータと人工知能は流行語ですが、それらがどのように相互に関連しているか知っていますか?さて、この記事を最後まで読んで、同じことを知ってください。

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartショッピングカートプラットフォームをUbuntu 16.04にインストールする方法

LiteCartは、PHP、jQuery、およびHTML 5で記述された無料のオープンソースのショッピングカートプラットフォームです。シンプルで軽量、使いやすいeコマースソフトウォー

DebianでNFS共有をセットアップする

DebianでNFS共有をセットアップする

NFSはネットワークベースのファイルシステムであり、コンピューターはコンピューターネットワークを介してファイルにアクセスできます。このガイドでは、NFを介してフォルダーを公開する方法について説明します

Fedora 28にMatomo Analyticsをインストールする方法

Fedora 28にMatomo Analyticsをインストールする方法

別のシステムを使用していますか?Matomo(旧Piwik)は、Google Analyticsのオープンな代替手段であるオープンソースの分析プラットフォームです。Matomoのソースはoでホストされています

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

UbuntuでNginxをセットアップしてライブHLSビデオをストリーミングする

HTTPライブストリーミング(HLS)は、Apple Inc.によって実装された非常に堅牢なストリーミングビデオプロトコルです。HLSは、ファイアウォール、プロキシ、