Google云sql从第一代迁移到第二代,停机时间极短,无停机

时间:2016-12-15 14:22:30

标签: mysql google-app-engine google-cloud-platform google-cloud-sql

有没有办法从第一代云sql迁移到第二代,只需要很少甚至没有停机时间?

将我的第一代数据库转储大约30分钟后,我将其设置为只读(意味着我的停机时间),我相信导入第二代也需要很长时间。

在升级过程中使用克隆以及升级完成时将差异复制到新数据库会怎么样?

我正在使用AppEngine,因此我正在考虑上传指向第二代数据库的新版本,而旧版本指向克隆。 升级完成后,我将更改版本并运行脚本以复制丢失的数据。

这可行吗?有更好的选择吗?

1 个答案:

答案 0 :(得分:0)

我最终做了以下事情:

  1. 创建第二代实例
  2. 在计算引擎中创建临时计算机
  3. Ssh到临时机器并获取机器的IP:https://askubuntu.com/questions/95910/command-for-determining-my-public-ip
  4. 允许访问新旧数据库实例上的IP地址
  5. 在第一代实例中设置用户和密码(在下面的脚本中输入)
  6. 上传配置为使用新的第二代数据库的新版app引擎应用,但不要将其设置为默认版本
  7. 编辑&在ssh
  8. 中的临时机器中运行下面的脚本
  9. 脚本将要求确认只读标志
  10. 在脚本运行时,数据库将处于READ ONLY模式,导致应用程序停机
  11. 脚本成功完成后,将应用引擎的默认版本更改为指向使用新的第二代数据库的新版本
  12. 这给了我们15分钟的停机时间
  13. 这是脚本:

    #!/bin/sh
    
    DB_IP=127.0.0.1
    SQL_FILE_NAME=db-backup.sql
    GZ_SQL_FILE_NAME=db-backup.sql.gz
    BUCKET_NAME=gs://db-bucket-name
    GS_FILE_PTH=$BUCKET_NAME/$GZ_SQL_FILE_NAME
    INSTANCE_NAME=1st-gen-instance
    NEW_INSTANCE_NAME=2nd-gen-instace
    
    gcloud config set project project-name
    gcloud sql instances patch $INSTANCE_NAME --database-flags read_only=on
    mysqldump --databases dbname -h $DB_IP -u user --password=password \
    --hex-blob --skip-triggers --set-gtid-purged=OFF \
    --default-character-set=utf8 > $SQL_FILE_NAME
    gzip $SQL_FILE_NAME
    gsutil cp -r $GZ_SQL_FILE_NAME $GS_FILE_PTH
    SERVICE_ACCOUNT_ADDRESS=$(gcloud sql instances describe $NEW_INSTANCE_NAME | sed -n -e 's/^.*serviceAccountEmailAddress: //p')
    gsutil acl ch -u $SERVICE_ACCOUNT_ADDRESS:W $BUCKET_NAME
    gsutil acl ch -u $SERVICE_ACCOUNT_ADDRESS:R $GS_FILE_PTH
    gcloud sql instances import $NEW_INSTANCE_NAME $GS_FILE_PTH
    gsutil acl ch -d $SERVICE_ACCOUNT_ADDRESS:W $BUCKET_NAME
    gsutil acl ch -d $SERVICE_ACCOUNT_ADDRESS:R $GS_FILE_PTH