如何设置可扩展的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 作为主服务器。 将“master = true”添加到 /etc/mongod.conf 并执行

service mongod restart

而 mongodb2 和 mongodb3 将被设置为从站。 将“slave=true”、“source = mongodb1”添加到 /etc/mongod.conf 并执行

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 从命令 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" }

一旦达到当前设置的最大容量,就可以开始对数据库进行分片。 我们将在以后的文章中介绍这一点。

布拉特·哈米托夫