MongoDB主从复制搭建教程-单机热备
一、MongoDB主从复制介绍
MongoDB主从复制是MongoDB最常用的复制方式,也是一个简单的数据库同步备份的集群技术,这种方式很灵活,可用于备份,故障恢复,读扩展等。不过MongoDB生产环境中一般使用的是MongoDB副本集和MongoDB分片集群技术,在随后发布的文章中,我会对副本集与分片集群技术进行逐一介绍。回到主从复制,最基本的配置方式就是建立一个主节点和一个或多个从节点。采用双机或多机备份后主节点挂掉了后从节点可以接替主机继续服务。所以这种模式比单节点的高可用性要好很多,但由于主从复制结构无法实现自动切换主从,需要人为干预,一旦主库出现故障影响时间相对比较久,对于业务侧来讲这是无法忍受的。这也就是为什么主从复制集群被MongoDB副本集集群所取代的原因。
主从复制可以解决哪些问题?
(1)缓解读写压力:一个 MongoDB实例承载海量的读和写,容易达到瓶颈。一主多从,从服务器可以有效的缓解了读的压力。如:web 服务器场景,大多都是读大于写。
(2)数据的备份:备份分为热备份和冷备份。热备份:主从复制,主挂掉了,从库的数据还是比较完善的;冷备份:定时的 copy 从服务器的数据。如:用户误操作。比如说用户执行了一个 delete,那么主从都会没有数据,这个时候,就体现出冷备份的重要性。
建立一个主节点和一个或者多个从节点,每个从节点要知道主节点的地址。运行mongod --master就启动了主服务器。运行mongod --slave --source master_address 则启动了从服务器,其中master_address就是上面主节点的地址。
所有从节点都从主节点复制内容。目前还没有能够从从节点复制的机制,原因就是从节点并不保存自己的oplog。一个集群中有多少个从节点并没有明确的限制,但是上千个从节点对单个主机点发起查询也会让其吃不消的。所以实际中,不超过12个从节点的集群就可以运转良好了。
二、MongoDB主从复制搭建
【注意】生产环境不推荐使用主从复制集群,建议使用副本集集群或者分片集群,主从复制集群仅仅用于学习和测试使用。
2.1 准备工作
[root@public ~]# mkdir cluster [root@public ~]# cd cluster/ [root@public cluster]# wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.2.22.tgz [root@public cluster]# tar -zxvf mongodb-linux-x86_64-3.2.22.tgz [root@public cluster]# mv mongodb-linux-x86_64-3.2.22/ mongodb [root@public cluster]# mkdir -p /root/cluster/master/db [root@public cluster]# mkdir -p /root/cluster/slave/db [root@public cluster]# cp /root/cluster/mongodb/bin/mongo /root/cluster/master/ [root@public cluster]# cp /root/cluster/mongodb/bin/mongo /root/cluster/slave/ [root@public cluster]# cp /root/cluster/mongodb/bin/mongod /root/cluster/master/ [root@public cluster]# cp /root/cluster/mongodb/bin/mongod /root/cluster/slave/
【注】为了测试方便,自建MongoDB主从集群的master节点和slave节点都在同一台虚机上,通过不同端口标识不同节点服务。
2.2 搭建主从
(1)开启master
[root@public cluster]# /root/cluster/master/mongod --dbpath=/root/cluster/master/db --master --port 27017 # --master 标记自己是master服务器 # --port 指定自己的端口,默认是27017
(2)开启slave
[root@public ~]# /root/cluster/slave/mongod --dbpath=/root/cluster/slave/db --slave --source=127.0.0.1:27017 --port 27018 # --slave 标记自己是slave服务器 # --source 标记需要同步的服务器即指定master IP # --port 开启自己的端口,千万不能和master重复
(3)主从同步日志信息
master数据库日志输出:
Sun Dec 20 08:05:06.210 [slaveTracking] build index local.slaves { _id: 1 } 也就是说在local这个数据库下面生成了一个slave表【集合】
slave数据库日志输出:
Sun Dec 20 08:05:05.196 [replslave] build index local.sources { _id: 1 } Sun Dec 20 08:05:05.201 [replslave] build index local.me { _id: 1 } # 说明在local数据下有两个表:【sources,me】总得来说,master通过slaves表记录这从属服务器的信息,slave 通过 sources表记录主服务器的信息。
(4)设置远程管理用户
> use admin > db.createUser({user:"admin",pwd:"123456",roles:[{role:"root",db:"admin"}]})
> db.auth("admin", "123456")
2.3 主从同步可设置参数
--only # 在从节点上指定只复制特定某个数据库(默认复制所有数据库)。 --slavedelay # 用在从节点上,当应用主节点的操作时增加延时(单位是秒)。这样就能轻松设置延时从节点了,这种节点对用户无意中删除重要文档或者插入垃圾数据等事故有很重要的防护作用。这些不良操作都会被复制到所有从节点上。通过延缓执行操作,可以有个恢复的时间差。 --fastsync # 以主节点的数据快照为基础启动从节点。如果数据目录一开始是主节点的数据快照,从节点用这个选项启动要比做完整同步快很多。 --autoresync # 如果从节点与主节点不同步了,则自动重新同步。 --oplogsize # 主节点oplog的大小(单位是MB)。
2.4 添加及删除源
启动从节点时可以用--source指定主节点,也可以在shell中配置这个源。假设主节点绑定了localhost:27017。启动从节点时可以不添加源,而是随后向sources集合添加主节点信息:
[root@public ~]# /root/cluster/slave/mongod --dbpath=/root/cluster/slave/db --slave --port 27018
现在可以在shell中运行如下命令,将localhost:27017作为源添加到从节点上:
# 主库更改复制源 > use local switched to db local > db.sources.insert({"host":"127.0.0.1:27017"}) WriteResult({ "nInserted" : 1 }) # 主库变更复制源 > db.sources.insert({"host":"127.0.0.1:27017"}) > db.sources.remove({"host":"127.0.0.1:27017"}) # sources集合可以被当做普通集合进行操作,而且为管理从节点提供了很大的灵活性。
【注】要是切换的两个主节点有相同的集合,MongoDB会尝试合并,但不保证能正确合并。要是使用的一个从节点对应多个不同的主节点,最好在主节点上使用不同的命名空间。
作者:UStarGao
链接:https://www.starcto.com/mongodb/185.html
来源:STARCTO
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
UCloud云平台推荐
随便看看
- 2022-03-22Redis数据备份与恢复以及迁移解决方案
- 2021-05-29MySQL ibdata1共享表空间
- 2021-09-17MySQL优化器之Cardinality(Analyze table)
- 2021-05-09CURL方法测试网站响应速度
- 2022-05-11MongoDB优雅查询文档记录.pretty()用法