cinder-specs/specs/kilo/nfs-backup.rst
Mike Perez 8ca13afc49 Introduce use case section
This will now require a separate section "Use Cases". This was
originally within "Problem description", but use cases seems to be
missed when it was filled out. This will hopefully improve spec
submission.

Change-Id: I3615ca5ff5c46851e682739a8343242e2f1b0a8d
2015-04-15 22:20:56 -07:00

259 lines
8.9 KiB
ReStructuredText

..
This work is licensed under a Creative Commons Attribution 3.0 Unported
License.
http://creativecommons.org/licenses/by/3.0/legalcode
============================
NFS backup driver for Cinder
============================
https://blueprints.launchpad.net/cinder/+spec/nfs-backup [1]
Currently, cinder-backup doesn't support backup to an NFS-supplied
data repository. This blueprint is for work to make this possible.
Problem description
===================
* Currently backup of cinder volumes is available to or Ceph
object stores, or via Tivoli Storage Manager. These choices, while
appropriate for some, don't address all OpenStack operators or
deployment scenarios.
* Some OpenStack administrators who own NFS storage devices or scalable
NFS storage clusters want to leverage these to provide backup
for their cinder volumes, irrespective of whether NFS is used as
a cinder volume backend.
* Some backend providers need dynamic mount management from OpenStack
as in the NFS volume drivers in order to better manage backup data
security, to provide a more deterministic environment for support
and service contracts, and to minimize dependencies external to
OpenStack distributions and automation packages.
* The NFS backup driver should not replicate functionality provided
by the POSIX filesystem driver (currently in review, see [3]
and [4]).
Use Cases
=========
Proposed change
===============
The following proposal presupposes a context in which the POSIX
filesystem driver ([3] and [4]) has been merged upstream and that
the POSIX filesystem driver, in turn, extends a "chunking" base
class that abstracts common functionality previously only in the
Swift backup driver (see [5] and [6]).
We propose to implement a NFSBackupDriver class under the
POSIX filesystem BackupDriver class::
+----------------------+
| |
+-------->| BackupDriver |<-----+
| | | |
| +----------^-----------+ |
| | |
| | |
+-----+------+ +-----------+---------+ +------+-----+
| TSM | | Chunking | | Ceph |
| BkupDriver | | BkupDriver | | BkupDriver |
| | | Base | | |
+------------+ +---^--------------+--+ +------------+
| |
| |
+-----+-----+ +-----+------+
| Swift | | POSIX |
| BkupDriver| | BkupDriver |
| (default) | | |
+-----------+ +-----^------+
|
|
+-----+------+
| NFS |
| BkupDriver |
| |
+------------+
The NFS Backup Driver will override the parent POSIX file system
driver's __init__() method in order to do dynamic mount management
using "brick" code shared with the volume driver for this purpose, as
in [2]. With this extension, it will connect to an externally
provisioned NFS share at initialization.
This generic NFS Backup Driver will otherwise just inherit methods
to create, delete, and restore from backups from its parent.
Backend vendors who can add value by, e.g. data transfer techniques
that avoid or reduce transfer operations between the cinder node and
the backend storage array can themselves extend the generic NFS Backup
Driver. To this end, we have agreed that the POSIX backup driver will
explicitly implement a generic data transfer method which subclasses
can override, or will inherit this generic method from the Chunking
Base Class. Moreover, while this generic data transfer method can
implement compression as an option, it is critical that it be only an
option since backends may choose to implement compression or
deduplication themselves.
A benefit of the approach presented here is that a user should be able
to switch between posix, NFS, and vendor-specific extensions of the
NFS backup driver, and backup operations will continue to work even
though they use different data transfer mechanisms.
Alternatives
------------
In the diagram, the common code shared by Swift and POSIX is
implemented via inheritance and an "is-a" relationship. A "has-a"
relationship to a library would also work for this proposal.
If other NAS drivers (GlusterFS, SMB, etc.) elect to also implement
dynamic mount management, we can abstract out a RemoteFS Backup Driver
as their common parent and interpolate it between the NFS backup
driver (and other NAS drivers) and the POSIX filesystem driver. Or we
may be able to just share most configuration options and promote the
original NFS Backup Driver implementation to the RemoteFS driver role.
Data model impact
-----------------
None.
REST API impact
---------------
None.
Security impact
---------------
NFS backups will run as a non-root user and the proposed driver will
not elevate user privileges except when it mounts the backup
repository. When it does the mount, it will invoke brick code to do
so. Thus the only privilege elevation from this driver will be in a
common library. That library has been audited and tweaked as
part of recent NFS security enhancements [7], addressing the NFS side
of launchpad bug 1260679 [8].
Because the backup driver runs as a regular user it works with secure
NAS environments in which root squash is enabled.
The backup driver will chmod '660' actual backup data and metadata
and chmod '770' directories in the path to same.
Notifications impact
--------------------
None.
Other end user impact
---------------------
None.
Performance Impact
------------------
Backup service can in general have performance impact. Future
enhancements to or extensions of this driver class could seek to
reduce data transfer bandwidth during backup and restore or pursue
differential backup strategies to reduce the amount of work involved
in typical backups.
POSIX path backups can potentially produce directories containing
a large number of backup files, such that directory operations could
be very costly. We should implement some directory hierarchy to keep
directories sized well. See [2] for one way to do this.
Other deployer impact
---------------------
None.
Developer impact
----------------
None.
Implementation
==============
Backup data and metadata will be written to the repository at unique
paths that are a function of the backup ID. That path will be stored
in the backup record service_metatdata so that it can be used to
navigate to the backup data and metadata for restore and delete
operations.
Backup and restore operations will share a common method for transfer
of data from volume to backup and vice versa. This method will be
initially implemented as a naive block copy but will allow for
enhancement or extension to e.g. reduce or eliminate data movement
between the cinder node and the NFS server for the backup repository.
Assignee(s)
-----------
Primary assignee:
Tom Barron (tbarron)
Other contributors:
Kevin Fox (kfox1111) - POSIX filesystem driver and Chunking Base class
Work Items
----------
Dependencies
============
None
Testing
=======
* Appropriate unit tests will be added.
* Existing tests with backup_driver option in cinder.conf set
for the NFS driver rather than for Swift will provide tempest coverage.
Documentation Impact
====================
Update the backup section of the OpenStack Configuration Reference to indicate
how to perform volume backups using an NFS server. Specifically, document:
* New value for cinder.conf backup_driver option: cinder.backup.drivers.nfs
* New cinder.conf option 'backup_nfs_share' with default value None and values
in one of the following formats::
- <fqdn>:<posix-path>
- <ipv4addr>:<posix-path>
- [<ipv6addr>]:<posix-path>
* New cinder.conf option 'backup_nfs_mount_options' with default value None
and values as specified in NFS man pages and as used in the NFS volume
driver. Note: it may make sense to set the default to values tuned for
backup performance rather than leaving the default None if we can agree
on such values for NFS common. Otherwise, different NFS backends will
likely want to extend this class and set optimal backend-specific default
options.
References
==========
[1]: https://blueprints.launchpad.net/cinder/+spec/nfs-backup
[2]: https://review.openstack.org/#/c/138234
[3]: https://blueprints.launchpad.net/cinder/+spec/add-backup-driver-nas-storage
[4]: https://review.openstack.org/#/c/82996
[5]: https://blueprints.launchpad.net/cinder/+spec/chunked-backup-base-class
[6]: https://review.openstack.org/#/c/139737/
[7]: https://review.openstack.org/#/c/107693
[8]: https://bugs.launchpad.net/cinder/+bug/1260679