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" }