Merge "FirstApp: Edits section5"

This commit is contained in:
Jenkins 2015-04-24 11:25:44 +00:00 committed by Gerrit Code Review
commit eadf80cccb

View File

@ -1,58 +1,71 @@
=========================== =============
Section Five: Block Storage Block Storage
=========================== =============
.. todo:: (For nick: Restructure the introduction to this chapter to provide context of what we're actually .. todo:: (For nick: Restructure the introduction to this chapter to
going to do.) provide context of what we're actually going to do.)
By default, data in OpenStack instances is stored on 'ephemeral' disks. These stay with the instance throughout its lifetime, but when the By default, data in OpenStack instances is stored on 'ephemeral'
instance is terminated, that storage disappears -- along with all the data stored on it. Ephemeral storage is allocated to a disks. These stay with the instance throughout its lifetime, but when
single instance and cannot be moved to another instance. the instance is terminated, that storage disappears -- along with all
the data stored on it. Ephemeral storage is allocated to a single
instance and cannot be moved to another instance.
In this section, we will introduce block storage. Block storage (sometimes referred to as volume storage) provides you In this section, we will introduce block storage. Block storage
with access to persistent storage devices. You interact with block storage by attaching volumes (sometimes referred to as volume storage) provides you with access to
to running instances, just as you might attach a USB drive to a physical server. Volumes can be detached from one instance and re-attached to another, and the data remains intact. persistent storage devices. You interact with block storage by
Block storage is implemented in OpenStack by the OpenStack Block Storage (cinder) project. attaching volumes to running instances, just as you might attach a USB
drive to a physical server. Volumes can be detached from one instance
and re-attached to another, and the data remains intact. Block
storage is implemented in OpenStack by the OpenStack Block Storage
(cinder) project.
One component of the Fractal app that cannot be allowed to fail is the database server, which is used to keep track One component of the Fractal app that cannot be allowed to fail is the
of all of the data about fractals that have been created, including their storage location. So while you may have database server, which is used to keep track of all of the data about
configured the images to be stored in Object Storage in the previous section, without the database we lose track of fractals that have been created, including their storage location. So
where in Object Storage they are, and the parameters that were used to create them. while you may have configured the images to be stored in Object
Storage in the previous section, without the database we lose track of
where in Object Storage they are, and the parameters that were used to
create them.
Advanced users should consider how to remove the database from the architecture altogether and replace it Advanced users should consider how to remove the database from the
with metadata in the Object Storage (then contribute these steps to :doc:`section9`). Others should read architecture altogether and replace it with metadata in the Object
on to learn about how to work with block storage and move the Fractal app database server to use it. Storage (then contribute these steps to :doc:`section9`). Others
should read on to learn about how to work with block storage and move
the Fractal app database server to use it.
Basics Basics
------ ~~~~~~
Later on, we'll use a volume from the block storage service Later on, we'll use a volume from the block storage service to provide
to provide persistent storage for the Fractal app's database server, persistent storage for the Fractal app's database server, but first -
but first - let's cover the basics, such as creating and attaching a block storage device. let's cover the basics, such as creating and attaching a block storage
device.
.. only:: dotnet .. only:: dotnet
.. warning:: This section has not yet been completed for the .NET SDK .. warning:: This section has not yet been completed for the .NET SDK.
.. only:: fog .. only:: fog
.. warning:: This section has not yet been completed for the fog SDK .. warning:: This section has not yet been completed for the fog SDK.
.. only:: jclouds .. only:: jclouds
.. warning:: This section has not yet been completed for the jclouds SDK .. warning:: This section has not yet been completed for the jclouds SDK.
.. only:: node .. only:: node
.. warning:: This section has not yet been completed for the pkgcloud SDK .. warning:: This section has not yet been completed for the pkgcloud SDK.
.. only:: openstacksdk .. only:: openstacksdk
.. warning:: This section has not yet been completed for the OpenStack SDK .. warning:: This section has not yet been completed for the OpenStack SDK.
.. only:: phpopencloud .. only:: phpopencloud
.. warning:: This section has not yet been completed for the PHP-OpenCloud SDK .. warning:: This section has not yet been completed for the
PHP-OpenCloud SDK.
As always, connect to the API endpoint: As always, connect to the API endpoint:
@ -107,11 +120,12 @@ List all volumes to see if it was successful:
[<StorageVolume id=755ab026-b5f2-4f53-b34a-6d082fb36689 size=1 driver=OpenStack>] [<StorageVolume id=755ab026-b5f2-4f53-b34a-6d082fb36689 size=1 driver=OpenStack>]
Now that you have created a storage volume, let's attach it to an already running instance. Now that you have created a storage volume, let's attach it to an
already running instance.
Using Block Storage for the Fractal Database Server Using Block Storage for the Fractal database server
--------------------------------------------------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
Firstly, we're going to need a new server for our dedicated database. Firstly, we're going to need a new server for our dedicated database.
Start a new instance called :code:`app-database` using the image, flavor Start a new instance called :code:`app-database` using the image, flavor
@ -131,8 +145,9 @@ We will also need a new security group to allow access to the database server
ex_keyname=keypair_name, ex_keyname=keypair_name,
ex_security_groups=[db_group]) ex_security_groups=[db_group])
Using the unique identifier (UUID) for the volume, make a new volume object, then Using the unique identifier (UUID) for the volume, make a new volume
use the server object from the previous snippet and attach the volume to it at :code:`/dev/vdb`: object, then use the server object from the previous snippet and
attach the volume to it at :code:`/dev/vdb`:
.. only:: libcloud .. only:: libcloud
@ -143,7 +158,8 @@ use the server object from the previous snippet and attach the volume to it at :
Log in to the server to be able to run the following steps. Log in to the server to be able to run the following steps.
.. note:: Replace :code:`IP_SERVICES` with the IP address of the services instance and USERNAME to the appropriate username. .. note:: Replace :code:`IP_SERVICES` with the IP address of the
services instance and USERNAME to the appropriate username.
Now prepare the empty block device. Now prepare the empty block device.
@ -157,14 +173,17 @@ Now prepare the empty block device.
.. todo:: Outputs missing, add attaching log from dmesg. .. todo:: Outputs missing, add attaching log from dmesg.
Stop the running MySQL database service and move the database files from :code:`/var/lib/mysql` onto the new volume (temporary mounted at :code:`/mnt/database`). Stop the running MySQL database service and move the database files
from :file:`/var/lib/mysql` onto the new volume (temporary mounted at
:file:`/mnt/database`).
:: ::
# systemctl stop mariadb # systemctl stop mariadb
# mv /var/lib/mysql/* /mnt/database # mv /var/lib/mysql/* /mnt/database
Sync the filesystems and mount the new blockdevice now containing the database files to :code:`/var/lib/mysql`. Sync the filesystems and mount the new blockdevice now containing the
database files to :file:`/var/lib/mysql`.
:: ::
@ -174,7 +193,8 @@ Sync the filesystems and mount the new blockdevice now containing the database f
# echo "/dev/vdb /var/lib/mysql ext4 defaults 1 2" >> /etc/fstab # echo "/dev/vdb /var/lib/mysql ext4 defaults 1 2" >> /etc/fstab
# mount /var/lib/mysql # mount /var/lib/mysql
Finally start the previously stopped MySQL database service and check if everything is working like expected. Finally start the previously stopped MySQL database service and check
if everything is working like expected.
:: ::
@ -182,9 +202,10 @@ Finally start the previously stopped MySQL database service and check if everyth
# mysql -ufaafo -ppassword -h localhost faafo -e 'show tables;' # mysql -ufaafo -ppassword -h localhost faafo -e 'show tables;'
Extras Extras
------ ~~~~~~
You can detach the volume and re-attach it elsewhere, or destroy the volume with the below steps. You can detach the volume and re-attach it elsewhere, or destroy the
volume with the below steps.
.. warning:: .. warning::
The following operations are destructive and will result in data loss. The following operations are destructive and will result in data loss.
@ -205,9 +226,11 @@ To detach and destroy a volume:
connection.destroy_volume(volume) connection.destroy_volume(volume)
.. note:: :code:`detach_volume` and :code:`destroy_volume` take a volume object, not a name. .. note:: :code:`detach_volume` and :code:`destroy_volume` take a
volume object, not a name.
There are also many other useful features, such as the ability to create snapshots of volumes (handy for backups): There are also many other useful features, such as the ability to
create snapshots of volumes (handy for backups):
.. only:: libcloud .. only:: libcloud
@ -216,32 +239,38 @@ There are also many other useful features, such as the ability to create snapsho
* snapshot_name = 'test_backup_1' * snapshot_name = 'test_backup_1'
connnection.create_volume_snapshot('test', name='test backup 1') connnection.create_volume_snapshot('test', name='test backup 1')
.. todo:: Do we need a note here to mention that 'test' is the volume name and not the volume object? .. todo:: Do we need a note here to mention that 'test' is the
volume name and not the volume object?
You can find information about these calls and more in the `libcloud documentation <http://ci.apache.org/projects/libcloud/docs/compute/drivers/openstack.html>`_. You can find information about these calls and more in the
`libcloud documentation
<http://ci.apache.org/projects/libcloud/docs/compute/drivers/openstack.html>`_.
Working with the OpenStack Database service Working with the OpenStack Database service
------------------------------------------- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
You created the database manually above, which is fine for a case with a single You created the database manually above, which is fine for a case with
database you won't touch often like this. However, OpenStack also has a component a single database you won't touch often like this. However, OpenStack
code-named :code:`trove` that provides Database as a Service (DBaaS). also has a component code-named :code:`trove` that provides Database
as a Service (DBaaS).
.. note:: This OpenStack Database service is not installed in many clouds right now, but if your cloud does .. note:: This OpenStack Database service is not installed in many
support it, it can make your life a lot easier when working with databases. clouds right now, but if your cloud does support it, it can
make your life a lot easier when working with databases.
SDKs don't generally support the service yet, but you can use the 'trove' commandline client SDKs don't generally support the service yet, but you can use the
to work with it instead. 'trove' commandline client to work with it instead.
Install the trove commandline client by following this guide: Install the trove commandline client by following this guide:
http://docs.openstack.org/cli-reference/content/install_clients.html http://docs.openstack.org/cli-reference/content/install_clients.html
Then set up the necessary variables for your cloud in an 'openrc' file using this guide: Then set up the necessary variables for your cloud in an :file:`openrc.sh` file
using this guide:
http://docs.openstack.org/cli-reference/content/cli_openrc.html http://docs.openstack.org/cli-reference/content/cli_openrc.html
Ensure you have an openrc.sh file, source it and then check your trove client works: Ensure you have an :file:`openrc.sh` file, source it and then check
:: your trove client works: ::
$ cat openrc.sh $ cat openrc.sh
export OS_USERNAME=your_auth_username export OS_USERNAME=your_auth_username
@ -256,18 +285,21 @@ Ensure you have an openrc.sh file, source it and then check your trove client wo
1.0.9 1.0.9
From there, you can find a good resource on what is supported and how From there, you can find a good resource on what is supported and how
to use in `these slides <http://www.slideshare.net/hastexo/hands-on-trove-database-as-a-service-in-openstack-33588994>`_. Steps to work with an existing database to use in `these slides
service installation start on slide 28. <http://www.slideshare.net/hastexo/hands-on-trove-database-as-a-service-in-openstack-33588994>`_. Steps
to work with an existing database service installation start on
slide 28.
Next Steps Next Steps
---------- ~~~~~~~~~~
You should now be fairly confident working with Block Storage volumes. You should now be fairly confident working with Block Storage volumes.
There are several calls we did not cover. To see these and more, There are several calls we did not cover. To see these and more, refer
refer to the volume documentation of your SDK, or try a different step in the tutorial, including: to the volume documentation of your SDK, or try a different step in
the tutorial, including:
* :doc:`/section6` - to automatically orchestrate the application * :doc:`/section6`: to automatically orchestrate the application
* :doc:`/section7` - to learn about more complex networking * :doc:`/section7`: to learn about more complex networking
* :doc:`/section8` - for advice for developers new to operations * :doc:`/section8`: for advice for developers new to operations