怎样通过网络在两台Linux之间倒数据
Why
在服务器之间倒腾数据是运维工作的常见场景,这个运维的同行们应该都心有戚戚焉吧,比如要把一台服务器上的服务迁移到另外一台服务器上、比如这个服务又新上一台服务器,需要把数据从老服务器上同步过来一份,类似的需求是不是感觉经常碰到呢?
Howto
- scp
- rsync
- sftp
- nc
- socat
- ……
以上几种方法中:
- scp 和 sftp 其实都还是走的 ssh,走这种方式服务器有加密、解密的负载,所以比较耗 cpu 资源,为了减轻 cpu 负载,可以选用轻一点的 cipher 比如 arcfour。这种方式比较适合于一次性的拷贝不太大的单个文件。
- rsync 可以走自有协议,也可以走 ssh 通道。不管那种,都可以用于“同步”数据的场景。
- 如果走自有协议的话,速度很不错。只不过需要先配置服务器和客户端
- 如果走 ssh 的话,会一样碰到加解密耗cpu的问题。
- nc( netcat )和 socat 在这里是类似的思路,只是 socat 号称是比 nc( netcat )更瑞士军刀的瑞士军刀:)
总结一下:
- 如果文件很多、数据量很大的场景下,我推荐用 tar+socat 的方案,代码如下:
1 | # server A & server B上都要执行 |
- 如果是单个的大文件,直接 socat 即可,代码跟上面类似
- 如果不追求性能和速度,scp 即可,代码略
进一步优化
- 如果网络带宽不大而且没有加密需求的话,可以给 tar 启用压缩,格式用性能最好的 xz
1 | # server A & server B上都要执行 |
- 如果从命令行简洁程度来讲,还不如直接用 nc 呢。:)
1 | # server A & server B上都执行 |