本文主要从以下几个方面阐述副本集架构对程序开发的影响。笔者将基于MongoDB的应用开发分为软件运维和软件开发两个阶段,本文将着重于后期的实践经验来分享和理解复制集和主从结构。重点介绍数据库连接字符串的基本概念。说到副本集,就是副本的集合,是分布式系统的基本属性之一。副本(Replica)副本是分布式系统中最常见的概念之一,指的是分布式系统提供数据和服务的一种冗余方式。在常见的分布式系统中,为了对外提供高可用的服务,我们往往会对数据和服务进行复制处理。有了replica的概念,就会涉及到replica数据一致性的问题。在MongoDB环境下,我们可以方便的从公开数据查询到副本集的基本含义。MongoDB复制(replicaset)MongoDB复制是在多台服务器上同步数据的过程。Replication提供数据的冗余备份,将数据副本存储在多台服务器上,提高数据可用性,保证数据安全。复制还允许您从硬件故障和服务中断中恢复数据。副本集角色MongoDB副本集是mongod进程的集合,通过一系列机制实现高可用。mongod是MongoDB系统的主要守护进程。它处理数据请求、管理数据访问并执行后台管理操作。副本集的角色主要包括主节点、从节点和仲裁节点。主节点负责所有写操作。副本集和主从结构之间的关系属于不同的MongoDb数据库结构。官方还没有推荐主从结构。3.6版后已移除:MongoDB3.6弃用了主从复制。自MongoDB3.2以来,分片集群的组件已弃用主从复制。主从结构与副本集的主要区别在于,前者有真正主服务器的概念,而副本集没有主服务器的概念,主要主节点是通过选举产生的。PrimaryDonotrunanarbiteronsystemsthatalsohostprimaryorsecondarymembersofthereplicaset仲裁器必须部署在独立的服务器上,以避免与主节点和副本节点一起部署。传统的主从部署复制集是Mongo官方推荐的部署结构复制集注意数据库连接字符串复制集是MongoDb高可用架构的一种部署方式。它对使用数据库的应用程序用户应该是极其透明的。关注特定的数据库操作,哪个实例处理它。我们可以在程序中指定如何连接副本集。正确的连接方式可以防止应用在主节点宕机或故障时无感知地正常切换。我们借用网络的一张图来说明一下,图中左边的部分其实是针对问题,直接连接一个实例,标记为Primary。对于连接Db数据库的Driver来说,应该不关心哪个实例是primary,哪个实例是primary也会发生变化。试想一下,运维给开发的数据库连接串就是一组配置,那么我们如何将其集成到应用中呢?基本设置PHP应用,框架使用YII2,驱动使用yii2-mongodbhttps://www.yiiframework.com/...Github地址https://github.com/yiisoft/yi...安装任一个runphp作曲家。pharrequire--prefer-distyiisoft/yii2-mongodboradd"yiisoft/yii2-mongodb":"~2.1.0"connectionstring直接连接return['class'=>'\yii\mongodb\Connection','dsn'=>'mongodb://username:password@s1.test.mongodb.domain.cn:10000/databasename','options'=>['socketTimeoutMS'=>1000]];副本集连接返回['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/数据库名',];问题1应该全部连接,还是只有一个数据库实例?在生产环境中,有3个replicationcollectioninstance,我们已经将它们分配给了connectionstring。对于是否应该只连接一个,我个人没有很好的解释。理论上,应用只需要一个入口,后面的处理就交给数据库了。2连接超时设置是否应该显示设置?https://docs.mongodb.com/manu...官方有连接字符串的参考说明。说到超时问题,我们来看一下数据库连接周期。一个完整的请求包括三个阶段:1.连接建立2.数据传输3.断开连接。通常我们说的超时有两种,connectTimeout和socketTimeout,前者是网络连接超时,后者是执行超时。如果与数据库服务器建立连接所需的时间超过了ConnectionTimeOut,则会抛出ConnectionTimeOutException,即服务器连接超时,没有在指定时间内建立连接。如果服务端处理数据的时间过长,超过了SocketTimeOut,就会抛出SocketTimeOutException,即服务端响应超时,服务端没有在规定时间内返回数??据给客户端。(这里的异常是java驱动返回的异常)这两个参数是生产环境中connectTimeoutMS和socketTimeoutMS官方给出的。关于生产环境options参数,没有配置replicaSet、connectTimeoutMS、socketTimeoutMS参数。官方文档https://docs.mongodb.com/manu...https://docs.mongodb.com/manu...https://docs.mongodb.com/manu...文章严谨,欢迎评论交流。关于副本集,笔者也在不断探索。带着不确定性思维,学习MongoDb数据库的基本态度:在问题中学习、实践、借鉴、提高、成长。欢迎关注公众号《图南科技》
