设为首页 收藏本站
查看: 1367|回复: 0

[经验分享] 如何设置一个可扩展的MongoDB数据库?

[复制链接]

尚未签到

发表于 2015-11-11 10:08:45 | 显示全部楼层 |阅读模式
  如何设置一个可扩展的MongoDB数据库?
  
  MongoDB是一款NoSQL数据库,功能强大,诸如复制和内置分片,你可以通过给服务器分布内容,将数据库扩展至任意多的服务器。
  
  安装与MongoDB有关的任何东西之前,我们需要确认选择了正确的硬件,并调试好了软件。
  
  1.    硬盘驱动
  如果你可以选择即将用到的硬件驱动,可以将企业级双SSD升级为RAID1。正如我们之前提到的,它性能卓越,节省费用。
  
  在Linux编辑你的/etc/fstab文件,并确保在将要和MongoDB使用的挂载点禁用“访问时间logging”(access time logging)。在第4栏添加noatime:

  
DSC0000.jpg
  重新挂接分区:
  
  

[iyunv@mongodb1 ~]# mount -o remount /
  
  验证新的设置生效:
  
  

[iyunv@mongodb1 ~]# mount
/dev/sda on / type ext4 (rw,noatime)
  
  2.     CPU和内存
  在一个虚拟机监视器上,将MongoDB作为一个虚拟机进行设置,这样你可以在以后扩展RAM和CPU内核。应该分配的CPU内核和RAM的大小取决于你的基础设施的需求以及预算。
  
  3.     优化
  最有用的技巧是优化你的数据库查询:
·        给常用的搜索查询和分类查询添加索引。

·        使用MongoDB的explain()命令。

·        限制搜索结果,限制返回结果的字段。

出于测试目的,我们来看一下这3个droplet:


DSC0001.jpg

安装

这一过程在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
  
  现在安装包
  
  

[iyunv@mongodb1 ~]# yum -y install mongo-10gen mongo-10gen-server
  
  让MongoDB在电脑重启之后启动,并启动服务器:
  
  

[iyunv@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/上的统计
  
  建立一个Master-Slave副本集
  我们将把mongodb1作为一个主服务器,添加“master = true”到/etc/mongod.conf 然后执行
  

service mongod restart
  
DSC0002.jpg
  
  Mongodb2和mongodb3会被设置为副服务器。
  添加 “slave=true”,“source = mongodb1” 到 /etc/mongod.conf 然后执行
  
  

service mongod restart
  
DSC0003.jpg


  现在我们应该让这个数据库更安全,设置一个密码或添加ip信息包过滤系统(iptables)规则到27017端口(MongoDB)和28017端口(网络界面)。
  
  创建一个用户和密码:
  

> use test
> db.addUser('admin', 'password');
{
"user" : "admin",
"readOnly" : false,
"pwd" : "90f500568434c37b61c8c1ce05fdf3ae",
"_id" : ObjectId("50eaae88790af41ffffdcc58")
}
我们同样应该添加防火墙规则来限制其他的MongoDB服务器,我们的IP,并保存:  
> use test


> db.addUser('admin', 'password');
{
        "user" : "admin",
        "readOnly" : false,
        "pwd" : "90f500568434c37b61c8c1ce05fdf3ae",
        "_id" : ObjectId("50eaae88790af41ffffdcc58")
}
  

iptables: Saving firewall rules to /etc/sysconfig/iptables:[  OK  ]
  
  在其他的MongoDB服务器上(mongodb2, mongodb3)重复这一步骤。如果你是在前端使用PHP,需要给PHP安装MongoDB模块:
  
  

[iyunv@webserver ~]# pecl install mongo
[iyunv@webserver ~]# echo extension=mongo.so >> `php -i | grep /php.ini | awk '{print $5}'`
[iyunv@webserver ~]# service httpd restart
  
  用数据填充数据库
  现在我们可以开始测试我们的新设置了,你可以在命令编辑器(command shell)输入mongo,进入到数据库:

[iyunv@mongodb1 ~]# mongo
  
  MongoDB shell 版本:2.2.2连接到:测试
  我们现在进入纽约时报畅销书排行榜的数据库,来进行测试:
  

> 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上看到相同的入口(entries),因为他们是一个副本集:
DSC0004.jpg


  
  你可以进入这些书的所有数据值,比如发行者名字,ISBN号,平均客户评价,书写语言等等。为了能优化你的查询,最好限制一下结果数量和返回的字段数量。
  例如,只返回两个结果我们会在最后用到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" }
  
  一旦达到了当前设置的最大容量,你可以将数据库分片,这方面我们会在以后的文章中详解。

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-137789-1-1.html 上篇帖子: MongoDB数据库用户名和密码的设置 下篇帖子: MongoDB数据库性能分析
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表