设置数据库复制¶
您可以创建现有数据库实例(主数据库)的副本,以提高读密集型工作负载的性能和可扩展性。读工作负载可以隔离到副本,而写工作负载可以定向到主数据库。当您对主数据库进行后续更改时,系统会自动将这些更改应用于副本。由于副本是只读的,因此它们不会直接减少主数据库上的写容量负担。此功能并非针对写密集型工作负载。
并非所有数据存储在 Trove 中都支持复制功能。
副本是通过使用与主数据库相同的服务器配置创建的,例如 flavor、数据卷、数据存储等。创建副本后,可以独立于主服务器更改一些设置,例如数据卷大小。
目前,Trove 不支持主数据库和副本之间的自动故障转移。
Trove 只能创建一个新的副本。将已存在的实例添加到复制组是不被支持的。
不支持创建副本的副本。
删除复制实例时,需要先删除副本,然后再删除主数据库。
设置复制¶
创建副本
首先,确保您有一个实例(ID:cebb f187-e223-46dd-8802-6dc04e895d0a)正在运行且状态为 HEALTHY,创建副本
$ openstack database instance create test-mysql-replica-1 \ --nic net-id=$netid \ --replica-of cebbf187-e223-46dd-8802-6dc04e895d0a
等待副本实例成功创建,验证复制服务器的状态。
$ openstack database instance list -c ID -c Name -c Status -c "Operating Status" -c Role +--------------------------------------+----------------------+---------+------------------+---------+ | ID | Name | Status | Operating Status | Role | +--------------------------------------+----------------------+---------+------------------+---------+ | 71f30a72-4e47-4505-9e7f-ffd8933a331c | test-mysql-replica-1 | ACTIVE | HEALTHY | replica | | cebbf187-e223-46dd-8802-6dc04e895d0a | test-mysql | ACTIVE | HEALTHY | primary | +--------------------------------------+----------------------+---------+------------------+---------+
验证复制状态。
可以通过对主数据库进行一些修改,并确保这些修改也传播到副本来验证复制。我们将主数据库上创建一个名为“newdb”的数据库,并检查它是否在副本上自动创建。
首先,获取主数据库和副本的现有数据库,它们应该相同
$ openstack database db list cebbf187-e223-46dd-8802-6dc04e895d0a # The primary +--------+ | Name | +--------+ | testdb | +--------+ $ openstack database db list 71f30a72-4e47-4505-9e7f-ffd8933a331c # The replica +--------+ | Name | +--------+ | testdb | +--------+
在主数据库上创建一个新数据库
$ openstack database db create cebbf187-e223-46dd-8802-6dc04e895d0a newdb
检查新数据库是否也在副本上创建
$ openstack database db list 71f30a72-4e47-4505-9e7f-ffd8933a331c +--------+ | Name | +--------+ | newdb | | testdb | +--------+
故障转移¶
由于复制是异步的,因此主数据库和副本之间存在延迟。延迟量会受到许多因素的影响,例如主服务器上运行的工作负载的繁忙程度以及数据中心之间的延迟。在大多数情况下,副本延迟范围在几秒钟到几分钟之间。
在执行故障转移之前,我们将创建一个额外的副本
$ openstack database instance create test-mysql-replica-2 \ --nic net-id=$netid \ --replica-of cebbf187-e223-46dd-8802-6dc04e895d0a
现在我们有 3 个实例在一个复制组中运行
$ openstack database instance list -c ID -c Name -c Status -c "Operating Status" -c Role +--------------------------------------+----------------------+--------+------------------+---------+ | ID | Name | Status | Operating Status | Role | +--------------------------------------+----------------------+--------+------------------+---------+ | 71f30a72-4e47-4505-9e7f-ffd8933a331c | test-mysql-replica-1 | ACTIVE | HEALTHY | replica | | a85ece86-9f62-4aa8-bb15-eba604cd2a01 | test-mysql-replica-2 | ACTIVE | HEALTHY | replica | | cebbf187-e223-46dd-8802-6dc04e895d0a | test-mysql | ACTIVE | HEALTHY | primary | +--------------------------------------+----------------------+--------+------------------+---------+
将“test-mysql-replica-1”故障转移(提升)为主数据库。
$ openstack database instance promote 71f30a72-4e47-4505-9e7f-ffd8933a331c
等待 Trove 设置新的复制,3 个实例的状态变为“PROMOTE”然后变为“HEALTHY”。
$ openstack database instance list -c ID -c Name -c Status -c "Operating Status" -c Role +--------------------------------------+----------------------+--------+------------------+---------+ | ID | Name | Status | Operating Status | Role | +--------------------------------------+----------------------+--------+------------------+---------+ | 71f30a72-4e47-4505-9e7f-ffd8933a331c | test-mysql-replica-1 | ACTIVE | HEALTHY | primary | | a85ece86-9f62-4aa8-bb15-eba604cd2a01 | test-mysql-replica-2 | ACTIVE | HEALTHY | replica | | cebbf187-e223-46dd-8802-6dc04e895d0a | test-mysql | ACTIVE | HEALTHY | replica | +--------------------------------------+----------------------+--------+------------------+---------+
将您的应用程序指向(前)副本。
每个服务器都有唯一的连接字符串。更新您的应用程序以指向(前)副本而不是主数据库。
其他支持的操作¶
移除一个故障的主数据库。这本质上用于驱逐一个已经故障的主数据库,以便在副本之间建立一个新的主数据库。命令:
openstack database instance eject <primary_ID>将副本更改为独立数据库服务器。分离的副本成为一个独立服务器,接受读和写操作。独立服务器不能再次被制作为副本。命令:
openstack database instance detach <replica_ID>