课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
一般来说,当一个软件服务器构建完成之后,我们很少会对服务器中的数据进行迁移,但是当服务器发生问题的时候,这些操作也是需要我们了解和掌握的。所以我们今天就来讲解一下关于服务器数据搬迁的事情。
引用
除了内嵌之外还可以使用引用的方式来关联数据。引用的方式和关系型数据库表的主外键很想。你可以把主表和外键表分别存储成一个Collection,然后用他们的_id进行关联,_id是MongoDB文档中一个比较特殊的字段,他会被MongoDB自动生成并且唯一存在在一个Collection中。但是,在使用引用的时候需要注意一下几点:
在一些复杂的多对多关系表中,不要尝试引用,因为这会加大应用程序逻辑上的开发和维护。
当使用内嵌结构产生过多重复数据的时候,可以考虑使用引用。
虽然MongoDB不支持JOIN操作,但是可以通过Aggregation中的$lookup指令来完成连接多表的操作请求。
应用集成
有了数据模型的定义,我们就可以开始进行应用集成。集成的方法可以使用MongoDB的Driver,它支持了几乎常用的各种计算机语言。使用简单和开发效率高是MongoDB的两大特点。于SQL语句不同的是,MongoDB采用了API的方法提供接口,开发人员可以选择支持自己熟悉语言的Driver,DBA可以直接使用MongoShell脚本。幸运的是,MongoDB提供了API和SQL语句的对照表供大家参考,SQLtoMongoDBMappingChart。
另一个强大的功能不能不提的是AggregationFramework(聚合)。并不是所有NoSQL数据库都支持Aggregation,简单理解Aggregation可以把它当成是Hadoop里面的MapReduce,或者SQL里面的LeftJoin。在没有Aggregation的情况下,开发人员进行数据迁移不得不进行如下操作:
在应用程序层开发类似Aggregation的功能,将数据聚合在一起并写进数据库。这样做加大了应用程序的复杂度,并且很难适应各种不同数据的组合情况。没遇到一个新的需求都需要进行一定量的开发工作。
有些人会把数据到如今Hadoop,然后在上面运行MapReduce生成结果,之后将结果倒进NoSQL中。这是一个折中的方法,但是他并不支持实时数据迁移,只能进行线下操作。
MongoDB支持原生Aggregation操作,你可以把需要迁移的数据进行聚合操作,每一次操作可以想象成一个流水线上的环节,将所有的操作连接起来可以构成一条AggregationPipeline。在Pipeline上面的每一个节点都有自己的输入输出,前一个节点的输出是下一个节点的输入。有兴趣的同学可以在这个连接上找到更多的关于Aggregation操作,它列出了每一个Aggregation命令和SQL语句的对应关系,SQLtoAggregationMappingChart
数据完整性
在关系型数据库中,有很多支持ACID事务操作的方法和应用,DBA并不希望在数据迁移的过程中有任何闪失,例如损失数据完整性。MongoDB在这方面具有不同形式的支持。在3.0以上版本中,MongoDB支持了WiredTigerStorageEngine,他支持了Document级别上的锁操作。也就是说,在进行数据库写操作时,MongoDB可以保证针对一个Document操作的原子性,这个操作可以和其他操作完全分隔开来。除了对单个Dcoument的原子操作支持外,MongoDB还支持多Document的事务,比如,findAndModify方法允许你在进行多个文档操作的时保持事务完整。再比如,可以通过PerformTwoPhaseCommits实现更新多个文档的原子操作,更多信息请访问PerformTwoPhaseCommits。
数据一致性
在数据一致性方面,MongoDB通过ReadPreference来调节一致性的程度。默认情况下,在一个MongoDBReplicaSet中,所有的数据库读操作都会发到Primary服务器上,ReplicaSet中的所有Secondary保证数据最终一致性。同时,MongoDB提供了修改这种一致性的行为方式。数据库管理员可以通过修改ReadPreference参数达到对一致性不同要求的场景。数据一致性可以有下面集中方案:
primary:默认模式,所有请求都会发送到Primary上。
primaryPreferred:大部分读请求都会发送到Primary,但是当Primary无法访问时,改请求会被转发到Secondary上。
secondary:所有请求都会发送到Secondary上。
secondaryPreferred:大部分情况下,读请求被发送到Secondary中,但是如果Replica中没有Secondary,请求会发送到Primary上。
nearest:请求会被发送到网络最近的服务器上。该模式在多数据中心上非常有效。
数据迁移
进行完上面的设计和思考以后,数据迁移就会变得想对容易。将数据导入进MongoDB有几个不同的选择,可以使用mongoimport将JSON数据进行导入,也可以通过ETL(ExtractTransformLoad)工具完成。很多项目允许在当前应用程序运行的情况下并行迁移关系型数据库中的数据,并且支持增量更新,具体操作如下:
当一条记录从关系型数据库读出后,应用程序会将这条记录按照先前定义的JONS格式插入到MongoDB中。
一致性检查,可以通过MD5等方法进行数据一致性检查。
新的插入操作和数据修改操作全部转到MongoDB中完成。
作者:赵翼
来源:infoq
【免责声明】:本内容转载于网络,转载目的在于传递最新信息。文章内容为作者个人意见,本平台对文中陈述、观点保持中立,不对所包含内容的准确性、可靠性与完整性提供形式地保证。请读者仅作参考。