Cloud Spanner - 基于字符串键的分片
Cloud Spanner - Sharding based on String key
我们的主要目标是读取性能,因为我们通常执行 80-90% 的读取到写入,我正在尝试 select 实现此目标的最佳主键。
我们的大部分查询都是基于客户,例如获取客户 X 提供的所有产品。客户由三个字符串标识,类似于股票代码。
我的第一个想法是创建主键如下:
CREATE TABLE Product (
ProductId INT64 NOT NULL,
CustomerCode STRING(3) NOT NULL,
...
) PRIMARY KEY (CustomerCode, ProductId);
我对这个设计的问题是:
Spanner 如何根据字符串值对数据进行分片?
这种方法会创建太多分片吗?我们有大约 100 个主要客户,我们计划使用 ~8 个节点
Spanner 基于主键对行范围进行基于负载的自动分片。
"Will this approach create too many shards?"
与许多其他分布式数据库不同,这不是您需要担心的事情。由于 Cloud Spanner 进行基于动态负载的分片,它会根据您放置在系统上的负载自动上下调整服务分片的数量。负载较多的行范围将拆分为更多的分片,负载较少的行范围将自动合并为较少的分片。
一个很好的阅读资源是 Optimizing Schema Design for Cloud Spanner。
我们的主要目标是读取性能,因为我们通常执行 80-90% 的读取到写入,我正在尝试 select 实现此目标的最佳主键。
我们的大部分查询都是基于客户,例如获取客户 X 提供的所有产品。客户由三个字符串标识,类似于股票代码。
我的第一个想法是创建主键如下:
CREATE TABLE Product (
ProductId INT64 NOT NULL,
CustomerCode STRING(3) NOT NULL,
...
) PRIMARY KEY (CustomerCode, ProductId);
我对这个设计的问题是:
Spanner 如何根据字符串值对数据进行分片?
这种方法会创建太多分片吗?我们有大约 100 个主要客户,我们计划使用 ~8 个节点
Spanner 基于主键对行范围进行基于负载的自动分片。
"Will this approach create too many shards?"
与许多其他分布式数据库不同,这不是您需要担心的事情。由于 Cloud Spanner 进行基于动态负载的分片,它会根据您放置在系统上的负载自动上下调整服务分片的数量。负载较多的行范围将拆分为更多的分片,负载较少的行范围将自动合并为较少的分片。
一个很好的阅读资源是 Optimizing Schema Design for Cloud Spanner。