处理 gcloud sql 实例创建过程中的超时问题。

5
我正在使用gcloud sql instances create创建CloudSQL实例。很多时候,该命令会超时,但会提供一个等待数据库创建完成的命令。
$ gcloud sql instances create mydb
Creating Cloud SQL instance...failed.
ERROR: (gcloud.sql.instances.create) Operation https://www.googleapis.com/sql/v1beta4/projects/foobar/operations/abcd is taking longer than expected. 
You can continue waiting for the operation by running `gcloud sql operations wait --project foobar abcd`
$ gcloud sql operations wait --project foobar abcd
Waiting for [https://www.googleapis.com/sql/v1beta4/projects/foobar/operations/abcd]...done.
NAME  TYPE    START                          END                            ERROR  STATUS
abcd  CREATE  2018-03-19T15:04:29.477+00:00  2018-03-19T15:10:08.561+00:00  -      DONE

我想知道是否可以配置 gcloud sql instances create 的超时时间?我在 文档 中找不到任何信息,甚至默认超时时间也没有。
另一个选项是异步启动实例创建,列出待处理操作并等待其完成:
$ gcloud sql instances create mydb --async
$ PENDING_OPERATIONS=$(gcloud sql operations list --instance=mydb --filter='status!=DONE' --format='value(name)')
$ gcloud sql operations wait "${PENDING_OPERATIONS}"

但是,gcloud sql operations wait 会在某个时刻超时吗?文档中也没有提到任何超时。


我已经查看了文档,也没有找到超时设置。请注意,超时不会影响操作是否成功执行。 我还很好奇为什么您的操作会超时,gcloud sql instances create 是一个非常简单的操作,不应该需要太长时间来完成。 - Patrick W
你是从哪里运行这个命令的?你可以尝试从云shell或另一个系统运行相同的命令吗? - Patrick W
@PatrickW 昨天我创建了4个实例,但超时了3次。我是从德国的工作站运行命令,在欧洲西部地区创建实例。我还没有尝试从Cloud shell运行它,因为“创建实例”命令只是脚本的一部分,而超时并不是一个大问题。 - otto.poellath
1
我刚刚遇到了这个错误,然后发出了“等待”命令。它再次超时并提示我再次发出“等待”命令。也许这不是抱怨的正确场所,但是WTF?这最多只能算业余水平。成功时请保持安静,失败时请大声喊出...不要发布一个说“ERROR”的消息,而操作甚至还没有完成!这纯粹是谷歌疯狂的表现。 - William Pursell
2个回答

1

1

我认为它超时是因为我在最小的可用机器上创建了MySQL实例:db-f1-micro,这对我的开发平台来说已经足够了。

我尝试了几个选项来捕获命令输出并运行建议的命令,但找不到方法来获取它。就好像输出被打印在stderr或stdout之外的其他地方。

我尝试了以下方法:

MyVAR=$($COMMAND)
$COMMAND | tee command.log
$COMMAND 2>&1 > command.log

如果我们能够捕获命令的输出,那么下面的脚本就可以正常工作了。
gcloud sql instances create ${MYSQL_INSTANCE}    \
        --assign-ip                              \
        ${BACKUP}                                \
        ${BACKUP_START_TIME}                     \
        ${BACKUP_ENABLE_BIN_LOG}                 \
        --database-flags=${MYSQL_FLAGS}          \
        --database-version=${MYSQL_DB_VERSION}   \
        --gce-zone=${MYSQL_ZONE}                 \
        --maintenance-release-channel=production \
        --maintenance-window-day=MON             \
        --maintenance-window-hour=4              \
        --pricing-plan=PER_USE                   \
        --storage-auto-increase                  \
        --storage-size=${MYSQL_STORAGE}          \
        --storage-type=${MYSQL_STORAGE_TYPE}     \
        --tier=${MYSQL_TIER}                     \
        --format=json                            | tee logs/${COUNTRY}-${ENV}.log

GCLOUD_CREATE_INSTANCE_RETURN_CODE=$?

if [ ${GCLOUD_CREATE_INSTANCE_RETURN_CODE} -eq 0 ]
then
  echo "Successfully created DB"
else
  echo "Error returned while creating the DB"

  TIMEOUT_ERROR=$(cat logs/${COUNTRY}-${ENV}.log | tail -1 | grep "gcloud beta sql operations wait" | wc -l)

  if [ "${TIMEOUT_ERROR}" = "1" ]
  then
    echo "It's a timeout error, continue waiting"
    FOLLOW_UP_COMMAND=$(cat logs/${COUNTRY}-${ENV}.log | tail -1 |cut -d '`' -f2)
    ${FOLLOW_UP_COMMAND}
  else
    echo "It's NOT a timeout error"
    echo "return code : ${GCLOUD_CREATE_INSTANCE_RETURN_CODE}"
    echo  ${GCLOUD_CREATE_INSTANCE_OUTPUT}
    exit 1
  fi
fi

gcloud sql users set-password root --instance=${MYSQL_INSTANCE} --password=${MYSQL_ROOT} --host "%"

最终,我在创建实例命令后加了一个大的休眠时间,以便我可以设置root密码。

对于db-f1-micro,它需要额外2分53秒才能完成创建。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接