読者です 読者をやめる 読者になる 読者になる

UTALI

書き溜めておいた技術記事や旅行記のバックアップです。

MongoDBとレプリケーション

前提知識

レプリケーション:サーバーの障害に備えてデータベースサーバーを複数台で運用・管理すること

MongoDBで可能なレプリケーションは2種類

  • マスター・スレーブレプリケーション
  • レプリカセット

マスター・スレーブレプリケーション

親と子の関係 親(マスター)に障害が生じた場合、子(スレーブ)も停止する。復帰するには手動で設定を行う必要がある。MongoDBでは非推奨

レプリカセット

プライマリーノードに障害が生じた場合に、自動的にセカンダリーノードに切り替わる。MongoDBではこちらが推奨されている。

なぜレプリケーションを行うのか?

ロードバランシング

読み取り処理がクエリの大半を占める場合は、セカンダリに負荷を逃がすことで容易にスケールすることができる。

レプリケーションは万能ではない

レプリケーションが有効なのは書き込みに対して読み込みが圧倒的に多い場合のみ

書き込みが多く、性能の低下を起こしている場合は、ハードウェアの強化(スケールアップ)またはシャーディングが必要

また、レプリケーションはバックアップの代わりにはならない、バックアップと異なりレプリカは最新の状態になるようにしてあるから

レプリケーションの構造

最低3つのMongoDBインスタンスが必要、ここで用意するMongoDBのノードは2つのレイヤーに分かれる。

ファーストクラス

アプリケーションのデータベースとして常時稼働する。そのうちの1つはプライマリとして動作、すべてのデータベースが完全なデータを保持する。

アービター

レブリケーションは行わないがファーストクラスの監視を行う、障害が発生した時は、新しいプライマリノードを選択する。

ここでは1つのマシンでファーストクラスの2つのノードを起動する。

まずはデータを保存するディレクトリを作成

mkdir data/db1
mkdir data/db2
mkdir data/arbiter

異なるポートを指定してレプリケーションモードでmongodbを起動

mongod --replSet --dbpath data/db1 --port 50001

次にセカンダリ、アービターを接続するための設定を行います。 ポート50001で起動したインスタンスにアクセスしてrs.initiate()コマンドを実行します。

rs.initiate()

少し待ち時間がありますが、これでレプリカセットを初期化することができた。次にセカンダリ、アービターを起動して先ほど初期化したレプリカセットに追加します

mongod --replSet --dbpath data/db2 --port 50002
mongod --replSet --dbpath data/arbiter --port 50003

再び最初に起動させたMongoDBにアクセスしてセカンダリ、アービターのアドレスを指定します。この場合はローカルで起動させているのでlocalhost:{ポート番号}を指定します。

rs.add("localhost:50002")
rs.add("localhost:50003",{arbiterOnly: true})

続く