Intro
Mongodb本身已经是比较成熟并已经广泛使用的一款nosql产品。了解该产品最好的方式当然是官网,考虑到网络和语言习惯,一些具有中文站则会给我们更大的便利。这篇文章主要记录一下折腾Mongodb3.x的一些步骤,其中所有的内容都是通过阅读官方文档了解的。
一、Mongodb安装
由于大部分时候Mongodb serever都是跑在Linux环境下,所以这里默认操作系统都是Linux centos6。Mongodb版本为当前最新,v3.4.2。
- tgz包下载
wget 'https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel62-3.4.2.tgz'
- 解压缩
tar zxvf mongodb-linux-x86_64-amazon-3.4.2.tgz cd mongodb-linux-x86_64-amazon-3.4.2/bin
这里会看到所有Mongodb相关的可执行文件,目前只关注
executable | desc |
mongod | Server启动程序 |
mongo | Client启动程序 |
二、Mongodb启动
1. 启动Server
知道了Mongodb server的启动文件是mongod,那么猜想 ./mongod既能启动server,但是很自然我们首先会关注这样几个问题。
1) 默认监听端口是多少,如果设置我自己想用的端口号
2) 运行日志在哪里看
3) 持久化的数据文件放在哪里
4) 是否有配置文件支持更多细节的配置
启动命令
./mongod --port 27017 --dbpath /mongodb/data --logpath /logs/mongodb.log -f /mongodb/server.conf
以上命令解答上面提到的4个问题。
--port 指定客户端连接端口号,默认27017 --dbpath 持久化数据所在路径,启动前该路径必须存在 --logpath 日志文件 -f 指定配置文件,简单的properties文件,自己创建即可
如果个性化参数都写在配置文件中会让启动命令变得清爽一些,我自己是这样做的
./mongod -f /mongodb/server.conf
配置文件 cat /mongodb/server.conf
port=27017 logpath=/logs/mongodb.log logappend=true #日志生产方式 (追加/覆盖) dbpath=/mongodb/data
2. 客户端连接
Mongodb client的启动文件是mongo,而我们又知道mongodb服务的ip:port,猜都能猜到客户端连接命令
./mongo 127.0.0.1:27017
如果连接成功,mongodb的安装就到此结束了。
三、权限配置
现在mongodb已经安装启动可以使用了,但是很奇怪,一直都没有遇到过权限问题,如果其他人也能随意连上我的数据篡改数据岂不是麻烦了。那下一个要解决的问题 就是为我的数据库加上权限控制。
总的来说是以下几步:
1. 开启权限验证
在server.conf中加上一行
auth=true
2. 添加管理员账号
这里所说的管理员账号不是像linux里面无所不能的root,而是一个能分配账号的账号。在server所在的系统,用客户端连接上server,执行以下代码
use admin db.createUser({ user:'admin', pwd:'123456', roles:[{role:'userAdminAnyDatabase', db:'admin'}] })
这样就创建了一个账号,user为admin, 密码为123456,他能在admin库中管理任何库的用户。
3. 添加数据操作账号
一旦开启的权限管理,接下来所有的操作都必须用合适的账号去做,刚刚我们能成功的添加用户,是因为这是我们的第一个账号(第一就有特权,呵)。我们创建的admin账号只能管理用户,而我们真正需要的账号是要能用来读写数据的,那就需要创建一个可读写数据的账号。
接下来,我们要为一个名为”testDatabase”的库添加读写用户rwuser。
use admin db.auth("admin","123456") use testDatabase db.createUser({ user:'rwuser', pwd:'123456', roles:[{role:'readWrite', db:'testDatabase'}] })
使用exit退出连接后,我们就可以使用该账号连接server了
./mongo 127.0.0.1:27017/testDatabase -urwuser -p123456
四. mongodb相关概念
mongodb也存在和mysql类似的“库”概念,大体概念是相似的,同样默认会有一个test库。Collection的概念则对应mysql中的表。
相关的命令:
command | desc |
use ${databaseName} | 切换到databaseName |
db | 当前所在库名 |
show collections | 列出当前所在库中所有collection名字 |
show dbs | 列出所有库 |
在这里“库”的概念之下,我们回头看添加账号时的一些操作。
//use testDatabase => use admin db.createUser({ user:'rwuser', pwd:'123456', roles:[{role:'readWrite', db:'testDatabase'}] })
admin账号登录后,为testDatabase库创建账号时,做了一次库切换use testDatabase
,可明明在roles:[{role:'readWrite', db:'testDatabase'}]
这一行代码里已经指明给该账号的是testDatabase库的读写权限,还需要多此一举吗。在mongodb里,这确实是有意义的。简单的说来,就是在某个库下创建的账号,只能用来登录到这个库,若再要操作其他库,则需要先做库切换。举个例子,如果上一节中use testDatabase改成use admin,登录命令则需要改成:
./mongo 127.0.0.1:27017/admin -urwuser -p123456
而此时连接成功后是登录到admin库,然后需要use testDatabase才能做后续的读写操作。