可复制集 replica set

概念图

可复制集需要至少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

设置主节点

进入27017的那个mongod的客户端,并且执行

rs.initiate({
_id: "myrs", // 需要和replSetName的名称一致
version: 1,
members: [{ _id: 0, host : "192.168.xx.xx:27017" }]});

或者

rs.initiate({})

执行结果

提示:
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会有三个节点了

测试

再主节点插入一条数据

use article;
db.comment.insert({name: "amber"})

再从节点查看,结果

这是因为需要再从节点再次进行

rs.slaveok() // 确认当前节点是副本节点
db.comment.find(); // 查看当前数据

可以看到已经有数据了,这样一主二从的可复制成功了

如果关闭主节点,在从节点执行rs.status();

可以看到原来的主节点的health变成了0

27018变成了新的主节点

最新文章

  1. Dagger2 使用初步
  2. 【leetcode❤python】 278. First Bad Version
  3. PyMySQL Evaluation
  4. Java分布式应用技术架构介绍
  5. java多线程系列8-线程的优先级
  6. 转载:有关SQL server connection KeepAlive 的FAQ
  7. Extjs文本输入域
  8. POJ 2923 Relocation (状态压缩,01背包)
  9. Flex通信-与Java实现Socket通信实例
  10. LRU缓存算法
  11. windows 环境下安装plpython语言环境到postgresql数据库
  12. uva_1422 Processor
  13. android 基础学习图片六progross
  14. android 原生的DownloadManager
  15. cannot be cast to java.lang.Comparable
  16. python中json文件处理涉及的四个函数json.dumps()和json.loads()、json.dump()和json.load()的区分
  17. Javascript--数组转换成字符串
  18. [游记] Noip 2018
  19. 巧用cheerio重构grunt-inline
  20. mysql 配置路径

热门文章

  1. vue中生命周期
  2. noip2019(普及组) 公交换乘 (不剪枝见祖宗题)
  3. [COCOS2DX-LUA]0-005.cocos2dx中关于全面屏和折叠屏的适配的一些见解
  4. python2.7入门 01
  5. Rocket - util - Repeater
  6. 【HBase】表的version
  7. Python——day2
  8. ASP.NET中使用Entity Framework开发增删改查的Demo(EF增删改查+母版页的使用)
  9. Java实现 蓝桥杯 算法提高 合并石子
  10. Java实现 LeetCode 436 寻找右区间