如何设置可扩展的MongoDB数据库

MongoDB是一个NoSQL数据库,具有内置的复制和分片等强大功能。这使您可以通过在其中分发内容,将您的数据库扩展到尽可能多的服务器。使用本教程帮助完成所有操作

MongoDB是一个NoSQL数据库,具有内置的复制和分片等强大功能。这使您可以通过在其中分发内容,将您的数据库扩展到尽可能多的服务器。 在安装任何MongoDB相关软件之前,我们需要确保我们的硬件被正确选择,软件被微调。

硬盘驱动器

如果您可以选择选择要使用的硬盘驱动器,请使用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()命令。
  • 限制搜索结果和返回的限制字段。
为了测试的目的,我们将旋转3Droplet:

安装

此过程在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作为主服务器。将“master = true”添加到/etc/mongod.conf并执行
service mongod restart
而mongodb2和mongodb3将被设置为从机。将“slave = true”,“source = mongodb1”添加到/etc/mongod.conf并执行
service mongod restart
现在,我们应该使用密码保护此数据库,或者向端口27017(MongoDB)和28017(Web界面)添加iptables规则。 要创建具有密码的用户:
> 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从命令shell访问数据库:
[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" }
一旦达到当前设置的最大容量,就可以开始分割数据库。我们将在未来的博文中讨论这个问题。
作者:Bulat Khamitov