不知不觉房产系统已经使用MongoDB一年多了,记得一年多以前,正是NOSQL被热炒时,MongoDB更是作为NOSQL中的佼佼者,被炒得火烫,也应该就在当时被这股火烫着了,所以义无反顾的选择了MongoDB,现在想想当时确实有些冲动了,当时MongoDB的资料还是比较少,更别说中文资料了,后来还出现使用MongoDB成功应用的范例Foursquare的宕机事件。现在确实应该很感谢MongoDB为我们的系统服务了一年了,在这一年的时间里,确实出现过不少的小问题,特别是在管理操作上,我想这大概也是因为MongoDB在系统维护上不如Mysql那样有着各种的业界实践,往往就只能通过管理员自己去摸索。
下面将在这一年的一些简单的管理操作做一下记录
下面将在这一年的一些简单的管理操作做一下记录
Starting and Stopping Mongo
MongoDB启动
MongoDB启动
对了,MongoDB在linux下是无需安装的,从官网上下载下安装包后解压,直接执行mongod,就可以启动MongoDB服务器,当然mongod还有很多的启动选择项,运行mongod --help就可以查看所有的选择项。
-f [ --config ] arg configuration file specifying additional options
一般来说,启动选择项可以直接写在在mongod后面,也可以指定配置文件,用文件来加载各种启动项,如
/home/mongodb/bin/mongod --config /home/mongodb/conf/mongod.conf
-f [ --config ] arg configuration file specifying additional options
一般来说,启动选择项可以直接写在在mongod后面,也可以指定配置文件,用文件来加载各种启动项,如
/home/mongodb/bin/mongod --config /home/mongodb/conf/mongod.conf
上面是一台测试机的启动选择项。
dbpath = /home/mongodb/data
指定数据库的存储目录,如果不设置则以mongodb的根目录为目录,当MongoDB启动之后,在数据库的存储目录下会创建一个mongod.lock文件,它是用来记录当前的mongod的进程号,同时也用于区分各个mongod的进程实例,所以不同的mongod进程实例是不能用相同的dbpath。
logpath = /home/mongodb/mongodb.log
指定日志输出的路径,如果没有设置logappend = true,系统会清除原来的日志记录,把已有的文件进行覆盖。
logappend = true
日志以追加的方式进行记录
bind_ip = 192.168.86.111
指定对外服务的绑定ip,这里指定内网的ip方式,如果外网无特殊的处理方式是无法进行连接。
port = 27017
指定服务器的监听端口号,默认是27017,如果单个机器要运行多个mongod进程,则需要给每个进程指定不同的端口号。
fork = true
指定以守护进程的方式来启动MongoDB,如果不指定,在启动mongod命令是加“&”也是可以的。
auth = true
启动mongodb客户端登录的认证机制。
master = true
指定该机器为主从模式下的主机器。
配置完配置文件后启栋mongod,启动时要盯着日志文件看,因为日志通常会告诉我们一些错误或警告的信息,这样能够更好的帮助我们了解和避免错误。
dbpath = /home/mongodb/data
指定数据库的存储目录,如果不设置则以mongodb的根目录为目录,当MongoDB启动之后,在数据库的存储目录下会创建一个mongod.lock文件,它是用来记录当前的mongod的进程号,同时也用于区分各个mongod的进程实例,所以不同的mongod进程实例是不能用相同的dbpath。
logpath = /home/mongodb/mongodb.log
指定日志输出的路径,如果没有设置logappend = true,系统会清除原来的日志记录,把已有的文件进行覆盖。
logappend = true
日志以追加的方式进行记录
bind_ip = 192.168.86.111
指定对外服务的绑定ip,这里指定内网的ip方式,如果外网无特殊的处理方式是无法进行连接。
port = 27017
指定服务器的监听端口号,默认是27017,如果单个机器要运行多个mongod进程,则需要给每个进程指定不同的端口号。
fork = true
指定以守护进程的方式来启动MongoDB,如果不指定,在启动mongod命令是加“&”也是可以的。
auth = true
启动mongodb客户端登录的认证机制。
master = true
指定该机器为主从模式下的主机器。
配置完配置文件后启栋mongod,启动时要盯着日志文件看,因为日志通常会告诉我们一些错误或警告的信息,这样能够更好的帮助我们了解和避免错误。
这里给出了个提示,使用的是32位的Mongodb,所以MongoDB只是存储最大为2GB的数据。其实这个跟MongoDB的mmap机制有关,如果是64位则不会存在这种限制。
请注意一定要盯着日志看
请注意一定要盯着日志看
tail -100f /home/mongodb/mongodb.log
停止MongoDB
千万要强调的是千万不要使用kill -9去关闭mongod!这样数据库会不理一切直接杀死该进程,会使得数据文件损坏。
稳妥的方法是使用kill -2 pid去关闭mongod,也就是当mongod进程接受到关闭指令后会等待当前运行操作或文件分配等操作完毕后,关闭所有打开的连接,并将缓存的数据刷新到磁盘后才正式关闭。
最稳妥的方式是使用shutdown命令来结束
稳妥的方法是使用kill -2 pid去关闭mongod,也就是当mongod进程接受到关闭指令后会等待当前运行操作或文件分配等操作完毕后,关闭所有打开的连接,并将缓存的数据刷新到磁盘后才正式关闭。
最稳妥的方式是使用shutdown命令来结束
> use admin
switched to db admin
> db.shutdownServer();
switched to db admin
> db.shutdownServer();
打开mongodb.org的Security文档,第一句话就是 Running Without Security(Trusted Environment),跟我们强调世界上没有什么百分百安全的环境,最好的安全是放在一个安全的环境中运行,这么无底气的话语未免也让人为它的安全担心,不过事实上MongoDB还是有安全认证模式的,只不过跟mysql对比起来有一点简陋。
MongoDB的安全
MongoDB目前只支持最基本的安全认证,如果我们开启了安全性检查,则只有数据库认证用户才能进行读写操作,当然我们还可以创建读写权限用户和只读权限用户,如果我们在admin的数据库中进行创建用户,那么admin中的用户就会被当作超级用户,超级用户可以读写所有的数据库,并且还可以进行特殊的管理操作,比如可以再创建其他用户关闭进程等操作。
配置MongoDb用户认证
根据官网上的例子,我们也来创建一个超级用户,一个test库中具有读写操作的普通用户,一个test库中只有读操作的普通用户。
MongoDB的安全
MongoDB目前只支持最基本的安全认证,如果我们开启了安全性检查,则只有数据库认证用户才能进行读写操作,当然我们还可以创建读写权限用户和只读权限用户,如果我们在admin的数据库中进行创建用户,那么admin中的用户就会被当作超级用户,超级用户可以读写所有的数据库,并且还可以进行特殊的管理操作,比如可以再创建其他用户关闭进程等操作。
配置MongoDb用户认证
根据官网上的例子,我们也来创建一个超级用户,一个test库中具有读写操作的普通用户,一个test库中只有读操作的普通用户。
> use admin
switched to db admin
> db.addUser("cyz","abc")
{
"_id" : ObjectId("4dba5fe7c6792ae30fea3c31"),
"user" : "cyz",
"readOnly" : false,
"pwd" : "8658a5bf469e005b047560619ef0d51c"
}
> use test
switched to db test
> db.addUser("cyz001","abc")
{
"user" : "cyz001",
"readOnly" : false,
"pwd" : "7a597bef551027cc2161d5e0efe4049e"
}
> db.addUser("cyz002","abc",true)
{
"user" : "cyz002",
"readOnly" : true,
"pwd" : "2dde0a3777cd7dd92459a6c3f98afac6"
}
switched to db admin
> db.addUser("cyz","abc")
{
"_id" : ObjectId("4dba5fe7c6792ae30fea3c31"),
"user" : "cyz",
"readOnly" : false,
"pwd" : "8658a5bf469e005b047560619ef0d51c"
}
> use test
switched to db test
> db.addUser("cyz001","abc")
{
"user" : "cyz001",
"readOnly" : false,
"pwd" : "7a597bef551027cc2161d5e0efe4049e"
}
> db.addUser("cyz002","abc",true)
{
"user" : "cyz002",
"readOnly" : true,
"pwd" : "2dde0a3777cd7dd92459a6c3f98afac6"
}
这里cyz是在admin库中创建,属于超级用户,可以对所有库进行操作,在test库中创建的cyz001和cyz002属于test库的操作人员,只能对test库进行相应操作,记得要为安全验证生效需要将启动项auth设置为true。
查看用户
所有的用户信息都存储在每个数据库的db.system.users中,可以使用find()进行查看
其中的pwd是根据用户名和用户密码生成的散列值。
修改用户
不管是添加用户,修改用户密码,修改用户操作权限都使用addUser()来完成。删除用户可以用remove()来实现。
查看用户
所有的用户信息都存储在每个数据库的db.system.users中,可以使用find()进行查看
> use admin
switched to db admin
> db.system.users.find()
{ "_id" : ObjectId("4dba5fe7c6792ae30fea3c31"), "user" : "cyz", "readOnly" : false, "pwd" :
"8658a5bf469e005b047560619ef0d51c" }
switched to db admin
> db.system.users.find()
{ "_id" : ObjectId("4dba5fe7c6792ae30fea3c31"), "user" : "cyz", "readOnly" : false, "pwd" :
"8658a5bf469e005b047560619ef0d51c" }
其中的pwd是根据用户名和用户密码生成的散列值。
修改用户
不管是添加用户,修改用户密码,修改用户操作权限都使用addUser()来完成。删除用户可以用remove()来实现。
> db.system.users.find({"user":"cyz001"})
更多的安全考虑
刚说了MongoDB的安全认证其实还是简陋的,所以我们还是有其他很多的安全考虑。
1.比如说MongoDB传输协议是不加密的,如果需要加密的话,我们可以考虑使用ssh隧道或是他们的技术来对客户端和服务端之间的通讯进行加密。
2.将MongoDB部署在只有客户端服务器才能访问到的环境,比如内网,vpn网络中,可以使用 bind_ip = 本机或内网 。
3.如果确实需要将MongoDB暴露在外部环境可以考虑使用IPTABLES等技术进行访问限制。
刚说了MongoDB的安全认证其实还是简陋的,所以我们还是有其他很多的安全考虑。
1.比如说MongoDB传输协议是不加密的,如果需要加密的话,我们可以考虑使用ssh隧道或是他们的技术来对客户端和服务端之间的通讯进行加密。
2.将MongoDB部署在只有客户端服务器才能访问到的环境,比如内网,vpn网络中,可以使用 bind_ip = 本机或内网 。
3.如果确实需要将MongoDB暴露在外部环境可以考虑使用IPTABLES等技术进行访问限制。
Monitoring and Diagnostics
官网首先给我们推荐了mongostat监控工具,基本上mongostat可以作为一个外部观测MongoDB内部状态指标的工具,并且一秒更新一次,如果出现一些性能问题可以用这里入手进行分析。
这里的属性都可以通过mongostat --help进行查看,有几个列需要解释一下,可以帮助到我们发生性能问题时比较准备的找到定位。
faults:这是一个重要的性能指标,显示你的机器每秒页面故障的数量,这个是mongoDB映射到虚拟地址空间,而不是物理内存,这个值如果飙高的话,可能意味着你的机器没有足够的内存来存储数据和磁盘的访问。
flushes:每秒做了多少次fsync,表面多少次数据被刷新进了磁盘。
mapped:是指mmap有多少数据量,也就是服务器的内存映射,其中包含了虚拟内存和常驻内存。
locked:这个值表面全局写入锁占用了机器多少时间, 当放生全局写入锁时,所有的查询操作都将等待,直到写入锁的解锁,如果这个锁飙高有可能是你的程序那部分出现问题。
idx miss:B树未命中的比例,这个应该是我们查询的命中的实时指数,一般在特定查询中会有用到。
qr | qw:如果有太多的查询进行处理,它们就以一个队列的方式进行,如果这个值飙高的话,那么查询也会变得很慢,因为后面的队列必须等待前面的队列执行完毕,高并发时,一般队列值会升高。
另外我们还可以在mongodb shell中进行检查,使用db.serverStatus()
faults:这是一个重要的性能指标,显示你的机器每秒页面故障的数量,这个是mongoDB映射到虚拟地址空间,而不是物理内存,这个值如果飙高的话,可能意味着你的机器没有足够的内存来存储数据和磁盘的访问。
flushes:每秒做了多少次fsync,表面多少次数据被刷新进了磁盘。
mapped:是指mmap有多少数据量,也就是服务器的内存映射,其中包含了虚拟内存和常驻内存。
locked:这个值表面全局写入锁占用了机器多少时间, 当放生全局写入锁时,所有的查询操作都将等待,直到写入锁的解锁,如果这个锁飙高有可能是你的程序那部分出现问题。
idx miss:B树未命中的比例,这个应该是我们查询的命中的实时指数,一般在特定查询中会有用到。
qr | qw:如果有太多的查询进行处理,它们就以一个队列的方式进行,如果这个值飙高的话,那么查询也会变得很慢,因为后面的队列必须等待前面的队列执行完毕,高并发时,一般队列值会升高。
另外我们还可以在mongodb shell中进行检查,使用db.serverStatus()
基本上db.serverStatus()跟mongostat 差不多,不过它显示的数据更为具体,它也有一个缺陷就是它的数据是静态的,不是实时的。
Http Console
其实mongodb还提供了一个跟直观的检测工具,在默认情况下,启动mongodb的同时还会启动一个http的服务器,用网页展示的信息比前两个工具来得更加直观,启动默认的监听端口为28017 http://ip:28017
Http Console
其实mongodb还提供了一个跟直观的检测工具,在默认情况下,启动mongodb的同时还会启动一个http的服务器,用网页展示的信息比前两个工具来得更加直观,启动默认的监听端口为28017 http://ip:28017
基本上我们可以看到查询,复制,锁等等这些的情况,具体的参数还是上官网looklook,http://www.mongodb.org/display/DOCS/Http+Interface
当然了,我们还可以使用其他的专业监控软件进行监控,如nagios,cacti,这些都有mongodb的插件。
Backups
MongoDB的备份机制还是不错的,备份的方式也是很多,这个并不比mysql要差。
Shutdown and Backup
关闭服务,直接把dbpath参数的目录进行备份,只需把所有的文件进行复制到其他地方就可以,不过如果这个备份是在服务启动时候做的话,有可能备份的文件会被损坏,虽然这种关闭服务的备份很有效也很安全,都效果相当不理想。
mongodump & mongorestore
mongodump简直就是mysqldump的另一版,如果你使用过mysqldump那就再熟悉不过了,mongodbdump可以使用在各个客户端,对正在运行的mongodb服务做出查询,然后将所有查到的文本写入到客户端的磁盘。
MongoDB的备份机制还是不错的,备份的方式也是很多,这个并不比mysql要差。
Shutdown and Backup
关闭服务,直接把dbpath参数的目录进行备份,只需把所有的文件进行复制到其他地方就可以,不过如果这个备份是在服务启动时候做的话,有可能备份的文件会被损坏,虽然这种关闭服务的备份很有效也很安全,都效果相当不理想。
mongodump & mongorestore
mongodump简直就是mysqldump的另一版,如果你使用过mysqldump那就再熟悉不过了,mongodbdump可以使用在各个客户端,对正在运行的mongodb服务做出查询,然后将所有查到的文本写入到客户端的磁盘。
除了mongodump,MongoDB还提供了从备份中恢复数据的工具mongorestore,mongorestore从mongodump获取结果,并将备份的数据插入到运行的MongoDB实例。
./mongodump --db test --collection user --out - > /home/chenyz/cyz.bson
./mongorestore --db test --collection user --directoryperdb /home/chenyz/cyz.bson --drop cyz.bson
./mongorestore --db test --collection user --directoryperdb /home/chenyz/cyz.bson --drop cyz.bson
上面的例子中,指定了要备份的db和要备份的collection,--drop表明要在恢复前删除集合,否则,数据将和现有的集合数据合并。
主从备份
上面说的几种备份数据方式已经很灵活了,但都不及在从服务器上备份来得方便,从服务器的数据几乎是于主服务器进行同步,涉及到主从方面还有很多,从服务器备份就不放在这里讲了。
修复
遇到一些停电,或非法关闭mongodb,不合理备份文件的操作,往往会出现文件损毁的提示,幸好,mongodb内置的修复功能会试着去恢复损坏的文件。
操作很简单,只需在启动mongod 加入 --repair启动项,系统就会将所有的文件导入忽略那些无效的文档然后进行导入,完成之后,会重新建立索引,数据量大的话需要花费很长的时间,因为所有的文件都需要进行验证,所有的索引都需要重建,另外修复数据库还能起到压缩数据的作用,闲置的空间,碎片在修复后会被重新回收进行使用。
另外在shell中也可以直接进行repair操作
主从备份
上面说的几种备份数据方式已经很灵活了,但都不及在从服务器上备份来得方便,从服务器的数据几乎是于主服务器进行同步,涉及到主从方面还有很多,从服务器备份就不放在这里讲了。
修复
遇到一些停电,或非法关闭mongodb,不合理备份文件的操作,往往会出现文件损毁的提示,幸好,mongodb内置的修复功能会试着去恢复损坏的文件。
操作很简单,只需在启动mongod 加入 --repair启动项,系统就会将所有的文件导入忽略那些无效的文档然后进行导入,完成之后,会重新建立索引,数据量大的话需要花费很长的时间,因为所有的文件都需要进行验证,所有的索引都需要重建,另外修复数据库还能起到压缩数据的作用,闲置的空间,碎片在修复后会被重新回收进行使用。
另外在shell中也可以直接进行repair操作
> db.repairDatabase()
{
"ok" : 1
}
{
"ok" : 1
}
相关推荐
浅述汽车企业管理控制系统.pptx
浅述操作系统的安全与防范.pdf
本文将从房建工程项目施工成本管理的全过程进行浅述,探讨如何通过系统性的管理实现成本的最优化。 首先,在施工准备阶段,前期策划是项目实施的基础,需对项目的可行性进行充分论证,并明确项目目标。在此过程中,...
【信息时代下档案管理工作的创新措施浅述】 随着信息技术的快速发展,信息时代已经全面渗透到社会各个领域,档案管理工作也不例外。在这个背景下,档案管理工作面临着全新的挑战与机遇。传统的档案管理方式,依赖...
图书管理信息化建设存在的问题与优化浅述 图书管理信息化建设是图书馆事业发展的必然趋势。随着社会的信息化和网络的普及,人们的需求不断变化,传统的图书管理模式已经无法满足读者的需求。因此,图书管理信息化...
### 企业现代计算机信息化管理中网络技术的应用浅述 #### 摘要 随着互联网技术在中国的迅猛发展,信息化已成为社会发展的重要趋势。“互联网+”模式正在各领域内得到广泛应用。在此背景下,现代化的企业越来越依赖...
物业管理中风险分析和浅述.docx
【标题】: 人工智能在水利工程管理中的应用浅述 【描述】: 本文探讨了人工智能在水利工程管理中的应用,分析了其带来的优势和当前的应用现状,旨在推动水利行业的现代化发展。 【标签】: 互联网 正文: 随着科技...
浅述信息化背景下企业管理方式创新.docx
2. 培训管理人员:提升档案管理人员的专业素质,使他们能够熟练进行档案管理和信息化操作。 3. 完善硬件设施:投资现代化设备,提升存储安全性、检索效率,引入先进的管理技术和软件。 4. 开发应用信息:通过对医疗...
浅述企业集团财务管理信息化的建设及完善借鉴.pdf
论计算机网络设备维护与安全管理浅述.pdf
国内医院信息化管理始于20世纪80年代,经历了从单机操作到多科室、多系统、局部网络的演变。如今,多数医院采用了HIS系统,涵盖患者医疗、临床和经营等多个方面,部分大型医院甚至实现了云共享医疗模式,提高了服务...
浅述智能电网的发展
浅述ORACLE EBS R12后台管理新变化.pdf Oracle E-Business Suite (EBS) 是 Oracle 公司享誉全球的软件之一,在实际工作中也被称为 Oracle ERP (Enterprise Resource Planning)。自1998年面世以来,已经推出了6个...
【绩效管理概述】 绩效管理是企业管理的核心组成部分,它关乎企业的生存和发展。绩效管理涉及制定绩效方案、绩效辅导、考核评价、结果应用以及目标提升的循环过程。它在人力资源管理中扮演着关键角色,因为企业的...
此外,一些软件的操作界面复杂,不易上手,这不仅增加了员工的学习成本,也可能限制了软件的实际效用。 #### 三、改进策略 **3.1 选择合适的管理软件** 为了克服上述问题,企业需要精心选择适合自己需求的人力...