登 录
注 册
< 数 据 库
MySQL
ClickHouse
ES
Doris
MongoDB
Redis
其他DB
重新定义OLTP数据库
MongoDB基本操作
复制集机制及原理
MongoDB事务
热门推荐>>>
中台架构
中台建设与架构
Hadoop
源码分析-NN启动(三)
HBase
HBased对接Hive
Linux
Nginx高可用
Python
数据导出工具
Flink
3分钟搭建Flink SQL测试环境
Kafka
Kafka对接Flume
深度学习
卷积神经网络
数据结构与算法
选择合适的算法
MySQL
数据备份恢复
计算机系统
信号量同步线程
Hive
Hive调优参数大全
其他框架
Azkaban Flow1.0与2.0
ClickHouse
表引擎-其他类型
技术成长
最好的职业建议
精选书单
技术成长书单—机器学习
技术资讯
数据在线:计算将成为公共服务
开发工具
IntelliJ IDEA 20年发展回顾(二)
系统工具
Mac命令行工具
虚拟化
内存虚拟化概述
云原生
云原生构建现代化应用
云服务
一文搞懂公有云、私有云...
Java
Spring Boot依赖注入与Runners
Go
Go函数与方法
SQL
SQL模板
当前位置:
首页
>>
MongoDB
>>
复制集机制及原理
复制集机制及原理
2023-09-10 16:13:05 星期日 发表于北京 阅读:545
![](/static/images/article_images/1694332922.124393.jpeg) MongoDB复制集的主要意义在于实现服务高可用。依赖以下来那个方面的功能: 1、数据写入时迅速将数据复制到另一个独立的节点上; 2、在接受写入的节点发生故障时自动选举出一个新的替代节点 #### 复制集的作用 数据分发:将数据从一个区域复制到另一个区域,减少另一个区域的读延迟 读写分离:不同类型的压力分别在不同的节点上执行 异地容灾:在数据中心故障时候快速切换到异地 #### 复制集的复制方式 跟MySQL的binlog复制是一样的原理。即:从节点监听主节点的oplog日志,有变更记录就拉取到从节点所在机器作相应的解析操作。 #### 复制集选举机制 1、具有投票权的节点之间来两两互相发送心跳 2、当5次心跳未收到时判断为节点失联 3、如果失联的是主节点,从节点会发起选举,选出新的主节点 4、如果失联的是从节点则不会产生新的选举 5、选举基于RAFT一致性算法,选举成功的必要条件是大多数节点存活 6、复制集中最多可以有50个节点,但具有投票权的节点最多7个 #### 影响选举的因素 集群必须有大多数节点存活(n / 2 +1),其中n为奇数; 被选举的主节点需要满足如下条件 >能够与多数节点建立连接 具有较新的oplog 具有较高的优先级 #### 复制集注意事项 关于硬件 >因为正常的复制集节点都有可能成为主节点,它们的地位是一样的,因此硬件配置上必须一致 为了保证节点不会同时宕机,各节点使用的硬件必须具有独立性 关于软件 >复制集各节点软件必须一致,以避免出现不可预知的问题 增加节点不会增加系统写性能 #### 复制集搭建 ##### 编辑三台节点配置文件并启动 ``` cd $MONGODB_HOME vim mongod.conf ``` 添加如下内容 ```systemLog: destination: file path: /data/mongodb/mongod.log # 指定日志文件的位置 logAppend: true storage: dbPath: /data/mongodb # MongoDB数据真实存储的目录 net: bindIp: 0.0.0.0 port: 28017 # 指定端口 replication: replSetName: rs0 # 复制集的名称 processManagement: fork: true ``` 将此配置文件发送到另外两台节点,再依次启动三台节点服务 ``` mongod -f /data/mongodb/mongod.conf mongod -f /data/mongodb/mongod.conf mongod -f /data/mongodb/mongod.conf ``` 配置复制集 在其中一台节点上登录MongoDB(该节点会被默认为master) ``` mongo --port 28017 # 初始化MongoDB > rs.initiate() # 添加另外两台从节点 rs0:PRIMARY> rs.add("192.168.1.101:28017") rs0:PRIMARY> rs.add("192.168.1.102:28017") # 查看复制集状态,在members字段下面应该能看到对应另外两台机器的配置信息 > rs.status() ``` 验证复制集 在主节点写入测试数据 ``` > db.test.insert({a:1}) > db.test.insert({a:2}) 在任意一台从节点能查询到数据 # 允许从节点读取数据 > rs.slabeOk() # 查询集合test的所有数据 > db.test.find() ```