您的位置:首页 > 数据库 > Mongodb

【Mongodb】 可复制集搭建

2020-06-21 23:35 369 查看
# 可复制集 replica set 概念图 ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233253108-1930307098.png) 可复制集需要至少3个以上的mongodb节点,其中有一个主节点promary,其余的为副本节点secondary 可复制集有三个角色: * 主要成员(Primary):主要接收所有写操作。就是主节点。 * 副本成员(Secondary):从主节点通过复制操作以维护相同的数据集,即备份数据,不可写操作,但可以读操作(但需要配置)。是默认的一种从节点类型。 * 仲裁者(Arbiter):不保留任何数据的副本,只具有投票选举作用。当然也可以将仲裁服务器维护为副本集的一部分,即副本成员同时也可以是仲裁者。也是一种从节点类型。 关于仲裁者: 如果主节点+副本节点是偶数推荐添加仲裁者,如果主节点+ 副本节点是奇数可以不添加仲裁者。仲裁者将永远是仲裁者,而主要人员可能会退出并成为次要人员,而次要人员可能成为选举期间的主要人员。 ## 为什么要用可复制集?它有什么重要性? 1. 避免数据丢失,保障数据安全,提高系统安全性; (最少3节点,最大50节点) 2. 自动化灾备机制,主节点宕机后通过选举产生新主机;提高系统健壮性; (7个选举节点上限) 3. 读写分离,负载均衡,提高系统性能; ## 搭建 ### 准备三个mongodb节点 正准备三个mongodb节点,我们先搭建一个主节点,2个副本节点的模式 修改配置mongo.conf * 第一个 ``` systemLog: #MongoDB发送所有日志输出的目标指定为文件 destination: file #mongod或mongos应向其发送所有诊断日志记录信息的日志文件的路径 path: "/home/amber/mongodb/mongodb-001/log/mongod.log" #当mongos或mongod实例重新启动时,mongos或mongod会将新条目附加到现有日志文件的末尾。 logAppend: true storage: #mongod实例存储其数据的目录。storage.dbPath设置仅适用于mongod。 dbPath: "/home/amber/mongodb/mongodb-001/data/db" journal: #启用或禁用持久性日志以确保数据文件保持有效和可恢复。 enabled: true processManagement: #启用在后台运行mongos或mongod进程的守护进程模式。 fork: true #指定用于保存mongos或mongod进程的进程ID的文件位置,其中mongos或mongod将写入其PID pidFilePath: "/home/amber/mongodb/mongodb-001/log/mongod.pid" net: #服务实例绑定所有IP,有副作用,副本集初始化的时候,节点名字会自动设置为本地域名,而不是ip #bindIpAll: true #服务实例绑定的IP bindIp: 0.0.0.0 #bindIp #绑定的端口 port: 27017 replication: #副本集的名称 replSetName: myrs ``` * 第二个第三个配置 把上述文件中的`mongodb-001`换成`mongodb-002``mongodb-003` 端口分别换成27018 27019 然后分别在mongodb-00X的根目录下执行启动命令 ``` ./bin/mongod -f ./conf/mongod.conf ``` 检查进程 ``` ps -ef|grep mongod ``` ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233317079-900142714.png) ### 设置主节点 进入27017的那个mongod的客户端,并且执行 ``` rs.initiate({ _id: "myrs", // 需要和replSetName的名称一致 version: 1, members: [{ _id: 0, host : "192.168.xx.xx:27017" }]}); ``` 或者 ``` rs.initiate({}) ``` 执行结果 ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233326431-791616322.png) ``` 提示: 1)“ok”的值为1,说明创建成功。 2)命令行提示符发生变化,变成了一个从节点角色,此时默认不能读写。稍等片刻,回车,变成主节 点。 ``` ### 配置副本节点 再27017的mongod客户端,也就是主节点上执行`192.168.xx.xx:27018`是副本节点的ip和端口 ``` rs.add("192.168.xx.xx:27018") rs.add("192.168.xx.xx:27019") ``` 使用 ``` rs.status() ``` 就可以看到members会有三个节点了 ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233739986-1722601861.png) ### 测试 再主节点插入一条数据 ``` use article; db.comment.insert({name: "amber"}) ``` 再从节点查看,结果 ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233351009-2061444547.png) 这是因为需要再从节点再次进行 ``` rs.slaveok() // 确认当前节点是副本节点 db.comment.find(); // 查看当前数据 ``` 可以看到已经有数据了,这样一主二从的可复制成功了 ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233400114-524789748.png) 如果关闭主节点,在从节点执行rs.status(); 可以看到原来的主节点的health变成了0 ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233410918-1305890654.png) 27018变成了新的主节点 ![](https://img2020.cnblogs.com/blog/1445322/202006/1445322-20200621233642773-2135393787.png)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: