Browse Source

weed master -peers=none

pull/7419/head
chrislu 1 month ago
parent
commit
ea3ac8a864
  1. 29
      weed/command/master.go
  2. 21
      weed/command/server.go

29
weed/command/master.go

@ -73,7 +73,7 @@ func init() {
m.ip = cmdMaster.Flag.String("ip", util.DetectedHostAddress(), "master <ip>|<server> address, also used as identifier")
m.ipBind = cmdMaster.Flag.String("ip.bind", "", "ip address to bind to. If empty, default to same as -ip option.")
m.metaFolder = cmdMaster.Flag.String("mdir", os.TempDir(), "data directory to store meta data")
m.peers = cmdMaster.Flag.String("peers", "", "all master nodes in comma separated ip:port list, example: 127.0.0.1:9093,127.0.0.1:9094,127.0.0.1:9095")
m.peers = cmdMaster.Flag.String("peers", "", "all master nodes in comma separated ip:port list, example: 127.0.0.1:9093,127.0.0.1:9094,127.0.0.1:9095; use 'none' for single-master mode")
m.volumeSizeLimitMB = cmdMaster.Flag.Uint("volumeSizeLimitMB", 30*1000, "Master stops directing writes to oversized volumes.")
m.volumePreallocate = cmdMaster.Flag.Bool("volumePreallocate", false, "Preallocate disk space for volumes.")
m.maxParallelVacuumPerServer = cmdMaster.Flag.Int("maxParallelVacuumPerServer", 1, "maximum number of volumes to vacuum in parallel per volume server")
@ -104,6 +104,9 @@ var cmdMaster = &Command{
The example security.toml configuration file can be generated by "weed scaffold -config=security"
For single-master setups, use -peers=none to skip Raft quorum wait and enable instant startup.
This is ideal for development or standalone deployments.
`,
}
@ -180,6 +183,10 @@ func startMaster(masterOption MasterOptions, masterWhiteList []string) {
// start raftServer
metaDir := path.Join(*masterOption.metaFolder, fmt.Sprintf("m%d", *masterOption.port))
peersString := strings.TrimSpace(*masterOption.peers)
isSingleMaster := peersString == "none" || peersString == ""
raftServerOption := &weed_server.RaftServerOption{
GrpcDialOption: security.LoadClientTLS(util.GetViper(), "grpc.master"),
Peers: masterPeers,
@ -202,6 +209,11 @@ func startMaster(masterOption MasterOptions, masterWhiteList []string) {
if raftServer == nil {
glog.Fatalf("please verify %s is writable, see https://github.com/seaweedfs/seaweedfs/issues/717: %s", *masterOption.metaFolder, err)
}
// For single-master mode, initialize cluster immediately without waiting
if isSingleMaster {
glog.V(0).Infof("Single-master mode: initializing cluster immediately")
raftServer.DoJoinCommand()
}
}
ms.SetRaftServer(raftServer)
r.HandleFunc("/cluster/status", raftServer.StatusHandler).Methods(http.MethodGet, http.MethodHead)
@ -229,10 +241,10 @@ func startMaster(masterOption MasterOptions, masterWhiteList []string) {
}
go grpcS.Serve(grpcL)
timeSleep := 1500 * time.Millisecond
if !*masterOption.raftHashicorp {
// For multi-master mode with non-Hashicorp raft, wait and check if we should join
if !*masterOption.raftHashicorp && !isSingleMaster {
go func() {
time.Sleep(timeSleep)
time.Sleep(1500 * time.Millisecond)
ms.Topo.RaftServerAccessLock.RLock()
isEmptyMaster := ms.Topo.RaftServer.Leader() == "" && ms.Topo.RaftServer.IsLogEmpty()
@ -294,6 +306,15 @@ func startMaster(masterOption MasterOptions, masterWhiteList []string) {
func checkPeers(masterIp string, masterPort int, masterGrpcPort int, peers string) (masterAddress pb.ServerAddress, cleanedPeers []pb.ServerAddress) {
glog.V(0).Infof("current: %s:%d peers:%s", masterIp, masterPort, peers)
masterAddress = pb.NewServerAddress(masterIp, masterPort, masterGrpcPort)
// Handle special case: -peers=none for single-master setup
peers = strings.TrimSpace(peers)
if peers == "none" || peers == "" {
glog.V(0).Infof("Running in single-master mode (peers=none), no quorum required")
cleanedPeers = []pb.ServerAddress{masterAddress}
return
}
cleanedPeers = pb.ServerAddresses(peers).ToAddresses()
hasSelf := false

21
weed/command/server.go

@ -232,10 +232,18 @@ func runServer(cmd *Command, args []string) bool {
*isStartingFiler = true
}
var actualPeersForComponents string
if *isStartingMasterServer {
_, peerList := checkPeers(*serverIp, *masterOptions.port, *masterOptions.portGrpc, *masterOptions.peers)
peers := strings.Join(pb.ToAddressStrings(peerList), ",")
masterOptions.peers = &peers
// Determine actual master addresses for other components without calling checkPeers
// (checkPeers will be called later in startMaster)
peersString := strings.TrimSpace(*masterOptions.peers)
if peersString == "none" || peersString == "" {
// Single-master mode: use the current server address
actualPeersForComponents = util.JoinHostPort(*serverIp, *masterOptions.port)
} else {
// Multi-master mode: use the provided peers string
actualPeersForComponents = peersString
}
}
if *serverBindIp == "" {
@ -249,7 +257,8 @@ func runServer(cmd *Command, args []string) bool {
// ip address
masterOptions.ip = serverIp
masterOptions.ipBind = serverBindIp
filerOptions.masters = pb.ServerAddresses(*masterOptions.peers).ToServiceDiscovery()
// Use actualPeersForComponents for volume/filer, not masterOptions.peers which might be "none"
filerOptions.masters = pb.ServerAddresses(actualPeersForComponents).ToServiceDiscovery()
filerOptions.ip = serverIp
filerOptions.bindIp = serverBindIp
if *s3Options.bindIp == "" {
@ -259,11 +268,11 @@ func runServer(cmd *Command, args []string) bool {
sftpOptions.bindIp = serverBindIp
}
iamOptions.ip = serverBindIp
iamOptions.masters = masterOptions.peers
iamOptions.masters = &actualPeersForComponents
webdavOptions.ipBind = serverBindIp
serverOptions.v.ip = serverIp
serverOptions.v.bindIp = serverBindIp
serverOptions.v.masters = pb.ServerAddresses(*masterOptions.peers).ToAddresses()
serverOptions.v.masters = pb.ServerAddresses(actualPeersForComponents).ToAddresses()
serverOptions.v.idleConnectionTimeout = serverTimeout
serverOptions.v.dataCenter = serverDataCenter
serverOptions.v.rack = serverRack

Loading…
Cancel
Save