使用ALTER RANGE后location_labels失效

使用ALTER RANGE之后,貌似location_labels并没有生效,各节点数据量趋于平均,F区节点加起来是4T,而其他两个区加起来是2.9T。



创建的Placement Policy是:

mysql> SHOW CREATE PLACEMENT POLICY `evict_sata_dw`;
+---------------+--------------------------------------------------------------------------------------+
| Policy        | Create Policy                                                                        |
+---------------+--------------------------------------------------------------------------------------+
| evict_sata_dw | CREATE PLACEMENT POLICY `evict_sata_dw` CONSTRAINTS="[-disk=sata-new, -disk=dw-ssd]" |
+---------------+--------------------------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> SHOW PLACEMENT where Target like '%GLOBAL%';
+-------------------+----------------------------------------------+------------------+
| Target            | Placement                                    | Scheduling_State |
+-------------------+----------------------------------------------+------------------+
| RANGE TiDB_GLOBAL | CONSTRAINTS="[-disk=sata-new, -disk=dw-ssd]" | SCHEDULED        |
+-------------------+----------------------------------------------+------------------+
1 row in set (23.21 sec)

mysql>

PD对应的Placement rule是:

root@prod-dw-tipd6-f001:~# tiup ctl:v7.5.1 pd config placement-rules rule-bundle get pd
Starting component ctl: /root/.tiup/components/ctl/v7.5.1/ctl pd config placement-rules rule-bundle get pd
{
  "group_id": "pd",
  "group_index": 0,
  "group_override": false,
  "rules": [
    {
      "group_id": "pd",
      "id": "default",
      "start_key": "",
      "end_key": "",
      "role": "voter",
      "is_witness": false,
      "count": 3,
      "location_labels": [
        "zone",
        "dc",
        "host"
      ],
      "version": 1
    }
  ]
}

root@prod-dw-tipd6-f001:~# tiup ctl:v7.5.1 pd config placement-rules rule-bundle get TiDB_GLOBAL
Starting component ctl: /root/.tiup/components/ctl/v7.5.1/ctl pd config placement-rules rule-bundle get TiDB_GLOBAL
{
  "group_id": "TiDB_GLOBAL",
  "group_index": 20,
  "group_override": true,
  "rules": [
    {
      "group_id": "TiDB_GLOBAL",
      "id": "evict_sata_dw_rule_0",
      "start_key": "",
      "end_key": "",
      "role": "voter",
      "is_witness": false,
      "count": 3,
      "label_constraints": [
        {
          "key": "disk",
          "op": "notIn",
          "values": [
            "sata-new"
          ]
        },
        {
          "key": "disk",
          "op": "notIn",
          "values": [
            "dw-ssd"
          ]
        },
        {
          "key": "engine",
          "op": "notIn",
          "values": [
            "tiflash"
          ]
        }
      ],
      "create_timestamp": 1710164464
    }
  ]
}

按照文档指导,通过 ALTER PLACEMENT POLICY evict_sata_dw CONSTRAINTS="[-disk=sata-new, -disk=dw-ssd]" SURVIVAL_PREFERENCES="[zone, dc, host]";手动设置SURVIVAL_PREFERENCES也没有生效。

手动创建新的Placement Policy也有问题,貌似都会直接忽略SURVIVAL_PREFERENCES,INFORMATION_SCHEMA.PLACEMENT_POLICIES表里也没这个字段。。


请问原来的放置策略是什么样子的呢。
对于带有 CONSTRAINTSSURVIVAL_PREFERENCES 的放置策略,会优先满足 CONSTRAINTS 条件,再满足按照 SURVIVAL_PREFERENCES 设置的数据隔离的生存目标。

这里数据调度是预期行为。创建placement rule 之后 placement rule 的规则会覆盖默认的规则,所以 default 规则里的 location-labels 会失效。而在 placement rule 中会先满足 CONSTRAINTS, 然后再 CONSTRAINTS 范围内进行 SURVIVAL_PREFERENCES 的配置。 对于placement rule 中不显示 SURVIVAL_PREFERENCES,这个 issue 跟踪: https://github.com/pingcap/tidb/issues/51699

请问有没有观察一段时间呀, 排除统计信息延迟的情况。

不止是不显示,而是直接在pd里的placement rule也没有SURVIVAL_PREFERENCES对应的location_labels。

  "group_id": "TiDB_GLOBAL",
  "group_index": 20,
  "group_override": true,

另外虽然 TiDB_GLOBAL 这个GROUP的group_override属性确实是true,我理解应该是按照group_index的大小,较大值的Group只会覆盖冲突的属性,如果后者没有对应的属性,会使用default的属性。
难道会直接忽略default规则里的所有属性?如果是忽略所有的属性,那就是一个很大的设计缺陷了,因为不仅是ALTER RANGE有问题,普通的ALTER TABLE PLACEMENT POLICY也有相应的问题,因为它产生的placement rule里也没有location_labels的属性,代表只要应用了PLACEMENT POLICY都会忽略location_labels的配置,当发生机架、机房故障时,大概率会丢数据

在 show create 语句里不显示应该是个 bug。但是 SURVIVAL_PREFERENCES 我本地试了下在 PD 上是能看到 location_labels 的相关配置的。这个是哪个版本的?如果有稳定复现的步骤可以去 github 上提交个 bug。

另外一个7.5.1集群也是一样,没有location_labels的配置。你执行一下tiup ctl:v7.5.1 pd config placement-rules rule-bundle get TiDB_GLOBAL我看下输出?

额,知道了,ALTER PLACEMENT POLICY之后,得重新执行一下ALTER RANGE操作,才会重新应用到PD中。

location_labels也开始生效了,F区数据在减少,其他两个区节点的数据在增加
image

@aytrack 这里能确认么?如果是这样,只要用了Placement Rule in SQL做物理隔离,都会导致location-labels失效的,它在PD上产生的规则可以见下图,叠加只有也会导致location-labels失效吧?

是的,有 group_override 为 true,则 group index 大的会覆盖相同范围 group index 小的规则。

所以在给表添加 rule in sql 时候,就要把 SURVIVAL_PREFERENCES 加上。

这是个 bug,我提个 issue 先: https://github.com/pingcap/tidb/issues/51712

翻了下文档,SURVIVAL_PREFERENCES貌似是7.1才引进的,6.5时候还不支持。也就是6.1和6.5两个LTS版本如果用了Placement Rule in SQL,即便发现了这个问题,还是没办法fix么?

遇到bug了?

workaround 就是再执行一边 alter range。
后面应该会在后续小版本 fix。

此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。