加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

Web架构之路:MongoDB集群及高可用实践

发布时间:2019-10-12 11:07:00 所属栏目:建站 来源:热爱技术君
导读:MongoDB集群有副本集及主从复制两种模式,不过主从模式在MongoDB 3.6已经彻底废弃,今天主要探讨副本集的搭建和使用,以及分片。 副本集介绍 副本集(Replica Set)即副本的集合,在MongoDB中通过先定义一个副本集合,然后将多个节点(副本)加入到这个集合中

副本集包括三种节点:主节点、从节点、仲裁节点。

  • 主节点负责处理客户端请求,读、写数据, 记录在其上所有操作的oplog;
  • 从节点定期轮询主节点获取这些操作,然后对自己的数据副本执行这些操作,从而保证从节点的数据与主节点一致。默认情况下,从节点不支持外部读取,但可以设置,副本集的机制在于主节点出现故障的时候,余下的节点会选举出一个新的主节点,从而保证系统可以正常运行。
  • 仲裁节点不复制数据,仅参与投票。由于它没有访问的压力,比较空闲,因此不容易出故障。由于副本集出现故障的时候,存活的节点必须大于副本集节点总数的一半,否则无法选举主节点,或者主节点会自动降级为从节点,整个副本集变为只读。因此,增加一个不容易出故障的仲裁节点,可以增加有效选票,降低整个副本集不可用的风险。仲裁节点可多于一个。也就是说只参与投票,不接收复制的数据,也不能成为活跃节点。

官方推荐MongoDB副本节点最少为3台, 建议副本集成员为奇数,最多12个副本节点,最多7个节点参与选举。限制副本节点的数量,主要是因为一个集群中过多的副本节点,增加了复制的成本,反而拖累了集群的整体性能。 太多的副本节点参与选举,也会增加选举的时间。而官方建议奇数的节点,是为了避免脑裂 的发生。

选举过程

副本集的选举过程大致如下:

得到每个服务器节点的最后操作时间戳。每个 mongodb都有oplog机制会记录本机的操作,方便和主服务器进行对比数据是否同步还可以用于错误恢复。

如果集群中大部分服务器down机了,保留活着的节点都为secondary状态并停止,不选举了。

如果集群中选举出来的主节点或者所有从节点最后一次同步时间看起来很旧了,停止选举等待人来操作。

如果上面都没有问题就选择最后操作时间戳最新(保证数据是最新的)的服务器节点作为主节点。

MongoDB 同步延迟问题

在MongoDB中,所有写操作都会产生 oplog,oplog 是每修改一条数据都会生成一条,如果你采用一个批量update命令更新了 N 多条数据,那么oplog 会有很多条,而不是一条。所以同步延迟就是写操作在主节点上执行完后,从节点还没有把 oplog 拿过来再执行一次。而这个写操作的量越大,主节点与从节点的差别也就越大,同步延迟也就越大了。

分片

当MongoDB存储海量的数据时,一台机器可能不足以存储数据,也可能不足以提供可接受的读写吞吐量。这时我们就可以通过在多台机器上分割数据,使得数据库系统能存储和处理更多的数据。

分片集群结构分布:

Web架构之路:MongoDB集群及高可用实践

三个主要组件:

  • Shard:数据存储位置,以chunk为单位存数据,实际生产环境中一个shard server角色可由几台机器组个一个replica set承担,防止主机单点故障;
  • Config Server:mongod实例,存储了整个ClusterMetadata,其中包括 chunk信息,默认需要配置3个Config Server节点;
  • Query Routers:(Mongos) 前端路由,客户端由此接入,且让整个集群看上去像单一数据库,前端应用可以透明使用。

Mongos本身并不持久化数据,Sharded Cluster所有的元数据都会存储到Config Server,而用户的数据会议分散存储到各个shard。Mongos启动后,会从配置服务器加载元数据,开始提供服务,将用户的请求正确路由到对应的碎片。

Mongos的路由功能:

  • 当数据写入时,MongoDB Cluster根据分片键设计写入数据。
  • 当外部语句发起数据查询时,MongoDB根据数据分布自动路由至指定节点返回数据。

分片部署

条件有限,我们还是在单机上,用不同MongoDB线程来部署分片。

Web架构之路:MongoDB集群及高可用实践

分片服务器

Shard Server和普通Mongod程序一样,不同的是需要在配置文件中添加shardsvr=true标记为Shard Server,配置参考如下:

  1. # 指定数据库路径 
  2. dbpath=/usr/local/mongodb/share/1/data/db 
  3. # 使用追加的方式写日志 
  4. logpath=/usr/local/mongodb/share/1/log/mongodb.log 
  5. # 使用追加的方式写日志 
  6. logappend = true 
  7. # 绑定服务IP 
  8. bind_ip=127.0.0.1 
  9. # 服务器端口 
  10. port = 27020 
  11. # 以守护进程的方式运行MongoDB,创建服务器进程 
  12. fork = true 
  13. # PID File 的完整路径 
  14. pidfilepath=/usr/local/mongodb/var/mongod27020.pid 
  15. # 不启用验证 
  16. noauth=true 
  17. # 最大同时连接数,默认2000 
  18. maxConns=2000 
  19. # 同步复制的日志大小设置,单位MB 
  20. oplogSize=10 
  21. # 设置为shared server 
  22. shardsvr=true 

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读