MongoDB副本集是将数据同步在多个服务器,
优点:提高了数据可用性,可以通过oplog恢复数据。
缺点:单节点存储所有数据,存储海量数据,对磁盘的容量依赖大。
0、配置
192.168.1.10 |
PRIMARY |
rs0 |
192.168.1.11 |
SECONDARY |
rs1 |
192.168.1.12 |
SECONDARY |
rs2 |
1、下载安装
cd /usr/local/src/
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz
tar zxf mongodb-linux-x86_64-rhel70-4.2.8.tgz -C /usr/local/
做软链接,保留版本号
ln -s /usr/local/mongodb-linux-x86_64-rhel70-4.2.8 /usr/local/mongodb
2、配置文件
192.168.1.10
vim /usr/local/mongodb/rs0/config/mongodb.conf # 任何IP都可以连 bind_ip=0.0.0.0 # 端口 port=27017 # 数据存放目录 dbpath=/usr/local/mongodb/rs0/data # 日志目录 logpath=/usr/local/mongodb/rs0/log/mongodb.log # 进程id目录 pidfilepath =/usr/local/mongodb/rs0/run/mongodb.pid # 日志输出方式 追加 logappend=true # 安静模式 将会尝试减少日志的输出量 quiet=true # 副本集名称 replSet=zbdata # 在后台启动 fork=true # 副本集的私钥的完整路径 keyFile=/usr/local/mongodb/keyfile # 开启用户认证 auth=true
192.168.10.11
bind_ip=0.0.0.0 port=27017 dbpath=/usr/local/mongodb/rs1/data logpath=/usr/local/mongodb/rs1/log/mongodb.log pidfilepath =/usr/local/mongodb/rs1/run/mongodb.pid logappend=true quiet=true replSet=zbdata fork=true keyFile=/usr/local/mongodb/keyfile
192.168.10.12
bind_ip=0.0.0.0 port=27017 dbpath=/usr/local/mongodb/rs1/data logpath=/usr/local/mongodb/rs1/log/mongodb.log pidfilepath =/usr/local/mongodb/rs1/run/mongodb.pid logappend=true quiet=true replSet=zbdata fork=true keyFile=/usr/local/mongodb/keyfile
3、生成认证文件keyFile
keyFile 集群之间安全认证(副本集默认没有认证)
openssl rand -base64 666 > /usr/local/mongodb/keyfile # 666文件大小
chmod 600 /usr/local/mongodb/keyfile #修改权限
将keyfile文件拷到副本集对应的目录
配置完成后启动服务
4、初始化
>config={ "_id" : "zbdata", "members" : [ { "_id" : 0, "host" : "192.168.1.10:27017" }, { "_id" : 1, "host" : "192.168.1.11:27017" }, { "_id" : 2, "host" : "192.168.1.12:27017" } ] } # 初始化配置 >rs.initiate(config) # 查看配置 >rs.conf() # 查看状态 >rs.status() #设置优先级 # 配置第三个成员优先级为3(优先级越高越优先成为主) >config=rs.conf() >config.members[3].priority = 3 >rs.reconfig(config)
5、配置权限
# 创建超级用户 *、userAdminAnyDatabase 任何数据库用户的管理权限 use admin db.createUser({ user:'admin', pwd:'123456', roles:[ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }) *、配置完登录 mongo -u admin -p 123456 --authenticationDatabase admin *、修改密码 use admin db.changeUserPassword("admin", "123456")
6、基本操作
a、查看
show dbs # 查看所有数据库
show tables # 查看所有table
show collections # 查看所有集合(表)
db # 查看当前操作的库
b、增
use test # 选择test库 db.createCollection('mycol') # 创建集合 db.mycol.insert({"name":"lifeilong", "age":18}) # 插入数据
c、删
use test db.dropDatabase() # 删除库 db.mycol.drop() # 删除表 db.mycol.remove({"name":"lifeilong", "age":18}) # 删除一条数据 db.mycol.update({},{$unset:{'crawled':''}},false, true) # 删除一列数据,crawled是要删除的列
d、改
# 更新数据 允许修改多条 db.mycol.update({"name":"lifeilong"}, {"$set":{"age":18}}, {multi:true})
e、查
db.mycol.find() # 查看所有数据 db.mycol.find().sort({update_time:-1}) # update_time逆序排序 db.mycol.find().skip(2).limit(10) # 跳过前2条,查询后面10个 db.mycol.find({'update_time':{'$regex': '2020-07-24 08'}}) # 正则匹配
f、聚合
*、查看人名重复次数大于1的数据 # 查询数据过大,使用磁盘缓存(allowDiskUse: true) db.getCollection('person').aggregate( [ { $group: { _id : '$name', count: { $sum : 1 } } }, { $match: { count: { $gt : 1} } } ], { allowDiskUse: true } ) *、先匹配后分组,安卓多个字段分组,并且将所有certName 拼接成列表 db.getCollection('qualification').aggregate([ { "$match": {"migrated": None}, }, { "$group": { "_id": { "certId": "$certId", "name": "$name", "organDate": "$organDate", "endDate": "$endDate", "certType": "$certType", }, "certNames": {"$addToSet": "$certName"}, }, }, {'$skip': 100}, {'$limit': 100}, ], {allowDiskUse:true} )
g、分析
*、查看集合中所有字段 db.projectset_licence.mapReduce( function() { for (var key in this) { emit(key, 1); } }, function(key, values) { return Array.sum(values); }, {out: {inline: 1}} ) *、判断列表数据 db.cited_papers_new.find( {'name.0': {'$exists': true}, # name(列表) 第一个值:存在 'result.0': {'$exists': false}} # result的第一个值:不存在 ) *、分析正在执行的操作 db.currentOp() # 重点关注每个操作的执行时间 如果太长就要优化 secs_running/microsecs_running *、索引 # 查询时发现CPU超频,分析发现部分查询时间过大导致的,果断加索引(给对应的查询条件字段加) db.mycol.createIndex({name:1})
7、备份恢复
a、备份恢复
*、全量备份
mongodump -u admin -p 123456 --oplog --gzip --authenticationDatabase "admin" --out /opt/backup
*、备份一个库
mongodump -u admin -p 123456 -d userprofile -o /opt/backup
*、恢复
mongorestore -u admin -p 123456 -d userprofile --dir /opt/backup/userprofile
*、全量恢复
mongorestore -u admin -p 123456 --oplogReplay --authenticationDatabase --gzip /opt/backup/20200910
b、灾难恢复
副本集可以通过oplog恢复数据
*、导出oplog
# -d local 数据库
# -c oplog.rs 集合名
# -o backup 导出目录
./mongodump -u admin -p 123456 --authenticationDatabase admin -d local -c oplog.rs -o backup/
*、恢复数据
# --oplogLimit "1596009600:1" 同一时间的第一个
./mongorestore -u admin -p 123456 --authenticationDatabase admin --oplogReplay --oplogLimit "1596009600:1" --dir backup/local