MongoDB复制是将数据同步在多个服务器过程
复制提供了数据的冗余备份,并在多个服务器存储数据副本,提高了数据的可用性,并可以保证数据的安全性。
复制还允许从硬件故障和服务器中恢复数据。
什么是复制?
-
-
数据可用性(24*7)
-
灾难恢复
-
无需停机维护(如备份,重建索引,压缩)
-
mongodb的复制至少需要两个节点(这里准备三个)其中一个主节点,负责处理客户端请求,其余都是从节点,负责复制主节点的数据。
mongodb各个节点常用的搭配方式为:一主一从,一主多从
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
MongoDB复制结构图如下:
架构规划:
节点 | 数据目录 | 端口 |
主节点 28017 | /data/mongo_28017 | :28017 |
从节点 28018 | /data/mongo_28018 | :28018 |
从节点 28019 | /data/mongo_28019 |
su - mongo mongod -f /opt/mongo_27017/conf/mongodb.conf --shutdown mkdir -p /opt/mongo_2801{7,8,9}/{conf,log,pid} mkdir -p /data/mongo_2801{7,8,9}
cat >/opt/mongo_28017/conf/mongo_28017.conf <<EOF systemLog: destination: file logAppend: true path: /opt/mongo_28017/log/mongodb.log storage: journal: enabled: true dbPath: /data/mongo_28017 directoryPerDB: true wiredTiger: engineConfig: cacheSizeGB: 0.5 directoryForIndexes: true collectionConfig: blockCompressor: zlib indexConfig: prefixCompression: true processManagement: fork: true pidFilePath: /opt/mongo_28017/pid/mongod.pid net: port: 28017 bindIp: 127.0.0.1,10.0.0.51 replication: oplogSizeMB: 1024 replSetName: dba EOF
cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28018/conf/mongo_28018.conf cp /opt/mongo_28017/conf/mongo_28017.conf /opt/mongo_28019/conf/mongo_28019.conf
sed -i 's#28017#28018#g' /opt/mongo_28018/conf/mongo_28018.conf sed -i 's#28017#28019#g' /opt/mongo_28019/conf/mongo_28019.conf
mongod -f /opt/mongo_28017/conf/mongo_28017.conf mongod -f /opt/mongo_28018/conf/mongo_28018.conf mongod -f /opt/mongo_28019/conf/mongo_28019.conf
# 添加主机名 vim /etc/hosts 10.0.0.51 db01 mongo db01:28017 mongo db01:28018 mongo db01:28019
改成变量起个别名,添加主从节点信息
config = { _id : "dba", members : [ {_id : 0, host : "db01:28017"}, {_id : 1, host : "db01:28018"}, {_id : 2, host : "db01:28019"}, ]} rs.initiate(config)
选举过程:
db.inventory.insertMany( [ { "item": "journal", "qty": 25, "size": { "h": 14, "w": 21, "uom": "cm" }, "status": "A" }, { "item": "notebook", "qty": 50, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "A" }, { "item": "paper", "qty": 100, "size": { "h": 8.5, "w": 11, "uom": "in" }, "status": "D" }, { "item": "planner", "qty": 75, "size": { "h": 22.85, "w": 30, "uom": "cm" }, "status": "D" }, { "item": "postcard", "qty": 45, "size": { "h": 10, "w": 15.25, "uom": "cm" }, "status": "A" } ]);
rs.slaveOk() use test db.inventory.find()
# 临时生效 rs.slaveOk() # 写入启动文件 echo "rs.slaveOk()" > ~/.mongorc.js