基于serf的数据库同步模块库
liuxiaolong
2019-09-05 5254b8f9e86010f517432f94fa81c6c3c33e5a47
agent.go
@@ -25,6 +25,7 @@
   "io/ioutil"
   "net"
   "os"
   "strconv"
   "sync"
   //"os"
@@ -208,6 +209,18 @@
         //var res []*Rows
         //json.Unmarshal(bytesReturn, &res)
      }
   case serf.MemberEvent:
      if event.EventType() == serf.EventMemberLeave {
         if ev.Members !=nil && len(ev.Members) ==1 {
            leaveMember := ev.Members[0]
            leaveSql := "delete from cluster_node where node_id='"+leaveMember.Name+"'"
            ExecuteSqlByGorm([]string{ leaveSql })
            fmt.Println("EventMemberLeave,current Members:",ev.Members)
         }
         return
      }
   default:
      fmt.Printf("Unknown event type: %s\n", ev.EventType().String())
@@ -524,14 +537,14 @@
}
//Init serf Init
func Init(clusterID string, password string, nodeID string, ips []string) (*Agent, error) {
func Init(clusterID string, password string, nodeID string, addrs []string) (*Agent, error) {
   agent, err := InitNode(clusterID, password, nodeID)
   if err != nil {
      fmt.Printf("InitNode failed, error: %s", err)
      return agent, err
   }
   err = agent.JoinByNodeIP(ips)
   err = agent.JoinByNodeAddrs(addrs)
   if err != nil {
      fmt.Printf("JoinByNodeIP failed, error: %s", err)
      return agent, err
@@ -576,43 +589,49 @@
   return agent, nil
}
func (a *Agent) JoinByNodeIP(ips []string) error {
func (a *Agent) JoinByNodeAddrs(addrs []string) error {
   var nodes []string
   if len(ips) == 0 {
   if len(addrs) == 0 {
      return fmt.Errorf("No Nodes To Join!")
   }
   for _, ip := range ips {
      node := fmt.Sprintf("%s:%d", ip, DefaultBindPort)
      nodes = append(nodes, node)
   for _, addr := range addrs {
      nodes = append(nodes, addr)
   }
   n, err := a.Agent.Join(nodes, true)
   if err != nil || n == 0 {
      //a.Stop()
      //fmt.Println("Stop node")
      return fmt.Errorf("Error Encrypt Key!")
   }
   a.Agent.Join(nodes, true)
   return err
   return nil
}
type Node struct {
   clusterID string
   NodeID    string
   IP        string
   isAlive   int //StatusNone:0, StatusAlive:1, StatusLeaving:2, StatusLeft:3, StatusFailed:4
}
//func (a *Agent) JoinByNodeIP(ips []string) error {
//   var nodes []string
//
//   if len(ips) == 0 {
//      return fmt.Errorf("No Nodes To Join!")
//   }
//   for _, ip := range ips {
//      node := fmt.Sprintf("%s:%d", ip, DefaultBindPort)
//      nodes = append(nodes, node)
//   }
//
//   n, err := a.Agent.Join(nodes, true)
//   if err != nil || n == 0 {
//      return fmt.Errorf("Error Encrypt Key!")
//   }
//
//   return err
//}
func (a *Agent) GetNodes() (nodes []Node) {
   var node Node
func (a *Agent) GetNodes() (nodes []NodeInfo) {
   var node NodeInfo
   fmt.Println("a.conf.ClusterID:", a.conf.ClusterID)
   mbs := a.GroupMembers(a.conf.ClusterID)
   for _, mb := range mbs {
      node.NodeID = mb.Name
      node.IP = mb.Addr.String()
      node.isAlive = int(mb.Status)
      node.clusterID = mb.Tags[tagKeyClusterID]
      node.NodeAddress = mb.Addr.String() + ":" + strconv.Itoa(int(mb.Port))
      node.IsAlive = int(mb.Status)
      node.ClusterID = mb.Tags[tagKeyClusterID]
      nodes = append(nodes, node)
   }