---
title:  Disk Storage
---

<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements.  See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License.  You may obtain a copy of the License at

     http://www.apache.org/licenses/LICENSE-2.0

Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->

With <%=vars.product_name_long%> disk stores, you can persist data to disk as a backup to your in-memory copy and overflow data to disk when memory use gets too high.

-   **[How Disk Stores Work](how_disk_stores_work.html)**

    Overflow and persistence use disk stores individually or together to store data.

-   **[Disk Store File Names and Extensions](file_names_and_extensions.html)**

    Disk store files include store management files, access control files, and the operation log, or oplog, files, consisting of one file for deletions and another for all other operations.

-   **[Disk Store Operation Logs](operation_logs.html)**

    At creation, each operation log is initialized at the disk store's `max-oplog-size`, with the size divided between the `crf` and `drf` files. When the oplog is closed, <%=vars.product_name_long%> shrinks the files to the space used in each file.

-   **[Configuring Disk Stores](overview_using_disk_stores.html)**

    In addition to the disk stores you specify, <%=vars.product_name_long%> has a default disk store that it uses when disk use is configured with no disk store name specified. You can modify default disk store behavior.

-   **[Optimizing a System with Disk Stores](optimize_availability_and_performance.html)**

    Optimize availability and performance by following the guidelines in this section.

-   **[Start Up and Shut Down with Disk Stores](starting_system_with_disk_stores.html)**

    This section describes what happens during startup and shutdown and provides procedures for those operations.

-   **[Disk Store Management](managing_disk_stores.html)**

    The `gfsh` command-line tool has a number of options for examining and managing your disk stores. The `gfsh` tool, the `cache.xml` file and the DiskStore APIs are your management tools for online and offline disk stores.

-   **[Creating Backups for System Recovery and Operational Management](backup_restore_disk_store.html)**

    A backup is a copy of persisted data from a disk store. A backup is used to restore the disk store to the state it was in when the backup was made. The appropriate back up and restore procedures differ based upon whether the cluster is online or offline. An online system has currently running members. An offline system does not have any running members.


