MongoDB复制是将数据同步在多个服务器的过程。 复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提高了数据的可用性, 并可以保证数据的安全性。 复制还允许您从硬件故障和服务中断中恢复数据。
mongodb的复制至少需要两个节点。其中一个是主节点,负责处理客户端请求,其余的都是从节点,负责复制主节点上的数据。 mongodb各个节点常见的搭配方式为:一主一从、一主多从。 主节点记录在其上的所有操作oplog,从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。
在本教程中我们使用同一个MongoDB来做MongoDB主从的实验, 操作步骤如下:
现在我们通过指定 --replSet 选项来启动mongoDB。–replSet 基本语法格式如下:
mongod --port “PORT” --dbpath “YOUR_DB_DATA_PATH” --replSet “REPLICA_SET_INSTANCE_NAME”
实例
mongod --bind_ip 192.168.xx.x --port 27017 --dbpath “D:\set up\mongodb\data” --replSet rs0 mongod --bind_ip 192.168.xx.x --port 27018 --dbpath “D:\set up\mongodb\data” --replSet rs0
以上实例会启动2个名为rs0的MongoDB实例,其端口号为27017和27018。 启动后打开命令提示框并连接上mongoDB服务。
mongo -host 192.168.xx.x -port 27017
在主(比如:27017)Mongo客户端使用命令rs.initiate()来启动一个新的副本集。 我们可以使用rs.conf()来查看副本集的配置 查看副本集状态使用 rs.status() 命令
添加副本集的成员,我们需要使用多台服务器来启动mongo服务。进入Mongo客户端,并使用rs.add()方法来添加副本集的成员。 语法 rs.add() 命令基本语法格式如下:
rs.add(HOST_NAME:PORT)
比如:
rs.add(‘192.168.xx.x:27018’)
MongoDB中你只能通过主节点将Mongo服务添加到副本集中, 判断当前运行的Mongo服务是否为主节点可以使用命令db.isMaster() 。 MongoDB的副本集与我们常见的主从有所不同,主从在主机宕机后所有服务将停止,而副本集在主机宕机后,副本会接管主节点成为主节点,不会出现宕机的情况。
在从服务器 27018 的客户端使用如下命令开启:
mongo -host 192.168.xx.x -port 27018
rs.slaveOk()
另外一种启动的方式: 具体操作方式就是,通过mongod --master启动主服务器,通过mongod --slave --source master_address启动从服务器,其中master_address就是主节点的地址!实际应用中会在不同机器上实现主从服务器,我们这里在一台机器上进行演示:
E:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongod --dbpath E:\master\mongodata --logpath E:\master\mongolog\log.txt --port 10000 --master all output going to: E:\master\mongolog\log.txt启动第一个从服务器:
E:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongod --dbpath E:\slave1\mongodata --logpath E:\slave1\mongolog\log.txt --port 10001 --slave --source local host:10000 all output going to: E:\slave1\mongolog\log.txt启动第二个从服务器:
E:\mongodb\mongodb-win32-x86_64-2.0.6\bin>mongod --dbpath E:\slave2\mongodata --logpath E:\slave2\mongolog\log.txt --port 10002 --slave --source local host:10000 all output going to: E:\slave2\mongolog\log.txt这里的 local 是当将几个 server 搭建在一台电脑上的时候,不然需要指定每个 server 的 host address。