问题现象
在使用表格存储的过程中,部分用户可能偶尔会接到一些500错误。主要错误码信息请参见下表。
错误状态 | 错误码 | 错误信息 |
503 | OTSPartitionUnavailable | The partition is not available. |
503 | OTSServerUnavailable | Server is not available. |
503 | OTSServerBusy | Server is busy. |
503 | OTSTimeout | Operation timeout. |
原因分析
表格存储是分布式的Serverless表存储服务,服务端会根据数据分区的数据量和访问情况自动进行负载均衡,从而突破单机服务能力的限制,实现数据规模与访问并发的无缝扩展。
如下图所示,表格存储会按照分区键(即第一个主键)的顺序将实际数据划分到不同的数据分区中,不同的数据分区会调度到不同的服务节点提供读写服务。
当某个数据分区的数据量过大或访问过热(如下图的数据分区P1)时,表格存储的动态负载均衡机制能够检测到这种情况的发生,并将数据分区分裂成两个数据分区P1和P5,并将这两个数据分区调度到负载较低的服务节点上。
当新创建一个数据表时,数据表只有一个数据分区,该表上能够提供的读写并发有限,自动负载均衡机制也有一定的延时性,您可以直接加入钉钉群23307953(表格存储技术交流群-2)或36165029092(表格存储技术交流群-3)联系表格存储技术支持,预先将数据表划分成多个数据分区。
表格存储使用上述的自动负载均衡机制实现表数据规模和访问并发的自动扩展,全程无需人工介入。
同时,表格存储使用共享存储的机制,数据分区为逻辑单位,因此在负载均衡的过程中,不会有实际数据的迁移,只是数据表元信息的变更。在元信息变更的过程中,为了保证数据的一致性,涉及到的数据分区会有短暂的不可用时间, 正常情况下影响时间为百毫秒级别,在数据分区的负载较大时,可能会持续到秒级别, 在这段时间内对该分区的读写操作可能会收到上述的错误。
解决方案
一般重试即可解决。表格存储SDK默认提供了一些重试策略,在初始化Client时可以指定重试策略。
同时,表格存储提供的是标准Restful API协议,由于网络环境的不可控,所有的读写操作也建议均增加重试策略,以便对网络错误等有一定的容错能力。
通过批量读写操作BatchWriteRow和BatchGetRow读写的数据可能属于一张表或多张表的多个数据分区。如果某个分区正在分裂,则整个操作是非原子性的,只能够保证每个单行操作的原子性。即使该操作的返回码为200,仍需检查response中的getFailedRows()
是否有失败的单行操作。