创建和管理实例

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

创建实例

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

控制台

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

    创建实例

  2. 输入以下值:

    • 要在 Cloud Console 中显示的实例名称。此实例名称在您的 Google Cloud 项目中必须是唯一的。
    • 用于永久标识实例的实例 ID。此实例 ID 在您的 Google Cloud 项目中也必须是唯一的。实例 ID 创建后便无法更改。
    • 配置,该配置定义了实例节点的地理位置,并且会影响数据的复制方式。详细了解实例配置
    • 实例的节点数。节点数确定实例中数据库可用的服务和存储资源的数量。
  3. 点击创建以创建实例。

以下屏幕截图显示了实例创建页面:

实例创建页面的屏幕截图

gcloud

使用 gcloud spanner instances create 命令:

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

请提供以下值:

  • [INSTANCE-ID]:在您的 Google Cloud 项目中唯一的永久性标识符。实例 ID 创建后便无法更改。
  • [INSTANCE-CONFIG]:实例配置,该配置定义了实例节点的地理位置,并且会影响数据的复制方式。详细了解实例配置
  • [INSTANCE-NAME]:要在 Cloud Console 中显示的实例名称。此实例名称在您的 Google Cloud 项目中必须是唯一的。
  • [NODE-COUNT]:实例的节点数。节点数确定实例中数据库可用的服务和存储资源的数量。

例如:

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::InstanceAdminClient client,
                    std::string const& project_id,
                    std::string const& instance_id,
                    std::string const& display_name,
                    std::string const& region) {
  namespace spanner = google::cloud::spanner;
  spanner::Instance in(project_id, instance_id);

  std::string region_id = region.empty() ? "us-central1" : region;
  std::string instance_config =
      "projects/" + project_id + "/instanceConfigs/regional-" + region_id;
  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";
}

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(ctx context.Context, w io.Writer, projectID, instanceID string) error {
	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");
    }
  }
}

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,
    )

    operation = instance.create()

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

    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 的配额和限制

在以下几种情况下,您不能从现有实例中移除节点:

  • 移除节点需要您的实例的每个节点最多存储 2 TB 的数据。
  • 根据您的历史使用模式,Cloud Spanner 为您的实例数据创建了大量拆分,并且在移除节点后,Cloud Spanner 将无法管理拆分。

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

如果要增加实例中的节点数,则您的 Google Cloud 项目必须具有足够的配额才能添加节点。

控制台

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

    转到“实例”页面

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

  3. 点击修改实例

  4. 输入所需的节点数。

  5. 点击保存

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

gcloud

使用 gcloud spanner instances update 命令:

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

请提供以下值:

  • [INSTANCE-ID]:实例的永久性标识符。
  • [NODE-COUNT]:实例的节点数。

删除实例

控制台

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

    转到“实例”页面

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

  3. 点击删除实例

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

  5. 点击删除

gcloud

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

gcloud spanner instances delete [INSTANCE-ID]

后续步骤