func (n *Node) checkSlave() { n.Lock() if n.Slave == nil { n.Unlock() return } slaves := make([]*DB, len(n.Slave)) copy(slaves, n.Slave) n.Unlock() for i := 0; i < len(slaves); i++ { if atomic.LoadInt32(&(slaves[i].state)) == Down { continue } if err := slaves[i].Ping(); err != nil { golog.Error("Node", "checkSlave", "Ping", 0, "db.Addr", slaves[i].Addr(), "error", err.Error()) } else { n.LastSlavePing = time.Now().Unix() atomic.StoreInt32(&(slaves[i].state), Up) continue } if int64(n.DownAfterNoAlive) > 0 && time.Now().Unix()-n.LastSlavePing > int64(n.DownAfterNoAlive/time.Second) { golog.Info("Node", "checkMaster", "Master down", 0, "db.Addr", slaves[i].Addr(), "slave_down_time", int64(n.DownAfterNoAlive/time.Second)) //If can't ping slave after DownAfterNoAlive, set slave Down n.DownSlave(slaves[i].addr) } } }
func (n *Node) checkMaster() { db := n.Master if db == nil { golog.Error("Node", "checkMaster", "Master is no alive", 0) return } if atomic.LoadInt32(&(db.state)) == Down { return } if err := db.Ping(); err != nil { golog.Error("Node", "checkMaster", "Ping", 0, "db.Addr", db.Addr(), "error", err.Error()) } else { n.LastMasterPing = time.Now().Unix() atomic.StoreInt32(&(db.state), Up) return } if int64(n.DownAfterNoAlive) > 0 && time.Now().Unix()-n.LastMasterPing > int64(n.DownAfterNoAlive/time.Second) { golog.Info("Node", "checkMaster", "Master down", 0, "db.Addr", db.Addr(), "Master_down_time", int64(n.DownAfterNoAlive/time.Second)) n.DownMaster(db.addr) } }
func NewServer(cfg *config.Config) (*Server, error) { s := new(Server) s.cfg = cfg s.addr = cfg.Addr s.user = cfg.User s.password = cfg.Password if err := s.parseAllowIps(); err != nil { return nil, err } if err := s.parseNodes(); err != nil { return nil, err } if err := s.parseSchemas(); err != nil { return nil, err } var err error netProto := "tcp" s.listener, err = net.Listen(netProto, s.addr) if err != nil { return nil, err } golog.Info("server", "NewServer", "Server running", 0, "netProto", netProto, "address", s.addr) return s, nil }
func main() { fmt.Print(banner) runtime.GOMAXPROCS(runtime.NumCPU()) flag.Parse() if len(*configFile) == 0 { fmt.Println("must use a config file") return } cfg, err := config.ParseConfigFile(*configFile) if err != nil { fmt.Printf("parse config file error:%v\n", err.Error()) return } //when the log file size greater than 1GB, kingshard will generate a new file if len(cfg.LogPath) != 0 { sysFilePath := path.Join(cfg.LogPath, sysLogName) sysFile, err := golog.NewRotatingFileHandler(sysFilePath, MaxLogSize, 1) if err != nil { fmt.Printf("new log file error:%v\n", err.Error()) return } golog.GlobalSysLogger = golog.New(sysFile, golog.Lfile|golog.Ltime|golog.Llevel) sqlFilePath := path.Join(cfg.LogPath, sqlLogName) sqlFile, err := golog.NewRotatingFileHandler(sqlFilePath, MaxLogSize, 1) if err != nil { fmt.Printf("new log file error:%v\n", err.Error()) return } golog.GlobalSqlLogger = golog.New(sqlFile, golog.Lfile|golog.Ltime|golog.Llevel) } if *logLevel != "" { setLogLevel(*logLevel) } else { setLogLevel(cfg.LogLevel) } var svr *server.Server svr, err = server.NewServer(cfg) if err != nil { golog.Error("main", "main", err.Error(), 0) golog.GlobalSysLogger.Close() golog.GlobalSqlLogger.Close() return } sc := make(chan os.Signal, 1) signal.Notify(sc, syscall.SIGHUP, syscall.SIGINT, syscall.SIGTERM, syscall.SIGQUIT) go func() { sig := <-sc golog.Info("main", "main", "Got signal", 0, "signal", sig) golog.GlobalSysLogger.Close() golog.GlobalSqlLogger.Close() svr.Close() }() svr.Run() }