mongodb快速均衡导入数据

需求环境:

有一个项目需要将mongodb sharding从2.6升级到3.0 并使用wt引擎,其中2.6环境很多collectiong开启了Sharding,且数据量很大.

选择mongodump,mongorestore方式



问题:

在restore步骤出现了2个问题

  1)大数量数据导入缓慢时间花费长

  2)chunks分配不均匀,需要很长时间做balance.

分析原因:

  针对以上问题我对mongodb的进行了初步的学习和研究,同时也查看了一些优秀的博客,发现部分原因:

  mongodb导入大量数据,会涉及到chunks的分裂和新chunk文件分配这个过程耗费时间,并且自动均衡策略不能均匀分配chunks到每个shard这在数据导入时也会引起不同的shard io使用差距大,无法合理使用整个集群的io。

解决办法:

  可以提前预先分配chunks并且均匀的移动到每个shard,针对这个场景我写了一个简单的python脚本实现

#! /usr/bin/python
#input basic info
ns = "crawler.logsData"
shard_key = "_id"
shards= ["shard01","shard02","shard03","shard04"]

min_key = 237223617
max_key = 264171274

avg_doc_size = 2340    #byte
chunk_size = 64*1024*1024   #byte 64MB
fragment = 0.9

def split_chunk(ns,shard_key,shards,min_key,max_key,avg_doc_size,chunk_size,fragment ):
    fname=‘./‘+ns+‘.js‘
    f=open(fname,‘a‘)
    f.write("db = db.getSiblingDB(‘admin‘)"+‘\n‘)
    docs_per_chunk = int(chunk_size*fragment/avg_doc_size)
    key_value=min_key+docs_per_chunk
    shard_counter = 0
    shardlen = len(shards)
    while  key_value  < max_key:
        str_split_chunk=(‘db.runCommand( { split : "%s", middle : {%s:%d} } )‘)% (ns,shard_key,key_value)
        str_move_chunk=(‘db.runCommand({moveChunk: "%s", find: {%s:%d}, to: "%s"})‘)%(ns,shard_key,key_value,shards[shard_counter])
        shard_counter = shard_counter + 1
        if shard_counter == shardlen:
            shard_counter = 0
        key_value=key_value+docs_per_chunk
        f.write(str_split_chunk+‘\n‘)
        f.write(str_move_chunk+‘\n‘)

    #    print(str_split_chunk)
    #    print(str_move_chunk)
    f.closed

split_chunk(ns,shard_key,shards,min_key,max_key,avg_doc_size,chunk_size,fragment)

step1

编辑以上脚本填写参数运行   会生成一个分配和move chunks的js文件文件名是crawler.logsData.js

step2

使用以下命令运行可以实现chunks的均匀预分配

time mongo admin -u username -p‘passwd‘ < /home/user/crawler.logsData.js  

step3

运行以下命令实现collection  crawler.logsData的数据导入

time mongorestore --host *** --port **  --db crawler --collection  logsData  -u username -p "passwd"  /home/user/crawler/logsData.bson

注意:

  step1&2可以预先处理不必等到迁移时,这样分配chunks和 chunks balance的时间就可以在实际迁移时节约出来了,这样做还可减少导入数据发生chunk split.

以下是我的测试结果 mongorestore 时间花费   26GB数据 14分钟



发散:

  针对以上测试,我们进一步思考,是否可以把这个方式使用到维护方面,如果我们预先知道collection的每月的数据增长量,那么就可以提前为下一个月的数据做chunks的预分配,

这样就不必使用mongodb balance因为在写入数据时就已经按照我们的规划均匀写入数据,这样可以均衡sharding的io使用率,提高整个sharding写入效率.

时间: 2024-11-09 06:12:51

mongodb快速均衡导入数据的相关文章

Mysql快速导出导入数据的实验

一.创建测试数据库 CREATE database example; use example; create TABLE `user` ( `id` int(11) NOT NULL, `last_name` varchar(45) DEFAULT NULL, `first_name` varchar(45) DEFAULT NULL, `sex` set('M','F') DEFAULT NULL, `age` tinyint(1) DEFAULT NULL, `phone` varchar(

使用MySQL Migration Toolkit快速将Oracle数据导入MySQL[转]

使用MySQL Migration Toolkit快速将Oracle数据导入MySQL上来先说点废话本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoDB非关系型数据库,所以干脆一起研究一下,对比学习中找不同,首先说一下本人使用的数据库版本和可视化工具Oracle10G—PL/SQL Developer9MySQL5.5.29—MySQL Workbench6.0MongoDB2.4.9(32bit最大2G)—Robomongo0.8.4为了保持数据的

使用MySQLMigrationToolkit快速将Oracle数据导入MySQL

使用MySQL Migration Toolkit快速将Oracle数据导入MySQL 上来先说点废话 本人最近在学习一些数据库方面的知识,之前接触过Oracle和MySQL,最近又很流行MongoDB非关系型数据库,所以干脆一起研究一下,对比学习中找不同,首先说一下本人使用的数据库版本和可视化工具 Oracle10G—PL/SQL Developer9 MySQL5.5.29—MySQL Workbench6.0 MongoDB2.4.9(32bit最大2G)—Robomongo0.8.4 为

使用MongoDB命令工具导出、导入数据

Windows 10家庭中文版,MongoDB 3.6.3, 前言 在前面的测试中,已经往MongoDB的数据库中写入了一些数据.现在要重新测试程序,数据库中的旧数据需要被清理掉,可是,又想保存之前写入的数据,于是,就需要导出数据(或备份)了--使用MongoDB提供的mongoexport命令.顺便测试了导出操作的反向操作--导入数据,使用mongoimport命令. 注意,MongoDB的bin目录已经添加到Windows环境变量path中了. 那么, 两个命令怎么使用呢?使用 命令 + -

搭建 MongoDB 服务器,MongoDB 基本使用,数据导入导出

MongoDB 1.1软件介绍 ? 介于关系数据库和非关系数据库之间的产品 – 一个基于分布式文件存储的数据库. – 由 C++ 语言编写.旨在为 WEB 应用提供可扩展的高性能数据存储解决方案. – MongoDB 将数据存储为一个文档,数据结构由键值(key=>value) 对组成. – MongoDB 文档类似于 JSON 对象.字段值可以包含其他文档,数组及文档数组. 1.2软件特点 – 安装简单 – 面向文档存储,操作比较简单容易 – 支持丰富的查询表达 – 可以设置任何属性的索引 –

(4.10) 快速导入数据

SQL Server快速导入数据分享 Posted in Other and tagged Database, 数据库, MSSQL, SQL Server, 导入数据, 分享on Apr 26, 2014. Viewd 61 times. 目录 目录 1.CTE 2.OpenRowSet/OpenDataSource 3.BULK INSERT 4.bcp 5.Shell 文/温国兵 SQL Server快速导入数据,可以尝试的方法如下:CTE.OpenRowSet/OpenDataSourc

mongodb数据库备份导入导出数据

备份数据: mongodump -h 192.168.2.20 -u game -p 12345678 -d dbname -o /data/test/ --excludeCollection=user_stats 其中-h为IP地址,-u账号,-p密码,-d数据库名称,-o存储数据的路径,--excludeCollection表示需过滤的集合,--excludeCollectionsWithPrefix表示过滤某些集合的前缀 导入数据: mongorestore --db gourmet --

HBase快速导入数据--BulkLoad

Apache HBase是一个分布式的.面向列的开源数据库,它可以让我们随机的.实时的访问大数据.但是怎样有效的将数据导入到HBase呢?HBase有多种导入数据的方法,最直接的方法就是在MapReduce作业中使用TableOutputFormat作为输出,或者使用标准的客户端API,但是这些都不非常有效的方法. Bulkload利用MapReduce作业输出HBase内部数据格式的表数据,然后将生成的StoreFiles直接导入到集群中.与使用HBase API相比,使用Bulkload导入

mongodb导入数据,保创建新项目

1.回顾 2.导入数据 2.1 excel数据表格 2.2 设计导入数据的路由 routes/users.js router.get('/upload', function (req, res, next) { res.send('上传数据') }) 2.3 安装 导入数据的模块 cnpm i node-xlsx -S 2.4 实现数据导入 ---- 读取文件信息 var xlsx = require('node-xlsx'); // 数据导入模块 // 导入的文件的绝对路径 var xlsxf