Chen Jian

导航

< 2025年3月 >
23 24 25 26 27 28 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 29
30 31 1 2 3 4 5
统计
 

以前我们跨主机拷贝大数据的时候,比如要拷贝超过100GB的mysql原始数据,我们通常的做法如下:

  • 在源端打包压缩为tar.gz文件
  • 采用scp或者rsync等方式拷贝到目标主机
  • 在目标主机解压文件

    这三个过程是同步阻塞,即不能同时异步执行,导致效率低下。

    现在我们将过程优化为以数据流的方式,同时执行(非阻塞模式),则效率一般可以提高到原来的3倍以上,具体实现如下:

    磁盘读取---->打包---->压缩------>传输---->解压缩-->拆包---->落盘

                         |->tar     |->gzip      |->ssh      |->gzip   |->tar

    比如我要将本地的test目录拷贝到“目标IP”的的data目录,则命令如下:

    tar -c test/ |pigz |ssh -c arcfour128 目标IP "gzip -d|tar -xC /data"

    当然,这里的解压过程仍然用了效率比较低下的gzip,如果将解压工具换成lz4(但需要单独编译安装),则效率可以再提高不少。

    如果不需要解压,则命令变为:

    tar -c test/ |pigz |ssh -c arcfour128 目标IP "cat >/data/test.tar.gz"

    注:因为采用了流式压缩,解压过程必须加上-i参数,及tar –ixf /data/test.tar.gz 。

    说明: pigz是一个高效的压缩工具,可以将多核CPU的每一分剩余性能都用来做压缩计算。而传统的gzip则只能用单核CPU。比如一台2个8core cpu服务器采用pigz和gzip压缩相同的数据,一般性能差距至少在7-8倍以上(一般不会达到理论的16倍,因为受限于磁盘的读写速度和内存等资源)。

    posted on   Chen Jian  阅读(1789)  评论(0编辑  收藏  举报
    编辑推荐:
    · AI与.NET技术实操系列:基于图像分类模型对图像进行分类
    · go语言实现终端里的倒计时
    · 如何编写易于单元测试的代码
    · 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
    · .NET Core 中如何实现缓存的预热?
    阅读排行:
    · 25岁的心里话
    · 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
    · 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
    · 零经验选手,Compose 一天开发一款小游戏!
    · 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
     
    点击右上角即可分享
    微信分享提示