怎样将企业模式的Vertica数据库迁移到EON
版本日志
日期 | 修改内容 |
---|---|
20211222 | 初建 |
20220407 | 1、增加不支持的projection类型列表。 2、增加在源库上的参数配置介绍 |
前言
Vertica EON 模式的共享存储支持 AWS、GCP、Azure、Ali等公有云存储,还有 minio、HDFS 等私有云存储。如果您是老用户,可能您现在的Vertica数据库是跑在企业模式部署下的,如果您希望将现在的企业模式数据库转换为 EON 数据库,如果没有自动工具,将企业模式数据库迁移到云存储上变为EON数据库非常麻烦,通常只能通过业务数据迁移的办法。
为了促进和加速从企业模式到 EON 模式的迁移,Vertica 提供了新的函数 MIGRATE_ENTERPRISE_TO_EON ,实现企业模式到 EON 的数据库转换。
迁移前准备
- 数据库版本在10.0及以上,10.0以下版本不支持进行迁移。
- 待迁移数据库集群和共享存储之间的配置已经完成。
- 只能对企业数据库进行迁移。
- 企业数据库中的所有节点在数据库迁移时必须处于UP状态,以保证能够完成目录转换和数据文件传输。
- 企业数据库中的所有节点都必须是 PERMANENT 或 EHEMERAL 类型。 集群中存在任何 EXECUTE 或 STANDBY 的节点都会导致错误。
- S3 credentials 和 (endpoint for non-AWS locations)必须在配置参数中以确保正确复制数据和目录。
- 企业数据库中所有分段projection的分段必须与集群分段相同。
- 企业数据库中不允许有非弹性分割的projection
- 企业数据库必须是弹性集群
- 企业数据库中不允许使用 groupROSes 或未捆绑的存储文件
不支持的Projection
Eon 数据库不支持四种类型的投影,如下所述。如果 MIGRATE_ENTERPRISE_TO_EON 在 Enterprise 数据库中找到任何这些投影类型,它会回滚迁移并在迁移错误日志中报告有问题的投影或其表名。例如:
The following projections are inconsistent with cluster segmentation. Rebalance them with REBALANCE_CLUSTER() or REBALANCE_TABLE():
Projection(Anchor Table): public.incon1_p1_b0(public.incon1)
不支持的原因 | 说明 | 解决方法 |
---|---|---|
projection未分布到所有节点 | 例如,在集群中添加了节点,因此当前投影数据的分布与新的集群分割要求不一致。 | 重分布集群或者表 错误日志文件列出了所有投影有问题的表的名称。 您可以使用 REBALANCE_TABLE函数,将这些表进行重分布。 您还可以通过调用 REBALANCE_CLUSTER函数重新分布数据库中所有未分布到所有节点的表。 |
projection不支持弹性分割 | 使用NODES选项创建projection。 在禁用弹性分段的数据库中创建的projection。 |
删除投影,使用所有节点重新创建。 |
使用 GROUPED 子句定义 | 在单个 ROS 容器中合并多个列 | 删除投影,重新创建没有 GROUPED 子句。 |
存储在非捆绑存储容器中的数据 | 仅在版本 7.2 中引入存储容器捆绑之前创建的 Vertica 数据库中发现。 | 使用元函数 COMPACT_STORAGE 在数据库中捆绑存储容器。 错误日志使用将数据存储在非捆绑存储容器中的投影来命名所有表。您可以将这些名称用作元函数 COMPACT_STORAGE 的参数。 |
必要的参数配置
迁移前,在源数据库上设置以下配置参数。所有参数都必须在数据库级别设置。
目标 Eon 环境 | 配置要求 |
---|---|
S3: AWS, Pure Storage, MinIO | 以下要求适用于所有受支持的云和非云(本地)环境:AWS、Pure Storage 和 MinIO。 有一个例外情况:从 AWS 上的企业模式数据库迁移。 AWSEndpoint (Pure Storage, MinIO only) AWSRegion (AWS only) AWSAuth / IAM role AWSEnableHttps 注意: 如果使用 Pure Storage 和 MinIO 迁移到本地公共存储,请将配置参数 AWSEnableHttps 设置为与数据库 TLS 加密设置兼容:如果使用 TLS,则 AWSEnableHttps=1,否则为 0。如果设置不兼容,则迁移返回错误。 |
Azure | 1、必须使用 azb:// 架构 URI 来设置用于公共数据存储的 Azure Blob 存储位置。有关此 URI 的格式,请参阅 Azure Blob 存储对象存储。 2、选择以下身份验证方法之一以授予 Vertica 对存储位置的访问权限: 2.1、配置托管标识以授予 Azure VM 访问存储位置的权限。此选项不需要在 Vertica 中做任何配置。 2.2、在数据库级别设置 AzureStorageCredentials 和 AzureStorageEndpointConfig 配置参数,让 Vertica 使用存储位置进行身份验证。 有关这两种身份验证方法的详细信息,请参阅 Azure Blob 存储对象存储。 |
GCP | GCSEndpoint GCSAuth GCSEnableHttp |
HDFS | 适用以下要求: 源数据库必须配置为访问 HDFS,包括(如适用)高可用性 (HA) 和 Kerberos 身份验证设置。 提示: 如果使用 Kerberos 身份验证,请记录以下 Kerberos 配置参数的设置。您需要将这些设置应用于迁移的 Eon 数据库: KerberosServiceName KerberosRealm KerberosKeytabFile 注意: 以下限制适用于 Kerberos 身份验证: 迁移仅支持 Vertica 身份验证。不支持通过委托令牌或代理用户进行用户身份验证。 迁移不支持多个 Kerberos 领域的身份验证。 在数据库级别设置配置参数 HadoopConfDir(非 HA 环境不需要)。 |
开始迁移
不同数据库对象的迁移方法
企业模式对象 | 迁移到Eon数据库 |
---|---|
Global catalog objects(projection、schema、users、权限等) | 直接同步到共享存储,不会发生变化 |
一个projection_basename下的伙伴projection(b0,b1) | 迁移一个projection到共享存储(通常为b0) |
Unsegmented projection | 在共享存储上保存一份数据,并将其复制分布到所有节点 |
节点数 | 相同数量的节点和相同数量的分段分片 |
Depot location | 如 MIGRATE_ENTERPRISE_TO_EON 中所指定。 revive 后,默认depot大小设置为本地文件系统的 80% |
USER和TEMP存储路径数据 | 迁移到共享存储 |
容错组与存储策略 | 不迁移 |
外部程序(External procedures) | 不迁移 |
与网络设置相关的目录对象——负载平衡组、网络地址、路由规则、子网等。 | 不迁移 |
迁移语法
SELECT MIGRATE_ENTERPRISE_TO_EON ( 'communal‑storage‑location', 'depot‑location' [, is‑dry‑run] );
- communal_storage_location:目录和数据文件所在的 S3/GCP url。 这个参数是必需的。
- depot_location: eon 模式的仓库位置路径。 此参数是必需的,并且应该是显式路径。
- is_dry_run: 如果 is_dry_run=true,元函数只检查存储类型和投影分段,不会进行数据迁移。 此参数是可选的,默认情况下为 false
试运行
设置[, is‑dry‑run]参数为true:
=> SELECT migrate_enterprise_to_eon('s3://verticadbbucket', '/vertica/depot', true);
如果该函数发现任何合规性问题,它会将这些问题写入数据库目录中的迁移错误日志 migrate_enterprise_to_eon_error.log。
正式迁移
=> SELECT migrate_enterprise_to_eon('s3://verticadbbucket', '/vertica/depot', false);
迁移进度跟踪
-
Eon Shards - 迁移后的分片数量和企业模式的节点数相同,数据分片的方法与projection的分段相同。
-
通过 database_migration_status 系统表监控迁移进度
- node_name
- transaction_id
- phase:步骤描述,依次执行的迁移操作包括:目录转换、数据传输、目录传输。 其中,数据传输表示传输数据文件和库文件。 目录传输包括检查点和事务日志文件的传输
- status:包含如下状态: RUNNING, COMPLETED, ABORT
- bytes_transfered, bytes_to_transfer:当进行操作目录转换步骤时,bytes_transfered 和 bytes_to_transfer 均为 0。
- communal_storage_location
- start_time and end_time:步骤的起止时间。
=> SELECT node_name, phase, status, bytes_to_transfer, bytes_transfered, communal_storage_location FROM database_migration_status ORDER BY node_name, start_time;
node_name | phase | status | bytes_to_transfer | bytes_transfered | communal_storage_location
------------------+--------------------+-----------+-------------------+------------------+---------------------------
v_vmart_node0001 | Catalog Conversion | COMPLETED | 0 | 0 | s3://verticadbbucket/
v_vmart_node0001 | Data Transfer | COMPLETED | 1134 | 1134 | s3://verticadbbucket/
v_vmart_node0001 | Catalog Transfer | COMPLETED | 3765 | 3765 | s3://verticadbbucket/
v_vmart_node0002 | Catalog Conversion | COMPLETED | 0 | 0 | s3://verticadbbucket/
v_vmart_node0002 | Data Transfer | COMPLETED | 1140 | 1140 | s3://verticadbbucket/
v_vmart_node0002 | Catalog Transfer | COMPLETED | 3766 | 3766 | s3://verticadbbucket/
v_vmart_node0003 | Catalog Conversion | COMPLETED | 0 | 0 | s3://verticadbbucket/
v_vmart_node0003 | Data Transfer | RUNNING | 5272616 | 183955 | s3://verticadbbucket/
增量迁移
- 迁移任务会对比数据库和共享存储的文件差异,只上传差异数据。
- 假设没有失败,第一次迁移运行将完成大部分数据传输。 后续的迁移运行预计会更短,因为它们只传输上次运行和当前运行开始时间之间企业数据库中发生的增量。
- 允许数据库管理员控制迁移进度,选择在空闲时间进行迁移工作。
- 可以使用这个估计来安排时间停止对企业数据库的更改,执行最终迁移运行以同步两个数据库,并恢复 eon 数据库。
- 复活(启动)新迁移的 Eon 数据库后,您无法再次进行增量迁移到其公共存储,除非您先删除数据库然后清理存储。
并发迁移
- 不支持从同一个集群到同一个公共存储位置的多个数据库迁移任务
- 允许将多个数据库迁移任务从同一集群迁移到不同的公共存储位置,但使用场景很少。
- 当从不同的集群同时迁移到相同的共享存储位置时。迁移任务先上传 cluster_config.json 文件的数据库会被恢复,稍后上传 cluster_config.json 文件的迁移任务将失败。 不建议进行这种操作。
- 为防止覆盖公用存储位置上的现有数据库,如果公用存储位置上已有数据库,则从其他企业数据库迁移数据库将失败。
迁移完成后
复活 Eon 数据库
迁移完成且 Eon 数据库可供使用后,可以使用管理控制台或管理工具从公共存储中恢复数据库。
复活数据库所需的节点数量与企业模式的节点数量一致。数据库复活后,可再根据实际需求收缩或者添加主子集群节点数。
例如,以下 admintools 命令恢复了一个三节点迁移的 Eon 数据库:
admintools -t revive_db -x bootstrap_params.conf \ --communal-storage-location=webhdfs://mycluster/verticadb \ -d verticadb \ -s vnode01,vnode02,vnode03
如果发生增量迁移,建议在迁移后的 eon 数据库中运行 CLEAN_COMMUNAL_STORAGE() 以清理过时的文件。