Skip to content

Commit d9ae599

Browse files
kennethdyerKenneth P. J. Dyerajhuh-mdb
authored
DOCSP-33213 fsync/fsyncUnlock Changes (#4802) (#5055)
* DOCSP-33213 Updates to fsync/fsyncUnlock for Self-Managed Backups of Sharded Clusters * Adds 7.1 versionadded * Reworks Larger Deployment notes * Documents new feature on fsyncUnlock and mongosh helpers * Fixes build issue * Adds lock timeout * Minor edits for cluster coverage * Minor edits for cluster coverage * Adds include for lock/unlock * Adjusts fsync text * Fixes tables * Adds notice for lock/unlock * Minor edit * Major edits to db.fsyncLock to bring it in sync * Minor edit * fsyncUnlock method edits * Minor edits * Minor edits * Adds release note * Fixes build issue * Fixes build issue * Fixes build issue * Fixes build issue * Fixes build issue * Fixes per Ali * Fixes per Ali * Fixes per Ali * Fixes per Nandini * Fixes per Nandini * Fixes per Nandini * Fixes per Nandini * Fixes per Nandini --------- Co-authored-by: Kenneth P. J. Dyer <[email protected]> Co-authored-by: Alison Huh <[email protected]>
1 parent 14188b8 commit d9ae599

File tree

8 files changed

+170
-141
lines changed

8 files changed

+170
-141
lines changed

source/includes/extracts-dbcommands.yaml

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,6 @@
11
ref: comment-content
22
content: |
3-
Optional.
4-
5-
A user-provided comment to attach to this command. Once set, this
3+
Optional. A user-provided comment to attach to this command. Once set, this
64
comment appears alongside records of this command in the following
75
locations:
86
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
.. important::
2+
3+
Servers maintain an fsync lock count. The :dbcommand:`fsync` command with
4+
the ``lock`` field set to ``true`` increments the lock count while the
5+
:dbcommand:`fsyncUnlock` command decrements it. To enable writes on a locked
6+
server or cluster, call the :dbcommand:`fsyncUnlock` command until the lock
7+
count reaches zero.
8+

source/includes/fsync-lock-method.rst

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
2+
Servers maintain an fsync lock count. The :method:`~db.fsyncLock` method
3+
increments the lock count while the :method:`~db.fsyncUnlock` method decrements
4+
it. To unlock writes on a server or cluster, call the :method:`~db.fsyncUnlock`
5+
method until the lock count reaches zero.
6+
Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,13 @@
1+
2+
Starting in MongoDB 7.1, the :dbcommand:`fsync` and :dbcommand:`fsyncUnlock`
3+
commands can perform fsync operations sharded clusters.
4+
5+
When run on :program:`mongos` with the ``lock`` field set to ``true``, the
6+
:dbcommand:`fsync` command flushes writes from the storage layer to disk and
7+
locks each shard, preventing additional writes. The :dbcommand:`fsyncUnlock`
8+
command can then be used to unlock the cluster.
9+
10+
This feature enables self-managed backups of sharded clusters using
11+
:program:`mongodump`.
12+
13+

source/reference/command/fsync.txt

Lines changed: 93 additions & 75 deletions
Original file line numberDiff line numberDiff line change
@@ -19,18 +19,30 @@ Definition
1919

2020
.. dbcommand:: fsync
2121

22-
Forces the :binary:`~bin.mongod` process to flush all pending writes
23-
from the storage layer to disk and locks the *entire*
24-
:binary:`~bin.mongod` instance to prevent additional writes until the
25-
user releases the lock with a corresponding
26-
:dbcommand:`fsyncUnlock`. Optionally, you can use :dbcommand:`fsync`
27-
to lock the :binary:`~bin.mongod` instance and block write operations
28-
for the purpose of capturing backups.
29-
30-
As applications write data, MongoDB records the data in the storage
31-
layer and then writes the data to disk within the :setting:`~storage.syncPeriodSecs`
32-
interval, which is 60 seconds by default. Run :dbcommand:`fsync` when
33-
you want to flush writes to disk ahead of that interval.
22+
Flushes all pending writes from the storage layer to disk. When the ``lock``
23+
field is set to ``true``, it sets a lock on the server or cluster to prevent
24+
additional writes until the lock is released.
25+
26+
27+
.. versionadded:: 6.0.11
28+
29+
When the ``fsync`` command runs on :program:`mongos`, it performs the
30+
fsync operation on each shard in the cluster.
31+
32+
33+
As applications write data, MongoDB records the data in the storage layer
34+
and then writes the data to disk within the
35+
:setting:`~storage.syncPeriodSecs` interval, which is 60 seconds by default.
36+
Run ``fsync`` when you want to flush writes to disk ahead of that interval.
37+
38+
.. include:: /includes/fsync-lock-command
39+
40+
Use this command to block writes when you want to perform backup
41+
operations.
42+
43+
.. |method| replace:: :method:`db.fsyncLock` helper method
44+
.. include:: /includes/fact-dbcommand-tip
45+
3446

3547
Syntax
3648
------
@@ -39,10 +51,11 @@ The command has the following syntax:
3951

4052
.. code-block:: javascript
4153

42-
db.runCommand(
54+
db.adminCommand(
4355
{
4456
fsync: 1,
4557
lock: <Boolean>,
58+
fsyncLockAcquisitionTimeout: <integer>,
4659
comment: <any>
4760
}
4861
)
@@ -54,7 +67,7 @@ The command has the following fields:
5467

5568
.. list-table::
5669
:header-rows: 1
57-
:widths: 20 20 80
70+
:widths: 20 20 60
5871

5972
* - Field
6073
- Type
@@ -63,11 +76,21 @@ The command has the following fields:
6376
* - ``fsync``
6477
- integer
6578
- Enter "1" to apply :dbcommand:`fsync`.
66-
79+
80+
* - ``fsyncLockAcquisitionTimeoutMillis``
81+
- integer
82+
- Optional. Specifies the amount of time in milliseconds to wait to
83+
acquire locks. If the lock acquisition operation times out, the
84+
command returns a failed response.
85+
86+
Default: ``90000``
87+
88+
.. versionadded:: 6.0.11
89+
6790
* - ``lock``
6891
- boolean
69-
- Optional. Takes a lock on the :binary:`~bin.mongod` instance and blocks all
70-
write operations. Each :dbcommand:`fsync` with ``lock`` operation
92+
- Optional. Takes a lock on the server or cluster and blocks all
93+
write operations. Each ``fsync`` with ``lock`` operation
7194
takes a lock.
7295

7396
* - ``comment``
@@ -76,13 +99,6 @@ The command has the following fields:
7699

77100
.. versionadded:: 4.4
78101

79-
To run the :dbcommand:`fsync` command, use the
80-
:method:`db.adminCommand()` method:
81-
82-
.. code-block:: javascript
83-
84-
db.adminCommand( { fsync: 1, ... } )
85-
86102
Considerations
87103
--------------
88104

@@ -91,61 +107,61 @@ Considerations
91107
Impact on Larger Deployments
92108
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
93109

94-
An :dbcommand:`fsync` lock is only possible on *individual*
95-
:binary:`~bin.mongod` instances of a
96-
sharded cluster, not on the entire cluster. To back up an entire sharded
97-
cluster, please see :doc:`/administration/backup-sharded-clusters` for
98-
more information.
110+
.. versionadded:: 6.0.11
111+
112+
When the ``fsync`` command runs on :program:`mongos`, it performs the fsync
113+
operation on the entire cluster. By setting the ``lock`` field to ``true``,
114+
it sets a lock on the cluster, preventing additional writes.
115+
116+
To take a usable self-managed backup, before locking a sharded cluster:
117+
118+
- Ensure that no chunk migration, resharding, or DDL operations are active.
119+
120+
- Stop the balancer to prevent additional chunk migrations from starting.
99121

100122
Alternatives with Journaling
101123
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
102124

103-
If your :binary:`~bin.mongod` has :term:`journaling <journal>` enabled,
104-
please use :ref:`file system or volume/block level snapshot tool <backup-with-journaling>` to create a
105-
backup of the data set and the journal together as a single unit.
106-
125+
If your :program:`mongod` has :term:`journaling <journal>` enabled, use
126+
:ref:`a file system or volume/block level snapshot tool <backup-with-journaling>`
127+
to create a backup of the data set and the journal together as a single unit.
107128

108-
``fsync`` with ``lock: true``
109-
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
110129

111-
.. versionchanged:: 3.4
130+
Lock Count
131+
~~~~~~~~~~
112132

113-
The ``{ fsync: 1, lock: true }`` command now returns a ``lockCount``
114-
in the return document.
133+
The ``fsync`` command returns a document includes a ``lockCount`` field. When
134+
run on :program:`mongod`, the count indicates the number of fsync locks set on
135+
the server.
115136

116-
After ``{ fsync: 1, lock: true }`` runs on a :binary:`~bin.mongod`, all
117-
write operations will block. :binary:`~bin.mongosh` provides a
118-
helper method :method:`db.fsyncLock()`.
137+
When run on a sharded cluster, :program:`mongos` sends the fsync operation to
138+
each shard and returns the results, which includes the ``lockCount`` for each.
119139

120140

121141
.. note::
122142

123-
The ``{ fsync: 1, lock: true }`` operation maintain a lock count.
124-
Each ``{ fsync: 1, lock: true }`` operation increments the lock
125-
count.
126-
127-
To unlock a :binary:`~bin.mongod` instance for writes, the lock count
128-
must be zero. That is, for a given number of ``{ fsync: 1, lock:
129-
true }`` operation, you must issue a corresponding number of unlock
130-
operations in order to unlock the instance for writes. To unlock,
131-
see :method:`db.fsyncUnlock()`.
143+
If the ``lockCount`` field is non-zero, all writes are blocked on the server
144+
and cluster. To reduce the lock count, use the :dbcommand:`fsyncUnlock`
145+
command.
132146

133147
Examples
134148
--------
135149

136-
Lock ``mongod`` Instance
137-
~~~~~~~~~~~~~~~~~~~~~~~~
150+
Fsync Lock
151+
~~~~~~~~~~
138152

139153
.. note::
140154

141155
.. include:: /includes/extracts/wt-fsync-lock-compatibility-command.rst
142156

143-
The primary use of :dbcommand:`fsync` is to lock the :binary:`~bin.mongod`
144-
instance in order to back up the files within :binary:`~bin.mongod`\ 's :setting:`~storage.dbPath`.
145-
The operation flushes all data to the storage layer and
146-
blocks all write operations until you unlock the :binary:`~bin.mongod` instance.
157+
The ``fsync`` command can lock an individual :program:`mongod` instance or a
158+
sharded cluster through :program:`mongos`. When run with the ``lock`` field
159+
set to ``true``, the fsync operation flushes all data to the storage layer and
160+
blocks all additional write operations until you unlock the instance or
161+
cluster.
147162

148-
To lock the database, use the ``lock`` field set to ``true``:
163+
To lock the database, use the ``fsync`` command to set the ``lock`` field
164+
to ``true``:
149165

150166
.. code-block:: javascript
151167

@@ -163,37 +179,38 @@ operation and the ``lockCount``:
163179
"ok" : 1
164180
}
165181

166-
You may continue to perform read operations on a :binary:`~bin.mongod` instance that has a
167-
:dbcommand:`fsync` lock. However, after the first write operation all
168-
subsequent read operations wait until you unlock the :binary:`~bin.mongod` instance.
182+
When locked, write operations are blocked. Separate connections may continue
183+
read operations until the first attempt at a write operation, then they also
184+
wait until the sever or cluster is unlocked.
185+
169186

170187
.. important::
171188

172-
The ``{ fsync: 1, lock: true }`` operation maintain a lock count.
189+
The fsync lock operation maintains a lock count.
173190

174-
To unlock a :binary:`~bin.mongod` instance for writes, the lock count
175-
must be zero. That is, for a given number of ``{ fsync: 1, lock:
176-
true }`` operation, you must issue a corresponding number of unlock
177-
operations in order to unlock the instance for writes.
191+
To unlock a server or cluster for writes, the lock count
192+
must be zero. That is, for the given number of times you perform an fsync
193+
lock, you must issue a corresponding number of unlock operations to unlock
194+
the server or cluster for writes.
178195

179-
Unlock ``mongod`` Instance
180-
~~~~~~~~~~~~~~~~~~~~~~~~~~
196+
Fsync Unlock
197+
~~~~~~~~~~~~
181198

182-
To unlock the :binary:`~bin.mongod`, use :method:`db.fsyncUnlock()`:
199+
To unlock a server of cluster, use the :dbcommand:`fsyncUnlock` command:
183200

184201
.. code-block:: javascript
185202

186-
db.fsyncUnlock();
203+
db.adminCommnad( { fsyncUnlock: 1 } )
187204

188-
Repeat the :method:`db.fsyncUnlock()` to reduce the lock count to zero
189-
to unlock the instance for writes.
205+
Repeat this command as many times as needed to reduce the lock count to zero.
206+
Once the lock count reaches zero, the server or cluster can resume writes.
190207

191208
Check Lock Status
192209
~~~~~~~~~~~~~~~~~
193210

194211
To check the state of the fsync lock, use :method:`db.currentOp()`. Use
195-
the following JavaScript function in the shell to test if :binary:`~bin.mongod` instance is
196-
currently locked:
212+
the following JavaScript function in the shell to test if the server or
213+
cluster is currently locked:
197214

198215
.. code-block:: javascript
199216

@@ -212,5 +229,6 @@ call it with the following syntax:
212229

213230
serverIsLocked()
214231

215-
This function will return ``true`` if the :binary:`~bin.mongod` instance is
216-
currently locked and ``false`` if the :binary:`~bin.mongod` is not locked.
232+
This function will return ``true`` if the server or cluster is
233+
currently locked and ``false`` if the server or cluster is not locked.
234+

source/reference/command/fsyncUnlock.txt

Lines changed: 12 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -19,26 +19,26 @@ Definition
1919

2020
.. dbcommand:: fsyncUnlock
2121

22-
Reduces the lock taken by :dbcommand:`fsync` (with the lock option)
23-
on a :binary:`~bin.mongod` instance by 1.
22+
Reduces the lock count on the server or cluster. To enable write operations,
23+
the lock count must be zero.
24+
2425

25-
.. important::
26+
.. versionadded:: 6.0.11
2627

27-
The :dbcommand:`fsync` ``lock`` and :dbcommand:`fsyncUnlock`
28-
operations maintain a lock count. Each :dbcommand:`fsync` ``lock``
29-
operation increments the lock count, and :dbcommand:`fsyncUnlock`
30-
decrements the lock count.
28+
When the ``fsyncUnlock`` command runs on :program:`mongos`, it
29+
reduces the lock count for each shard in the cluster.
3130

32-
To unlock a :binary:`~bin.mongod` instance for writes, the lock count
33-
must be zero. That is, for a given number of :dbcommand:`fsync`
34-
``lock`` operations, you must issue a corresponding number of
35-
:dbcommand:`fsyncUnlock` operations to unlock the instance for
36-
writes.
31+
Use this command to unblock writes after you finish a backup operation.
32+
33+
.. include:: /includes/fsync-lock-command
3734

3835
:dbcommand:`fsyncUnlock` is an administrative operation. Typically
3936
you will use :dbcommand:`fsyncUnlock` following a database
4037
:doc:`backup operation </core/backups>`.
4138

39+
.. |method| replace:: :method:`db.fsyncUnlock` helper method
40+
.. include:: /includes/fact-dbcommand-tip
41+
4242
Syntax
4343
------
4444

@@ -77,11 +77,6 @@ The operation returns a document with the following fields:
7777
* - ``ok``
7878
- The status code.
7979

80-
.. tip::
81-
82-
:binary:`~bin.mongosh` provides the helper method
83-
:method:`db.fsyncUnlock()`.
84-
8580
Examples
8681
--------
8782

0 commit comments

Comments
 (0)