zhangzengfei
2023-05-22 acb15a431beb73159921477415c5d0f7d06c6768
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
package serf
 
import (
    "context"
 
    "serfNode/config"
    "serfNode/logger"
 
    "basic.com/syncdb.git"
)
 
var agent *syncdb.Agent
var nodeRole string
 
// 初始化节点
func InitAgent(ctx context.Context, conf config.SerfConfig) error {
    if agent != nil {
        agent.Stop()
        agent = nil
    }
 
    var err error
    password := conf.AuthKey + "123456"
 
    serfConfig := syncdb.DefaultConfig()
    serfConfig.RPCAddr = "0.0.0.0:7373"
    serfConfig.RPCPort = 7373
    serfConfig.BindAddr = "0.0.0.0:5000"
    serfConfig.Ctx = ctx
 
    if conf.BindAddr != "" {
        serfConfig.BindAddr = conf.BindAddr
    }
 
    if conf.RPCAddr != "" {
        serfConfig.RPCAddr = conf.RPCAddr
    }
 
    if conf.RPCPort != 0 {
        serfConfig.RPCPort = conf.RPCPort
    }
 
    agent, err = syncdb.InitNode(conf.ClusterName, password, conf.NodeName, "./serf-daemon.json", serfConfig)
    if err != nil {
        logger.Error(err)
        return err
    }
 
    agent.RegisterHandleEventFunc(HandleSerfEvent)
 
    //logger.Debug("agent init done")
 
    return nil
}
 
// 加入集群
func JoinCluster(addr string) error {
    return agent.JoinByNodeAddrs([]string{addr})
}
 
// 退出集群
func LeaveCluster() error {
    return agent.Leave()
}
 
func ClusterState() map[string]map[string]string {
    return agent.Stats()
}
 
func Members() []syncdb.NodeInfo {
    return agent.GetNodes()
}
 
func Switch2Master() error {
    nodeRole = "master"
    SetTag("role", "master")
 
    return nil
}
 
func Switch2Slave() error {
    nodeRole = "slave"
    SetTag("role", "slave")
 
    return nil
}
 
func SetTag(key, value string) error {
    // 有一些预置的tag
    conf := agent.SerfConfig()
    conf.Tags[key] = value
 
    return agent.SetTags(conf.Tags)
}
 
func IsMaster() bool {
    return nodeRole == "master"
}