仅在需要时如何运行Google Cloud SQL



Google Cloud SQL广告说,最小的机器类型每小时只有0.0150美元,而且我每小时都会收取每小时的费用,而不仅仅是我连接的数小时。这是因为我在使用游泳池吗?我如何设置后端,以便仅在需要时查询云DB,以免一天中的每个小时都收费?

const mysql      = require('mysql');
const pool = mysql.createPool({
    host : process.env.SQL_IP,
    user     : 'root',
    password : process.env.SQL_PASS,
    database : 'mydb',
    ssl      : {
          [redacted]
    }
});
function query(queryStatement, cB){
  pool.getConnection(function(err, connection) {
    // Use the connection
    connection.query(queryStatement, function (error, results, fields) {
      // And done with the connection.
      connection.destroy();
      // Callback
      cB(error,results,fields);
    });
  });
}

这与池有关,而是关于云SQL的性质。与应用引擎不同,云SQL实例始终 UP。一个星期六早上,当我离开项目一个星期时,我知道了这一点。:(

除非您明确停止服务,否则无法在不使用它们时旋转它们。

至少在GCP SDK内,无法进行服务停止。您可以一直写一个cron作业或类似的作业,例如在当地时间下午6点在M-F上运行一个小gcloud sql instances patch [INSTANCE_NAME] --activation-policy NEVER命令。我太懒了,无法做到这一点,所以我只是为自己设置了一个日历提醒,以便在工作日结束时关闭我的实例。

这是当前SDK文档的MySQL实例启动/停止/重新启动页面:https://cloud.google.com/sql/docs/mysql/start-stop-restart-instance

在附加说明上,根据流量,GCP平台中还有一个正在进行的"功能请求",可以启动/停止云SQL(第二代(。您也可以访问链接并在那里提供宝贵的建议/评论。

我从@ingernet中获取了这个想法,并创建了一个云函数,该功能在需要时启动/停止CloudSQL实例。它可以通过计划的作业触发,以便您可以定义实例上升或向下的何时。

细节在此GitHub Gist中(从这里摘录(。免责声明:我不是Python开发人员,因此代码中可能存在问题,但最终起作用。


基本上您需要按照以下步骤:

  1. 创建一个将用于触发云功能的酒吧/子主题。
  2. 创建云功能并在下面的代码中复制。
    1. 确保在第8行中设置正确的项目ID。
    2. 将触发器设置为pub/sub,然后选择步骤1中创建的主题。
  3. 创建一个云调度程序作业,以定期触发云功能。
    1. 希望触发云功能时选择频率。
    2. 将目标设置为pub/sub并定义步骤1中创建的主题。
    3. 应将有效载荷设置为start [CloudSQL instance name]stop [CloudSQL instance name]以启动或停止指定的实例(例如start my_cloudsql_instance将使用名称my_cloudsql_instance启动CloudSQL实例(

main.py:

from googleapiclient import discovery
from oauth2client.client import GoogleCredentials
import base64
from pprint import pprint
credentials = GoogleCredentials.get_application_default()
service = discovery.build('sqladmin', 'v1beta4', credentials=credentials, cache_discovery=False)
project = 'INSERT PROJECT_ID HERE'
def start_stop(event, context):
  print(event)
  pubsub_message = base64.b64decode(event['data']).decode('utf-8')
  print(pubsub_message)
  command, instance_name = pubsub_message.split(' ', 1)
  if command == 'start':
    start(instance_name)
  elif command == 'stop':
    stop(instance_name)
  else:
    print("unknown command " + command)
def start(instance_name):
  print("starting " + instance_name)
  patch(instance_name, "ALWAYS")
def stop(instance_name):
  print("stopping " + instance_name)
  patch(instance_name, "NEVER")
def patch(instance, activation_policy):
  request = service.instances().get(project=project, instance=instance)
  response = request.execute()
  dbinstancebody = {
    "settings": {
      "settingsVersion": response["settings"]["settingsVersion"],
      "activationPolicy": activation_policy
    }
  }
  request = service.instances().patch(
    project=project,
    instance=instance,
    body=dbinstancebody)
  response = request.execute()
  pprint(response)

需求.txt

google-api-python-client==1.10.0
google-auth-httplib2==0.0.4
google-auth==1.19.2
oauth2client==4.1.3

相关内容

  • 没有找到相关文章

最新更新