背景
在工作中遇到大数据(20G左右)批量部署的问题,刚开始通过scp或者rsync限速80M串行分发,大约每台机器的耗时为5分钟,极大的增加了大批量部署的时间和难度,各种难产。于是作者就花了一天多的时间做了个简易的传输工具,现在还不太成熟,希望对大家有启发,更希望大家多多提建议。
思路
将传输完成的目标机器转换成数据源为其他机器提供数据源服务。(相当于《行尸走肉》中的僵尸一样,每一个被感染的个体都是传染源)
语言选型
对于数据传输来说,个人认为语言不是瓶颈而是传输的方法(串行、并行还是其他),之所以选择 go 是因为 go 可以编译后扔到机器上直接执行(Python需要安装各种依赖包增加了部署的难度)
依赖
由于公司机器都已安装FTP服务且已配置限速下载,所以工具本身不提供下载服务,下载限速也是写死在Client端的。
架构
C/S架构,即大家熟知的Client和Server结构。
Client:等待接受Server下载任务并执行。
Server:负责分发控制客户端的下载以及接受客户端的回传信息。
效果
第1次传输1台,第2次传输2台,第3次传输4台……第n次传输2(n-1)
台,也就是说传输1+2+4=7台数据的时间相当于串行传输3台机器的时间,并且传输的数量越多,相对串行传输时间越少。
废话不多说,直接上Server端代码。至于代码规范性,请大家忽略。代码以 GitHub 上为准。
[root@docker100080 src]# cat p2pserver.go
package main
import (
"bufio"
"flag"
"fmt"
"github.com/gin-gonic/gin"
"github.com/parnurzeal/gorequest"
"io"
"os"
"strconv"
"strings"
"time"
)
//定义slice
var (
SuccList[]string //成功列表
FailList[]string //失败列表
DstList []string //目的列表
//p2pConfig
ListenPortstring
Port *string
Server *string
Srcpath *string
Dstpath *string
Filename *string
Timeout *int
)
var succ_ch = make(chan string