创建和管理实例

本页面介绍了如何创建、列出、修改和删除 Cloud Spanner 实例

创建实例

您可以使用 gcloud 命令行工具或 Google Cloud Console 创建实例。

控制台

  1. 转到 Cloud Console 中的创建实例页面。

    创建实例

  2. 输入以下值:

    • 要在 Cloud Console 中显示的实例名称。此实例名称在您的 Google Cloud 项目中必须是唯一的。
    • 用于永久标识实例的实例 ID。此实例 ID 在您的 Google Cloud 项目中也必须是唯一的。实例 ID 创建后便无法更改。
    • 配置,该配置定义了实例的地理位置,并且会影响数据的复制方式。详细了解实例配置
    • 实例的计算容量大小。计算容量决定了实例中数据库可用的服务和存储资源的数量。如需指定计算容量,您可以选择度量单位(处理单元或节点),然后输入数量。使用处理单元时,以 100 的倍数(100、200、300 等)输入最多 1000 的数量,并以 1000 的倍数(1000、2000、3000 等)输入更大的数量。每个节点等于 1000 个处理单元。详细了解处理单元和节点
  3. 点击创建以创建实例。

gcloud

使用 gcloud spanner instances create 命令。使用此命令时,请以节点数或处理单元数的形式指定计算容量

gcloud spanner instances create [INSTANCE-ID] --config=[INSTANCE-CONFIG] \
    --description="[INSTANCE-NAME]" --nodes=[NODE-COUNT]

gcloud spanner instances create [INSTANCE-ID] --config=[INSTANCE-CONFIG] \
    --description="[INSTANCE-NAME]" --processing-units=[PROCESSING-UNIT-COUNT]

请提供以下值:

  • [INSTANCE-ID]:在您的 Google Cloud 项目中唯一的永久性标识符。实例 ID 创建后便无法更改。
  • [INSTANCE-CONFIG]:实例配置,该配置定义了实例的地理位置,并且会影响数据的复制方式。详细了解实例配置
  • [INSTANCE-NAME]:要在 Cloud Console 中显示的实例名称。此实例名称在您的 Google Cloud 项目中必须是唯一的。
  • [NODE-COUNT]:实例的计算容量,以节点数表示。每个节点等于 1000 个处理单元。
  • [PROCESSING-UNIT-COUNT]:实例的计算容量,以处理单元数表示。以 100 的倍数(100、200、300 等)输入最多 1000 的数量,并以 1000 的倍数(1000、2000、3000 等)输入更大的数量。

例如:

gcloud spanner instances create test-instance --config=regional-us-central1 \
    --description="Test Instance" --nodes=1

您应该会看到类似于以下示例的消息:

Creating instance...done.

C++

如需了解如何安装和使用 Cloud Spanner 客户端库,请参阅 Cloud Spanner 客户端库

void CreateInstance(google::cloud::spanner_admin::InstanceAdminClient client,
                    std::string const& project_id,
                    std::string const& instance_id,
                    std::string const& display_name,
                    std::string const& config) {
  namespace spanner = ::google::cloud::spanner;
  spanner::Instance in(project_id, instance_id);

  std::string instance_config =
      "projects/" + project_id + "/instanceConfigs/" + config;
  auto instance =
      client
          .CreateInstance(
              spanner::CreateInstanceRequestBuilder(in, instance_config)
                  .SetDisplayName(display_name)
                  .SetNodeCount(1)
                  .SetLabels({{"cloud_spanner_samples", "true"}})
                  .Build())
          .get();
  if (!instance) throw std::runtime_error(instance.status().message());
  std::cout << "Created instance [" << in << "]:\n" << instance->DebugString();
}

Go

如需了解如何安装和使用 Cloud Spanner 客户端库,请参阅 Cloud Spanner 客户端库

import (
	"context"
	"fmt"
	"io"

	instance "cloud.google.com/go/spanner/admin/instance/apiv1"
	instancepb "google.golang.org/genproto/googleapis/spanner/admin/instance/v1"
)

func createInstance(w io.Writer, projectID, instanceID string) error {
	// projectID := "my-project-id"
	// instanceID := "my-instance"
	ctx := context.Background()
	instanceAdmin, err := instance.NewInstanceAdminClient(ctx)
	if err != nil {
		return err
	}
	defer instanceAdmin.Close()

	op, err := instanceAdmin.CreateInstance(ctx, &instancepb.CreateInstanceRequest{
		Parent:     fmt.Sprintf("projects/%s", projectID),
		InstanceId: instanceID,
		Instance: &instancepb.Instance{
			Config:      fmt.Sprintf("projects/%s/instanceConfigs/%s", projectID, "regional-us-central1"),
			DisplayName: instanceID,
			NodeCount:   1,
			Labels:      map[string]string{"cloud_spanner_samples": "true"},
		},
	})
	if err != nil {
		return fmt.Errorf("could not create instance %s: %v", fmt.Sprintf("projects/%s/instances/%s", projectID, instanceID), err)
	}
	// Wait for the instance creation to finish.
	i, err := op.Wait(ctx)
	if err != nil {
		return fmt.Errorf("waiting for instance creation to finish failed: %v", err)
	}
	// The instance may not be ready to serve yet.
	if i.State != instancepb.Instance_READY {
		fmt.Fprintf(w, "instance state is not READY yet. Got state %v\n", i.State)
	}
	fmt.Fprintf(w, "Created instance [%s]\n", instanceID)
	return nil
}

Java

如需了解如何安装和使用 Cloud Spanner 客户端库,请参阅 Cloud Spanner 客户端库

import com.google.api.gax.longrunning.OperationFuture;
import com.google.cloud.spanner.Instance;
import com.google.cloud.spanner.InstanceAdminClient;
import com.google.cloud.spanner.InstanceConfigId;
import com.google.cloud.spanner.InstanceId;
import com.google.cloud.spanner.InstanceInfo;
import com.google.cloud.spanner.Spanner;
import com.google.cloud.spanner.SpannerOptions;
import com.google.spanner.admin.instance.v1.CreateInstanceMetadata;
import java.util.concurrent.ExecutionException;

class CreateInstanceExample {

  static void createInstance() {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "my-project";
    String instanceId = "my-instance";
    createInstance(projectId, instanceId);
  }

  static void createInstance(String projectId, String instanceId) {
    Spanner spanner = SpannerOptions.newBuilder().setProjectId(projectId).build().getService();
    InstanceAdminClient instanceAdminClient = spanner.getInstanceAdminClient();

    // Set Instance configuration.
    String configId = "regional-us-central1";
    int nodeCount = 2;
    String displayName = "Descriptive name";

    // Create an InstanceInfo object that will be used to create the instance.
    InstanceInfo instanceInfo =
        InstanceInfo.newBuilder(InstanceId.of(projectId, instanceId))
            .setInstanceConfigId(InstanceConfigId.of(projectId, configId))
            .setNodeCount(nodeCount)
            .setDisplayName(displayName)
            .build();
    OperationFuture<Instance, CreateInstanceMetadata> operation =
        instanceAdminClient.createInstance(instanceInfo);
    try {
      // Wait for the createInstance operation to finish.
      Instance instance = operation.get();
      System.out.printf("Instance %s was successfully created%n", instance.getId());
    } catch (ExecutionException e) {
      System.out.printf(
          "Error: Creating instance %s failed with error message %s%n",
          instanceInfo.getId(), e.getMessage());
    } catch (InterruptedException e) {
      System.out.println("Error: Waiting for createInstance operation to finish was interrupted");
    } finally {
      spanner.close();
    }
  }
}

Node.js

如需了解如何安装和使用 Cloud Spanner 客户端库,请参阅 Cloud Spanner 客户端库

// Imports the Google Cloud client library
const {Spanner} = require('@google-cloud/spanner');

/**
 * TODO(developer): Uncomment the following lines before running the sample.
 */
// const projectId = 'my-project-id';
// const instanceId = 'my-instance';

// Creates a client
const spanner = new Spanner({
  projectId: projectId,
});

const instance = spanner.instance(instanceId);

// Creates a new instance
try {
  console.log(`Creating instance ${instance.formattedName_}.`);
  const [, operation] = await instance.create({
    config: 'regional-us-central1',
    nodes: 1,
    displayName: 'This is a display name.',
    labels: {
      ['cloud_spanner_samples']: 'true',
      created: Math.round(Date.now() / 1000).toString(), // current time
    },
  });

  console.log(`Waiting for operation on ${instance.id} to complete...`);
  await operation.promise();

  console.log(`Created instance ${instanceId}.`);
} catch (err) {
  console.error('ERROR:', err);
}

PHP

如需了解如何安装和使用 Cloud Spanner 客户端库,请参阅 Cloud Spanner 客户端库

use Google\Cloud\Spanner\SpannerClient;

/**
 * Creates an instance.
 * Example:
 * ```
 * create_instance($instanceId);
 * ```
 *
 * @param string $instanceId The Spanner instance ID.
 */
function create_instance($instanceId)
{
    $spanner = new SpannerClient();
    $instanceConfig = $spanner->instanceConfiguration(
        'regional-us-central1'
    );
    $operation = $spanner->createInstance(
        $instanceConfig,
        $instanceId,
        [
            'displayName' => 'This is a display name.',
            'nodeCount' => 1,
            'labels' => [
                'cloud_spanner_samples' => true,
            ]
        ]
    );

    print('Waiting for operation to complete...' . PHP_EOL);
    $operation->pollUntilComplete();

    printf('Created instance %s' . PHP_EOL, $instanceId);
}

Python

如需了解如何安装和使用 Cloud Spanner 客户端库,请参阅 Cloud Spanner 客户端库

def create_instance(instance_id):
    """Creates an instance."""
    spanner_client = spanner.Client()

    config_name = "{}/instanceConfigs/regional-us-central1".format(
        spanner_client.project_name
    )

    instance = spanner_client.instance(
        instance_id,
        configuration_name=config_name,
        display_name="This is a display name.",
        node_count=1,
        labels={
            "cloud_spanner_samples": "true",
            "sample_name": "snippets-create_instance-explicit",
            "created": str(int(time.time()))
        }
    )

    operation = instance.create()

    print("Waiting for operation to complete...")
    operation.result(OPERATION_TIMEOUT_SECONDS)

    print("Created instance {}".format(instance_id))

Ruby

如需了解如何安装和使用 Cloud Spanner 客户端库,请参阅 Cloud Spanner 客户端库

# project_id  = "Your Google Cloud project ID"
# instance_id = "Your Spanner instance ID"

require "google/cloud/spanner"

spanner  = Google::Cloud::Spanner.new project: project_id
instance = spanner.instance instance_id

job = spanner.create_instance instance_id,
                              name:   instance_id,
                              config: "regional-us-central1",
                              nodes:  2,
                              labels: { cloud_spanner_samples: true }

puts "Waiting for create instance operation to complete"

job.wait_until_done!

if job.error?
  puts job.error
else
  puts "Created instance #{instance_id}"
end

列出实例

控制台

转到 Cloud Console 中的 Spanner 实例页面。

转到“实例”页面

Cloud Console 会显示您的 Cloud Spanner 实例列表,以及每个实例的 ID、显示名、配置、以处理单元数和节点数表示的计算容量

gcloud

使用 gcloud spanner instances list 命令:

gcloud spanner instances list

gcloud 工具会输出 Cloud Spanner 实例的列表,以及每个实例的 ID、显示名、配置和计算容量。

修改实例

以下部分介绍了如何更改实例的显示名和计算容量。您无法更改实例 ID 或实例配置。

更改显示名称

控制台

  1. 转到 Cloud Console 中的 Spanner 实例页面。

    转到“实例”页面

  2. 点击您要重命名的实例的名称。

  3. 点击修改实例

  4. 输入新的实例名称。此名称在 Google Cloud 项目中必须是唯一的。

  5. 点击保存

gcloud

使用 gcloud spanner instances update 命令:

gcloud spanner instances update [INSTANCE-ID] --description=[INSTANCE-NAME]

请提供以下值:

  • [INSTANCE-ID]:实例的永久性标识符。
  • [INSTANCE-NAME]:要在 Cloud Console 中显示的实例名称。此实例名称在您的 Google Cloud 项目中必须是唯一的。

更改计算容量

您必须供应足够的计算容量,以将 CPU 利用率存储空间利用率保持在建议的最大值以下。如需了解详情,请参阅 Cloud Spanner 的配额和限制

在以下情况下,您无法减少现有实例的计算容量:

  • 移除计算容量需要您的实例的每个节点(1000 个处理单元)存储超过 2 TB 的数据。
  • 根据您的历史使用模式,Cloud Spanner 为您的实例数据创建了大量拆分,并且在移除计算容量后,Cloud Spanner 将无法管理拆分。

移除计算容量时,请在 Cloud Monitoring 中监控 CPU 利用率和请求延迟时间,以确保单区域实例的 CPU 利用率保持在 65% 以下,多区域实例中每个区域的 CPU 利用率保持在 45% 以下。移除计算容量时,您可能会遇到请求延迟暂时增加的情况。

如果想要增加实例的计算容量,您的 Google Cloud 项目必须具有足够的配额才能添加计算容量。

控制台

  1. 转到 Cloud Console 中的 Spanner 实例页面。

    转到“实例”页面

  2. 点击要更改的实例名称。

  3. 点击修改实例

  4. 选择度量单位(处理单元或节点),然后输入数量,以更改计算容量。使用处理单元时,以 100 的倍数(100、200、300 等)输入最多 1000 的数量,并以 1000 的倍数(1000、2000、3000 等)输入更大的数量。每个节点等于 1000 个处理单元。

  5. 点击保存

    如果系统对话框提示此位置没有足够的配额来添加计算容量,请按照说明请求更高配额。

gcloud

使用 gcloud spanner instances update 命令。使用此命令时,请以节点数或处理单元数的形式指定计算容量

gcloud spanner instances update [INSTANCE-ID] --nodes=[NODE-COUNT]

gcloud spanner instances update [INSTANCE-ID] --processing-units=[PROCESSING-UNIT-COUNT]

请提供以下值:

  • [INSTANCE-ID]:实例的永久性标识符。
  • [NODE-COUNT]:实例的计算容量,以节点数表示。每个节点等于 1000 个处理单元。
  • [PROCESSING-UNIT-COUNT]:实例的计算容量,以处理单元数表示。以 100 的倍数(100、200、300 等)输入最多 1000 的数量,并以 1000 的倍数(1000、2000、3000 等)输入更大的数量。

为实例添加标签

标签可帮助您整理资源。

控制台

  1. 转到 Cloud Console 中的 Spanner 实例页面。

    转到“实例”页面

  2. 选中实例对应的复选框。 页面右侧将显示信息面板

  3. 点击信息面板中的标签标签页。然后,您可以添加、删除或更新 Cloud Spanner 实例的标签。

删除实例

控制台

  1. 转到 Cloud Console 中的 Spanner 实例页面。

    转到“实例”页面

  2. 点击要删除的实例名称。

  3. 点击删除实例

  4. 按照说明进行操作,确认您要删除实例。

  5. 点击删除

gcloud

使用 gcloud spanner instances delete 命令,并将 [INSTANCE-ID] 替换为实例 ID:

gcloud spanner instances delete [INSTANCE-ID]

后续步骤