DR Auto-Sync 双活模式部署拓扑如下(示例),需要开启 TiDB 的两个特殊功能:
- 1、Placement-Rules,用以设定每个 TiKV 的角色Voter - 该 TiKV 上的 replica 可投票、可被选为 leaderFollower - 该 TiKV 上的 replica 可投票,不可被选为 leaderLearner - 该 TiKV 上的 replica 只异步接收日志,不参与投票
- 2、DR Auto-Sync,用以开启两中心自适应同步复制功能
一、示例环境说明
| 服务器地址 | 服务器角色 | 资源 |
|---|---|---|
| 192.168.68.100 | 中控机、监控服务器 | 8核32G |
| 192.168.68.101 | PD(AZ1) | 4核8G |
| 192.168.68.102 | ||
| 192.168.68.103 | PD(AZ2) | |
| 192.168.68.104 | ||
| 192.168.68.111 | TiDB(AZ1)、TiProxy(AZ1) | 8核16G |
| 192.168.68.112 | ||
| 192.168.68.113 | TiDB(AZ2)、TiProxy(AZ2) | |
| 192.168.68.114 | ||
| 192.168.68.121 | TiKV(AZ1) | 8核16G |
| 192.168.68.122 | ||
| 192.168.68.123 | ||
| 192.168.68.124 | TiKV(AZ2) | |
| 192.168.68.125 | ||
| 192.168.68.126 |
二、环境初始化配置
如下步骤在部署前对环境服务器执行相关初始化操作。
1、安装必要的工具
yum -y install numa* hdparm irqbalance tar jq curl
2、关闭防火墙
systemctl stop firewalld.service
systemctl disbale firewalld.service
systemctl status firewalld.service
3、关闭交换分区
swapoff -a && free -h
#注释 /etc/fstab 配置文件中 swap 挂载项
vi /etc/fstab
#禁用swap
echo "vm.swappiness = 0">> /etc/sysctl.conf
sysctl -p
4、禁用THP
#查看是否启用
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
[root@localhost ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
vi /etc/rc.d/rc.local
#以下为新增
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
#赋予执行权限
chmod +x /etc/rc.d/rc.local
#在命令行使用root执行以下命令(和配置文件中新增命令一样〉
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
#查看配置是否生效
cat /sys/kernel/mm/transparent_hugepage/defrag
cat /sys/kernel/mm/transparent_hugepage/enabled
5、创建用户及相关目录
#创建tidb用户
useradd tidb
echo "tidb:Kingbase@123" | chpasswd
#主机文件
cat > /etc/hosts <<EOF
127.0.0.1 localhost
192.168.68.100 Server100
192.168.68.101 Server101
192.168.68.102 Server102
192.168.68.103 Server103
192.168.68.104 Server104
192.168.68.111 Server111
192.168.68.112 Server112
192.168.68.113 Server113
192.168.68.114 Server114
192.168.68.121 Server121
192.168.68.122 Server122
192.168.68.123 Server123
192.168.68.124 Server124
192.168.68.125 Server125
192.168.68.126 Server126
EOF
#配置tidb用户sudo权限
visudo
tidb ALL=(ALL) NOPASSWD: ALL
#中控机到各目标机的ssh免密登录
su - tidb
ssh-keygen -t rsa
for i in {100};do ssh-copy-id -i ~/.ssh/id_rsa.pub tidb@192.168.68.$i;done
for i in {101..104};do ssh-copy-id -i ~/.ssh/id_rsa.pub tidb@192.168.68.$i;done
for i in {111..114};do ssh-copy-id -i ~/.ssh/id_rsa.pub tidb@192.168.68.$i;done
for i in {121..126};do ssh-copy-id -i ~/.ssh/id_rsa.pub tidb@192.168.68.$i;done
#ssh-copy-id -p <端口号> <用户名>@<主机名或IP地址>
#验证免密登录
for i in {100};do ssh tidb@192.168.68.$i -i ~/.ssh/id_rsa hostname;done
for i in {101..104};do ssh tidb@192.168.68.$i -i ~/.ssh/id_rsa hostname;done
for i in {111..114};do ssh tidb@192.168.68.$i -i ~/.ssh/id_rsa hostname;done
for i in {121..126};do ssh tidb@192.168.68.$i -i ~/.ssh/id_rsa hostname;done
6、执行以下命令修改 sysctl 参数
echo "vm.swappiness = 0">> /etc/sysctl.conf
echo "fs.file-max = 1000000">> /etc/sysctl.conf
echo "net.core.somaxconn = 32768">> /etc/sysctl.conf
echo "net.ipv4.tcp_syncookies = 0">> /etc/sysctl.conf
echo "vm.overcommit_memory = 1">> /etc/sysctl.conf
echo "vm.min_free_kbytes = 1048576">> /etc/sysctl.conf
sysctl -p
7、执行以下命令配置用户的 limits.conf 文件
cat << EOF >>/etc/security/limits.conf
tidb soft nofile 1000000
tidb hard nofile 1000000
tidb soft stack 32768
tidb hard stack 32768
tidb soft core unlimited
tidb hard core unlimited
EOF
8、创建相关目录并修改属主
# 创建`deploy_dir`和`data_dir`存放目录
mkdir -p /opt/tidb-deploy
mkdir -p /data/tidb-data
chown -R tidb.tidb /opt/tidb-deploy
chown -R tidb.tidb /data/tidb-data
9、部署时间服务(chronyd)
#安装时间服务程序
yum install chrony
#服务端:192.168.68.100
[root@Server100 ~]# egrep -v "^$|^#" /etc/chrony.conf
server ntp.aliyun.com iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
allow 192.168.68.0/24
local stratum 10
logdir /var/log/chrony
#客户端
[root@Server101 ~]# egrep -v "^$|^#" /etc/chrony.conf
server 192.168.68.100 iburst
driftfile /var/lib/chrony/drift
makestep 1.0 3
rtcsync
local stratum 10
logdir /var/log/chrony
#查看时间同步情况
chronyc tracking
chronyc sourcestats
三、部署TiDB集群
如下步骤执行TiDB集群部署。
3.1、部署离线环境tiup组件
cd /mytmp
#解压安装包
tar -xvf tidb-server-v7.1.8-5.3-linux-amd64.tar.gz -C /opt/
tar -xvf tidb-toolkit-v7.1.8-5.3-linux-amd64.tar.gz -C /opt/
#部署离线环境 TiUP 组件
chown -R tidb.tidb /opt/tidb-*
su - tidb
cd /opt/tidb-server-v7.1.8-5.3-linux-amd64/
sh local_install.sh
#根据提示执行
source /home/tidb/.bash_profile
#安装custer组件
tiup install cluster
tiup list
验证tiup组件部署:
which tiup
tiup --version
tiup --binary cluster
tiup list tidb #查看可用版本
tiup list tikv
tiup list pd
tiup list tiproxy
tiup list tiflash
查看此时的镜像路径:
cat ~/.tiup/tiup.toml
tiup mirror show
#镜像路径记录于: ~/.tiup/tiup.toml 文件中
合并离线包
cp -rp keys ~/.tiup/
tiup mirror merge ../tidb-toolkit-v7.1.8-5.3-linux-amd64
tiup mirror show
3.2、初始化拓扑文件
执行命令,生成集群初始化配置文件:tidb-test.yaml
global:
user: "tidb"
ssh_port: 22
deploy_dir: "/opt/tidb-deploy"
data_dir: "/data/tidb-data"
monitored:
node_exporter_port: 9100
blackbox_exporter_port: 9115
deploy_dir: "/opt/tidb-deploy/monitored-9100"
data_dir: "/data/tidb-data/monitored-9100"
log_dir: "/opt/tidb-deploy/monitored-9100/log"
server_configs:
tiproxy:
proxy.proxy-protocol: v2
tidb:
graceful-wait-before-shutdown: 60
proxy-protocol.fallbackable: true
tikv:
raftstore.pd-store-heartbeat-tick-interval: 2s
#调整这个和下面的参数降低sync_recovery时候的snapshot传输速度,以避免该阶段QPS下跌的太严重
raftstore.snap-generator-pool-size: 1
server.snap-max-write-bytes-per-sec: 30MB
server.concurrent-send-snap-limit: 4
server.concurrent-recv-snap-limit: 4
server.grpc-compression-type: gzip
readpool.storage.use-unified-pool: true
readpool.coprocessor.use-unified-pool: true
readpool.storage.low-concurrency: 8
pd:
replication.max-replicas: 5
replication.location-labels: ["zone","rack","host"]
replication.isolation-level: "host"
pd_servers:
- host: 192.168.68.101
name: "pd-101"
client_port: 2379
peer_port: 2380
deploy_dir: "/opt/tidb-deploy/pd-2379"
data_dir: "/data/tidb-data/pd-2379"
log_dir: "/opt/tidb-deploy/pd-2379/log"
- host: 192.168.68.102
name: "pd-102"
client_port: 2379
peer_port: 2380
deploy_dir: "/opt/tidb-deploy/pd-2379"
data_dir: "/data/tidb-data/pd-2379"
log_dir: "/opt/tidb-deploy/pd-2379/log"
- host: 192.168.68.103
name: "pd-103"
client_port: 2379
peer_port: 2380
deploy_dir: "/opt/tidb-deploy/pd-2379"
data_dir: "/data/tidb-data/pd-2379"
log_dir: "/opt/tidb-deploy/pd-2379/log"
tidb_servers:
- host: 192.168.68.111
port: 4000
status_port: 10080
deploy_dir: "/opt/tidb-deploy/tidb-4000"
log_dir: "/opt/tidb-deploy/tidb-4000/log"
config:
labels: { zone: "idc1" }
proxy-protocol.networks: "192.168.68.111"
- host: 192.168.68.112
port: 4000
status_port: 10080
deploy_dir: "/opt/tidb-deploy/tidb-4000"
log_dir: "/opt/tidb-deploy/tidb-4000/log"
config:
labels: { zone: "idc1" }
proxy-protocol.networks: "192.168.68.111"
- host: 192.168.68.113
port: 4000
status_port: 10080
deploy_dir: "/opt/tidb-deploy/tidb-4000"
log_dir: "/opt/tidb-deploy/tidb-4000/log"
config:
labels: { zone: "idc2" }
proxy-protocol.networks: "192.168.68.113"
- host: 192.168.68.114
port: 4000
status_port: 10080
deploy_dir: "/opt/tidb-deploy/tidb-4000"
log_dir: "/opt/tidb-deploy/tidb-4000/log"
config:
labels: { zone: "idc2" }
proxy-protocol.networks: "192.168.68.113"
tiproxy_servers:
- host: 192.168.68.111
port: 6000
status_port: 3080
deploy_dir: "/opt/tidb-deploy/tidb-6000"
config:
labels: { zone: "idc1" }
ha.virtual-ip: "192.168.68.10/24"
ha.interface: "ens33"
- host: 192.168.68.113
port: 6000
status_port: 3080
deploy_dir: "/opt/tidb-deploy/tidb-6000"
config:
labels: { zone: "idc2" }
ha.virtual-ip: "192.168.68.20/24"
ha.interface: "ens33"
tikv_servers:
- host: 192.168.68.121
port: 20160
status_port: 20180
deploy_dir: "/opt/tidb-deploy/tikv-20160"
data_dir: "/data/tidb-data/tikv-20160"
log_dir: "/opt/tidb-deploy/tikv-20160/log"
config:
server.labels: { zone: "idc1", rack: "rack1", host: "121" }
- host: 192.168.68.122
port: 20160
status_port: 20180
deploy_dir: "/opt/tidb-deploy/tikv-20160"
data_dir: "/data/tidb-data/tikv-20160"
log_dir: "/opt/tidb-deploy/tikv-20160/log"
config:
server.labels: { zone: "idc1", rack: "rack1", host: "122" }
- host: 192.168.68.123
port: 20160
status_port: 20180
deploy_dir: "/opt/tidb-deploy/tikv-20160"
data_dir: "/data/tidb-data/tikv-20160"
log_dir: "/opt/tidb-deploy/tikv-20160/log"
config:
server.labels: { zone: "idc1", rack: "rack1", host: "123" }
- host: 192.168.68.124
port: 20160
status_port: 20180
deploy_dir: "/opt/tidb-deploy/tikv-20160"
data_dir: "/data/tidb-data/tikv-20160"
log_dir: "/opt/tidb-deploy/tikv-20160/log"
config:
server.labels: { zone: "idc2", rack: "rack2", host: "124" }
- host: 192.168.68.125
port: 20160
status_port: 20180
deploy_dir: "/opt/tidb-deploy/tikv-20160"
data_dir: "/data/tidb-data/tikv-20160"
log_dir: "/opt/tidb-deploy/tikv-20160/log"
config:
server.labels: { zone: "idc2", rack: "rack2", host: "125" }
- host: 192.168.68.126
port: 20160
status_port: 20180
deploy_dir: "/opt/tidb-deploy/tikv-20160"
data_dir: "/data/tidb-data/tikv-20160"
log_dir: "/opt/tidb-deploy/tikv-20160/log"
config:
server.labels: { zone: "idc2", rack: "rack2", host: "126" }
monitoring_servers:
- host: 192.168.68.100
port: 9090
deploy_dir: "/opt/tidb-deploy/prometheus-8249"
data_dir: "/data/tidb-data/prometheus-8249"
log_dir: "/opt/tidb-deploy/prometheus-8249/log"
grafana_servers:
- host: 192.168.68.100
port: 3000
deploy_dir: /opt/tidb-deploy/grafana-3000
alertmanager_servers:
- host: 192.168.68.100
web_port: 9093
cluster_port: 9094
deploy_dir: "/opt/tidb-deploy/alertmanager-9093"
data_dir: "/data/tidb-data/alertmanager-9093"
log_dir: "/opt/tidb-deploy/alertmanager-9093/log"
和普通集群相比,有以下几个参数设置需要注意:
- 调整 TiKV 心跳上报频率,pd-store-heartbeat-tick-interval,与 Dr-Auto-Sync 相关的 wait-store-timeout 同频可能导致 sync/async 切换无故自动切换问题。
- 调整 snapshot 相关参数,规避 sync_recover 阶段 snapshot 传输导致的 QPS 下降问题。
- 为 TiKV 实例配置 idc (数据中心) 以及 logic (逻辑单元,部署时与机柜对应) 标签 (注意:相同 logic 标签的 TiKV 实例承载一份完整的数据副本)。
注意:
1、对于需要全局生效的参数,请在配置文件中 server_configs 的对应组件下配置。2、对于需要某个节点生效的参数,请在具体节点的 config 中配置。
3.3、检查环境
#执行如下命令,检查环境
su - tidb
tiup cluster check tidb-test.yaml
#发现有很多Fail,执行自修复命令
tiup cluster check tidb-test.yaml --apply --user root -p
#执行完后再次检查
tiup cluster check tidb-test.yaml --user tidb
#可忽略Warn,没有Fail即可执行下一步
3.4、执行部署
su - tidb
cd /opt/tidb-server-v7.1.8-5.3-linux-amd64
tiup cluster deploy tidb-test v7.1.8-5.3 tidb-test.yaml --user tidb
3.5、初始化安全启动集群
安全启动后,TiUP 会自动生成 TiDB root 用户的密码,并在命令行界面返回密码。
使用安全启动方式后,不能通过无密码的 root 用户登录数据库,你需要记录命令行返回的密码进行后续操作。
tiup cluster start tidb-test --init
3.6、验证集群运行状态
tiup cluster display tidb-test
# 安装mysql客户端程序
rpm -ivh mysql-community-common-5.7.44-1.el7.x86_64.rpm \
mysql-community-libs-5.7.44-1.el7.x86_64.rpm \
mysql-community-libs-compat-5.7.44-1.el7.x86_64.rpm \
mysql-community-client-5.7.44-1.el7.x86_64.rpm
预期结果输出:各节点 Status 状态信息为 Up 说明集群状态正常。
3.7、验证TiProxy代理
mysql -h 192.168.68.10 -P 6000 -uroot -pRoot@123 #分发TiDB服务器为 192.168.68.111:4000和192.168.68.112:4000
mysql -h 192.168.68.20 -P 6000 -uroot -pRoot@123 #分发TiDB服务器为 192.168.68.113:4000和192.168.68.114:4000
select * from information_schema.cluster_processlist;
查看集群拓扑结构:
http://192.168.68.103:2379/dashboard/#/cluster_info/store_topology
3.8、设置PD实例优先级
# 设置 pd 实例优先级, 确保 pd leader 始终处于主中心
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 -i
# IDC1 pd实例
member leader_priority pd-101 100
member leader_priority pd-102 100
# IDC2 pd实例
member leader_priority pd-103 50
3.9、备份关键配置
集群部署完成后,复制源文件到两个同城容灾中心的tiup上进行备份
su - tidb
scp -r /home/tidb/.tiup tidb@192.168.68.103:/home/tidb/
并在两个tiup上分别验证是否生效(在两个中心的服务器上保留原始拓扑文件的备份)
tiup mirror show
tiup cluster list
tiup cluster display tidb-test
四、配置DR-Atuo-Sync
如下步骤执行DR Auto-sync集群配置操作。
4.1、配置 Placement Rules 规则
为集群配置 Placement Rules,规划集群副本的放置位置,标记各副本角色。
IDC1中心规则配置文件、作为当前的生产中心(Primary):dr_auto_sync_idc1_rule.json
[
{
"group_id": "pd",
"group_index": 0,
"group_override": false,
"rules": [
{
"group_id": "pd",
"id": "voters",
"start_key": "",
"end_key": "",
"role": "voter",
"count": 3,
"label_constraints": [{"key": "zone","op": "in","values": ["idc1"]}],
"location_labels": ["zone","rack","host"]
},
{
"group_id": "pd",
"id": "followers",
"start_key": "",
"end_key": "",
"role": "follower",
"count": 2,
"label_constraints": [{"key": "zone","op": "in","values": ["idc2"]}],
"location_labels": ["zone","rack","host"]
},
{
"group_id": "pd",
"id": "learners",
"start_key": "",
"end_key": "",
"role": "learner",
"count": 1,
"label_constraints": [{"key": "zone","op": "in","values": ["idc2"]}],
"location_labels": ["zone","rack","host"]
}
]
}
]
IDC2中心规则配置文件、作为当前的灾备中心(DR):dr_auto_sync_idc2_rule.json
[
{
"group_id": "pd",
"group_index": 0,
"group_override": false,
"rules": [
{
"group_id": "pd",
"id": "voters",
"start_key": "",
"end_key": "",
"role": "voter",
"count": 3,
"label_constraints": [{"key": "zone","op": "in","values": ["idc2"]}],
"location_labels": ["zone","rack","host"]
},
{
"group_id": "pd",
"id": "followers",
"start_key": "",
"end_key": "",
"role": "follower",
"count": 2,
"label_constraints": [{"key": "zone","op": "in","values": ["idc1"]}],
"location_labels": ["zone","rack","host"]
},
{
"group_id": "pd",
"id": "learners",
"start_key": "",
"end_key": "",
"role": "learner",
"count": 1,
"label_constraints": [{"key": "zone","op": "in","values": ["idc1"]}],
"location_labels": ["zone","rack","host"]
}
]
}
]
注意项:
id不能重复,建议写 voters,followers,learners 用于区分各副本用途;
role 写副本的角色(voter、follower、learner);
location_labels 需要与 PD 的 label 保持一致;
label_constraints 可以填写不同的颗粒度,比如中心、机架、机器。但是key的值,必须在 PD 的 label 中存在,比如颗粒度是中心,key 就需要写成 zone,颗粒度是机器,key需要写成host;
备份原始 Placement Rules,便于回退:pd-ctl config placement-rules rule-bundle load --out="default.json"。
4.2、启用自适应同步模式
#查看当前placement rule
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 config placement-rules show
#备份原始 Placement Rules,便于回退
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 config placement-rules rule-bundle load --out="default.json"
#修改placement rule配置
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 config placement-rules rule-bundle save --in="/opt/tidb-server-v7.1.8-5.3-linux-amd64/dr_auto_sync_idc1_rule.json"
4.3、配置 DR Auto-Sync
DR-Auto-Sync 相关配置,涉及主中心和副中心的标签、副本数、集群同步降级阻塞时间等。
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 -i #进入命令行的交互模式
#修改dr-auto-sync 模式
config set replication-mode dr-auto-sync
#配置dr-auto-sync 的机房标签
config set replication-mode dr-auto-sync label-key zone
#配置主中心
config set replication-mode dr-auto-sync primary idc1
#配置副中心
config set replication-mode dr-auto-sync dr idc2
#配置主中心副本数量
config set replication-mode dr-auto-sync primary-replicas 3
#配置副中心非learner副本数量
config set replication-mode dr-auto-sync dr-replicas 2
#当出现网络隔离或者故障时,降级为异步模式的等待时间(可选)
#当阻塞窗口设置为0时,两个可用区将保持在异步复制状态。
config set replication-mode dr-auto-sync wait-store-timeout "15s"
#开启 ACID 恢复功能(可选)
config set replication-mode dr-auto-sync pause-region-split true
#查看配置是否生效
config show replication-mode
说明:
- replication-mode 为待启用的复制模式,以上示例中设置为 dr-auto-sync。默认使用 majority 算法。
- label-key 用于区分不同的中心,需要和 Placement Rules 相匹配。
- primary 是主中心 zone 的值,即 idc1。
- dr 是备中心 zone 的值,即 idc2。
- primary-replicas 是主中心副本的数量。
- dr-replicas 是备中心副本的数量。
检查配置是否生效
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 config show replication-mode
查看同步状态
curl http://192.168.68.101:2379/pd/api/v1/replication_mode/status
{
"mode": "dr-auto-sync",
"dr-auto-sync": {
"label_key": "zone",
"state": "sync",
"state_id": 1004,
"acid_consistent": true
}
}
#或者查看Grafana
http://192.168.68.100:3000 #路径:tidb-test-PD -> DR Autosync
Dr-Auto-Sync 日常运维主要关注主、副中心数据同步状态和 Region Leader 、PD Leader 分布情况,可以通过设置监控告警为运维人员及时提供信息。
4.4、查看副本分布情况
tiup cluster display tidb-test --labels
#或者
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 store --jq='.stores[]|{zone:.store|.labels[],address:.store|.address,leader_count: .status|.leader_count}'|grep idc1
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 store --jq='.stores[]|{zone:.store|.labels[],address:.store|.address,leader_count: .status|.leader_count}'|grep idc2
注:如上图所示,当前region的leader副本都分布在idc1可用区。
4.5、使用 jq 查看 TiKV 和 region 关键信息
- 查看 store 基本信息store --jq=".stores[] | {id: .store.id, address: .store.address, state_name: .store.state_name, capacity: .status.capacity, available: .status.available, region_count: .status.region_count}"
- 列出所有 regionregion --jq=".regions[] | {id:.id}"
- 检查没有 learner peer 的 regionregion --jq='.regions[] | select(.peers | any(.role_name=="Learner") | not) | {id: .id, peers: [.peers]}'
五、容灾切换验证
DR-Auto-Sync 集群支持计划内切换和计划外切换(故障抢修)两种模式的容灾切换操作。
- 计划内切换:有计划的主中心、副中心角色转换,常用于日常容灾演练、副中心业务验证、计划内机房硬件维护等场景,具备操作简单、业务无感知等优点。
- 计划外切换:应对主中心机房级故障导致的集群不可用,通过人工干预快速恢复集群并对外提供服务。操作相对复杂,在大部分场景下提供 RPO=0、RTO<1 min(从中心故障) 或 RTO<10 min(主中心故障)的容灾保障。
5.1、计划内切换
Dr-Auto-Sync 计划内切换的目标是完成主副中心的转换,将 PD Leader,Region Leader 等资源迁移至副中心。主要涉及集群环境前置检查、PD 扩缩容、TiKV 角色转换、PD Leader 切换四个步骤。
5.1.1、前置检查
为确保计划内切顺利完成,需要在切换操作前进行如下操作:
#集群状态检查
tiup cluster display tidb-test
curl http://192.168.68.101:2379/pd/api/v1/replication_mode/status
chronyc sourcestats
#元数据备份/同步
scp -r /opt/tidb-server-v7.1.8-5.3-linux-amd64 root@192.168.68.113:/opt/
scp -r /home/tidb/.tiup tidb@192.168.68.113:/home/tidb/
#在灾备中心验证元数据信息
tiup mirror show
tiup cluster list
tiup cluster display tidb-test
5.1.2、PD 扩缩容
计划内切换前置步骤,通过 PD 缩扩容,实现 PD 实例迁移工作,确保 IDC1/2 机房中心角色转换后,新的主中心(IDC2) PD 实例数满足单中心多数派选举需求。(注意:选择 IDC1 非 PD Leader 实例进行缩容,规避 PD Leader 切换带来的业务影响)
先扩容PD到同城容灾中心
下面的命令会刷新所有组件的启动脚本,将新的 pd 加到各个组件的启动脚本中,但不会重启 tidb,tikv 和 pd。因此不会造成集群服务闪断或中止。
# 获取pd实例信息
tiup cluster display tidb-test -R pd
ID Role Host Ports OS/Arch Status Data Dir Deploy Dir
-- ---- ---- ----- ------- ------ -------- ----------
192.168.68.101:2379 pd 192.168.68.101 2379/2380 linux/x86_64 Up|L /data/tidb-data/pd-2379 /opt/tidb-deploy/pd-2379
192.168.68.102:2379 pd 192.168.68.102 2379/2380 linux/x86_64 Up /data/tidb-data/pd-2379 /opt/tidb-deploy/pd-2379
192.168.68.103:2379 pd 192.168.68.103 2379/2380 linux/x86_64 Up|UI /data/tidb-data/pd-2379 /opt/tidb-deploy/pd-2379
# 扩容DC2机房pd实例
pd_servers:
- host: 192.168.68.104
name: "pd-104"
client_port: 2379
peer_port: 2380
deploy_dir: "/opt/tidb-deploy/pd-2379"
data_dir: "/data/tidb-data/pd-2379"
log_dir: "/opt/tidb-deploy/pd-2379/log"
#执行如下命令扩容
tiup cluster scale-out tidb-test pd-scale-out-104.yaml -utidb -p
#再次查看pd实例信息
tiup cluster display tidb-test -R pd
ID Role Host Ports OS/Arch Status Data Dir Deploy Dir
-- ---- ---- ----- ------- ------ -------- ----------
192.168.68.101:2379 pd 192.168.68.101 2379/2380 linux/x86_64 Up|L /data/tidb-data/pd-2379 /opt/tidb-deploy/pd-2379
192.168.68.102:2379 pd 192.168.68.102 2379/2380 linux/x86_64 Up /data/tidb-data/pd-2379 /opt/tidb-deploy/pd-2379
192.168.68.103:2379 pd 192.168.68.103 2379/2380 linux/x86_64 Up|UI /data/tidb-data/pd-2379 /opt/tidb-deploy/pd-2379
192.168.68.104:2379 pd 192.168.68.104 2379/2380 linux/x86_64 Up /data/tidb-data/pd-2379 /opt/tidb-deploy/pd-2379
手工将IDC1中的PD leader切换至同城容灾中心IDC2
注意:要将 leader 角色切换至集群原有 PD 而不是新扩容的 PD 上,这是为了防止由于元信息注册滞后造成集群不可用的风险。
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 member leader show
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.101:2379 member leader transfer pd-103
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 member leader show
#查看集群PD实例信息
tiup cluster display tidb-test -R pd
调整pd实例优先级别,确保 pd leader 始终处于主中心(idc2)
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 -i
# IDC2 pd 实例
member leader_priority pd-103 100
member leader_priority pd-104 100
# IDC1 pd 实例
member leader_priority pd-101 50
member leader_priority pd-102 50
#查看pd成员信息
member show
缩容当前生产中心(IDC1)非Leader节点
下面的命令会刷新所有组件的启动脚本,将新的 pd 加到各个组件的启动脚本中,但不会重启 tidb,tikv 和 pd。因此不会造成集群服务闪断或中止。
#选择DC1机房原非pd leader 实例进行缩容操作,规避pd leader 切换带来的业务影响
tiup cluster scale-in tidb-test -N 192.168.68.102:2379
#查看集群PD实例信息
tiup cluster display tidb-test -R pd
#如果在IDC1中心执行的如上命令,再执行如下命令把集群信息复制到IDC2中,以免在IDC2查看是集群信息不一致。
scp -r .tiup/storage/cluster/clusters/tidb-test tidb@192.168.68.113:/home/tidb/.tiup/storage/cluster/clusters/
5.1.3、TiKV 角色转换
TiKV 角色转换涉及 Placement Rules 配置修改,DR-Auto-Sync 数据中心角色配置对换,主/副中心 Region Leader 数量统计等操作。
- 通过修改 Placement Rules 配置,完成主/副中心 TiKV 角色转换 (DC1:2 Follower + 1 Learner,DC2:3 Voter)。PD Leader 根据新的 Placement Rules 配置,重新调度 Region Leader。
- pd-ctl 调整 DR-Auto-Sync primary/dr dc 配置,完成数据中心角色配置对换。
- 循环统计各 TiKV Region Leader 数量,确保 DC1 Region Leader 数为 0。
Placement Rules配置修改
#修改placement rule配置
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 config placement-rules rule-bundle save --in="/opt/tidb-server-v7.1.8-5.3-linux-amd64/dr_auto_sync_idc2_rule.json"
#查看确认配置i修改
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 config placement-rules show
集群主副中心角色转换
# 调整 PRIMARY DC
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 config set replication-mode dr-auto-sync primary idc2
# 调整 DR DC
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 config set replication-mode dr-auto-sync dr idc1
#查看复制模式信息
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 config show replication-mode
#查看集群同步状态
curl http://192.168.68.103:2379/pd/api/v1/replication_mode/status
#查看leader角色副本分别情况
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 store --jq='.stores[]|{zone:.store|.labels[],address:.store|.address,leader_count: .status|.leader_count}' | grep idc1
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 store --jq='.stores[]|{zone:.store|.labels[],address:.store|.address,leader_count: .status|.leader_count}' | grep idc2
#查看learner角色副本分布情况
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 store --jq='.stores[]|{zone:.store|.labels[],address:.store|.address,learner_count: .status|.learner_count}' | grep idc1
tiup ctl:v7.1.8-5.3 pd -u 192.168.68.103:2379 store --jq='.stores[]|{zone:.store|.labels[],address:.store|.address,learner_count: .status|.learner_count}' | grep idc2
#查看集群标签信息情况(leader副本均分布在idc2中)
tiup cluster display tidb-test --labels
注意:转换主备中心角色后,统计观察等到复制状态为sync、idc1中心leader副本数量为0,idc2中心learner副本数量为0时,即完成了DR-Auto-Sync的主备切换操作。