IBM Cloud Docs
备份和恢复 IBM 本地数据

备份和恢复 IBM 本地数据

IBM Cloud Pak for Data IBM Software Hub

您可以备份和恢复与 IBM 本地安装相关的数据。

下表列出了脚本支持的升级路径。

脚本支持的升级路径
正在使用的版本 可升级到的版本
5.0.x 5.1.x
4.8.x
  1. 5.0.x 或 5.1.x
4.7.x 4.8.x 或 5.0.x
4.6.x 4.7.x 或 4.8.x
4.5.x 4.6.x 或 4.7.x
4.0.x 4.5.x 或 4.6.x

完成升级的更简单方法见以下主题:

如果要从 4.6.4 或更低版本升级到最新版本,那么必须先升级到 4.6.5,然后再升级到最新发行版。

主要数据存储为 PostgreSQL 数据库。

请选择以下一种方式来管理数据备份:

  • Kubernetes CronJob:使用为您提供的 $INSTANCE-store-cronjob cron 作业。
  • backupPG.sh script: 使用 backupPG.sh bash 脚本。
  • pg_dump 工具:直接在每个集群上运行 pg_dump 工具。 这是一个手动选项,使您能够控制此过程。

从一个版本升级到另一个版本之前,使用其中一个过程来备份数据时,将保留技能的工作空间标识,但服务实例标识和凭证会更改。

准备工作

  • 使用此过程创建备份时,备份包含所有服务实例中的所有助手和技能。 它可能包括您无法使用的技能和助手。
  • 原始服务实例的访问许可权信息不会存储在备份中。 即,不保留用于确定谁可以查看服务实例以及谁无法查看服务实例的原始访问权。
  • 您不能使用此程序备份搜索集成返回的数据。 搜索集成检索的数据来自 Discovery 实例中的数据集合。 请参阅 Discovery 文档 以了解如何备份其数据。
  • 如果您备份并还原或以其他方式更改搜索集成所连接的 Discovery 服务,则无法还原搜索集成,而必须重新创建。 当您设置搜索集成时,会将助手的响应部分映射到同一集群上由 Discovery 实例托管的数据集合中的字段。 如果该 Discovery 实例发生更改,那么与该实例的映射会中断。 如果您的 Discovery 服务没有变化,那么搜索集成可以继续连接到数据收集。
  • 用于复原数据的工具会先清除当前数据库,然后再复原备份。 因此,如果您可能需要还原到当前数据库,请首先创建其备份。
  • 您用于还原数据的目标 IBM Cloud Pak for Data 集群必须具有与备份数据库的环境相同数量的预置服务实例。 要在 IBM Cloud Pak for Data Web 客户机中进行验证,请从主导航菜单中选择 服务,选择 实例,然后打开 供应的实例 选项卡。 如果多个用户创建了实例,那么要求创建实例的其他用户登录并检查他们创建的实例数。 然后,可以将部署的实例总数相加。 即使是管理用户也无法查看其他人从 Web 客户机用户界面创建的实例。

使用 CronJob 备份数据

部署服务时,将自动创建并启用名为 $INSTANCE-store-cronjob 的 CronJob。 CronJob 是一种类型的 Kubernetes 控制器。 CronJob 按重复安排来创建作业。 更多信息,请参阅 CronJobKubernetes 文档。

商店 CronJob 将创建 $INSTANCE-backup-job-$TIMESTAMP 作业。 每个 $INSTANCE-backup-job-$TIMESTAMP 作业都会删除旧日志,并运行存储 PostgreSQL 数据库的备份。PostgreSQL 提供用于创建备份的 pg_dump 工具。 要创建备份,pg_dump 工具会将数据库内容发送到 stdout,然后您可以将其写入文件。 pg_dump 工具使用 pg_dump 命令创建备份,并将其存储在名为 $INSTANCE-store-db-backup-pvc 的持久卷主张(PVC)中。

您负责在备份初始创建后将其移动到更安全的位置,最好是在无法轻松删除备份的集群外部可访问的位置。 请确保对所有环境 (尤其是生产集群) 都执行此操作。

下表列出了用于控制备份定时作业的配置值。 您可以在服务部署后,使用 oc edit cronjob $INSTANCE-store-cronjob 命令编辑 cron 作业来编辑这些设置。

定时作业变量
变量 描述 缺省值
store.backup.suspend 如果为 True,那么定时作业不会创建任何备份作业。 False
store.backup.schedule 指定一天中运行备份作业的时刻。 请使用 cron 表达式指定安排。 例如,{minute} {hour} {day} {month} {day-of-week},其中 {day-of-week} 被指定为 0 =星期日,1 =星期一,以此类推。 缺省安排是每天晚上 11 点运行。 0 23 * * *
store.backup.history.jobs.success 要保留的成功作业数。 30
store.backup.history.jobs.failed 要在作业日志中保留的失败作业数。 10
store.backup.history.files.weekly_backup_day 将一周中的某一天指定为每周备份日。0=Sunday,1=Monday,依此类推。 0
store.backup.history.files.keep_weekly 要保留的在 weekly_backup_day 创建的备份数。 4
store.backup.history.files.keep_daily 一周中其他几天所拍摄的照片备份数量。 6

通过 Portworx 访问备份的文件

要通过 Portworx 访问备份文件,请完成以下步骤:

  1. 获取用于 PostgreSQL 备份的持久卷的名称:

    oc get pv |grep $INSTANCE-store
    

    此命令会返回存储备份所在的持久卷声明的名称,例如 pvc-d2b7aa93-3602-4617-acea-e05baba94de3。 此名称在此过程的后面部分中称为 $pv_name

  2. 查找运行 Portworx 的节点:

    oc get pods -n kube-system -o wide -l name=portworx-api
    
  3. 以核心用户身份登录到运行 Portworx 的节点之一:

    ssh core@<node hostname>
    sudo su -
    
  4. 确保持久卷处于分离状态,且在您计划传输备份文件期间没有计划进行存储备份。

    请记住,除非您通过编辑 postgres.backup.schedule 配置参数的值来更改计划,否则每天晚上11点(在节点配置的时区)都会进行备份。 可以运行 oc get cronjobs 命令来检查 $RELEASE-backup-cronjob 作业的当前安排。 在以下命令中,$pvc_node 是您在此任务的第一步中发现的节点的名称:

    pxctl volume inspect $pv_name |head -40
    
  5. 将持久音量附加到主机:

    pxctl host attach $pv_name
    
  6. 在要安装节点的文件夹中创建一个文件夹:

    mkdir /var/lib/osd/mounts/voldir
    
  7. 安装节点:

    pxctl host mount $pv_name --path /var/lib/osd/mounts/voldir
    
  8. 将目录更改为 /var/lib/osd/mounts/voldir。 将备份文件转移到安全位置。 之后,退出目录。 卸装卷:

    pxctl host unmount --path /var/lib/osd/mounts/voldir $pv_name
    
  9. 从主机中分离音量:

    pxctl host detach $pv_name
    
  10. 确保音量处于关闭状态。 否则,后续备份将失败:

    pxctl volume inspect $pv_name |head -40
    

从 Red Hat OpenShift Container Storage 访问备份文件

要从 Red Hat OpenShift Container Storage (OCS) 访问备份文件,请完成以下步骤:

  1. 创建用于 PostgreSQL 备份的持久卷声明的卷快照:

    cat <<EOF | oc apply -f -
    apiVersion: snapshot.storage.k8s.io/v1
    kind: VolumeSnapshot
    metadata:
      name: wa-backup-snapshot
    spec:
      source:
    
    
        persistentVolumeClaimName: ${INSTANCE_NAME}-store-db-backup-pvc
    
    
      volumeSnapshotClassName: ocs-storagecluster-rbdplugin-snapclass
    EOF
    
  2. 从卷快照创建持久卷声明:

    cat <<EOF | oc apply -f -
    apiVersion: v1
    kind: PersistentVolumeClaim
    metadata:
      name: wa-backup-snapshot-pvc
    spec:
      storageClassName: ocs-storagecluster-ceph-rbd
      accessModes:
      - ReadWriteOnce
      volumeMode: Filesystem
      dataSource:
        apiGroup: snapshot.storage.k8s.io
        kind: VolumeSnapshot
        name: wa-backup-snapshot
      resources:
        requests:
          storage: 1Gi     
    EOF
    
  3. 创建 pod 以访问持久卷声明:

    cat <<EOF | oc apply -f -
    kind: Pod
    apiVersion: v1
    metadata:
      name: wa-retrieve-backup
    spec:
      volumes:
        - name: backup-snapshot-pvc
          persistentVolumeClaim:
           claimName: wa-backup-snapshot-pvc
      containers:
        - name: retrieve-backup-container
          image: cp.icr.io/cp/watson-assistant/conan-tools:20210630-0901-signed@sha256:e6bee20736bd88116f8dac96d3417afdfad477af21702217f8e6321a99190278
          command: ['sh', '-c', 'echo The pod is running && sleep 360000']
          volumeMounts:
            - mountPath: "/watson_data"
              name: backup-snapshot-pvc
    EOF
    
  4. 如果您不知道要抽取的备份文件的名称,并且无法检查最新的备份 cron 作业,请运行以下命令:

    oc exec -it wa-retrieve-backup -- ls /watson_data
    
  5. 将备份文件转移到安全位置:

    kubectl cp wa-retrieve-backup:/watson_data/${FILENAME} ${SECURE_LOCAL_DIRECTORY}/${FILENAME}
    
  6. 运行以下命令以清除为检索文件而创建的资源:

    oc delete pod wa-retrieve-backup
    oc delete pvc wa-backup-snapshot-pvc
    oc delete volumesnapshot wa-backup-snapshot
    

使用调试 pod 抽取 PostgreSQL 备份

要使用调试 pod 抽取 PostgreSQL 备份,请完成以下步骤:

  1. 获取商店名称 cronjob pod:

    export STORE_CRONJOB_POD=`oc get pods -l component=store-cronjob --no-headers | awk 'NR==1{print $1}'`
    
  2. 查看可用存储备份的列表以确定最新备份:

    oc debug ${STORE_CRONJOB_POD}
    ls /store-backups/
    

在商店备份列表中,您可以在时间戳记的帮助下找到最新的备份。

  1. 当步骤 2 中列出的调试 pod 保持活动状态时,在单独的终端会话中,设置 STORE_CRONJOB_POD 变量以匹配步骤 1 中返回的商店 cronjob pod 的名称:

    export STORE_CRONJOB_POD=`oc get pods -l component=store-cronjob --no-headers | awk 'NR==1{print $1}'`
    
  2. STORE_DUMP_FILE 变量导出并保存为来自 Step 2 的最新 store.dump_YYYYMMDD-TIME 文件名:

    export STORE_DUMP_FILE=store.dump_YYYYMMDD-TIME
    
  3. store.dump_YYYYMMDD-TIME 文件复制到系统上安全位置的一个目录中:

    `oc cp ${STORE_CRONJOB_POD}-debug:/store-backups/${STORE_DUMP_FILE} ${STORE_DUMP_FILE}`
    

    必须通过运行 ls 命令来验证是否已将 store.dump_YYYYMMDD-TIME 文件复制到正确的目录。

使用脚本备份数据

对于 IBM Cloud Pak® for Data 4.6.3 或更高版本,无法使用 watsonx Assistant 中的脚本来备份数据。{ .note}

backupPG.sh 脚本收集其中一个 PostgreSQL pod 的 pod 名称和凭证。 然后,backupPG.sh 脚本使用 PostgreSQL pod 来运行 pg_dump 命令。

要使用提供的脚本来备份数据,请完成以下步骤:

  1. 下载 backupPG.sh 脚本。

    访问 GitHub 并找到您的版本目录以查找文件。

    如果您的版本目录中不存在 backupPG.sh 脚本,请使用 KubernetesCronJobpg_dump 工具 备份数据。

  2. 登录到安装了产品的 Red Hat OpenShift 项目名称空间。

  3. 运行以下脚本:

    ./backupPG.sh --instance ${INSTANCE} > ${BACKUP_DIR}
    

    请替换命令中的以下值:

    • ${BACKUP_DIR}:指定一个文件,用于保存下载的数据。 请确保指定用于存储该文件的备份目录。 例如,/bu/backup-file-name.dump 创建名为 bu 的备份目录。
    • --instance ${INSTANCE}: 选择要备份的特定实例。

如果您想直接使用 PostgreSQL 工具备份数据,可以手动完成备份数据的过程。

手动备份数据

请完成此流程中的步骤,直接使用 PostgreSQL 工具备份您的数据。

要备份数据,请完成以下步骤:

  1. 访存正在运行的 PostgreSQL pod:

    仅适用于 4.8.8、5.1.0 版本以及所有未来版本:

       oc get pods -l app=${INSTANCE}-postgres-16 -o jsonpath="{.items[0].metadata.name}"
    

    其他版本请使用:

     oc get pods -l app=${INSTANCE}-postgres -o jsonpath="{.items[0].metadata.name}"
    

    将 $ {INSTANCE} 替换为您要备份的部署实例。

  2. 只有在有版本5.0.0或4.8.5之前 的情况下才可执行以下两个步骤:

    a. 获取商店VCAP的密名:

     oc get secrets -l component=store,app.kubernetes.io/instance=${INSTANCE} -o=custom-columns=NAME:.metadata.name | grep store-vcap
    

    b. 获取 PostgreSQL 连接值。 这些值将传递给在下一步中运行的命令。 您必须已安装 jq

    • 获取数据库:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.database'
      
    • 要获取主机名:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.host'
      
    • 获取用户名:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.username'
      
    • 获取密码:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.password'
      
  3. 只有在有版本4.8.6或5.0.1及更高版本 的情况下才可执行以下两个步骤:

    a. 获取商店连接的密名:

    oc get secrets -l component=store-subsystem,app.kubernetes.io/instance=${INSTANCE} -o=custom-columns=NAME:.metadata.name | grep store-datastore-connection
    

    b. 获取 PostgreSQL 连接值。 这些值将传递给在下一步中运行的命令。 您必须已安装 jq

    • 获取数据库:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.store_vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.database'
      
    • 要获取主机名:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.store_vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.host'
      
    • 获取用户名:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.store_vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.username'
      
    • 获取密码:

      oc get secret $VCAP_SECRET_NAME -o jsonpath="{.data.store_vcap_services}" | base64 --decode | jq --raw-output '.["user-provided"][]|.credentials|.password'
      
  4. 运行以下命令:

    oc exec $KEEPER_POD -- bash -c "export PGPASSWORD='$PASSWORD' && pg_dump -Fc -h $HOSTNAME -d $DATABASE -U $USERNAME" > ${BACKUP_DIR}
    

    以下列表描述了这些论点。 您在上一步中已检索到其中某些参数的值:

    仅适用于 4.8.8、5.1.0 版本以及所有未来版本:

    使用 $KEEPER_POD : 任何 PostgreSQL 16 pod。

    其他版本:

    使用 $KEEPER_POD:实例中的任何 PostgreSQL pod。

    适用于所有版本:

    • ${BACKUP_DIR}:指定一个文件,用于保存下载的数据。 请确保指定用于存储该文件的备份目录。 例如,/bu/backup-file-name.dump 创建名为 bu 的备份目录。
    • $DATABASE: 在步骤 3 中从 Store VCAP 私钥检索到的商店数据库名称。
    • $HOSTNAME: 在步骤 3 中从 Store VCAP 私钥检索到的主机名。
    • $USERNAME: 在步骤 3 中从 Store VCAP 私钥检索到的用户名。
    • $PASSWORD: 在步骤 3 中从 Store VCAP 私钥检索到的密码。

    要查看有关 pg_dump 命令的更多信息,可以运行以下命令:

    oc exec -it ${KEEPER_POD} -- pg_dump --help
    
  5. 备份包含加密密钥的秘密。 如果以下 如果该版本中没有上述秘密,请忽略此步骤。

    oc get secret -l service=conversation,app=$INSTANCE-auth-encryption
    oc get secret $INSTANCE-auth-encryption -o yaml > auth-encryption-secret.yaml
    

复原数据

IBM 创建了名为 pgmig 的复原工具。 该工具通过将数据库备份添加到您选择的数据库中,从而恢复数据库备份。 此外,该工具还可将模式升级到与在其中复原数据的产品版本相关联的模式。 在工具添加备份数据之前,它会删除当前服务部署中所有实例的数据,因此任何备件也会被删除。

先决条件:

设置您之前备份的 auth-encryption-secret

oc apply -f auth-encryption-secret.yaml
oc get secret -l service=conversation,app=$INSTANCE-auth-encryption
  1. 安装要将数据复原到的目标 IBM Cloud Pak for Data 集群。

    从目标集群的网络客户端,为每个在旧集群上备份的服务实例创建一个服务实例。 目标 IBM Cloud Pak for Data 集群所具有的实例数必须与在其中备份数据库的源环境中的实例数相同。

  2. 备份当前数据库,然后将其替换为备份的数据库。

    该工具会先清除当前数据库,然后再复原备份。 因此,如果您可能需要还原到当前数据库,请确保首先创建其备份。

  3. 转到您在上一步骤中通过 ${BACKUP_DIR} 参数指定的备份目录。

  4. 运行以下命令以从 GitHub Watson Developer Cloud Community 存储库下载 pgmig 工具。

    在第一个命令中,将 <WA_VERSION> 更新为要复原的版本。 例如,如果要复原 4.6.0,请将 <WA_VERSION> 更新为 4.6.0

    wget https://github.com/watson-developer-cloud/community/raw/master/watson-assistant/data/<WA_VERSION>/pgmig
    chmod 755 pgmig
    
  5. 创建以下两个配置文件,并将其保存在同一个备份目录中:

  6. 获取私钥:

    仅适用于 4.8.8、5.1.0 版本以及所有未来版本:

    oc get secret ${INSTANCE}-postgres-16-ca -o jsonpath='{.data.ca\.crt}' | base64 -d | tee ${BACKUP_DIR}/ca.crt | openssl x509 -noout -text
    

    其他版本:

    oc get secret ${INSTANCE}-postgres-ca -o jsonpath='{.data.ca\.crt}' | base64 -d | tee ${BACKUP_DIR}/ca.crt | openssl x509 -noout -text
    
    • ${INSTANCE} 替换为您要备份的实例名称。
    • ${BACKUP_DIR} 替换为 postgres.yamlresourceController.yaml 文件所在的目录。
  7. 将先前步骤中下载并创建的文件复制到 PostgreSQL pod 上的任何现有目录。

    a. 仅适用于 4.8.8、5.1.0 版本以及所有未来版本:

    运行以下命令查找 PostgreSQL pod:

    oc get pods | grep ${INSTANCE}-postgres-16
    

    b. 其他版本:

    运行以下命令查找 PostgreSQL pod:

    oc get pods | grep ${INSTANCE}-postgres
    

    c. 必须复制的文件为 pgmigpostgres.yamlresourceController.yamlca.crt (在步骤 6 中生成的私钥文件) 以及您为下载的数据创建的文件。 运行以下命令复制文件。

    如果要将数据复原到独立 IBM Cloud Pak for Data 集群,请将这些样本命令中所有对 oc 的引用替换为 kubectl

     oc exec -it ${POSTGRES_POD} -- mkdir /controller/tmp
     oc exec -it ${POSTGRES_POD} -- mkdir /controller/tmp/bu
     oc rsync ${BACKUP_DIR}/ ${POSTGRES_POD}:/controller/tmp/bu/
    
    • ${POSTGRES_POD} 替换为上一步骤中某个 PostgreSQL pod 的名称。
  8. 将商店部署缩减为0个副本,停止商店部署:

    oc scale deploy ibm-watson-assistant-operator -n ${OPERATOR_NS} --replicas=0
    oc get deployments -l component=store
    

    记下商店部署中有多少副本:

     oc scale deployment ${STORE_DEPLOYMENT} --replicas=0
    
  9. 在 PostgreSQL pod中启动远程命令的执行:

    oc exec -it ${POSTGRES_POD} /bin/bash
    
  10. 运行 pgmig 工具:

    仅适用于 4.8.8、5.1.0 版本以及所有未来版本:

    cd /controller/tmp/bu
    export PG_CA_FILE=/controller/tmp/bu/ca.crt
    ./pgmig --resourceController resourceController.yaml --target postgres.yaml --source <backup-file-name.dump>
    export ENABLE_ICP=true
    

    其他版本:

    cd /controller/tmp/bu
    export PG_CA_FILE=/controller/tmp/bu/ca.crt
    ./pgmig --resourceController resourceController.yaml --target postgres.yaml --source <backup-file-name.dump>
    
    • <backup-file-name.dump> 替换为您为下载的数据创建的文件的名称。

    如需了解更多命令选项,请参阅 PostgreSQL 迁移工具的详细信息

    脚本运行时,系统会提示您输入信息,其中包括目标集群上要将备份数据添加到的实例。 您指定的实例数据将被删除并替换。 如果备份中有多个实例,那么系统会多次提示您指定目标实例信息。

  11. 重新部署商店:

    oc scale deployment ${STORE_DEPLOYMENT} --replicas=${ORIGINAL_NUMBER_OF_REPLICAS}
    oc scale deploy ibm-watson-assistant-operator -n ${OPERATOR_NS} --replicas=1
    

    您可能需要等待几分钟,才能从网络界面看到恢复的数据。

  12. 复原数据后,必须训练后端模型。 有关重新训练后端模型的更多信息,请参阅 重新训练后端模型

创建 resourceController.yaml 文件

resourceController.yaml 文件包含有关要添加备份数据的新环境的详细信息。 向该文件添加以下信息:

accessTokens:
  - value
  - value2
host: localhost
port: 5000

要添加该文件中必需但当前缺少的值,请完成以下步骤:

  1. 要获取 accessTokens 值列表,您需要获取服务实例的不记名令牌的列表。

    • 登录到 IBM Cloud Pak for Data Web 客户机。
    • 从 IBM Cloud Pak for Data Web 客户机主导航菜单中,选择我的实例
    • “已预配的实例”选项卡中,点击您的实例。
    • 在实例的访问信息中,找到 “持有者”令牌。 复制该令牌并将其粘贴到 accessTokens 列表中。

    实例的不记名令牌可以访问用户拥有的所有实例。 因此,如果单个用户拥有所有实例,那么仅需要一个不记名令牌。

    如果服务具有多个实例,每个实例分别由不同的用户拥有,那么必须收集拥有实例的每个用户的不记名令牌。 您可以在 accessTokens 部分中列出多个不记名令牌值。

  2. 要获取主机信息,您需要提供用于托管UI组件的Pod的详细信息:

    oc describe pod -l component=ui
    

    请查找 RESOURCE_CONTROLLER_URL: https://${release-name}-addon-assistant-gateway-svc.zen:5000/api/ibmcloud/resource-controller 部分。

    例如,可以使用类似于以下内容的命令来进行查找:

    oc describe pod -l component=ui | grep RESOURCE_CONTROLLER_URL
    

    复制在 RESOURCE_CONTROLLER_URL 中指定的主机。 主机值是 RESOURCE_CONTROLLER_URL 值,不包括开头的协议以及从端口到值结尾的所有内容。 例如,对于上一个示例,主机为 ${release-name}-addon-assistant-gateway-svc.zen

  3. 要获取端口信息,请再次查看 RESOURCE_CONTROLLER_URL 条目。 端口在 URL 中指定为 <host>: 之后。 在此样本 URL 中,端口为 5000

  4. 将发现的值粘贴到 YAML 文件并保存该文件。

创建 postgres.yaml 文件

postgres.yaml 文件包含有关目标环境 (复原数据的环境) 中的 PostgreSQL pod 的详细信息。 向该文件添加以下信息:

host: localhost
port: 5432
database: store
username: user
su_username: admin
su_password: password

要添加该文件中必需但当前缺少的值,请完成以下步骤:

  1. 适用于 4.8.6 或 5.0.1 及更高版本

    要获取 host 的信息,您必须获取商店数据存储连接字符串secret。

    oc get secret ${INSTANCE}-store-datastore-connection-strings -o jsonpath='{.data.store_vcap_services}' | base64 -d
    
    

    适用于 5.0.0 或 4.8.5 及之前的版本

    要获取有关 host 的信息,必须获取 Store VCAP 私钥。

    oc get secret ${INSTANCE}-store-vcap -o jsonpath='{.data.vcap_services}' | base64 -d
    

    get 命令将返回有关 Redis 和 PostgreSQL 数据库的信息。 查找名为 pgservice 的 PostgreSQL 数据库的 JSON 代码段。 它将显示如下内容:

    {
      "user-provided":[
        {
          "name": "pgservice",
          "label": "user-provided",
          "credentials":
          {
            "host": "${INSTANCE}-rw",
            "port": 5432,
            "database": "conversation_pprd_${INSTANCE}",
            "username": "${dbadmin}",
            "password": "${password}"
          }
        }
      ],
    }
    
  2. 复制用户提供的凭证( hostportdatabaseusernamepassword )的值。

    您可以将针对 usernamepassword 返回的值指定为 su_usernamesu_password 值。

    更新后的文件如下所示:

    仅适用于 4.8.8、5.1.0 版本以及所有未来版本:

    host: wa_inst-postgres-16-rw
    port: 5432
    database: conversation_pprd_wa_inst
    username: dbadmin
    su_username: dbadmin
    su_password: mypassword
    

    其他版本:

    host: wa_inst-postgres-rw
    port: 5432
    database: conversation_pprd_wa_inst
    username: dbadmin
    su_username: dbadmin
    su_password: mypassword
    
  3. 保存 postgres.yaml 文件。

PostgreSQL 迁移工具详细信息

下表列出了 pgmig 工具支持的自变量:

pgmig 工具自变量
自变量 描述
-h, --help 命令用法
-f, --force 如果目标存储区中有数据,则将其删除
-s, --source string 备份文件名
-r, --resourceController string 资源控制器配置文件名
-t, --target string 目标 PostgreSQL 服务器配置文件名
-m, --mapping string 服务实例映射配置文件名(可选)
--testRCConnection 测试资源控制器的连接,然后退出
--testPGConnection 测试 PostgreSQL 服务器的连接,然后退出
-v, --version 获取构建版本

映射配置文件

运行脚本并在提示时指定映射后,此工具会在当前目录中生成名为 enteredMapping.yaml 的文件。 此文件根据运行脚本期间提供的交互式输入,反映出旧集群详细信息到新集群的映射。

例如,该 YAML 文件包含类似于以下内容的值:

instance-mappings:
  00000000-0000-0000-0000-001570184978: 00000000-0000-0000-0000-001570194490

第一个值( 00000000-0000-0000-0000-001570184978 )是数据库备份中的实例ID,第二个值( 00000000-0000-0000-0000-001570194490 )是系统中服务中已配置实例的ID。

可以将此文件传递到脚本,以便在同一环境中执行脚本的后续运行。 或者,可以对其进行编辑,以用于其他备份和复原操作。 映射文件是可选的。 如果未提供,那么此工具会根据您在 YAML 文件中提供的信息来提示您输入映射详细信息。

重新训练后端模型

根据助手中的模型数,可以使用下列其中一个选项来重新训练后端模型:

手动重新训练后端模型

在训练数据发生更改后打开对话技能时,将自动启动训练。 请等待一些时间,以便技能针对复原的数据进行重新训练。 接受训练通常需要不到 10 分钟的时间。 训练机器学习模型的过程至少需要一个节点,该节点上要有4个CPU,专门用于训练。 因此,请在低流量时间段打开复原的助手和技能,并且一次打开一个。 如果助手或对话技能未响应,请修改工作空间 (例如,添加意向,然后将其除去)。 检查并确认。

自动重新训练后端模型

当要重新训练大量模型时,可以使用自动重新训练所有作业来训练后端模型。 要了解有关自动重新训练所有作业及其实现的更多信息,请参阅以下主题:

准备工作

在开始自动重新训练所有作业之前,必须确保 PostgreSQL 数据库和 Cloud Object Storage (Cloud Object Storage) (用于存储操作和对话技能及其快照) 处于活动状态且未损坏。 此外,必须确保助手在自动重新训练所有作业期间不会接收或发送任何数据。

计划

要对完成自动重新训练所有作业所需的持续时间进行良好估计,可以使用 calculate_autoretrain_all_job_duration.sh 脚本:

仅适用于版本 5.1.0、5.0.3、4.8.8 以及所有未来版本:

请在以下脚本中的 PROJECT_CPD_INST_OPERANDS 键中指定安装助手的命名空间。

#!/bin/bash

calculate_duration() {
 local input_variable="$1"
 DURATION=$(("$NUM_OF_WORKSPACES_TO_TRAIN"*60 / (input_variable * 2) + "$NUM_OF_WORKSPACES_TO_TRAIN" * 2))
}

export PROJECT_CPD_INST_OPERANDS=<namespace where Assistant is installed>

ETCD_ENDPOINTS=$(oc get secret wa-cluruntime-datastore-connection-strings -n ${PROJECT_CPD_INST_OPERANDS} -o jsonpath="{.data.etcd}" | base64 --decode | jq -r '.endpoints')

NUM_OF_WORKSPACES_TO_TRAIN=$(oc exec wa-etcd-0 -n ${PROJECT_CPD_INST_OPERANDS} -- bash -c "
 password=\"\$( cat /var/run/credentials/pass.key)\"
 etcdctl_user=\"root:\$password\"
 export ETCDCTL_USER=\"\$etcdctl_user\"

 ETCDCTL_API=3 etcdctl --cert=/etc/etcdtls/operator/etcd-tls/etcd-client.crt --key=/etc/etcdtls/operator/etcd-tls/etcd-client.key --cacert=/etc/etcdtls/operator/etcd-tls/etcd-client-ca.crt --endpoints=${ETCD_ENDPOINTS} get  --prefix  /bluegoat/voyager-nlu/voyager-nlu-slot-wa/workspaces/ --keys-only | sed '/^$/d' | wc -l")

echo "Number of workspaces to train $NUM_OF_WORKSPACES_TO_TRAIN"

calculate_duration 5
DURATION_5=$DURATION

calculate_duration 10
DURATION_10=$DURATION

calculate_duration 15
DURATION_15=$DURATION

echo "Approximate duration of the auto retrain all job if you have 5 Training pods: $DURATION_5 seconds"
echo "Approximate duration of the auto retrain all job if you have 10 Training pods: $DURATION_10 seconds"
echo "Approximate duration of the auto retrain all job if you have 15 Training pods: $DURATION_15 seconds"

其他版本:

#!/bin/bash
calculate_duration() {
    local input_variable="$1"
    DURATION=$(("$NUM_OF_WORKSPACES_TO_TRAIN"*60 / (input_variable * 2) + "$NUM_OF_WORKSPACES_TO_TRAIN" * 2))
  }

export PROJECT_CPD_INST_OPERANDS=<namespace where Assistant is installed>

NUM_OF_WORKSPACES_TO_TRAIN=$(oc exec wa-etcd-0 -n ${PROJECT_CPD_INST_OPERANDS} -- bash -c '
  password="$( cat /var/run/credentials/pass.key )"
  etcdctl_user="root:$password"
  export ETCDCTL_USER="$etcdctl_user"

  ETCDCTL_API=3 etcdctl --cert=/etc/etcdtls/operator/etcd-tls/etcd-client.crt --key=/etc/etcdtls/operator/etcd-tls/etcd-client.key --cacert=/etc/etcdtls/operator/etcd-tls/etcd-client-ca.crt --endpoints=https://$(hostname).${CLUSTER_NAME}.cpd.svc.cluster.local:2379 get  --prefix  /bluegoat/voyager-nlu/voyager-nlu-slot-wa/workspaces/ --keys-only | sed '/^$/d' | wc -l')

echo "Number of workspaces to train $NUM_OF_WORKSPACES_TO_TRAIN"

calculate_duration 5
DURATION_5=$DURATION

calculate_duration 10
DURATION_10=$DURATION

calculate_duration 15
DURATION_15=$DURATION
echo "Approximate duration of the auto retrain all job if you have 5 Training pods: $DURATION_5 seconds"
echo "Approximate duration of the auto retrain all job if you have 10 Training pods: $DURATION_10 seconds"
echo "Approximate duration of the auto retrain all job if you have 15 Training pods: $DURATION_15 seconds"

此外,您可以在获得持续时间估算后计划加快自动重新训练所有作业的速度。 有关加快自动重新培训-全部作业的更多信息,请参阅 加快自动重新培训-全部作业 主题。

过程

要使用自动重新训练所有作业来重新训练后端模型,请执行以下步骤:

设置自动重新训练所有作业的环境变量

在运行 auto-retrain-all 作业之前,请设置以下环境变量:

  1. AUTO_RETRAIN 环境变量设置为 false 以禁用任何现有自动重新训练作业:

      export AUTO_RETRAIN="false"
    
  2. 要设置 BATCH_RETRAIN_ALL_SIZE 环境变量,请将可用训练副本数 CLU_TRAINING_REPLICAS 乘以 2,前提是每个模型大约采用 ~30 seconds 来训练模型。 使用以下命令设置 BATCH_RETRAIN_ALL_SIZE

      export BATCH_RETRAIN_ALL_SIZE=$(($(oc get deploy ${INSTANCE}-clu-training --template='{{index .spec.replicas}}') * 2))
    
  3. WAIT_TIME_BETWEEN_BATCH_RETRAIN_IN_SECONDS_FOR_RETRAIN_ALL 设置为 (60-${BATCH_RETRAIN_ALL_SIZE}):

      export WAIT_TIME_BETWEEN_BATCH_RETRAIN_IN_SECONDS_FOR_RETRAIN_ALL=$((60-${BATCH_RETRAIN_ALL_SIZE}))
    
  4. WAIT_TIME_BETWEEN_TRAININGS_FOR_RETRAIN_ALL 设置为1:

      export WAIT_TIME_BETWEEN_TRAININGS_FOR_RETRAIN_ALL=1
    
  5. AUTO_RETRAIN_ALL_CRON_SCHEDULE 设置为要运行自动重新训练所有作业的时间:

      export AUTO_RETRAIN_ALL_CRON_SCHEDULE=<value of cron schedule>
    

    例如,可以提供以下格式的值,例如 "0 40 19 11 3 ? 2024":

    (Seconds) (Minutes) (Hours) (Day of Month) (Month) (Day of Week) (Year)

    必须设置 UTC 时区的时间。

  6. AUTO_RETRAIN_ALL_ENABLED 设置为true:

      export AUTO_RETRAIN_ALL_ENABLED="true"
    
运行自动重新训练所有作业
  1. 要运行 auto-retrain-all 作业,请使用以下命令:

        export PROJECT_CPD_INST_OPERANDS=<namespace where Assistant is installed>
        export INSTANCE=`oc get wa -n ${PROJECT_CPD_INST_OPERANDS} |grep -v NAME| awk '{print $1}'`
    
        cat <<EOF | oc apply -f -
        apiVersion: assistant.watson.ibm.com/v1
        kind: TemporaryPatch
        metadata:
          name: ${INSTANCE}-store-admin-env-vars
          namespace: ${PROJECT_CPD_INST_OPERANDS}
        spec:
          apiVersion: assistant.watson.ibm.com/v1
          kind: WatsonAssistantStore
          name: ${INSTANCE}
          patchType: patchStrategicMerge
          patch:
            store-admin:
              deployment:
                spec:
                  template:
                    spec:
                      containers:
                      - name: store-admin
                        env:
                        - name: AUTO_RETRAIN
                          value: "${AUTO_RETRAIN}"
                        - name: AUTO_RETRAIN_ALL_CRON_SCHEDULE
                          value: "${AUTO_RETRAIN_ALL_CRON_SCHEDULE}"
                        - name: AUTO_RETRAIN_ALL_ENABLED
                          value: "${AUTO_RETRAIN_ALL_ENABLED}"
                        - name: BATCH_RETRAIN_ALL_SIZE
                          value: "${BATCH_RETRAIN_ALL_SIZE}"
                        - name: WAIT_TIME_BETWEEN_BATCH_RETRAIN_IN_SECONDS_FOR_RETRAIN_ALL
                          value: "${WAIT_TIME_BETWEEN_BATCH_RETRAIN_IN_SECONDS_FOR_RETRAIN_ALL}"
                        - name: WAIT_TIME_BETWEEN_TRAININGS_FOR_RETRAIN_ALL
                          value: "${WAIT_TIME_BETWEEN_TRAININGS_FOR_RETRAIN_ALL}"
        EOF
    

仅适用于版本 5.1.0、5.0.3、4.8.8 以及所有未来版本:

  1. 运行以下命令获取 etcd 端点:

    oc get secret wa-cluruntime-datastore-connection-strings -o jsonpath="{.data.etcd}" | base64 --decode | jq -r '.endpoints
    
  2. 完成 auto-retrain-all 作业后,必须使用以下命令禁用 auto-retrain-all 标志并启用 auto-retrain 标志:

       oc patch temporarypatch ${INSTANCE}-store-admin-env-vars -p '{"metadata":{"finalizers":[]}}' --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
       oc delete temporarypatch ${INSTANCE}-store-admin-env-vars -n ${PROJECT_CPD_INST_OPERANDS}
       oc patch watsonassistantstore/${INSTANCE} -p "{\"metadata\":{\"annotations\":{\"oppy.ibm.com/temporary-patches\":null}}}" --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
    
验证自动重新训练所有作业

您可以通过将 Affected workspaces found 的数量与 store-admin 服务日志中的 Retrained Total 计数进行比较来验证自动重新训练全部作业是否成功完成。 要获取 Affected workspaces foundRetrained Total 的编号,请运行以下命令:

oc logs $(oc get pod -l component=store-admin --no-headers -n ${PROJECT_CPD_INST_OPERANDS}  |awk '{print $1}') | grep "\[RETRAIN-ALL-SUMMARY\] Affected workspaces found"

如果自动重新训练所有作业成功,那么 Retrained Total 计数等于 Affected workspaces found 的数目。 此外,如果 Retrained TotalAffected workspaces found 的计数之间的差异较小,那么自动重新训练所有作业将通过在后台训练其余模型来成功完成。 但是,如果 Retrained TotalAffected workspaces found 之间存在很大差异,那么必须查看 store-admin 日志以分析问题,并考虑 加速自动重新训练所有作业

加速自动重新训练-所有作业

完成自动重新训练所有作业的持续时间取决于要训练的模型数。 因此,要加快训练过程,必须 scale CLU_TRAINING_REPLICAS 的数量及其依赖关系。 例如,如果 scale CLU_TRAINING_REPLICAS 的数量为 x,那么必须 scale 按以下计算的从属副本数量:

  • TFMM_REPLICAS 到 0.5x
  • DRAGONFLY_CLU_MM_REPLICAS 到 0.3x
  • CLU_EMBEDDING_REPLICAS 到 0.2x
  • CLU_TRITON_SERVING_REPLICAS 到 0.2x。

如果模型数的计算结果是十进制数,那么必须将结果向上舍入到下一个更大的整数。 例如,如果 TFMM_REPLICAS 的数目为 2.4,那么将该值向上循环到 3。

使用以下步骤来 scale 模型数:

  1. 按计算注册副本数的值:

      export CLU_TRAINING_REPLICAS=<value from calculation>
      export TFMM_REPLICAS=<value from calculation>
      export DRAGONFLY_CLU_MM_REPLICAS=<value from calculation>
      export CLU_EMBEDDING_REPLICAS=<value from calculation>
      export CLU_TRITON_SERVING_REPLICAS=<value from calculation>
    
  2. 使用以下命令增加 REPLICAS 的数量:

      export PROJECT_CPD_INST_OPERANDS=<namespace where Assistant is installed>
      export INSTANCE=`oc get wa -n ${PROJECT_CPD_INST_OPERANDS} |grep -v NAME| awk '{print $1}'`
    
      cat <<EOF | oc apply -f -
      apiVersion: assistant.watson.ibm.com/v1
      kind: TemporaryPatch
      metadata:
        name: ${INSTANCE}-clu-training-replicas
        namespace: ${PROJECT_CPD_INST_OPERANDS}
      spec:
        apiVersion: assistant.watson.ibm.com/v1
        kind: WatsonAssistantCluTraining
        name: $INSTANCE
        patchType: patchStrategicMerge
        patch:
          clu-training:
            deployment:
              training:
                spec:
                  replicas: ${CLU_TRAINING_REPLICAS}
      EOF
    
      cat <<EOF | oc apply -f -
      apiVersion: assistant.watson.ibm.com/v1
      kind: TemporaryPatch
      metadata:
        name: ${INSTANCE}-clu-runtime-replicas
        namespace: ${PROJECT_CPD_INST_OPERANDS}
      spec:
        apiVersion: assistant.watson.ibm.com/v1
        kind: WatsonAssistantCluRuntime
        name: ${INSTANCE}
        patchType: patchStrategicMerge
        patch:
          tfmm:
            deployment:
              spec:
                replicas: ${TFMM_REPLICAS}
          dragonfly-clu-mm:
            deployment:
              spec:
                replicas: ${DRAGONFLY_CLU_MM_REPLICAS}
      EOF
    
      cat <<EOF | oc apply -f -
      apiVersion: assistant.watson.ibm.com/v1
      kind: TemporaryPatch
      metadata:
        name: ${INSTANCE}-clu-replicas
        namespace: ${PROJECT_CPD_INST_OPERANDS}
      spec:
        apiVersion: assistant.watson.ibm.com/v1
        kind: WatsonAssistantClu
        name: ${INSTANCE}
        patchType: patchStrategicMerge
        patch:
          clu-embedding:
            deployment:
              spec:
                replicas: ${CLU_EMBEDDING_REPLICAS}
          clu-triton-serving:
            deployment:
              spec:
                replicas: ${CLU_TRITON_SERVING_REPLICAS}
      EOF
    
  3. 完成自动重新训练所有作业后,必须将 REPLICAS 的编号还原为原始编号:

     oc patch temporarypatch ${INSTANCE}-clu-training-replicas -p '{"metadata":{"finalizers":[]}}' --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
     oc patch temporarypatch ${INSTANCE}-clu-runtime-replicas -p '{"metadata":{"finalizers":[]}}' --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
     oc patch temporarypatch ${INSTANCE}-clu-replicas -p '{"metadata":{"finalizers":[]}}' --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
    
     oc delete temporarypatch ${INSTANCE}-clu-training-replicas -n ${PROJECT_CPD_INST_OPERANDS}
     oc delete temporarypatch ${INSTANCE}-clu-runtime-replicas -n ${PROJECT_CPD_INST_OPERANDS}
     oc delete temporarypatch ${INSTANCE}-clu-replicas -n ${PROJECT_CPD_INST_OPERANDS}
    
     oc patch watsonassistantclutraining/${INSTANCE} -p "{\"metadata\":{\"annotations\":{\"oppy.ibm.com/temporary-patches\":null}}}" --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
     oc patch watsonassistantcluruntime/${INSTANCE} -p "{\"metadata\":{\"annotations\":{\"oppy.ibm.com/temporary-patches\":null}}}" --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
     oc patch watsonassistantclu/${INSTANCE} -p "{\"metadata\":{\"annotations\":{\"oppy.ibm.com/temporary-patches\":null}}}" --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
     oc patch watsonassistantclutraining/${INSTANCE} -p "{\"metadata\":{\"annotations\":{\"oper8.org/temporary-patches\":null}}}" --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
     oc patch watsonassistantcluruntime/${INSTANCE} -p "{\"metadata\":{\"annotations\":{\"oper8.org/temporary-patches\":null}}}" --type=merge -n ${PROJECT_CPD_INST_OPERANDS}
     oc patch watsonassistantclu/${INSTANCE} -p "{\"metadata\":{\"annotations\":{\"oper8.org/temporary-patches\":null}}}" --type=merge -n ${PROJECT_CPD_INST_OPERANDS}