1 新版本2022-03-10
1.1 安装数据库并运行
# 这是安装指南 https://docs.mongodb.com/guides/server/install/?spm=a2c4g.11186623.0.0.3fe25dddBNMBQU
# 去https://www.mongodb.com/download-center#production查看下载地址。
下载、解压、移动、设置环境变量:
cd ~
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-3.2.22.tgz
tar zxvf mongodb-linux-x86_64-rhel70-3.2.22.tgz
mv mongodb-linux-x86_64-rhel70-3.2.22 /user/local/mongodb3.2.22
export PATH=/usr/local/mongodb3.2.22/bin:$PATH
运行:
# 建立MongoDB数据目录,不然默认是/data/db
mkdir -p /root/mongo/data
# 运行
mongod --dbpath /root/mongo/data
不过这个不是后台运行,可以开个tmux
运行。也可以通过配置文件运行:
touch /usr/local/mongodb3.2.22/mongod.conf
里面的内容:
systemLog:
destination: file
path: /root/mongo/mongod.log
logAppend: true
security:
authorization: enabled
storage:
dbPath: /root/mongo/data
directoryPerDB: true
net:
port: 27017
unixDomainSocket:
enabled: false
processManagement:
fork: true
pidFilePath: /root/mongo/mongod.pid
然后运行:
mongod -f /usr/local/mongodb3.2.22/mongod.conf
这种方式就到了后台。
1.2 安装SHELL
wget https://fastdl.mongodb.org/linux/mongodb-shell-linux-x86_64-rhel70-5.0.6.tgz
这个好像不一定要与mongodb一个版本。
tar -xvzf mongodb-shell-linux-x86_64-rhel70-5.0.6.tgz
mv mongodb-shell-linux-x86_64-rhel70-5.0.6 /usr/local/mongo5.0.6
运行:
cd /usr/local/mongo5.0.6
mongo --host localhost --port 27017
新建一个超管,然后关服务器:
> use admin
> db.createUser(
{
user: "superuser",
pwd: "abcabc111",
roles: [ "root" ]
}
)
> db.shutdownServer()
> exit
重启服务:
mongod --auth
# 这时候就需要auth后,才能show users
> use admin
> db.auth("superuser", "abcabc111")
当然也可以直接这样授权运行:
mongo --host 127.0.0.1 -u superuser -p 'abcabc111' --authenticationDatabase admin
以下是复杂版本
安装Server
进官网,点击Try Free,选择合适的版本。
wget https://repo.mongodb.org/yum/redhat/7/mongodb-org/4.2/x86_64/RPMS/mongodb-org-server-4.2.0-1.el7.x86_64.rpm
直接安装
yum -y install mongodb-org-server-4.2.0-1.el7.x86_64.rpm
就可以了。查看状态,启动,开机启动:
systemctl status mongod
systemctl start mongod
systemctl enable mongod
好了。
配置
vi /etc/mongod.conf
然后修改日志、数据的目录,以及允许远程访问,开启用户认证。
然后按照设置好的路径,把相应的目录给建好了,并修改权限,很重要!
chown -R mongod:mongod /data/mongodb
然后重启mongod服务:
systemctl restart mongod
如果还重启失败,看日志,会发现Failed to unlink socket file /tmp/mongodb-27017.sock Operation not permitted
这样的提示,其实是这个文件属于root,不属于mongod,没权限,删掉即可。
安装Shell
也是直接下载:
然后按照,跟Server类似,装好了,就可以输入mongo运行了。
其实也可以直接下载TGZ文件,解压设置好PATH,一步到位,就省得分开装mongod,mongo,mongos。
远程连接
MongoDB默认无密码登录,有点危险。admin数据库是一个特殊的权限数据库,加进该数据库的用户是超级用户,可以操作所有数据库。然后开启认证。
[root@master ~]# mongo
MongoDB shell version v4.2.0
> use admin
switched to db admin
> db.createUser({user:'admin', pwd: 'admin', roles: ['root']});
Successfully added user: { "user" : "admin", "roles" : [ "root" ] }
> db.auth('admin', 'admin')
1
添加用户都是添加到特定的数据库,但是通过赋权限,其实该用户也能操作别的库。贴上官网解释:
然后去阿里云打开安全组的规则:
如果设置了iptables防火墙,也要打开相应的端口。
之后就可以远程访问数据库了,因为这个用户是建立在admin库的,所以Authentication Database一定要填admin才行。
连接成功,可以看到3个默认的数据库admin config local。
如果我们在别的数据库下,创建用户,该用户连上来就只能看到自己的数据库。比如这样,就新建了一个数据库的管理员用户,这样挺好的。
use abc # 一定要先切过来,不放心的还可以insert一条collection记录
db.createUser({'user': 'test', 'pwd':'test', 'roles':[{role: 'dbOwner', db: 'abc'}]})
另外,推荐使用Robo 3T来图形化管理MongoDB。
内置角色说明
有如下内置角色,其中有的角色设置需指定数据库。
- 数据库用户角色:read、readWrite;
- 数据库管理角色:dbAdmin、dbOwner、userAdmin;
- 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
- 备份恢复角色:backup、restore;
- 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase) - 内部角色:__system
角色权限:
- read:允许用户读取指定数据库
- readWrite:允许用户读写指定数据库
- dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
- userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
- clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
- readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
- readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
- userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
- dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
- root:只在admin数据库中可用。超级账号,超级权限
个人感觉,root
和dbOwner
用的比较多些。其它常用命令:
show users # 查看当前用户
db.changeUserPassword("user", "newpwd") # 修改密码
db.updateUser("user", {roles:[{role:"", db:""}]}) # 更新用户roles
db.grantRolesToUser("user", [{role:"", db:""}]) # 追加角色
db.revokeRolesFromUser("user", [{role:"", db:""}]) # 删除角色
db.dropUser("user") # 删除指定用户
db.dropAllUsers() # 删除当前数据下所有用户
集群配置keyFile
集群服务器使用密钥文件keyFile进行认证,创建用户后先生成密码文件:
openssl rand -base64 741 > /data/mongodb/keyfile/mongodb-keyfile # 生成密钥文件,注意改成自己的目录
chmod 600 /data/mongodb/keyfile/mongodb-keyfile # 必须给600权限
scp /data/mongodb/mongodb-keyfile worker1:/data/mongodb/keyfile/ # 分发
scp /data/mongodb/mongodb-keyfile worker2:/data/mongodb/keyfile/
然后修改配置文件mongod.conf
,添加如下:
security:
authorization: enabled
clusterAuthMode: keyFile
keyFile: /data/mongodb/keyfile/mongodb-keyfile
javascriptEnabled: true
再修改数据目录的所有者:
chown -R mongod:mongod /data/mongodb
重启mongodb后登陆:
use admin
db.auth("admin","admin")
好了,够用了。