系统环境
- 操作系统版本
1 | $ cat/etc/redhat-release |
- mongodb 版本
1 | $ mongo --version |
配置MongoDB Repository
- 创建 /etc/yum.repos.d/mongodb.repo 文件
1 | $ vim /etc/yum.repos.d/mongodb.repo |
- 编辑内容:
1 | [mongodb] |
上面的mongdb仓库使用的是mongodb官网的,版本比较老,我安装的时候是2.6.12,如果使用清华大学的mongodb镜像版本为3.2.X
安装MongoDB
不管是主、从、还是仲裁,三个都需要安装mongdb
1 | $ sudo yum install mongodb-org |
启动MongoDB
1 | $ sudo systemctl start mongod |
开机自启
1 | $ /sbin/chkconfig mongod on |
配置数据库
1 | $ mongo |
1 | > use admin |
MongoDB数据库角色
- 数据库用户角色: read、 readWrite
- 数据库管理角色: dbAdmin、dbOwner、userAdmin
- 集群管理角色:clusterAdmin、 clusterManager、clusterMonitor、hostManager
- 备份恢复角色:backup、restore
- 所有数据库角色: readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
- 超级用户角色:root
- 内部角色: __system
角色说明
Read 允许用户读指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除、查看统计、或访问system.profile
dbOwner 允许用户对某个数据库进行所有操作
userAdmin 允许用户向system.users集合写入,可以查找指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
clusterManager 在集群上提供管理和监视行为,这个角色可以访问config和local 数据库,用于分片和复制
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有书苦苦的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root 只在admin数据库中可用,超级账号,超级权限
参考教程 :
MongoDB 操作
- 查看mongo 版本
$ mongo –version // or in mongo use > db.version() - 查看所有数据库
> show dbs - 查看集合
> show collections - 查看用户
> show users - 进入数据库
> user db-name - 显示数据操作命令
> db.help() - 显示指定数据库的集合下的操作命令
> db.collection_name.help() - 查找指定数据库的集合,所有的条目
> db.collection_name.find() - 查找指定数据库的集合,有条件限制
> db.collection_name.find({key: value})
// 查找collection_name集合下的属性为key,值为value的项目 - 删除数据库
> db.dropDatabase() - 克隆指定数据库到本机上
> db.cloneDatabase(“127.0.0.1”) - 恢复当前数据库
> db.repairDatabase() - 获取当前数据库的名字
> db.getName() or db - 查看链接当前db的机器
> db.getMongo() - 查看数据库服务器的状态
> db.serverStatus()
配置各个主机的主机名代替ip地址
PRIMARY: ip: 192.168.8.126 port: 27017 hostname: mongo1
SECONDARY: ip: 192.168.8.128 port: 27017 hostname: mongo2
ARBITER: ip: 192.168.8.127 port: 27017 hostname: message
以mongo1为例:
1 | $ sudo hostnamectl set-hostname mongo1 |
修改各个主机的hosts文件
mongo1:
1 | $ sudo vim /etc/hosts |
mongo2:
1 | $ sudo vim /etc/hosts |
message(仲裁节点):
1 | $ sudo vim /etc/hosts |
配置复制集
需要在主、从、仲裁中都要配置
1 | $ sudo vim /etc/mongod.conf |
重启mongodb
1 | $ sudo service mongod restart |
配置之前关闭防火墙和selinux
Centos7中已经不使用iptables,默认使用firewall
关闭防火墙
$ sudo systemctl stop firewalld.service
$ sudo systemctl disable firewalld.service # 禁止开机自启关闭selinux
$ sudo vim /etc/sysconfig/selinux
# /etc/sysconfig/selinux
取消注释 #SELINUX=enforcing
改为
SELINUX=disabled
保存退出后 执行
$ setenforce 0 // 设置SELINUX状态
$ getenforce // 获取SELINUX状态
Permissive
参考教程:
配置主节点
$ mongo
> use admin
> rs.initiate()
> rs.add("mongo2:27017")
loit:PRIMARY> rs.addArb("message:27017")
loit:PRIMARY> rs.status()
// out
{
"set" : "myReplSet",
"date" : ISODate("2018-09-23T04:16:10Z"),
"myState" : 1,
"members" : [
{
"_id" : 0,
"name" : "mongo1:27017",
"health" : 1,
"state" : 1,
"stateStr" : "PRIMARY",
"uptime" : 8178,
"optime" : Timestamp(1537668470, 1),
"optimeDate" : ISODate("2018-09-23T02:07:50Z"),
"electionTime" : Timestamp(1537668114, 1),
"electionDate" : ISODate("2018-09-23T02:01:54Z"),
"self" : true
},
{
"_id" : 1,
"name" : "mongo2:27017",
"health" : 1,
"state" : 2,
"stateStr" : "SECONDARY",
"uptime" : 8054,
"optime" : Timestamp(1537668470, 1),
"optimeDate" : ISODate("2018-09-23T02:07:50Z"),
"lastHeartbeat" : ISODate("2018-09-23T04:16:09Z"),
"lastHeartbeatRecv" : ISODate("2018-09-23T04:16:09Z"),
"pingMs" : 3,
"syncingTo" : "mongo1:27017"
},
{
"_id" : 2,
"name" : "message:27017",
"health" : 1,
"state" : 7,
"stateStr" : "ARBITER",
"uptime" : 8176,
"lastHeartbeat" : ISODate("2018-09-23T04:16:09Z"),
"lastHeartbeatRecv" : ISODate("2018-09-23T04:16:09Z"),
"pingMs" : 0
}
],
"ok" : 1
}
测试
在主库中添加测试测试数据后,在从从库中也会同步;
如果主库关闭,从库会充当主库;
此时如果原主库再启动,则变为从库;
搭建中遇到的问题
1.在rs.add(hostname:port)时候报 code:13144
- 注意关闭防火墙,setlinux 或者添加规则
- 注意注释掉bind_ip = 127.0.0.1 或者改为 bind_ip = 0.0.0.0
注意指定replSet 在 mongod.conf中
参考教程:
2.在rs.createUser()时报错
Error: couldn’t add user: not master at src/mongo/shell/db.js:1004
将mongod.conf中的replSet注释掉
参考教程:
3.在从库中无法查看数据库中的数据报 code: 13435
error: { “$err” : “not master and slaveOk=false”, “code” : 13435 }
注意看错误信息: 不是主机,slaveOk=false
解决方案:
进入mongo控制台
输入
> rs.slaveOk()
即可
参考教程:
mongodb, replicates and error: { “$err” : “not master and slaveOk=false”, “code” : 13435 }
意外情况
1.三个机器只有一个运行 rs.initiate(),如果其他机器运行了,则需要清除
$ mongo
> use local
> db.dropDabase()
> exit
$ service mongod restart
2.卸载数据库
- 停止服务
$ sudo systemctl stop mongod - 删除安装包
$ sudo yum erase $(rpm -qa | grep mongod-org) - 删除数据与日志
$ sudo rm -rf /var/log/mongodb
$ sudo rm -rf /var/lib/mongo