| | |
| | | c.BindJSON(&body) |
| | | role := body.Role |
| | | if role == "master" { |
| | | AsMaster() |
| | | AsMaster(role) |
| | | util.ResponseFormat(c, code.AddSuccess, "加入节点成功") |
| | | return |
| | | } else if role == "volume" { |
| | |
| | | return |
| | | } |
| | | } else if role == "master+volume" { |
| | | AsMaVo() |
| | | AsMaVo(role) |
| | | util.ResponseFormat(c, code.AddSuccess, "加入节点成功") |
| | | } else { |
| | | util.ResponseFormat(c, code.RequestParamError, "选择节点类型错误") |
| | |
| | | |
| | | } |
| | | |
| | | func AsMaVo() { |
| | | AsMaster() |
| | | func AsMaVo(role string) { |
| | | AsMaster(role) |
| | | ReplaceLineContentBySearch(Option+StartScriptAsMaVo, Option, config.Server.ScriptPath, StartServerScript) |
| | | } |
| | | |
| | | func (sc *SeaweedfsController) RoleOfVolumeToMasterController(c *gin.Context) { |
| | | AsMaster() |
| | | AsMaster("master") |
| | | ReplaceLineContentBySearch(Option+StartScriptAsMaVo, Option, config.Server.ScriptPath, StartServerScript) |
| | | } |
| | | |
| | |
| | | } |
| | | |
| | | //更新所有节点的脚本参数 |
| | | func UpdateAllNodesScriptArgument(nowPeers []interface{}) { |
| | | for _, val := range nowPeers { |
| | | ip := val.(string) |
| | | func UpdateAllNodesScriptArgument(peersIp []string) { |
| | | fmt.Println("开始更新本地配置文件") |
| | | for _, ip := range peersIp { |
| | | fmt.Println("ip: ", ip) |
| | | url := "http://" + ip + ":7020/node/api-v/swfs/updateSWFSService" |
| | | fmt.Println("url", url) |
| | | http.Get(url) |
| | | resp, _ := http.Get(url) |
| | | fmt.Println("更新返回状态:", resp.StatusCode) |
| | | if resp.StatusCode == 200 { |
| | | fmt.Println("请求完毕", resp.StatusCode) |
| | | } |
| | | } |
| | | } |
| | | |
| | | //请求作为主节点操作流程 |
| | | func RequestMasterNodesOperation(nowPeers []interface{}) { |
| | | //请求作为当前角色节点操作流程 |
| | | func RequestNodesOperation(nowPeers []interface{}, role string) { |
| | | peersIp := make([]string, 0) |
| | | for _, val := range nowPeers { |
| | | peersIp = append(peersIp, strings.Split(val.(string), ":")[0]) |
| | | } |
| | | coreBaseUnit, _ := strconv.Atoi(config.Server.CoreBaseUnit) |
| | | UpdateAllNodesScriptArgument(nowPeers) |
| | | RestartAllServer(nowPeers, coreBaseUnit) |
| | | UpdateAllNodesScriptArgument(peersIp) |
| | | replaceContent := "" |
| | | if role == "master" { |
| | | replaceContent = Option + StartScriptAsMaster |
| | | } else if role == "master+volume" { |
| | | replaceContent = Option + StartScriptAsMaVo |
| | | } |
| | | ReplaceLineContentBySearch(replaceContent, Option, config.Server.ScriptPath, StartServerScript) |
| | | RestartAllServer(peersIp, coreBaseUnit) |
| | | } |
| | | |
| | | //重启所有节点服务并验证 |
| | |
| | | startupItem = string(body) |
| | | } |
| | | tick := time.Tick(1 * time.Second) |
| | | fmt.Println("准备开始验证节点服务") |
| | | for countdown := timeOut; countdown > 0; countdown-- { |
| | | fmt.Println("第", countdown, "次验证") |
| | | result := Verification(startupItem, ip) |
| | | fmt.Println("第一次验证result结果:", result) |
| | | if result == true { |
| | | break |
| | | } |
| | | <-tick |
| | | } |
| | | fmt.Println("验证完毕") |
| | | } |
| | | |
| | | //验证服务状态 |
| | |
| | | } |
| | | |
| | | //构建重启流程 |
| | | func RestartAllServer(nowPeers []interface{}, coreBaseUnit int) { |
| | | coreThread := len(nowPeers)/coreBaseUnit + 1 |
| | | func RestartAllServer(peersIp []string, coreBaseUnit int) { |
| | | fmt.Println("开始构建重启流程") |
| | | coreThread := len(peersIp)/coreBaseUnit + 1 |
| | | masterIp := make([]string, 0) |
| | | timeOut, _ := strconv.Atoi(config.Server.TimeOut) |
| | | var waitGroup sync.WaitGroup |
| | | for i, val := range nowPeers { |
| | | ip := val.(string) |
| | | fmt.Println("当前并行度coreThread:", coreThread) |
| | | for i, ip := range peersIp { |
| | | fmt.Println("重启当前组服务" + ip) |
| | | if (i+1)%coreThread == 0 { |
| | | masterIp = append(masterIp, strings.Split(ip, ":")[0]) |
| | | fmt.Println("加入第一组并开始验证第一组 masterIp: ", masterIp) |
| | | for i := 0; i < len(masterIp); i++ { |
| | | fmt.Println("len masterIp: ", len(masterIp)) |
| | | fmt.Println("第" + strconv.Itoa(i) + "个线程") |
| | | go Restart(masterIp[i], timeOut) |
| | | waitGroup.Add(1) //每创建一个goroutine,就把任务队列中任务的数量+1 |
| | | } |
| | | fmt.Println("这里为阻塞!!!!!") |
| | | waitGroup.Wait() //.Wait()这里会发生阻塞,直到队列中所有的任务结束就会解除阻塞 |
| | | fmt.Println("当前组任务完成") |
| | | masterIp = make([]string, 0) |
| | | fmt.Println("清空当前组成员:", masterIp) |
| | | } else { |
| | | masterIp = append(masterIp, strings.Split(ip, ":")[0]) |
| | | if len(nowPeers) == i+1 { |
| | | if len(peersIp) == i+1 { |
| | | var waitGroup sync.WaitGroup |
| | | for i := 0; i < len(masterIp); i++ { |
| | | go Restart(masterIp[i], timeOut) |
| | |
| | | break |
| | | } |
| | | } |
| | | continue |
| | | |
| | | } |
| | | fmt.Println("服务流程执行完毕") |
| | | |
| | | } |
| | | |
| | | //获取查找内容当前行内容 |
| | |
| | | } |
| | | |
| | | //作为主节点加入(默认包含数据节点) |
| | | func AsMaster() bool { |
| | | func AsMaster(role string) bool { |
| | | AddNewMasterToPeers() |
| | | nowPeers := GetNowPeersList() |
| | | RequestMasterNodesOperation(nowPeers) |
| | | fmt.Println("nowPeers: ", nowPeers) |
| | | RequestNodesOperation(nowPeers, role) |
| | | return true |
| | | } |
| | | |