スケーラブルなMongoDBデータベースをセットアップする方法
MongoDBは、レプリケーションやシャーディングなどの優れた機能が組み込まれたNoSQLデータベースです。 これにより、サーバー間でコンテンツを分散することにより、データベースを必要な数のサーバーに拡張できます。
MongoDBに関連するものをインストールする前に、ハードウェアが正しく選択され、ソフトウェアが微調整されていることを確認する必要があります。
1. ハードドライブ
使用するハードドライブを選択できる場合は、RAID1のエンタープライズグレードのデュアルSSDドライブを使用してください。 以前に説明したように、これらはパフォーマンスに優れており、実際にコストを節約できます。
Linuxで/etc/ fstabファイルを編集し、MongoDBで使用されるマウントのアクセス時間ロギングを必ず無効にしてください。 4番目の列にnoatimeを追加します。
パーティションを再マウントします。
[root@mongodb1 ~]# mount -o remount /
新しい設定が有効になったことを確認します。
[root@mongodb1 ~]# mount
/dev/sda on / type ext4 (rw,noatime)
2. CPUとメモリ
MongoDBをハイパーバイザー上のVMとして設定すると、後でRAMとCPUコアをスケールアップできます。 割り当てる必要のあるCPUコアとRAMの量は、インフラストラクチャのニーズと予算によって異なります。
3. 最適化
最も役立つヒントは、データベースクエリを最適化することです。
- 一般的に検索またはソートされたクエリのインデックスを追加します。
- MongoDBのexplain()コマンドを使用します。
- 検索結果を制限し、返されるフィールドを制限します。
テストの目的で、3つの液滴をスピンアップします。
インストール
この手順は、mongodb1、mongodb2、およびmongodb3でも同じです。 CentOSへのMongoDBのインストールは非常に簡単です。 編集して次のリポジトリを追加します
/etc/yum.repos.d/10gen.repo
[10gen] name=10gen baseurl=http://downloads-distro.mongodb.org/repo/redhat/os/x86_64 gpgcheck=0 enabled=1
次に、パッケージをインストールします。
[root@mongodb1 ~]# yum -y install mongo-10gen mongo-10gen-server
再起動時にMongoDBを開始できるようにし、サービスを開始します。
[root@mongodb1 ~]# chkconfig mongod on && service mongod start
Starting mongod: forked process: 1387 all output going to: /var/log/mongo/mongod.log child process started successfully, parent exiting [ OK ]
これで、http:// SERVER:28017/で統計を確認できるはずです。
マスタースレーブレプリカセットのセットアップ
mongodb1をマスターサーバーとして割り当てます。 /etc/mongod.confに「master=true」を追加して実行します
service mongod restart
一方、mongodb2とmongodb3はスレーブとしてセットアップされます。 /etc/mongod.confに「slave=true」、「source=mongodb1」を追加して実行します
service mongod restart
次に、このデータベースをパスワードで保護するか、iptablesルールをポート27017(MongoDB)および28017(Webインターフェイス)に追加する必要があります。
パスワードを使用してユーザーを作成するには:
> use test
> db.addUser('admin', 'password'); { "user" : "admin", "readOnly" : false, "pwd" : "90f500568434c37b61c8c1ce05fdf3ae", "_id" : ObjectId("50eaae88790af41ffffdcc58") }
また、ファイアウォールルールを追加して、他のMongoDBサーバー、IPに制限し、以下を保存する必要があります。
[root@mongodb1 ~]# iptables -N MongoDB [root@mongodb1 ~]# iptables -I INPUT -s 0/0 -p tcp --dport 27017 -j MongoDB [root@mongodb1 ~]# iptables -I INPUT -s 0/0 -p tcp --dport 28017 -j MongoDB [root@mongodb1 ~]# iptables -I MongoDB -s 127.0.0.1 -j ACCEPT [root@mongodb1 ~]# iptables -I MongoDB -s 192.34.57.64 -j ACCEPT [root@mongodb1 ~]# iptables -I MongoDB -s 192.34.56.123 -j ACCEPT [root@mongodb1 ~]# iptables -I MongoDB -s 192.34.57.162 -j ACCEPT [root@mongodb1 ~]# iptables -A MongoDB -s 0/0 -j DROP [root@mongodb1 ~]# /etc/init.d/iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
他のMongoDBサーバー(mongodb2、mongodb3)でこの手順を繰り返します。
フロントエンドにPHPを使用している場合は、PHP用のMongoDBモジュールをインストールする必要があります。
[root@webserver ~]# pecl install mongo [root@webserver ~]# echo extension=mongo.so >> `php -i | grep /php.ini | awk '{print $5}'` [root@webserver ~]# service httpd restart
データベースにデータを入力します
これで、新しいセットアップのテストを開始できます。 mongo:と入力すると、コマンドシェルからデータベースにアクセスできます。
[root@mongodb1 ~]# mongo
MongoDB shell version: 2.2.2 connecting to: test
テストのために、ニューヨークタイムズのベストセラーリストをデータベースに入力してみましょう。
> db.books.save( { title: 'Safe Haven', author: 'Nicholas Sparks' } ) > db.books.save( { title: 'Gone Girl', author: 'Gillian Flynn' } ) > db.books.save( { title: 'The Coincidence Of Callie And Kayden', author: 'Jessica Sorensen' } ) > db.books.save( { title: 'Fifty Shades of Grey', author: 'E.L. James' } ) > db.books.save( { title: 'Hopeless', author: 'Colleen Hoover' } )
すべての結果を表示するには:
> db.books.find() { "_id" : ObjectId("50eaaa4b633625147f205994"), "title" : "Safe Haven", "author" : "Nicholas Sparks" } { "_id" : ObjectId("50eaaa62633625147f205995"), "title" : "Gone Girl", "author" : "Gillian Flynn" } { "_id" : ObjectId("50eaaa8d633625147f205996"), "title" : "The Coincidence Of Callie And Kayden", "author" : "Jessica Sorensen" } { "_id" : ObjectId("50eaaaa0633625147f205997"), "title" : "Fifty Shades of Grey", "author" : "E.L. James" } { "_id" : ObjectId("50eaaab3633625147f205998"), "title" : "Hopeless", "author" : "Colleen Hoover" }
これらはレプリカセットであるため、mongodb2とmongodb3で同じエントリを表示できるはずです。
出版社の名前、ISBN番号、平均的な顧客評価、書き言葉など、これらの本にあらゆる種類の値を入力することができます。 ただし、クエリを最適化するには、結果の数と返されるフィールドの数を制限するのが最善です。
たとえば、2つの結果のみを返すには、最後にlimit()を使用します。
> db.books.find( {}, { title : 1 , author: 1 } ).sort( { timestamp : -1 } ).limit(2) { "_id" : ObjectId("50eaaa4b633625147f205994"), "title" : "Safe Haven", "author" : "Nicholas Sparks" } { "_id" : ObjectId("50eaaa62633625147f205995"), "title" : "Gone Girl", "author" : "Gillian Flynn" }
現在のセットアップの最大容量に達したら、データベースのシャーディングを開始できます。 これについては、今後の投稿で取り上げます。