我们有一个运行Mongo的生产应用程序,副本设置在不同的盒子上。
我想开始对数据做一些BI,可能使用Pentaho。
我的问题是:我应该如何设置我的架构,以便我不直接在生产环境中使用BI?
我应该创建一个单独的BI实例并对BI实例执行mongoexport,还是应该遵循其他一些最佳实践?
答案 0 :(得分:3)
根据您的数据集,BI要求和MongoDB服务器版本,有几个选项需要考虑。如果您只需要读取数据用于报告,那么除了您还要写数据(例如,用于map / reduce操作)之外,还有更多选项。 MongoDB 2.2还引入了一些非常有用的功能和改进,如下所述。
通常,使用replica set配置对于管理目的非常有用,因为这样可以在不中断主MongoDB服务器的情况下提供数据集的完整副本。对于更大的数据集和水平写入缩放,MongoDB的sharding功能也可以与下面的任何建议结合使用。
在走下分离BI数据的道路之前,通过在临时环境中进行测试来确定实际影响是值得的。
以下方法大致按照与生产环境隔离的顺序:
使用副本集,您可以使用read preferences将查询定向到适当的服务器。在2.2之前的MongoDB版本中,一般读取首选项仅限于从主数据库读取或允许使用“slaveOK”(相当于“secondaryPreferred”)从非隐藏副本进行读取。在MongoDB 2.2中,还有一些额外的读取首选项,包括“辅助”(如果可用则从辅助读取,否则出错); “主要首选”(如果可用则从主要读取..否则为次要);和“最近”(根据网络延迟从最近的主节点或辅助节点读取)。 MongoDB 2.2中的读取首选项可以与tag sets结合使用,以便对指向副本集或分片集群中的服务器的定向查询进行更精细的控制。
对于MongoDB 1.8及更高版本,您可以使用hidden secondary node的副本集。隐藏节点不会通告给正常连接到副本集的客户端,但可以直接连接到报告生成。注意:隐藏节点将是只读辅助节点,因此这限制了某些查询的使用。例如,map / reduce需要写入权限才能保存到输出集合..但您可以根据BI要求使用内联map / reduce。
MongoDB 2.2具有数据库级写锁定(与以前版本具有全局写锁定的改进)。如果需要编写BI数据,可以将其保存到单独的数据库中以最大限度地减少锁争用。您仍然需要考虑整体资源效应。例如,为BI目的处理大量旧文档可能会与生产应用程序正在查询的最新文档的缓存竞争。
如果要将BI数据与生产环境完全分离,可以使用MongoDB backup strategies之一创建单独的实例。如果启用了复制,则可以从副本集中的辅助节点创建备份。根据数据集的大小,执行数据的快照复制(包括已构建的索引)而不是完整的mongodump/mongorestore周期可能会更快。
答案 1 :(得分:0)
使用副本集并在辅助节点上运行分析(只要涉及)。