Merge "Add Redis datastore upgrade"
This commit is contained in:
commit
a038b356fd
@ -17,3 +17,5 @@ handling complex administrative tasks.
|
|||||||
manage-db-config.rst
|
manage-db-config.rst
|
||||||
set-up-replication.rst
|
set-up-replication.rst
|
||||||
set-up-clustering.rst
|
set-up-clustering.rst
|
||||||
|
upgrade-datastore.rst
|
||||||
|
upgrade-cluster-datastore.rst
|
||||||
|
83
doc/source/user/upgrade-cluster-datastore.rst
Normal file
83
doc/source/user/upgrade-cluster-datastore.rst
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
=========================
|
||||||
|
Upgrade cluster datastore
|
||||||
|
=========================
|
||||||
|
|
||||||
|
Upgrading datastore for cluster instances is very similar to upgrading
|
||||||
|
a single instance.
|
||||||
|
|
||||||
|
Trove tries to perform a rolling upgrade so that there won't be any
|
||||||
|
downtime. However, it is not always possible and, for example, in case
|
||||||
|
of Redis upgrade, some of its slots may be temporarily unavailable.
|
||||||
|
|
||||||
|
Trove strategy upgrades every instance in the entire cluster one by
|
||||||
|
one. Upgrading is finished once all instances are upgraded.
|
||||||
|
|
||||||
|
Please check the guide for datastore upgrade to check prerequisistes.
|
||||||
|
|
||||||
|
This example shows you how to upgrade Redis datastore (version 3.2.6)
|
||||||
|
for a cluster.
|
||||||
|
|
||||||
|
Upgrading cluster
|
||||||
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
#. **Check cluster task**
|
||||||
|
|
||||||
|
Use :command:`openstack database cluster list` to check whether the
|
||||||
|
task of your cluster is NONE.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack database cluster list
|
||||||
|
+--------------------------------------+---------------+-----------+-------------------+-----------+
|
||||||
|
| ID | Name | Datastore | Datastore Version | Task Name |
|
||||||
|
+--------------------------------------+---------------+-----------+-------------------+-----------+
|
||||||
|
| 05f2e7b7-8dac-453f-ad5d-38195cd5718f | redis_cluster | redis | 3.2.6 | NONE |
|
||||||
|
+--------------------------------------+---------------+-----------+-------------------+-----------+
|
||||||
|
|
||||||
|
#. **Check if target version is available**
|
||||||
|
|
||||||
|
Use :command:`openstack datastore version list` to list all
|
||||||
|
available versions your datastore.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack datastore version list redis
|
||||||
|
+--------------------------------------+-------+
|
||||||
|
| ID | Name |
|
||||||
|
+--------------------------------------+-------+
|
||||||
|
| 483debec-b7c3-4167-ab1d-1765795ed7eb | 3.2.6 |
|
||||||
|
| 507f666e-193c-4194-9d9d-da8342dcb4f1 | 3.2.7 |
|
||||||
|
+--------------------------------------+-------+
|
||||||
|
|
||||||
|
#. **Run cluster-upgrade**
|
||||||
|
|
||||||
|
Use :command:`openstack database cluster upgrade` command to
|
||||||
|
upgrade your datastore for the selected instance.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack database cluster upgrade 05f2e7b7-8dac-453f-ad5d-38195cd5718f 3.2.7
|
||||||
|
|
||||||
|
#. **Wait until task changes from UPGRADING_CLUSTER to NONE**
|
||||||
|
|
||||||
|
You can use :command:`openstack database cluster list` to check the
|
||||||
|
current task.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack database cluster list
|
||||||
|
+--------------------------------------+---------------+-----------+-------------------+-----------+
|
||||||
|
| ID | Name | Datastore | Datastore Version | Task Name |
|
||||||
|
+--------------------------------------+---------------+-----------+-------------------+-----------+
|
||||||
|
| 05f2e7b7-8dac-453f-ad5d-38195cd5718f | redis_cluster | redis | 3.2.7 | NONE |
|
||||||
|
+--------------------------------------+---------------+-----------+-------------------+-----------+
|
||||||
|
|
||||||
|
Other clusters
|
||||||
|
~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Upgrade for other clusters works in the same way. Currently Trove
|
||||||
|
supports upgrades for the following cluster datastores:
|
||||||
|
|
||||||
|
- MySQL.
|
||||||
|
- MariaDB.
|
||||||
|
- Redis.
|
96
doc/source/user/upgrade-datastore.rst
Normal file
96
doc/source/user/upgrade-datastore.rst
Normal file
@ -0,0 +1,96 @@
|
|||||||
|
=================
|
||||||
|
Upgrade datastore
|
||||||
|
=================
|
||||||
|
|
||||||
|
You can upgrade your datastore version. When you perform an upgrade,
|
||||||
|
the system automatically manages data and configuration files of your
|
||||||
|
database.
|
||||||
|
|
||||||
|
To perform datastore upgrade, you need:
|
||||||
|
|
||||||
|
- A supported OS image with the target datastore version.
|
||||||
|
|
||||||
|
- A Trove database instance to be upgrade.
|
||||||
|
|
||||||
|
This example shows you how to upgrade Redis datastore (version 3.2.6)
|
||||||
|
for a single instance database.
|
||||||
|
|
||||||
|
.. note::
|
||||||
|
|
||||||
|
**Before** you begin make sure that:
|
||||||
|
|
||||||
|
- Your target datastore is binary compatible with the current
|
||||||
|
datastore. Each database provider has its own compatibilty
|
||||||
|
policy. Usually there shouldn't be any problem when
|
||||||
|
performing an upgrade within minor versions.
|
||||||
|
|
||||||
|
- You **do not** downgrade your datastore.
|
||||||
|
|
||||||
|
- Target versions is supported by Trove. For instance, Trove
|
||||||
|
doesn't support Cassandra >=2.2 at this moment so you
|
||||||
|
shouldn't perform an upgrade from 2.1 to 2.2.
|
||||||
|
|
||||||
|
Upgrading datastore
|
||||||
|
~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
#. **Check instance status**
|
||||||
|
|
||||||
|
Use :command:`openstack database instance list` to check whether the
|
||||||
|
status of your instance is ACTIVE.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack database instance list
|
||||||
|
+--------------------------------------+------------+-----------+-------------------+--------+-----------+------+-----------+
|
||||||
|
| ID | Name | Datastore | Datastore Version | Status | Flavor ID | Size | Region |
|
||||||
|
+--------------------------------------+------------+-----------+-------------------+--------+-----------+------+-----------+
|
||||||
|
| 55411e95-1670-497f-8d92-0179f3b4fdd4 | redis_test | redis | 3.2.6 | ACTIVE | 6 | 5 | RegionOne |
|
||||||
|
+--------------------------------------+------------+-----------+-------------------+--------+-----------+------+-----------+
|
||||||
|
|
||||||
|
#. **Check if target version is available**
|
||||||
|
|
||||||
|
Use :command:`openstack datastore version list` command to list
|
||||||
|
all available versions your datastore.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack datastore version list redis
|
||||||
|
+--------------------------------------+-------+
|
||||||
|
| ID | Name |
|
||||||
|
+--------------------------------------+-------+
|
||||||
|
| 483debec-b7c3-4167-ab1d-1765795ed7eb | 3.2.6 |
|
||||||
|
| 507f666e-193c-4194-9d9d-da8342dcb4f1 | 3.2.7 |
|
||||||
|
+--------------------------------------+-------+
|
||||||
|
|
||||||
|
#. **Run upgrade**
|
||||||
|
|
||||||
|
Use :command:`openstack database instance` command to upgrade your
|
||||||
|
datastore for the selected instance.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack database instance 55411e95-1670-497f-8d92-0179f3b4fdd4 3.2.7
|
||||||
|
|
||||||
|
#. **Wait until status changes from UPGRADE to ACTIVE**
|
||||||
|
|
||||||
|
You can use :command:`openstack database instance list` to check the
|
||||||
|
current status.
|
||||||
|
|
||||||
|
.. code-block:: console
|
||||||
|
|
||||||
|
$openstack database instance list
|
||||||
|
+--------------------------------------+------------+-----------+-------------------+---------+-----------+------+-----------+
|
||||||
|
| ID | Name | Datastore | Datastore Version | Status | Flavor ID | Size | Region |
|
||||||
|
+--------------------------------------+------------+-----------+-------------------+---------+-----------+------+-----------+
|
||||||
|
| 55411e95-1670-497f-8d92-0179f3b4fdd4 | redis_test | redis | 3.2.7 | UPGRADE | 6 | 5 | RegionOne |
|
||||||
|
+--------------------------------------+------------+-----------+-------------------+---------+-----------+------+-----------+
|
||||||
|
|
||||||
|
Other datastores
|
||||||
|
~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
Upgrade for other datastores works in the same way. Currently Trove
|
||||||
|
supports upgrades for the following datastores:
|
||||||
|
|
||||||
|
- MySQL,
|
||||||
|
- MariaDB,
|
||||||
|
- Redis.
|
@ -125,6 +125,9 @@ class RedisCluster(models.Cluster):
|
|||||||
|
|
||||||
return RedisCluster(context, db_info, datastore, datastore_version)
|
return RedisCluster(context, db_info, datastore, datastore_version)
|
||||||
|
|
||||||
|
def upgrade(self, datastore_version):
|
||||||
|
self.rolling_upgrade(datastore_version)
|
||||||
|
|
||||||
def grow(self, instances):
|
def grow(self, instances):
|
||||||
LOG.debug("Growing cluster.")
|
LOG.debug("Growing cluster.")
|
||||||
|
|
||||||
|
@ -154,6 +154,9 @@ class RedisClusterTasks(task_models.ClusterTasks):
|
|||||||
|
|
||||||
LOG.debug("End grow_cluster for id: %s.", cluster_id)
|
LOG.debug("End grow_cluster for id: %s.", cluster_id)
|
||||||
|
|
||||||
|
def upgrade_cluster(self, context, cluster_id, datastore_version):
|
||||||
|
self.rolling_upgrade_cluster(context, cluster_id, datastore_version)
|
||||||
|
|
||||||
|
|
||||||
class RedisTaskManagerAPI(task_api.API):
|
class RedisTaskManagerAPI(task_api.API):
|
||||||
|
|
||||||
|
@ -13,6 +13,8 @@
|
|||||||
# License for the specific language governing permissions and limitations
|
# License for the specific language governing permissions and limitations
|
||||||
# under the License.
|
# under the License.
|
||||||
|
|
||||||
|
import os
|
||||||
|
|
||||||
from oslo_log import log as logging
|
from oslo_log import log as logging
|
||||||
|
|
||||||
from trove.common import exception
|
from trove.common import exception
|
||||||
@ -109,6 +111,49 @@ class Manager(manager.Manager):
|
|||||||
if snapshot:
|
if snapshot:
|
||||||
self.attach_replica(context, snapshot, snapshot['config'])
|
self.attach_replica(context, snapshot, snapshot['config'])
|
||||||
|
|
||||||
|
def pre_upgrade(self, context):
|
||||||
|
mount_point = self._app.get_working_dir()
|
||||||
|
save_etc_dir = "%s/etc" % mount_point
|
||||||
|
home_save = "%s/trove_user" % mount_point
|
||||||
|
|
||||||
|
self._app.status.begin_restart()
|
||||||
|
self._app.stop_db()
|
||||||
|
|
||||||
|
operating_system.copy("%s/." % system.REDIS_CONF_DIR, save_etc_dir,
|
||||||
|
preserve=True, as_root=True)
|
||||||
|
|
||||||
|
operating_system.copy("%s/." % os.path.expanduser('~'), home_save,
|
||||||
|
preserve=True, as_root=True)
|
||||||
|
|
||||||
|
self.unmount_volume(context, mount_point=mount_point)
|
||||||
|
|
||||||
|
return {
|
||||||
|
'mount_point': mount_point,
|
||||||
|
'save_etc_dir': save_etc_dir,
|
||||||
|
'home_save': home_save
|
||||||
|
}
|
||||||
|
|
||||||
|
def post_upgrade(self, context, upgrade_info):
|
||||||
|
self._app.stop_db()
|
||||||
|
|
||||||
|
if 'device' in upgrade_info:
|
||||||
|
self.mount_volume(context, mount_point=upgrade_info['mount_point'],
|
||||||
|
device_path=upgrade_info['device'],
|
||||||
|
write_to_fstab=True)
|
||||||
|
operating_system.chown(path=upgrade_info['mount_point'],
|
||||||
|
user=system.REDIS_OWNER,
|
||||||
|
group=system.REDIS_OWNER,
|
||||||
|
recursive=True, as_root=True)
|
||||||
|
|
||||||
|
self._restore_home_directory(upgrade_info['home_save'])
|
||||||
|
|
||||||
|
self._restore_directory(upgrade_info['save_etc_dir'],
|
||||||
|
system.REDIS_CONF_DIR)
|
||||||
|
|
||||||
|
self._app = service.RedisApp()
|
||||||
|
self._app.start_db()
|
||||||
|
self._app.status.end_restart()
|
||||||
|
|
||||||
def restart(self, context):
|
def restart(self, context):
|
||||||
"""
|
"""
|
||||||
Restart this redis instance.
|
Restart this redis instance.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user