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