MongoDB复制是将数据同步在多个服务器过程
复制提供了数据的冗余备份,并在多个服务器存储数据副本,提高了数据的可用性,并可以保证数据的安全性。
复制还允许从硬件故障和服务器中恢复数据。
什么是复制?
- 保证数据的安全性
- 数据可用性(24*7)
- 灾难恢复
- 无需停机维护(如备份,重建索引,压缩)
- 分布式读取数据
MongoDB复制原理
mongodb的复制至少需要两个节点(这里准备三个)其中一个主节点,负责处理客户端请求,其余都是从节点,负责复制主节点的数据。
mongodb各个节点常用的搭配方式为:一主一从,一主多从
主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
MongoDB复制结构图如下:
架构规划:
节点 | 数据目录 | 端口 |
主节点 28017 | /data/mongo_28017 | :28017 |
从节点 28018 | /data/mongo_28018 | :28018 |
从节点 28019 | /data/mongo_28019 | :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