本篇文章主要从如下几个方面说明复制集架构对程序开发的影响php
笔者把基于MongoDb的应用开发分为软件运维和 软件开发两个阶段java
本篇会侧重后一阶段的实践经验分享git
谈到复制集,它是副本的集合,分布式系统的基本属性之一。github
副本是分布式系统最多见的概念之一,指分布式系统对数据和服务提供的一种冗余方式。在常见的分布式系统中,为了对外提供高可用的服务,咱们每每会对数据和服务进行副本处理。有副本的概念,就会关联到副本数据一致性问题。mongodb
MongoDb环境下,咱们很容易从公开资料查询到复制集的基本你含义数据库
MongoDB 复制(副本集)MongoDB复制是将数据同步在多个服务器的过程。安全
复制提供了数据的冗余备份,并在多个服务器上存储数据副本,提升了数据的可用性, 并能够保证数据的安全性。服务器
复制还容许您从硬件故障和服务中断中恢复数据yii2
MongoDB副本集是一组mongod进程的集合,它经过一系列机制实现了高可用。网络
mongod is the primary daemon process for the MongoDB system. It handles data requests, manages data access, and performs background management operations.
副本集角色主要包括主节点,从节点,和仲裁节点。 主节点负责全部的写操做。
二者属于不一样的MongoDb数据库结构,主从结构已经不被官方推荐
Deprecated since version 3.6: MongoDB 3.6 deprecates the use of
master-slave replication.Master-slave replication has been deprecated
for components of sharded clusters since MongoDB 3.2.
主从结构与复制集最主要的区别是前者有真正的主服务器的概念,复制集没有主服务器的概念,经过选举选出主要的主节点Primary
Do not run an arbiter on systems that also host the primary or the secondary members of the replica set
仲裁者必定要部署在独立的服务器上,避免与主节点和复制节点部署在一块儿
这是Mongo官方更推荐的部署结构
关注数据库链接字符串
复制集属于MongoDb高可用架构的一种部署方式,对于使用数据库的应用者来讲应该是极度透明的,内部主从实例切换应该作到无感切换,也就是说应用并不关心具体的一次数据库操做,是由哪一个实例来处理的。
咱们能够在程序中指定如何链接复制集,正确的链接方式能够避免当主节点宕机或者故障时,应用程序无感知正常切换,借用网络的一张图来讲明
这张图的左边部分其实是有问题的,直连一个实例,而且标明Primary,对于链接Db数据库的Driver来讲,它应该不用关心哪一个实例是主,而且哪一个实例是主也是会变化的。
试想运维给到开发的数据库链接串是一组配置,那咱们如何集成到应用程序中?
对于PHP应用来说,框架使用YII2,驱动使用yii2-mongodb
https://www.yiiframework.com/...
Github地址
https://github.com/yiisoft/yi...
Either run php composer.phar require --prefer-dist yiisoft/yii2-mongodb or add "yiisoft/yii2-mongodb": "~2.1.0"
return [ 'class' => '\yii\mongodb\Connection', 'dsn' => 'mongodb://username:password@s1.test.mongodb.domain.cn:10000/databasename', 'options'=>[ 'socketTimeoutMS' => 1000 ] ];
return [ 'class' => '\yii\mongodb\Connection', 'dsn' => 'mongodb://user:pqssword@s1._test.mongodb.domain.cn:30000,s2.mongodb.domain.cn:30000,s3._test.mongodb.domain.cn:30000/databasename', ];
1 应该都链接,仍是只链接一台数据库实例便可?
生产环境下,复制集合实例有3个,咱们都配到了链接串中。是否应该只链接一台,我我的也没有很好的解释,理论上应用只须要一个入口便可,后续都交给数据库处理。
2 链接超时设置是否应该显示设置?
https://docs.mongodb.com/manu... 官方有针对链接串的参考说明。
谈到超时问题,咱们来看数据库链接周期
一次完整的请求包括三个阶段:一、创建链接 二、数据传输 三、断开链接。
一般咱们谈到的超时分为两种,connectTimeout 和socketTimeout,前者是网络链接超时,后者是执行超时。
若是与数据库服务器请求创建链接的时间超过ConnectionTimeOut,就会抛 ConnectionTimeOutException,即服务器链接超时,没有在规定的时间内创建链接。若是服务器处理数据用时过长,超过了SocketTimeOut,就会抛SocketTimeOutExceptin,即服务器响应超时,服务器没有在规定的时间内返回给客户端数据。(这里的异常是java驱动返回的异常)
这两个参数,官方给出的是 connectTimeoutMS和socketTimeoutMS
咱们在生产环境下,参数replicaSet,connectTimeoutMS,socketTimeoutMS都没有配置。
https://docs.mongodb.com/manu...
https://docs.mongodb.com/manu...
https://docs.mongodb.com/manu...
文章中的观点有不严谨之处,欢迎评论沟通,关于副本集,笔者也是在不断探索中。
抱着不肯定性思惟,学习MongoDb数据库的基本态度:边学习,边实践,边参考,边改进,在问题中成长。
欢迎关注公众号《图南科技》