开发者社区> 技术小甜> 正文

MongoDB报表实例 -- 标签成员方案

简介:
+关注继续查看

更加复杂,但是灵活的方法,用于路由报表查询到一个专属节点去使用标签和读偏好。


因为使用隐藏成员,设置一个成员为priority: 0,但是不设置它为隐藏。然而,分配一个标签use: reporting:

1
2
3
4
5
6
7
PRIMARY> conf = rs.config()    
"_id" "test""version" : 21, "members" : [ { "_id" : 0, "host" "xucy.local:27017", }, { "_id" : 1, "host" "xucy.local:28017", }, { "_id" : 2, "host" "xucy.local:29017", } ] } // we'll use members[1], the instance on port 28017     
PRIMARY> conf.members[1].priority = 0     
PRIMARY> conf.members[1].tags = { "use""reporting" }     
PRIMARY> conf.version += 1     
PRIMARY> rs.reconfig(conf)    
[...]


像之前一样,xucy.local:28017绝不会成为主;然而,在这种情况下其他两个机器变得不可达,你的应用将能处理读到报表服务器。它会继续不用说你的报表应该在这样一个事件期间暂停。


你的报表代码将会像这样(用Python,这次):

1
2
3
from pymongo import MongoReplicaSetClient    
from pymongo.read_preferences import ReadPreference     
rep_set = MongoReplicaSetClient( 'xucy.local:27017,xucy.local:28017,xucy.local:29017', replicaSet = 'test', read_preference = ReadPreference.SECONDARY, tag_sets = [{'use':'reporting'}] ) # check to ensure we're not running reporting against the sole remaining secondary if rep_set.primary is not None: rep_set.my_application.users.aggregate(...)


以上只发送报表查询到副本标记有use: reporting,并且如果没有可用的主,它根本上避免运行。在实践中,你会抛出异常并在你的扩展代码中处理它们,如果你发现没有主!更好的还是,你的监控可以设置运行时可用的值,你可以转移,例如,reporting_system.ok()。


益处和考虑


使用标签和读偏好允许一些级别的灵活性,而那在隐藏成员中是不可能的。


报表实例可以容易添加


因为你的连接代码是可定义的,而不是指定到一个专门的主机,添加更多节点为报表作业,只添加他们并标记他们,像这样:

1
PRIMARY> rs.add({_id:3, host:"xucy.local:30017", priority:0, tags:{'use':'reporting'}})


你存在的代码将会利用新的容量,并且复制集将继续运行,不用触发选举和从客户端断开连接。


报表实例可以被跳过或删除


报表标记可以被移动,或者甚至移除,如果你需要提供读带宽给其他作业在必要时。像这样的一个重新配置将会触发选举,并重连所有客户端,但是这不会比其他选项更糟糕。注意:这是一个反模式的通过发布生产读到副本成员来增加常用容量。这只是一个紧急方式。


一些驱动需要手工同步


Ruby驱动(像1.9.2),例如,不会刷新副本集的视图除非客户端像这样显式初始化,使用refresh_mode: :sync。检查你的驱动文档。


结论


简单的复制配置已经成为我喜欢MongoDB原因之一,它使得MySQL复制看起来像出自石器时代。它有些粗糙,但是已经在不断提升性能。无论你使用标记集合或者隐藏成员,构建一个报表架构在MongoDB的复制属性上,简化操作,让你专注于构建一个伟大的应用。

















本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1751798 ,如需转载请自行联系原作者




版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
MongoDB :第四章:集合的创建与删除
MongoDB :第四章:集合的创建与删除
30 0
品牌列表-从数据库获取列表|学习笔记
快速学习品牌列表-从数据库获取列表
58 0
数据库学习-新增数据作业示例【带源码】
MySQL数据库 “新增数据 ” 习题示例,包含源码,能建立起对于新增数据的基本概念
54 0
mongodb:增加删除字段
mongodb:增加删除字段
56 0
MongoDB(10)- 查询嵌套文档
MongoDB(10)- 查询嵌套文档
166 0
「OushuDB」用户指南数据定义 创建和管理数据库 (中)
CREATE DATABASE实际上是通过拷贝一个现有的数据库进行工作的。缺省时,它拷贝名为template1的标准系统数据库。所以该数据库是创建新数据库的”模板”。如果你给template1增加对象,这些对象将被拷贝到随后创建的用户数据库中。这样的行为允许节点对数据库中的标准套件进行修改。比如,如果你把过程语言PL/Perl安装到template1里,那么你在创建用户数据库的时候它们就会自动可得,而不需要额外的动作。
47 0
「OushuDB」用户指南数据定义 创建和管理数据库 (下)
回顾一下 http://www.oushu.com/docs/ch/server-configuration.html 我们知道OushuDB 服务器提供了大量的运行时配置变量。你可以为许多这种变量设置特定于数据库的缺省数值。
71 0
「OushuDB」用户指南数据定义 创建和管理数据库 (上)
数据库是一些SQL对象(“数据库对象”)的集合;通常每个数据库对象(表、函数等)属于并且只属于一个数据库。不过有几个系统表 (比如pg_database)属于整个集群并且可以在集群之内的每个数据库里访问。更准确地说,一个数据库是一个模式的集合,而模式包含表、函数等等。因此完整的层次是这样的:服务器→数据库→模式→表(或者其它类型对象,比如函数)。
73 0
DataWorks_赋值节点三种赋值语言+数据库节点MySQL、三种取值方式使用案例
DataWorks_赋值节点三种赋值语言+数据库节点MySQL、三种取值方式使用案例
496 0
阿里云DLA新功能来袭 查询MongoDB嵌套字段更方便
DLA之前对于MongoDB只支持简单类型的映射查询,对于嵌套字段无法直接查询,最近我们加入了对嵌套字段直接查询的支持,这篇文章给大家介绍一下。
11451 0
+关注
技术小甜
文章
问答
视频
文章排行榜
最热
最新
相关电子书
更多
开源数据库MongoDB专场MongoDB疑难杂症分析及优化
立即下载
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
相关实验场景
更多
相关镜像