mirror of
https://github.com/seaweedfs/seaweedfs.git
synced 2026-10-24 15:00:43 +02:00
* master: cap parallel vacuums per rack via -maxParallelVacuumPerRack Hosts that run one volume server per disk under a single rack label could not bound host-level vacuum I/O: maxParallelVacuumPerServer limits each process, so every disk on the machine compacted at once. A second quota map keyed on rack id debits alongside the per-server one, so at most N volume copies compact in parallel within a rack. Defaults to 0 (no limit); the flag is wired on master, server, mini and master.follower. * master: resolve a data node's rack key once per vacuum sweep A volume server that unregisters mid-sweep loses its parent node, so the quota credit path calling dn.GetRack() panicked and crashed the master. Rack names are also local to their data center, so same-named racks in different centers shared one quota bucket. Each node's rack key is now captured when the limiters are built and carries the data center id, so checks, debits and credits never touch the live parent pointer. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * master: reserve vacuum quota per needed copy count, not per copy Each copy of a volume checked the shared server/rack quota independently, so several same-rack replicas all passed against one remaining slot and the debits drove the bucket negative. Needs are now counted per server and per rack first; a volume whose own copies exceed a cap reserves the whole bucket once it is free instead of pending forever. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * master.follower: register -maxParallelVacuumPerRack as a flag It was only a fixed default, so passing the flag on the command line failed flag parsing. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * master: key the rack vacuum quota by rack node identity Joining data center and rack names with "/" still let two different racks share one bucket when the names themselves contained slashes. Key the limiter by the rack node instead, which is unique per rack regardless of naming. * master: keep the tiered-replica vacuum test through the rebase * master: document 0 as no limit for -maxParallelVacuumPerServer The clamped per-server need makes a non-positive cap mean "no limit", matching the new rack flag; say so in the flag help. Generated with [Devin](https://devin.ai) Co-Authored-By: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com> * master: key the rack-key cache by data node identity Node ids are only unique within a rack, so two servers that share an id in different racks would have reused the first server's cached rack and escaped the per-rack vacuum cap. * master: read the per-rack vacuum cap from master.toml -maxParallelVacuumPerRack becomes the master.max_parallel_vacuum_per_rack config key, so the new master limit is set the same way as other master options instead of a flag wired into every command that embeds a master. * master: let master.max_parallel_vacuum_per_server override the flag The released -maxParallelVacuumPerServer flag keeps working, but a value in master.toml now wins when set, matching how master.mdir already overrides -mdir. * master: group the vacuum caps under master.vacuum in master.toml Rename master.max_parallel_vacuum_per_rack to master.vacuum.max_parallel_per_rack and master.max_parallel_vacuum_per_server to master.vacuum.max_parallel_per_server, so the keys sit in one subsystem table like master.volume_growth and master.maintenance. * master: deprecate -maxParallelVacuumPerServer for master.toml The flag still works - and is overridden by master.vacuum.max_parallel_per_server when set - but the help text now points operators at the config key, matching the codebase style of help-text-only deprecation. * topology: read node parent atomically UnlinkChildNode clears a data node's parent under the rack's lock while readers like the vacuum sweep's rack capture reach it with no shared lock, so a torn interface read could crash the master. Store the parent in an atomic.Pointer and nil-guard the detached walk in DataNode.GetTopology. --------- Co-authored-by: Devin <158243242+devin-ai-integration[bot]@users.noreply.github.com>
67 lines
2.9 KiB
TOML
67 lines
2.9 KiB
TOML
# Put this file to one of the location, with descending priority
|
|
# ./master.toml
|
|
# $HOME/.seaweedfs/master.toml
|
|
# /etc/seaweedfs/master.toml
|
|
# this file is read by master
|
|
|
|
[master.maintenance]
|
|
# periodically run these scripts are the same as running them from 'weed shell'
|
|
# Scripts are skipped while an admin server is connected.
|
|
scripts = """{{DEFAULT_MAINTENANCE_SCRIPTS}}"""
|
|
sleep_minutes = 17 # sleep minutes between each script execution
|
|
|
|
|
|
# vacuum reclaims deleted space by compacting volumes
|
|
[master.vacuum]
|
|
# concurrent volume compactions per volume server; overrides the deprecated
|
|
# -maxParallelVacuumPerServer flag (default 1) when set; 0 = no limit
|
|
# max_parallel_per_server = 1
|
|
# concurrent volume copies compacting within one rack; 0 = no limit
|
|
max_parallel_per_rack = 0
|
|
|
|
|
|
[master.sequencer]
|
|
type = "raft" # Choose [raft|snowflake] type for storing the file id sequence
|
|
# when sequencer.type = snowflake, the snowflake id must be different from other masters
|
|
sequencer_snowflake_id = 0 # any number between 1~1023
|
|
|
|
|
|
# configurations for tiered cloud storage
|
|
# old volumes are transparently moved to cloud for cost efficiency
|
|
[storage.backend]
|
|
[storage.backend.s3.default]
|
|
enabled = false
|
|
aws_access_key_id = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
|
|
aws_secret_access_key = "" # if empty, loads from the shared credentials file (~/.aws/credentials).
|
|
region = "us-east-2"
|
|
bucket = "your_bucket_name" # an existing bucket
|
|
endpoint = ""
|
|
storage_class = "STANDARD_IA"
|
|
# optional HTTP client tuning for S3-compatible services:
|
|
# disable_http2 = false # true keeps the client on HTTP/1.1, one connection per concurrent request
|
|
# max_connections = 0 # cap on connections to the endpoint, 0 = no cap
|
|
# idle_connection_timeout_seconds = 0 # close idle connections sooner, 0 = Go default (90s)
|
|
|
|
# create this number of logical volumes if no more writable volumes
|
|
# count_x means how many copies of data.
|
|
# e.g.:
|
|
# 000 has only one copy, copy_1
|
|
# 010 and 001 has two copies, copy_2
|
|
# 011 has only 3 copies, copy_3
|
|
[master.volume_growth]
|
|
copy_1 = 7 # create 1 x 7 = 7 actual volumes
|
|
copy_2 = 6 # create 2 x 6 = 12 actual volumes
|
|
copy_3 = 3 # create 3 x 3 = 9 actual volumes
|
|
copy_other = 1 # create n x 1 = n actual volumes
|
|
threshold = 0.9 # create threshold
|
|
reservation_timeout = "5m"# capacity reservation timeout before unreleased reservations expire
|
|
disable = false # disables volume growth if true
|
|
|
|
# configuration flags for replication
|
|
[master.replication]
|
|
# any replication counts should be considered minimums. If you specify 010 and
|
|
# have 3 different racks, that's still considered writable. Writes will still
|
|
# try to replicate to all available volumes. You should only use this option
|
|
# if you are doing your own replication or periodic sync of volumes.
|
|
treat_replication_as_minimums = false
|