对于生产中的简单集群,如何切换成两地三中心?

期待你上线后不同的节点角色切换后的实际使用体验

1 个赞

视频只简单的介绍了概念和优缺点,没用具体的操作内容,估计要303才有具体操作。

Placement Rules和location-labels是两套不同的调度策略。

通过拓扑 label 进行副本调度

https://docs.pingcap.com/zh/tidb/v8.1/schedule-replicas-by-topology-labels/

  • 必须同时配置 PD 的 location-labels 和 TiKV 的 labels 参数,否则 PD 不会根据拓扑结构进行调度。
  • 如果你使用 Placement Rules in SQL,只需要配置 TiKV 的 labels 即可。Placement Rules in SQL 目前不兼容 PD location-labels 设置,会忽略该设置。不建议 location-labels 与 Placement Rules in SQL 混用,否则可能产生非预期的结果。

Placement Rules 使用文档

https://docs.pingcap.com/zh/tidb/v8.1/configure-placement-rules/

Placement Rules in SQL

https://docs.pingcap.com/zh/tidb/v8.1/placement-rules-in-sql/

Placement Rules 特性在 TiDB v5.0 及以上的版本中默认开启。所以如果要使用开始那个,估计得先关闭Placement Rule,不然是没效果的。

pd-ctl config placement-rules disable

当然,应该建议完全用Placement Rules来配置,但文档中的高可用部分还是使用的老方法配置,只是给了Placement Rules的链接。这样做应该有一些误导。

使用Placement Rules
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config placement-rules enable #启用Placement Rules策略
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config placement-rules show --group=pd --id=default#查看策略

cat > rules.json <<EOF
[
    {
        "group_id": "pd",
        "id": "zone1",
        "start_key": "",
        "end_key": "",
        "role": "voter",
        "count": 2,
        "label_constraints": [
            {"key": "zone", "op": "in", "values": ["xian"]},
            {"key": "dc", "op": "in", "values": ["xian1"]}
        ],
        "location_labels": ["rack", "host"]
    },
    {
        "group_id": "pd",
        "id": "zone2",
        "start_key": "",
        "end_key": "",
        "role": "voter",
        "count": 2,
        "label_constraints": [
            {"key": "zone", "op": "in", "values": ["xian"]},
            {"key": "dc", "op": "in", "values": ["xian2"]}
        ],
        "location_labels": ["rack", "host"]
    },
    {
        "group_id": "pd",
        "id": "zone3",
        "start_key": "",
        "end_key": "",
        "role": "follower",
        "count": 1,
        "label_constraints": [
            {"key": "zone", "op": "in", "values": ["beijing"]},
            {"key": "dc", "op": "in", "values": ["beijing1"]}
        ],
        "location_labels": ["rack", "host"]
    }
]
EOF
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config placement-rules save --in=rules.json

参考这里的实践指南

1 个赞

这个好, 又学到一招

从这个问题可以延伸出很多思考,感谢楼主抛砖引玉。

总结到位,学到了!

PRIMARY_REGION = “prod” // 保证 Leader 在 bj1,生产中心,保证你的读写都是在本地中心
REGIONS = “prod, samecity, remote” // 保证副本会分布到其它中心
FOLLOWERS=4; // 4个 flower,也就是一个数据有Leader在内的5份,你一个5个节点,保证每上节点都有一份数据,随意挂2个节点可以保证能正常使用,并且可以在剩下的3个节点中仍然保证高可用

如果不做 FOLLOWERS=4 的设置,默认是一个Leader+2个flower
所以可能 的情况是:数据在挂掉的2个节点+1个存活节点上,这个时候因为只有一个节点上有一份数据,无法择主,自然就出问题了

正常设置了

tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config set location-labels zone,dc,rack,host

tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config set isolation-level zone

tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config set max-replicas 3

就应kv数据就应该分布在3个zone中。
不过因为高版本默认启用的是placement-rules所以,应该关闭了就可以正常使用。
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config placement-rules disable
不过还是建议使用placement-rules,那就要设置策略。
设置策略的文档中是按照region这个label来处理的,所以要先设置kv的labels。
#查询集群拓扑
SELECT store_id,address,label from INFORMATION_SCHEMA.TIKV_STORE_STATUS;
#为tikv设置区域,每一个都要设置对应的labels
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 4 region=‘xian1’ host=‘host1’ --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 1 region=‘xian1’ host=‘host2’ --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 27 region=‘xian2’ host=‘host1’ --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 5002 region=‘xian2’ host=‘host2’ --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 5001 region=‘beijing1’ host=‘host1’ --force
#开启调度策略
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 config placement-rules enable
DROP PLACEMENT POLICY default_221; #如果有规则,可以先删除
CREATE PLACEMENT POLICY default_221 \ #修改使用ALTER
SURVIVAL_PREFERENCES=“[region, host]” \ # 数据将以副本的形式放置在不同的 region 里,优先满足跨 region 级别的生存目标,再满足跨 zone 级别的生存目标,最后再满足跨 host 级别的生存目标
PRIMARY_REGION = “xian1” \ #指定主节点
REGIONS = “xian1,xian2” \ #指定哪些可以成为主
FOLLOWERS=4; #指定副本数量
ALTER RANGE GLOBAL PLACEMENT POLICY= ‘default_221’; #给集群分配策略
SHOW PLACEMENT; #查看放置策略的调度进度

如果不需要按表设置的话,这里就够了,也不用去每个库每个表设置,不然太麻烦了。

如果要设置每个表的(一般用于热点或者重要库),可以
ALTER DATABASE 库名 PLACEMENT POLICY=default_221;#更改数据库的调度策略–以前的表还要单独一个个设置
ALTER TABLE 表名 PLACEMENT POLICY=default_221;#更改表的调度策略

之前的设置似乎有问题,SHOW PLACEMENT; #查看放置策略的调度进度,一直显示penging。
用ALTER PLACEMENT POLICY default_221 SURVIVAL_PREFERENCES=“[region, host]” ;改动之后,状态变成SCHEDULED了。
这样应该是对的。而且解决了之前缩容节点一直显示进行中的问题,现在缩容节点也显示成Tombstone了,可以处理删除了。
看来如果不懂具体使用,而且只需要简单的调度的话,用SURVIVAL_PREFERENCES="[region, host]"就够了。
所以,最终使用的配置是

tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 4  region='xian'  zone='xian1' host='xian11'  --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 1  region='xian'  zone='xian1'  host='xian12'  --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 27  region='xian'  zone='xian2'  host='xian21'  --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 5002  region='xian'  zone='xian2'  host='xian22'  --force
tiup ctl:v8.1.2 pd -u http://192.168.2.121:2379 store label 5001  region='beijing' zone='beijing1'  host='beijing11'  --force
#查询集群拓扑
SELECT store_id,address,label from INFORMATION_SCHEMA.TIKV_STORE_STATUS;
#指定生存偏好
####没策略先创建
CREATE PLACEMENT POLICY default_221 SURVIVAL_PREFERENCES="[region, zone, host]"  PRIMARY_REGION = "xian" REGIONS = "xian,beijing" FOLLOWERS=4;
####有策略就修改
#SHOW CREATE PLACEMENT POLICY default_221;#查看策略内容
#DROP PLACEMENT POLICY default_221; #删除策略
ALTER PLACEMENT POLICY default_221 SURVIVAL_PREFERENCES="[region, zone, host]"  PRIMARY_REGION = "xian" REGIONS = "xian,beijing" FOLLOWERS=4;
ALTER RANGE GLOBAL PLACEMENT POLICY= 'default_221'; #设置应用策略到集群
#查看放置策略的调度进度
SHOW PLACEMENT; # null不处理=>penging等待=>INPROGRESS进行=>SCHEDULED已安排

异地最好也搭建容灾的集群使用ticdc同步吧

目前的方案是两地三中心的集群。
至于双集群ticdc,那是另外的事情,没在讨论范围内。
而且ticdc同步ddl不方便,所以如果ddl经常变更的,暂时不好使用。

您提供的这些参考文档都可以作为操作手册了

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