1、MongoDB单机版的安装
提前准备MongoDB安装包
这里以下实例为例:
hostname:mongodb63
IP:192.168.4.63
[root@mongodb63 ~]# tar -xf mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@mongodb63 ~]# mkdir /usr/local/mongodb
[root@mongodb63 ~]# cp -r mongodb-linux-x86_64-rhel70-3.6.3/bin/ /usr/local/mongodb/
[root@mongodb63 mongodb]# cd /usr/local/mongodb/
[root@mongodb63 mongodb]# mkdir -p data/db log etc #新建 data/db、log、etc 目录
[root@mongodb63 mongodb]# ls
bin data etc log
vim etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.4.63
port=27077 #默认端口为27017 如果不加为默认端口
#auth=true
#keyFile = /usr/local/mongodb/rs/keyfile
添加环境变量
[root@mongodb63 ~]# vim /etc/profile
export PATH=$PATH:/usr/local/mongodb/bin/
[root@mongodb63 ~]# source /etc/profile
[root@mongodb63 ~]# mongod -f /usr/local/mongodb/etc/mongodb.conf #启动MongoDB
[root@mongodb63 ~]# ss -anput|grep 27077 #查看是否成功
[root@mongodb63 ~]# mongo --host 192.168.4.63 --port 27077 #登录MongoDB
常用命令 MongoDB命令和配置文件要区分大小
> show dbs #显示已有库
admin 0.000GB
config 0.000GB
local 0.000GB
> db #显示当前所在库
> use 库名 #切换库,若不存在 会自动延时创建库
> show tables #或者show collections 查看库下已有的集合
> db.dropDatabase() #删除当前所在的库
> db.haha.save({a:1,b:2,c:3}) #写入数据
WriteResult({ "nInserted" : 1 })
> db.haha.count()
1
> db.haha.find()
停止服务
[root@mongodb63 ~]# mongod --dbpath=/usr/local/mongodb/data/db --shutdown #停止服务或killall mongod 杀死服务
2、副本集群的搭建
- 集群前准备3台实例并安装MongoDB 并删除除之前所有数据MongoDB
mongodb61 IP:192.168.4.61
mongodb62 IP:192.168.4.62
mongodb63 IP:192.168.4.63
2.1、副本集群的搭建
操作在61上进行 其实任何一台操作都可以
- 方便选举主节点 建议奇数台组建集群
- 其中只有主库可以写入 副本(从)不能写入只能查询
- 主库down机 会从副本中自动选举主库,当之前的主库恢复后 为自动加放到集群 并以副本(从)库身份运行
- 仲裁节点,可要可不要,但因为mongodb算法不太好,存在有选举不出主节点的可能,建议还是配置一个,仲裁节点不存储数据,对硬件配置也没有要求,可以找一台配置较差或者配置到其它服务的实例上
修改配置文件 3台都需要修改 在单机版基础上添加replSet=rs1
[root@mongodb61 mongodb]# vim /usr/local/mongodb/etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.4.61
port=27077
replSet=rs1 #添加这一行配置
#auth=true
#keyFile = /usr/local/mongodb/rs/keyfile
开启服务
[root@mongodb61 ~]# mongod -f /usr/local/mongodb/etc/mongodb.conf
登陆MongoDB
[root@mongodb61 ~]# mongo --host 192.168.4.61 --port 27077
config={
_id:"rs1",
members:[
{_id:0,host:"192.168.4.61:27077"},
{_id:1,host:"192.168.4.62:27077"},
{_id:2,host:"192.168.4.63:27077",arbiterOnly:true} #加仲裁节点
]
};
========显示以下信息代表成功
{
"_id" : "rs1",
"members" : [
{
"_id" : 0,
"host" : "192.168.4.61:27077"
},
{
"_id" : 1,
"host" : "192.168.4.62:27077"
},
{
"_id" : 2,
"host" : "192.168.4.63:27077",
"arbiterOnly" : true
}
]
}
> rs.initiate(config) #初始化 选主从 如果集群成功> 会变成 rs1:PRIMARY>
rs1:PRIMARY> rs.status() #查看集群状态
rs1:PRIMARY> rs.isMaster() #查看是否为主库
rs1:PRIMARY> use haha
rs1:PRIMARY> db.haha.save({d:5,e:6,f:8}) #写入数据测试 可以看到前面已要变了成
rs1:PRIMARY> db.haha.find()
{ "_id" : ObjectId("5e05b7def43f1d19454bf8e4"), "d" : 5, "e" : 6, "f" : 8 }
从库查询
rs1:SECONDARY> db.getMongo().setSlaveOk() #默认从库不能查询 要输入这条命令
rs1:SECONDARY> use haha
rs1:SECONDARY> db.haha.find()
{ "_id" : ObjectId("5e05b7def43f1d19454bf8e4"), "d" : 5, "e" : 6, "f" : 8 }
2.2、副本集群开启用户认证
在以上基础上 新建管理员超级用户
rs1:PRIMARY> use admin#添加root超级管理员 admin用户 在主服务端创建后会自动同步到其它服务端
rs1:PRIMARY> db.createUser(
{
user:"root",
pwd:"root",
roles:[{role:"root",db:"admin"}]
}
)
rs1:PRIMARY> db.createUser(
{
user: "admin",
pwd: "admin",
roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
}
)
rs1:PRIMARY> exit
[root@mongodb61 ~]# mongod --dbpath=/usr/local/mongodb/data/db --shutdown
3台实例相同的操作 退出和关闭MongoDB
MongoDB 中的角色:
read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以在指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予所有数据库的dbAdmin权限
root:只在admin数据库中可用。超级账号,超级权限
查看已经存在的用户
use admin
db.system.users.find()
移除用户
use admin
db.system.users.remove({user:"root"})
创建用户
use admin
db.createUser({user:"root",pwd:"123456",roles:[{role:"root",db:"admin"}]})
创建读写用户 因为admin只有用户管理权限,下面创建用户,用户都是跟着库走
use dev_data
db.createUser({user:"datauser",pwd:"123456",roles:[{role:"readWrite",db:"dev_data"}]})
创建只读用户
use dev_data
生成keyfile文件
通过openssl生一个keyfile文件,用于节点之间权限认证的
在mongodb安装文件夹下创建一个rs目录 mkdir -p /usr/local/mongodb/rs
使用 openssl生成一个key文件, openssl rand -base64 741 > keyfile (没有安装openssl的请自行下载安装)
同时给 keyfile 文件设置权限 chmod 600 keyfile
然后scp或者其它方法把keyfile文件传到各个mongodb服务器mongodb/rs 文件夹下
修改配置文件 3台都需要相同操作
vim /usr/local/mongodb/etc/mongodb.conf
dbpath=/usr/local/mongodb/data/db
logpath=/usr/local/mongodb/log/mongodb.log
logappend=true
fork=true
bind_ip=192.168.4.63
port=27077
replSet=rs1
auth=true #取消之前注释的两行
keyFile = /usr/local/mongodb/rs/keyfile
]# mongod -f /usr/local/mongodb/etc/mongodb.conf
服务器 认证登陆 第1种认证登陆方式
格式:mongo -u用户名 -p密码 --authenticationDatabase 数据库名
[root@mongodb61 ~]# mongo --host 192.168.4.61 --port 27077 -u "root" --authenticationDatabase "admin" -p'root'
服务器 无认证登陆 无权限
[root@mongodb62 mongodb]# mongo --host 192.168.4.62 --port 27077
rs1:SECONDARY> rs.status()
{
"operationTime" : Timestamp(1577785469, 1),
"ok" : 0,
"errmsg" : "not authorized on admin to execute command { replSetGetStatus: 1.0, $clusterTime: { clusterTime: Timestamp(1577785449, 1), signature: { hash: BinData(0, 098FCC247EDB082DB5B18A84AD2AF2A587243261), keyId: 6776528919215472641 } }, $db: \"admin\" }",
"code" : 13,
"codeName" : "Unauthorized",
"$clusterTime" : {
"clusterTime" : Timestamp(1577785469, 1),
"signature" : {
"hash" : BinData(0,"i8vPtAV9DxxIxssN6reZMezng1o="),
"keyId" : NumberLong("6776528919215472641")
}
}
}
第2种认证登陆方式 先登陆 然后进入admin库认识
rs1:SECONDARY> use admin
switched to db admin
rs1:SECONDARY> db.auth("root","root")
3、扩展 增加、删除节点
增加一个节点
1、同上,建立一个文件包含bin、data、config、log等文件
2、启动mongodb
3、添加次新节点到现有的Replica sets
rs1:PRIMARY> rs.add("192.168.4.64:27077") #添加192.168.4.64节点
rs1:PRIMARY> rs.status()
删除一个节点
rs1:PRIMARY> rs.remove("192.168.4.64:27077")
rs1:PRIMARY> rs.status()
4、扩展 集群指定权重 在集群初始化也可以指定权重 这样相对灵活一点
hqmongodb:PRIMARY> cfg = rs.conf()
rs1:PRIMARY> cfg.members[0].priority = 1
1
rs1:PRIMARY> cfg.members[1].priority = 3
3
rs1:PRIMARY> cfg.members[3].priority = 2
2
rs1:PRIMARY> rs.reconfig(cfg) #使配置生效 过大概1分钟左右
rs1:SECONDARY> rs.conf() #查看节点为权重 前缀已经变成rs1:SECONDARY