原来一直使用的团队部署的mongodb或者云服务商的,今天尝试部署学习一下。
MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
本文在腾讯云上尝试部署mongodb。
环境:Linux(ubuntu 16.04)
mongodb下载地址:
https://www.mongodb.com/download-center
1 解压进入mongodb目录下
tar -vxf mongodb-linux-x86_64-ubuntu1604-3.6.5.tgz
cd mongodb-linux-x86_64-ubuntu1604-3.6.5
2建立文件夹存放数据和log
mkdir -p data/db
touch mongodb.log
3 运行mongodb
3.1 直接运行
cd bin
./mongod -dbpath=./../data/db -logpath=./../mongodb.log -logappend -port=27017 -fork
- –dbpath:指定存储数据的文件夹
- –logpath:指定日志存储文件(将不会输出到控制台)
- –port指定端口,如果不写的话,默认是27017
- –fork代表后台运行
出现这个log 说明启动成功了。
2018-05-24T09:31:40.549+0800 I NETWORK [initandlisten] waiting for connections on port 27017
3.2 通过配置文件启动
./mongod -f mongodb.conf
mongodb.conf:
port = 27017
dbpath = ./../data/db
logpath = log/mongod.log
logappend=true
4 连接
4.1 本地访问
在bin文件夹下执行
./mongo localhost:27000
即可连接到mongodb
Mongod 控制台出现这个log 说明链接成功
2018-05-24T09:35:09.415+0800 I NETWORK [listener] connection accepted from 127.0.0.1:36834 #1 (1 connection now open)
2018-05-24T09:35:09.416+0800 I NETWORK [conn1] received client metadata from 127.0.0.1:36834 conn1: { application: { name: "MongoDB Shell" }, driver: { name: "MongoDB Internal Client", version: "3.6.5" }, os: { type: "Linux", name: "Ubuntu", architecture: "x86_64", version: "16.04" } }
敲击回车进入到mongodb shell模式
4.2 公网访问
默认情况下mongodb 是无法通过外网链接访问。
我们可以通过在mongodb.conf 配置bind_ip 支持外网访问。当值得注意的是我们开启外网访问后,很容易受到攻击。
1 修改mongodb默认端口
2 设置 mongodb访问权限
mongodb.conf
port = 27017
dbpath = ./../data/db
logpath = ./../mongodb.log
logappend=true
bind_ip = 云主机内网ip
在腾讯云上不能直接绑定到公网ip,我们绑定到内网ip,即可实现公网的访问。个人猜测公网ip是映射过来的,所以对于云主机而言公网ip是不可见的。
./mongo xxx.xx.xx.xxx:27017
在本地linux开发机上即可连接到云服务器上的mongodb
5 修改mongodb默认配置
5.1 修改mongodb默认端口
我们可以修改 -port= 参数 或更改conf中port 配置mongodb默认端口
5.2 绑定mongodb实例
bind_ip = 127.0.0.1 将mongodb实例绑定到本地server
bind_ip = 127.0.0.1, 172.28.31.255 将本地server绑定的内网ip
PS: 可以使用该命令查看linux 外网ip :curl icanhazip.com
5.3 开启认证
因为mongodb 默认运行环境为安全,即运行在内网环境中外网无法访问,所以安全模式是默认没有开启的。
在mongodb中,mongodb下可以有多个数据库,我们可以为每个数据库添加相应的账户。只有该账户有操作该数据库的权限。服务器端使用安全模式运行后,客户端如果不指定数据库,用户名和密码进行认证,则客户端可以连接到服务器上,但是进行其他操作时会出错。
https://docs.mongodb.com/manual/reference/method/db.createUser/#create-administrative-user-with-roles
5.3.1 添加管理员账户
这里我们为数据库添加管理员账户
use admin
db.createUser(
{
user: "appAdmin",
pwd: "password",
roles:
[
{ role: "readWriteAnyDatabase", db: "admin" },
]
}
)
这里我们就创建了一个管理员账户,现在尝试开启验证
PS:role 这里是用户身份,mongodb提供了非常丰富的用户身份,readWriteAnyDatabase我们在admin创建了一个具有所有数据库读写权限的账户,具体可参阅第8.1节
5.3.2重启server
在命令启动添加–auth 参数 或在配置中添加auth=true
重新启动服务器。
5.3.3 普通方式连接
./mongo xxx.xx.xx.xxx:27017
连接接mongodb
测试权限是否启动:
use test
switched to db test
> show collections
2018-05-29T10:11:38.833+0800 E QUERY [thread1] Error: listCollections failed: {
"ok" : 0,
"errmsg" : "not authorized on test to execute command { listCollections: 1.0, filter: {}, $db: \"test\" }",
"code" : 13,
"codeName" : "Unauthorized"
} :
报错说明安全模式已经启用了
5.3.4 以账户密码方式连接
用户只能在用户所在数据库登录,包括管理员账号。
./mongo xxx.xx.xx.xxx:27017
use admin
db.auth("admin","helloworld")//管理账户必须要在admin中才能验证
>1 出现1说明验证成功
use test
show collections
没有报错说明验证通过
6 测试
use admin
db.auth("admin","helloworld")
use test2 //创建一个数据库
db.test2.insert({"hello":"world"})//插入一条数据
db.createUser(
{
user: "test2user",
pwd: "password",
roles:
[
{ role: "readWrite", db: "test2" },
]
}
)
//创建新数据库普通账户(如果没有创建用户管理员权限,需要将auth关掉创建)
use test2
db.auth("test2user", "password")
show collections
7 运行
Mongodb 可在linux 配置后台运行。
此测试采用supervisor 软件后台运行
配置:
[program:mongodb]
directory=/home/xxxx/mongodb/mongodb-linux-x86_64-ubuntu1604-3.6.5
command= /home/xxxx/mongodb/mongodb-linux-x86_64-ubuntu1604-3.6.5/bin/mongod -f /home/xxxx/mongodb/mongodb-linux-x86_64-ubuntu1604-3.6.5/bin/mongodb.conf
autostart=true
startsecs=3
autorestart=true
startretries=3
user=root
redirect_stderr=true
stdout_logfile_maxbytes=20MB
stdout_logfile_backups=20
stdout_logfile =/home/xxxx/mongodb/mongodb-linux-x86_64-ubuntu1604-3.6.5/logs/mongodb.log
8 参考资料
8.1 role 身份
roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。role里的角色可以选:
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
8.2 mongodb 常用命令
1 创建数据库 use yourDB
2 查询所有数据库 show dbs
3 创建用户 createUser
4 删除用户 show collections
5 插入数据 db.test2.insert
8.3 参考链接
https://blog.csdn.net/langzi7758521/article/details/70936024
https://www.jianshu.com/p/fc9cda52f49d
https://blog.csdn.net/huwei2003/article/details/40507611
https://www.cnblogs.com/wpjzh/p/5999363.html
./mongo 118.24.21.130:27017 连接到云服务器上mongodb
use admin 切换到admin数据库
mongo 192.168.1.200:27017/database -u user -p password
mongo 118.24.21.130:27017
/database -u user -p password
mongodb://118.24.21.130[:27017]
./mongod -f mongodb.conf
/home/ubuntu/mongodb/mongodb-linux-x86_64-ubuntu1604-3.6.5/bin/mongod -f /home/ubuntu/mongodb/mongodb-linux-x86_64-ubuntu1604-3.6.5/bin/mongodb.conf
mongodb://[username:password@]host1[:port1][,host2[:port2],…[,hostN[:portN]]][/[database][?options]]
mongodb:// 这是固定的格式,必须要指定。
username:password@ 可选项,如果设置,在连接数据库服务器之后,驱动都会尝试登陆这个数据库
host1 必须的指定至少一个host, host1 是这个URI唯一要填写的。它指定了要连接服务器的地址。如果要连接复制集,请指定多个主机地址。
portX 可选的指定端口,如果不填,默认为27017
/database 如果指定username:password@,连接并验证登陆指定数据库。若不指定,默认打开 test 数据库。
?options 是连接选项。如果不使用/database,则前面需要加上/。所有连接选项都是键值对name=value,键值对之间通过&或;(分号)隔开
mongodb://118.24.21.130[:27017]
https://blog.csdn.net/langzi7758521/article/details/70936024
https://www.jianshu.com/p/fc9cda52f49d
https://blog.csdn.net/huwei2003/article/details/40507611
5 为mongodb 添加用户及密码
使用