首页 > 其他分享 >三地五中心,TiDB POC最佳姿势探索

三地五中心,TiDB POC最佳姿势探索

时间:2023-11-14 10:07:35浏览次数:32  
标签:v7.1 三地 tiup POC pd TiDB az1 az leader


POC测试背景

在某地震多发省,为了避免地震造成的机房级灾难,或者城市级灾难,导致整个系统不可用,拟建设一套三地五中心五副本分布式高可用数据库系统,保证高可用需求。在该系统中需要接入不同地区的应用流量,且前期应用开发已经采用了百库百表的水平分库表策略。为尽可能减少应用~数据库延迟、数据库计算层向存储层跨机房跨城取数延迟,需要做到业务流量与对于数据分片leader在同一个机房。



POC测试项

#敏感信息已脱敏,测试用例信息可作为参考与学习

三地五中心,TiDB POC最佳姿势探索_sql



测试环境信息



机器软件环境配置

共12台阿里私有云托管物理机,其中10台用作部署集群,2台用作部署同步程序或测试HTAP能力扩容。

单台配置如下:

配置项

配置信息

系统内核版本

麒麟v10、arm架构

cpu

海光 64c(已超线程)

内存

512GB

磁盘

4*nvme SSD 3TB

tidb版本

v7.1.0-->v7.1.1


机器与空间信息

共有三个城市:cd、ya、lz

五个机房:cd有两个机房AZ1、AZ2;ya有两个机房AZ3、AZ4;lz有一个机房AZ5

延迟:同城两机房延时小于1ms;cd与ya两地延时3ms;cd与lz两地延时7ms;ya与lz两地延时9ms

机器放置拓扑:每个机房两台机器



流量单元化控制



需求

3地数据中心架构有如下需求:

  1. db_00-24 这 25 个库的 leader 在 AZ1,db_25-49 这 25 个库的 leader 在 AZ2,db_50-74 这 25 个库的 leader 在 AZ3,db_75-99 这 25 个库的 leader 在 AZ4
  2. AZ5 不能有 Leader,即使前面 4 个 AZ 任意一个故障,AZ5 也不能 Leader
  3. 5 副本(max-replicas)

三地五中心,TiDB POC最佳姿势探索_sql_02



解决方案(存在bug)

1、给机器打label

以az1的两台机器为例:
tikv_server:
  -host1
     config:
        server.lables: {az: "az1" ,host : "host1" }
  -host2
     config:
        server.lables: {az: "az1" ,host : "host2" }

2、按照AZ级别设置placement rule确定副本role

az1数据副本(全能型)放置规则,(az2\3\4规则类似):

 "group_id": "pd",
        "id": "cd1",
        "start_key": "",
        "end_key": "",
        "role": "voter",
        "count": 1,
        "label_constraints": [
            {"key": "az", "op": "in", "values": ["az1"]}
        ],
        "location_labels": ["az", "host"]


az5数据副本(只同步,不提供服务)放置规则:

 "group_id": "pd",
        "id": "lz",
        "start_key": "",
        "end_key": "",
        "role": "follower",
        "count": 1,
        "label_constraints": [
            {"key": "az", "op": "in", "values": ["az5"]}
        ],
        "location_labels": ["az", "host"]

详细细节参考Placement Rules 使用文档 | PingCAP 文档中心

3、使用placement rule in sql 配置主副本leader放置规则

创建放置在az1数据的放置规则:
CREATE PLACEMENT POLICY p1 LEADER_CONSTRAINTS="+az=az1" FOLLOWER_CONSTRAINTS="{+az=az2: 1,+az=az3: 1,+az=az4: 1,+az=az5: 1}"


在百库百表下每个az约有进250+库,2500+表

生成更改表放置规则的sql语句,约2500+DDL
select concatenate('alter table' ,table_achema ,'.',table_name,'placement policy = p1' from information_schema.tables where right(table_schema ,2) between '00' and '24' order by table_schema
备注:在库已有放置规则的情况下,库下新建无放置规则的表

详细细节参考Placement Rules in SQL | PingCAP 文档中心



bug1

**bug描述:**TiDB v7.1.0 pd调度bug

**bug现象:**数据副本无法按照placement rule in sql设置的放置规则完成调度

三地五中心,TiDB POC最佳姿势探索_数据_03

bug解决方案:

升级pd从v7.1.0到v7.1.1或整体升级集群到v7.1.1

可以从v7.1.1的镜像源中获取7.1.1版本pd,在一台和外网相通的机器上拉取需要的组件:
tiup mirror clone tidb-community-server-${version}-linux-amd64 ${version} --os=linux --arch=amd64
参考:https://docs.pingcap.com/zh/tidb/stable/production-deployment-using-tiup#%E5%87%86%E5%A4%87-tiup-%E7%A6%BB%E7%BA%BF%E7%BB%84%E4%BB%B6%E5%8C%85

打热补丁
tiup cluster patch <cluster-name> <package-path> [flags]
参考:https://docs.pingcap.com/zh/tidb/stable/tiup-component-cluster-patch#tiup-cluster-patch

或整体升级集群版本,参考:https://docs.pingcap.com/zh/tidb/stable/upgrade-tidb-using-tiup#%E4%BD%BF%E7%94%A8-tiup-%E5%8D%87%E7%BA%A7-tidb



bug2

**bug描述:**placement rule的规则无法完全生效

**bug现象:**按照az去打placement rule 后,在az5仍然会有mysql库、information_schema库等系统库表的region leader ,且部分表出现副本数大于5副本的情况。

**bug解决方案:**弃用按照AZ定义副本role的做法,采用reject-leader方案,参考:跨数据中心部署拓扑 | PingCAP 文档中心

三地五中心,TiDB POC最佳姿势探索_sql_04



调整方案后收益

三地五中心,TiDB POC最佳姿势探索_sql_05



跨城获取TSO的影响与探索



问题描述与初步分析

压力测试中,az1、az2、az3、az4各占25%流量,流量与数据主副本leader也保持一致,但是响应延时却并不一致

三地五中心,TiDB POC最佳姿势探索_数据库_06



实测确认跨城获取TSO影响

三地五中心,TiDB POC最佳姿势探索_数据库_07



优化方案

拆分一套集群为4套集群。

三地五中心,TiDB POC最佳姿势探索_sql_08



灾难恢复与流量切流



需求

1、当发生机房级别灾难时,流量需要切换,为保证最佳性能,pd leader 也要region leader 也要尽可能的与流量进行契合

2、同城一机房挂机后,流量优先切换到同城另一个机房

3、当一个城市两机房全部挂机后,例如cd的az1和az2挂机,流量全部切换至az3和az4,不切换到az5



pd leader 切换

给pd menber 打上权重,保证灾难时优先调度pd leader 到同城节点

交互模式
tiup ctl:v<CLUSTER_VERSION> pd -i -u http://127.0.0.1:2379

以az1流量为例,设置pd leader 调度策略
tiup ctl:v7.1.0 pd member leader_priority  pd-1 5
tiup ctl:v7.1.0 pd member leader_priority  pd-2 3
tiup ctl:v7.1.0 pd member leader_priority  pd-3 1
tiup ctl:v7.1.0 pd member leader_priority  pd-4 1
tiup ctl:v7.1.0 pd member leader_priority  pd-5 0


手动pd leader 切换(为避免切换后不稳定,需要先调整调度权重)
tiup ctl:v7.1.0 pd member leader transfer pd3



region leader 切换

有问题的切换:

第一步:
假设原放置az1的region leader需要切换到az2,执行sql获得语句,约2500+DDL
select concatenate('alter table' ,table_achema ,'.',table_name,'placement policy = p2' from information_schema.tables where right(table_schema ,2) between '00' and '24' order by table_schema
第二步:
执行获得的2500+个DDL

问题:切换时间长
数据库层操作:alter table xx placement policy az2; -- 之前是 az1

最终耗时:28 分钟

优化后切换:

换一个思路不再更改表绑定更换规则,而是直接更改绑定的规则的内容
ALTER PLACEMENT POLICY p1 LEADER_CONSTRAINTS="+az=az2" FOLLOWER_CONSTRAINTS="{+az=az1: 1,+az=az3: 1,+az=az4: 1,+az=az5: 1}"

切换时常约3分钟



写在最后

1、poc(概念验证)是一个非常好的检验数据库能力的方式,可以帮我们验证和了解各种功能

2、本次只摘取了整个测试实战过程中碰到的三个点来分享,希望能帮助到有类似需求的TiDB用户

作者介绍:BraveChen,来自神州数码钛合金战队,是一支致力于为企业提供分布式数据库TiDB整体解决方案的专业技术团队。团队成员拥有丰富的数据库从业背景,全部拥有TiDB高级资格证书,并活跃于TiDB开源社区,是官方认证合作伙伴。目前已为10+客户提供了专业的TiDB交付服务,涵盖金融、证券、物流、电力、政府、零售等重点行业。

标签:v7.1,三地,tiup,POC,pd,TiDB,az1,az,leader
From: https://blog.51cto.com/tidb/8361081

相关文章

  • 【运维实操】TIDB v6.1.1:全量备份、全量恢复和增量备份方法解析
    作者:Fly-bird背景:由于公司要求必须保证数据库的数据安全,我们生产环境的数据库采取全量备份+增量备份+实时同步从库的方式保证数据库的高可用,本文介绍我公司生产环境的数据库备份方式。注意:我们使用实时同步数据到从库的方式保障高可用(使用pump+drainer),同时支持恢复任意时刻数据的......
  • 浅尝poc编写工具+漏洞验证xpoc
    一、快速编写poc工具为了方便打点找到了一个在线编写poc的网站:https://poc.xray.cool/ 可配合xpoc批量利用。在线版(个人觉得本地版好用)  本地版(可验证是否有效):①windows下载链接:https://ctstack-oss.oss-cn-beijing.aliyuncs.com/tool/c39865a939edf5d7f4a37017c......
  • tidb数据库5.4.3和6.5.3版本性能测试对比
    作者:qizhining一、测试需求:基于历史原因,我们的业务数据库一直使用5.4.3,最近由于研发提出需求:需要升级到6.5.3版本,基于版本不同,需要做个压力测试已验证2个版本之间的性能差异。二、测试目的:验证tidb数据库5.4.3和6.5.3版本性能的差异三、测试结果:tidb数据库6.5.3版本比5.4.3总体性......
  • 理解TiDB集群的P99计算方式
    一、背景简介在学习prometheus时,会遇到一个histogram_quantile()函数,用于对histogram类型的指标进行分位数计算,实际上这个函数就是histogram这个指标类型最常用的函数。此函数在tidb的监控图表中有一个比较明显地方使用:计算P99/P999Duration等延迟指标。新人们对此函数的理解是......
  • TiDB 源码编译之 TiProxy 篇
    作者:ShawnYanTiProxy简介TiProxy是一个基于Apache2.0协议开源的、轻量级的TiDB数据库代理,基于Go语言编写,支持MySQL协议。TiProxy支持负载均衡,接收来自应用程序的请求,然后将其发送到TiDB集群。支持自动故障转移,当后端TiDBServer发生故障,可以自动将连接转移到......
  • epoch
    在机器学习中,一个epoch是指对整个训练数据集进行一次完整的训练。在训练神经网络时,一次完整的训练周期会经过所有的训练样本,然后根据模型的权重进行参数更新。训练数据集通常被分成小批次(minibatches)进行处理,每个小批次包含一组训练样本。在一个epoch中,模型会逐批次地处理训......
  • 渗透中 PoC、Exp、Payload、RCE、IOC,Shellcode 的区别
    PoC:全称“ProofofConcept”,中文“概念验证”,常指段漏洞证明的代码。Exp:全称“Exploit”,中文“利用”,指利用系统漏洞进行攻击的动作作。Payload:中文“有效载荷”,指成功exploit之后,真正在目标系统执行的代码或指令RCE:RCE(remotecommand/codeexecute)可以让攻击......
  • 如何使用Poco库采集阿里云信息
    阿里云是一个云主机平台,我们在购买云主机的时候,往往会因为挑选自己心意的产品而眼花缭乱。今天我就使用Poco库编写一个采集阿里云信息的程序,有了它,我们在挑选阿里云产品你轻松了许多,一起来看看吧。```cpp//引入Poco库#include<Poco/Net/HTTPClientSession.h>#include<Po......
  • CodeForces 1060G Balls and Pockets
    洛谷传送门CF传送门NOIP模拟赛T2。很厉害的题。想象数轴上\(a_1,a_2,\ldots,a_n\)位置上各有一个洞,每个非负整数位置上有一个点。每次操作相当于,对于每个点,如果它刚好位于一个洞,那么它会掉进去;否则设它的位置为\(p\),位置在它前面的洞有\(t\)个,那么这个点的位置变成......
  • TypeError: fit() got an unexpected keyword argument 'nb_epoch'
    model.fit(trainX,trainY,nb_epoch=200,batch_size=2,verbose=2) It'sjust epochs now. nb_epoch wasdeprecatedyearsago. 把nb_epoch......