ITPub博客

首页 > 数据库 > 国内数据库 > 金仓数据库普通集群向同城双中心架构不停机改造实施方案

金仓数据库普通集群向同城双中心架构不停机改造实施方案

原创 国内数据库 作者:董小姐yyds 时间:2026-08-21 17:20:47 0 删除 编辑

 文档版本说明  

项目

版本信息

服务器信息

源端集群

KES 普通集群 1 主 2备V8R3PSI008

192.168.40.52/53/54

(已经有一套端口25432端口的同城双中心在运行)

目标端集群

KES 同城双中心

V8R3PSI011

生产中心:192.168.40.107/160/161

灾备中心:172.168.15.110/200/201

(161节点部署KFS同步服务和控制台,不影响主节点性能)

端口

54321

数据规模

约 1TB

迁移工具

备份还原、KingbaseFlySync V002R003M083PS002

停机时长

15分钟以内

1 现状及约束说明

1.1 当前现状

现有生产环境为 KES 普通集群(1 主 2 备),数据库版本 V8R3PSI008,业务数据约 1TB,承载线上业务持续运行。 当前服务器硬件上已经部署另一套不同端口的 KES 同城双中心实例。

1.2 硬性架构约束

⚠️ 同一台物理服务器不允许同时部署两套不同实例端口的同城双中心集群, 无法在现有服务器直接原地改造集群为同城双中心 。

1.3 约束结论

不可复用现有业务服务器做改造, 必须新增独立服务器资源,部署一套全新的 KES 同城双中心集群 。

2 变更申请说明

将现有 1 主 2 备 KES 普通集群改造为 KES 同城双中心架构; 受硬件部署约束,申请新增独立服务器资源部署全新同城双中心集群。 采用 快照 SCN 备份还原 + KFS 增量日志同步 实现源业务不停机迁移;数据校验完成后执行业务割接,完成架构改造。

特别说明: 不停机迁移过程中,不支持DDL变更;如果需要DDL变更,需要在不停机迁移前或不停机迁移完成后进行

3 改造总体思路

申请独立新增服务器部署全新 KES 同城双中心集群; 源端原有普通集群全程保持业务对外提供服务,不停止业务; 通过 sys_dump 快照全量备份还原完成初始数据迁移,KFS 做增量日志同步追平迁移期间新增业务数据; 数据一致性校验通过后,业务窗口执行割接切换;割接异常支持回退原有旧集群。

3.1 架构规划

  1. 源端:KES 普通集群(1 主 2 备 V8R3PSI008) :原有生产集群,迁移过程持续对外提供业务访问,不停机。
  2. 目标端:全新 KES 同城双中心(V8R3PSI011) :部署在新增独立服务器,分为生产中心、灾备中心,与源端硬件完全隔离,无端口冲突。
  3. 迁移流程 :目标端执行 sys_dump 远程快照备份源端业务库 → 目标端本地 sys_restore 还原全量数据 → KFS 增量同步持续追增量数据 → 数据校验 → 业务割接。

架构示意图:源端 KES 普通集群(1 主 2 备)→【sys_dump 远程备份】→目标端生产中心 sys_restore 本地还原,KFS 增量同步,目标端包含生产中心、灾备中心。

4 实施前置准备

4.1 服务器与环境资源准备

  1. 申请新增服务器,满足 1TB 业务数据存储、CPU、内存、网络带宽需求;完成操作系统初始化。
  2. 在新增服务器部署完整 KES 同城双中心集群,完成双中心基础配置, 提前预校验双中心内部同步、故障切换功能正常 。
  3. 网络打通:源集群与目标同城双中心集群网络互通;评估备份传输、KFS 日志同步带宽,避免大流量挤占业务带宽影响源端业务。
  4. 完成数据库实例端口、IP、账号、目录规划。

4.2 KFS 环境部署配置(目标端生产中心第 3 节点执行)

前置:JDK8、Ruby 环境、KFS 安装包、license 授权文件准备就绪。  

1. 创建正向、反向同步操作系统用户  

#正向同步用户flysync
useradd flysync
passwd flysync
usermod -G kingbase flysync
#反向同步用户flysync_rev(割接后回写同步使用)
useradd flysync_rev
passwd flysync_rev
usermod -G kingbase flysync_rev

2. 修改操作系统资源限制 编辑 /etc/security/limits.conf ,增加:  

flysync - nproc 8896
flysync - nofile 65536
flysync_rev - nproc 8896
flysync_rev - nofile 65536
  1. 创建目录
su - flysync
mkdir -p /home/flysync/software/
mkdir -p /home/flysync/kfs
mkdir -p /home/flysync/kfsmc
su - flysync_rev
mkdir -p /home/flysync_rev/software/
mkdir -p /home/flysync_rev/kfs
mkdir -p /home/flysync_rev/kfsmc
  1. 上传安装包至 /home/flysync/software ,解压,配置 JDK、Ruby 环境变量,写入 .bash_profile

jdk-8u381-linux-x64.tar.gz

rbenv_2.2.2_linux_x64.zip

KingbaseFlySync-V002R003M083PS002-mc-Linux-x86_64.tar.gz

KingbaseFlySync-V002R003M083PS003-replicator.tar.gz

KingbaseFlySync-V002R002C004PS003-evaluate-x64.tar.gz

PATH=$PATH:/home/flysync/software/rbenv/ruby/bin:/home/flysync/software/jdk1.8.0_381/bin

生效环境变量: source .bash_profile ,校验 java -version 、 ruby -v 输出正常。  

  1. 安装包解压,复制 license 授权文件。
  2. KFS 控制台图形化部署,安装系统依赖包
--安装依赖包
yum install -y libXext libSM libXrender libX11 libXtst xorg-x11-server-utils xauth net-tools
--安装控制台 启动xmanager下的Xmanager - Passive组件
export DISPLAY=192.168.40.1:0.0
cd /home/flysync/software/
./setup.sh
--启动console和compare服务,V2R3版本比V2R2版本少了manager服务,登录方式不变
./console/fsconsole start
./compare/fscompare start
--web界面访问
http://192.168.40.161:8089/

4.3 源端数据库做评估

使用 KFS 评估工具,评估源库:大字段、无主键表、大表记录数; 查看评估报告,识别同步风险项。  

⚠️ 无主键表会影响 KFS 增量同步性能,业务侧优先改造;本项目源库存在大字段,KFS 配置需要开启 lob 支持。

本文中源库中有使用大字段。

cd /home/flysync/software/KingbaseFlySync-V002R002C004PS003-evaluate
cp jdbc/kingbase8-8.6.0-mysql.jar lib/
cd bin
./repevaluate -dbtype kingbase8 -assess all -host 192.168.40.52 -port 54321 -user zyzxyx -pass zyzxyx -db smrz -schema smrz -role master -envHost 192.168.40.52 -envPort 22 -envUser root -envPass dhh -path ./
--查看评估报告
more assess-2026-08-19-15-33-36

4.4 KFS 同步配置文件

重要: repl_java_mem_size ≥ 2048M ;正向同步 ini 配置源端、目标端连接信息,开启大对象 lob 支持; 反向同步配置流程与正向一致, 端口、服务名称必须和正向不冲突。

建议:同步用户使用非业务用户,便于安全管理。

同步类型

RMI 端口

KUFL 端口

服务名

正向同步(源→目标)

11000

3112/4112

kes_source、kes_target

反向同步(目标→源,割接回退用)

21000

5112/6112

kes_source_107、kes_target_52

为了降低对源库的性能影响,在目标端双中心的生产中心第3个节点部署KFS同步服务程序和控制台

正向同步配置文件示例:

cd /home/flysync/kfs/KingbaseFlySync-V002R003M083PS003-replicator/flysync-replicator/samples/ini/
cp flysync_kingbase8-redo_source.ini ~/flysync.ini
[flysync@localhost ini]$ cat ~/flysync.ini | grep -v ^# | grep -v grep
[defaults]
install-directory=/home/flysync/kfs/replicator
profile-script=~/.bash_profile
rmi-port=11000
repl_java_mem_size=2048
[kes_source]
master=192.168.40.161
members=192.168.40.161
replication-host=192.168.40.52
replication-port=54321
replication-user=system
replication-password=zyzxyx
kingbase-dbname=smrz
property=replicator.datasource.global.connectionSpec.databaseMode=mysql
property=replicator.extractor.dbms.tablePatterns=smrz.*
role=master
kufl-port=3112
datasource-type=kingbase
datasource-version=8
kingbase-extractor-method=redo
property=replicator.extractor.dbms.autoIdentity=full
property=replicator.datasource.global.connectionSpec.use_cluster=true
property=replicator.datasource.global.connectionSpec.slave_add=192.168.40.151
property=replicator.datasource.global.connectionSpec.slave_port=54321
property=replicator.datasource.global.connectionSpec.nodeList=node1,node2
repl_auto_recovery_max_attempts=0
repl_auto_recovery_delay_interval=30s
property=replicator.extractor.dbms.minRowsPerBlock=4000
property=replicator.extractor.dbms.enableHeartbeatInterval=true
property=replicator.extractor.dbms.heartbeatInterval=60s
property=replicator.extractor.dbms.alwaysHeartbeat=true
property=replicator.extractor.dbms.enableLob=true
property=replicator.extractor.dbms.maxLobSize=5000000
[kes_target]
master=192.168.40.161
master-kufl-port=3112
members=192.168.40.161
replication-host=192.168.40.107
replication-port=54321
replication-user=system
replication-password=zyzxyx
kingbase-dbname=smrz
property=replicator.datasource.global.connectionSpec.databaseMode=mysql
role=slave
property=replicator.datasource.global.connectionSpec.use_cluster=true
property=replicator.datasource.global.connectionSpec.slave_add=192.168.40.160,192.168.40.161
property=replicator.datasource.global.connectionSpec.slave_port=54321,54321
property=replicator.datasource.global.connectionSpec.nodeList=node1,node2,node3
kufl-port=4112
datasource-type=kingbase
datasource-version=8
svc-remote-filters=dropstatementdata
property=replicator.filter.casetransform.to_upper_case=false
property=replicator.filter.rename.definitionsFile=${replicator.home.dir}/support/filters-config/rename.csv
property=replicator.global.buffer.size=50
property=replicator.applier.dbms.maxRowBatchSize=4000
property=replicator.applier.dbms.optimizeRowEvents=true
property=replicator.session.enable.trigger=false
property=replicator.applier.dbms.enableMergeTxn=true
property=replicator.applier.dbms.statementCacheCapacity=5000
property=replicator.applier.dbms.foreignKeyCheckMode=uncheck
svc_parallelization_type=memory
FFLINE 时,尝试将系统重新置于ONLINE状态的次数
repl_auto_recovery_max_attempts=0
repl_auto_recovery_delay_interval=30s
channels=8
property=replicator.store.parallel-queue.partitionerClass=com.kingbase.flysync.replicator.storage.parallel.LoadBalancingPartitioner

反向同步服务配置文件内容省略, 注意更改flysync.ni中参数,确认无误。

4.5 KES 数据库配置

4.5.1 检查数据库是否已经支持 decoderbufs 插件(源和目标端主节点)

  1. 校验 decoderbufs.so 、 kfs_current_query.so 动态库、 decoderbufs.control 扩展文件;缺失则从 KFS 安装包拷贝到 KES 对应 lib、share/extension 目录。
  2. 业务账号配置 superuser 超级管理员权限,具备复制权限。
  3. 修改集群所有节点 es_rep.conf 参数,逻辑复制必须开启 wal_level=logical

说明:

  • 一般来说都自带,只有定制的一些版本会没有。
  • 复制槽和decoderbufs插件 是相互依赖的,只有源端会创建复制槽 所以只有源端需要配置decoderbufs插件。
4.5.1.1 检查 V8 安装目录下的/lib 目录
  • 检查 V8 安装目录下的/lib 目录,是否有 decoderbuf.so 和 kfs_current_query.so 包
cd /home/kingbase/cluster/install/kingbase/lib/
ls -l decoderbufs.so kfs_current_query.so

  • 若没有,将Kingbase FlySync 安装包中附带的 decoderbuf.so 和 kfs_current_query.so 复制到 Kingbase 安装目录的/lib 目录下。若有省略以下步骤
su - kingbase
scp flysync@192.168.40.161:/home/flysync/kfs/KingbaseFlySync-V002R003M083PS003-replicator/extensions/decoderbufs/kfs_decoderbufs_lib_linux64_v8r3.zip /home/kingbase/software
--根据cpu架构、版本解压 zip 包
cd /home/kingbase/software
unzip kfs_decoderbufs_lib_linux64_v8r3.zip
cp lib/kfs_current_query.so   /home/kingbase/cluster/install/kingbase/lib/
cd /home/kingbase/cluster/install/kingbase/lib/
ls -l decoderbufs.so kfs_current_query.so
4.5.1.2 检查 V8 安装目录下的/share/extension 目录
  • 检查 V8 安装目录下的/share/extension 目录,是否有 decoderbufs.control 文件
cd /home/kingbase/cluster/install/kingbase/share/extension
ls -l decoderbufs.control
  • 若没有,将 Kingbase FlySync 安装包中附带的 decoderbuf.control 复制到 Kingbase 安装目录的/share/extension 目录下。
su - kingbase
cd /home/kingbase/software
cp share/extension/decoderbufs.control /home/kingbase/cluster/install/kingbase/share/extension/
cd /home/kingbase/cluster/install/kingbase/share/extension/
ls -l decoderbufs.control
4.5.1.3 检查用户是否有超管权限
\du+
若没有,赋予超管权限
alter user zyzxyx superuser;
4.5.1.4 检查用户是否有复制权限(源端和目标端所有节点)

集群架构下默认已包含复制权限

cd /home/kingbase/cluster/install/kingbase/data
cat sys_hba.conf | grep replication

4.5.2 复制槽参数配置 (源端和目标端所有节点)

修改集群所有节点 es_rep.conf 参数,逻辑复制必须开启 wal_level=logical

cd /home/kingbase/cluster/install/kingbase/data
vi es_rep.conf
#kfs
wal_level=logical
log_supplement_replica_identity=auto

重启集群生效

--普通集群重启命令 任意节点操作即可
sys_monitor.sh restart
--双中心集群需要每个中心都执行重启命令 任意节点操作即可
sys_monitor.sh restart

4.5.3 检查用户是否配置免密登录(源端)

检查system用户是否能免密访问数据库, 如果不能,配置system用户免密访问数据库。为了步骤 5.2 后台创建扩及复制槽导出快照号。

sys_encpwd -H \* -U system -D \* -P 54321 -W kingbase

4.5.4 创建业务用户和业务库(目标端)

创建业务用户、业务库、业务 schema,创建 KFS 对比支撑库 compare。

--创建业务库
create user zyzxyx with password 'zyzxyx' superuser;
create database smrz owner zyzxyx;
\c smrz 
create schema smrz AUTHORIZATION zyzxyx ;
--创建kfs控制台支撑库
create database compare;

4.7 KFS 服务初始化安装

  1. 将 kes 驱动 jar 包复制到 replicator lib 目录。
  2. 执行服务安装脚本 ./fspm install ,拷贝 license 文件。
  3. 正向、反向同步服务初始启动为 offline 状态。

正向同步服务安装示例

cp /home/flysync/kfs/KingbaseFlySync-V002R003M083PS003-replicator/extensions/jdbc/kingbase8-8.6.0-mysql.jar /home/flysync/kfs/KingbaseFlySync-V002R003M083PS003-replicator/flysync-replicator/lib/
cd /home/flysync/kfs/KingbaseFlySync-V002R003M083PS003-replicator/tools/
./fspm install
cp /home/flysync/software/license.dat /home/flysync/kfs/replicator/
source ~/.bash_profile
replicator start offline

反向步骤相同,安装完成后记得 replicator start offline

5 不停机全量数据迁移

业务全程不中断;通过快照导出一致性快照号,保障备份点数据一致性。

关键步骤:

  1. 源端 KFS 同步服务 online
  2. KES 中开启事务、设置事务隔离级别、手动创建复制槽,导出快照
  3. sys_dump 快照备份
  4. sys_restore 快照还原
  5. 步骤 2 会话中 commit 提交事务,退出会话 (创建一个后台脚本保持会话活跃,避免会话超时关闭)
  6. 源端 KFS 同步服务执行 reset : fsrepctl -service 服务名 reset -kufl -y #清理 kufl 文件  

                                 fsrepctl -service 服务名 reset -db -y  # 清理中间表

  1. 源端指定event ID解析  fsrepctl -service XX online -from-event kb:lsn:lsn  指定断点启动  
  2. 目标端 KFS 同步服务启动
  3. 查看同步情况

特别强调: 不停机迁移过程中,不支持DDL变更;如果需要DDL变更,需要在不停机迁移前或不停机迁移完成后进行

说明:不停机迁移,用的是逻辑复制槽保存的断点来实现指定断点启动。物理复制槽的作用是把wal日志复制到本地。

5.1 源端同步服务online

将源端 KFS 离线(offline),源端和目标端 KFS 同时执行 reset 命令,确认中间表、kufl 文件、复制槽等被删除。

su - flysync
replicator start offline
fsrepctl -service kes_source reset -all -y
fsrepctl -service kes_source online
fsrepctl services  --state显示online
kufl -service kes_source list -last 10 -sql | grep smrz  --确保已经解析有业务数据,适用于业务频繁操作的场景,如果业务不繁忙,需人为确认flysync.ini中同步范围配置正确,能解析出心跳也行
kufl -service kes_source list -last 10 -sql 
select slot_name,plugin,database from sys_replication_slots ;
或
select * from sys_replication_slots ;

注:KFS V2R3 和 V2R2版本还是有一些区别的,V2R2是在源端创建逻辑复制槽, V2R3是在源端库里创建物理复制槽,使用redo解析可以有效降低长事务对KES的影响。

扩展:源端库中的会在同步业务库里flysync_服务名模式下创建中间表,如图:

5.2 源端创建逻辑复制槽、导出快照号

⚠️ 重要约束: 该 ksql 会话事务不能关闭,不能退出,直到备份完成 commit 提交;一旦会话断开快照失效,会造成数据不一致。如果用后台操作,务必验证system用户或者创建复制槽导出快照号的用户能免密登录。

在目标端生产中心主节点上进行远程快照备份源端业务库数据

--远程连接源端数据库  replication=database  #这个是固定参数,直接写就行
ksql -d "host=192.168.40.52 user=zyzxyx password=zyzxyx replication=database  dbname=smrz  port=54321" 
--开启事务
begin transaction;
--设置事务隔离级别
set transaction_isolation to "repeatable read";
--手动创建复制槽,导出快照。两个语句在同一行执行,用分号隔开
select sys_create_logical_replication_slot('kingbase8_kfs_logical_slot', 'decoderbufs');select sys_export_snapshot();

注意:

1、此处有风险,如果在create复制槽的同时有数据生成,可能会有丢 数(快照没卡住)

2、记录查出来的快照号和事务号 ,后续 sys_dump 备份使用该快照号。  

3、不能关闭事务,也不要退出ksql连接(备份完成或者DTS迁移数据完成,就可以关闭连接),否则会丢快照

4、不停机迁移过程中,不支持DDL变更;如果需要DDL变更,需要在不停机迁移前或不停机迁移完成后进行

[kingbase@localhost ~]$ ksql -d "host=192.168.40.52 user=zyzxyx password=zyzxyx replication=database  dbname=smrz  port=54321"
Licesen Type: SALES-企业版.
Type "help" for help.
smrz=# begin transaction;
BEGIN
smrz=# set transaction_isolation to "repeatable read";
SET
smrz=# select sys_create_logical_replication_slot('kingbase8_kfs_logical_slot', 'decoderbufs');select sys_export_snapshot();
INFO:  Exiting startup callback
   sys_create_logical_replication_slot
-----------------------------------------
 (kingbase8_kfs_logical_slot,0/12035D08)  --记住lsn号
(1 row)
 sys_export_snapshot
---------------------
 00000011-00000200-1   --记住快照号,后面sys_dump备份要用
(1 row)

扩展:后台创建逻辑复制槽、导出快照号步骤

如果KES源端数据库是VPN访问,经常会断网的环境,使用下面方法在 后台创建复制槽和快照并保持会话不丢失

1、在kes源端创建保持会话活动的存储过程

su - kingbase
ksql smrz system
-- 创建保持活跃的存储过程
CREATE OR REPLACE PROCEDURE keep_session_alive(
  interval_seconds INT DEFAULT 60,  -- 间隔时间(默认60秒)
  max_loops INT DEFAULT 0           -- 循环次数(0表示无限循环)
)
AS $$
DECLARE
  loop_count INT := 0;
BEGIN
  RAISE NOTICE '会话保活程序已启动,间隔时间:%秒,循环次数:%', 
               interval_seconds, 
               CASE WHEN max_loops = 0 THEN '无限' ELSE max_loops::TEXT END;
  -- 循环逻辑
  LOOP
    -- 执行轻量级查询保活
    PERFORM 1;  -- 等效于 SELECT 1,但无需返回结果
    -- 更新计数器
    loop_count := loop_count + 1;
    -- 达到指定次数后退出(max_loops=0时无限循环)
    IF max_loops > 0 AND loop_count >= max_loops THEN
      RAISE NOTICE '已达到最大循环次数,退出。';
      EXIT;
    END IF;
    -- 等待指定间隔
    PERFORM pg_sleep(interval_seconds);
  END LOOP;
END;
$$ LANGUAGE plpgsql;

2、在KES数据库服务器上创建shell脚本,执行创建复制槽和快照

注意:keep_session_alive(60, 1000)  若时长不够可进行更改

su - kingbase
vi kes_export_snapshot.sh
#添加以下内容
source ~/.bash_profile
echo "KES创建快照和复制槽"
ksql  smrz system <<EOF
begin;
set transaction_isolation to "repeatable read";
select sys_create_logical_replication_slot('source_kes52tokes107_3112_kfs_logical_slot', 'decoderbufs');select sys_export_snapshot();
CALL keep_session_alive(60, 1000);--前面是间隔几秒循环一次,后面是循环次数,0是永远在循环,两者相乘就是这个会话可以保持多少时间。
end;
EOF
echo "已退出会话!"

3、给脚本加上可执行权限

chmod +x kes_export_snapshot.sh

4、后台执行脚本

nohup ./kes_export_snapshot.sh &
#脚本执行必须在源端服务做完reset后

5、在nohup.out文件中查看创建的快照号

cat nohup.out
KES创建快照和复制槽
BEGIN
SET
INFO:  Exiting startup callback
    sys_create_logical_replication_slot    
-------------------------------------------
 (m_kes_3114_kfs_logical_slot,25/B23E2030)
(1 row)
 sys_export_snapshot 
---------------------
 00000006-0001231D-1
(1 row)

6、用这个快照号进行不停机迁移。

5.3 目标端执行远程 sys_dump 快照备份

目标端生产中心主节点 kingbase 用户操作

  1. 配置数据库免密访问
--配置免密远程访问源端业务数据库 
su - kingbase
sys_encpwd -H 192.168.40.52 -U zyzxyx -D smrz -P 54321 -W zyzxyx

2.  编写备份脚本,填入上面记录的快照号,并行备份。  

--编写远程备份脚本
cd /home/kingbase/backup
cat smrz_full_backup.sh
cd /home/kingbase/backup/
sys_dump -h 192.168.40.52 -p 54321 -U zyzxyx -Fd -d smrz --snapshot=00000011-00000200-1 -j 4 --feedback=100 -v -f smrz_full_20260821 >> smrz_full_exp_20260821.log
  1. nohup 后台运行,防止会话断开中断备份  
--后台执行备份脚本,避免会话断开,备份终止
nohup sh smrz_full_backup.sh &

5.4  目标端 sys_restore 本地还原备份集

目标端生产中心节点执行还原,后台运行避免会话中断

--配置免密远程访问源端业务数据库 
su - kingbase
sys_encpwd -H 192.168.40.107 -U zyzxyx -D smrz -P 54321 -W zyzxyx
--后台执行还原,避免会话断开,备份终止
nohup sys_restore -h 192.168.40.107 -p 54321 -U zyzxyx -d smrz   /home/kingbase/backup/smrz_full_20260821 --feedback=100 -v -j 4  > smrz_full_imp_20260821.log &

5.5 备份并还原完成后提交源端事务 (必须操作)

备份并还原执行完毕后,回到源端 ksql 会话执行 commit,关闭事务,退出 ksql 连接。

⚠️ 如果不关闭该会话,后续 KFS 启动会报错失败。

切换到源端kes数据库上创建逻辑复制槽和快照的ksql连接的会话

commit;
\q

如果是后台脚本创建复制槽和导出快照,需要kill掉进程

--查询长会话
select usename,client_addr,pid,pg_blocking_pids(pid) as lock,now()::timestamp-query_start as wait,xact_start,query,state from sys_stat_activity  where state<>'idle'  order by wait desc;
--终止会话
SELECT sys_terminate_backend(24738);	
--再次检查
select usename,client_addr,pid,pg_blocking_pids(pid) as lock,now()::timestamp-query_start as wait,xact_start,query,state from sys_stat_activity  where state<>'idle'  order by wait desc;

6 开启增量同步与数据一致性校验  

  1. 配置源普通集群 → 新建同城双中心集群的增量数据同步(WAL 流复制 / 日志回放),持续同步迁移期间源端产生的新增业务数据;
  2. 持续监控同步延迟,待延迟降低至接近 0,源与目标集群数据基本一致;
  3. 在目标同城双中心集群开展业务功能、数据一致性校验,核对关键业务表、计数、业务逻辑。

6.1 源端 KFS 同步服务执行 reset

必须操作,如果不清理,有可能会保存旧的断点和KUFL

su - flysync
replicator restart offline
fsrepctl services
fsrepctl -service kes_source reset -kufl -y #清理 kufl 文件  
fsrepctl -service kes_source reset -db -y  # 清理中间表

6.2 源端 KFS 同步服务指定断点启动

  1. 将步骤 5.2 中 创建复制槽  sys_create_logical_replication_slot 输出的 LSN 号 转换成 eventid , 通过以下命令进行转换。
SELECT x'012035D08'::bigint;
注意:需要去除/,且/后的内容如果不足8位,需要在高位补0

输出如下:

smrz=# SELECT x'012035D08'::bigint;
   int8
-----------
 302210312
(1 row)

  1. 源端指定event ID解析, 断点启动
fsrepctl -service kes_source online -from-event kb:302210312:302210312
fsrepctl services

6.4 目标端KFS同步服务启动

fsrepctl -service kes_target reset -all -y
fsrepctl -service kes_target online

6.5 持续监控 KFS 同步延迟

持续监控 KFS 同步延迟,等待同步延迟趋近于 0,源目标数据基本追平。

fsrepctl services 
fsrepctl -service kes_target perf

观察appliedLastSeqno是否追平,appliedLatency延迟值小于1s

6.6 数据一致性校验

有以下2种办法:

    • 简易校验:业务关键表记录数人工比对;
    • 推荐方式:登录 KFS 控制台( http://192.168.40.161:8089/ )创建 不停机校验任务 ;

注意:本业务包含大字段,校验任务开启 “校验大对象” 选项;大数据量场景可选择抽样校验,业务重要表选择全量校验。

扩展:查看目标端库中的中间表,在同步数据库里的flysync_源端服务名模式/flysync_目标端端服务名模式下

说明:目录只有KES-KES KES-Oracle Oracle-KES Oracle-Oracle支持不停机校验,如果有大对象,或者数据量较大,分别选择记录大对象和选择抽样比对

如果数据量较大,建议对校验参数进行相应优化

6.7 删除逻辑复制槽 (必须)

注意: 数据在追平后需要删除步骤5.2创建的逻辑复制槽,否则会卡wal日志

select * from sys_replication_slots ;
select sys_drop_replication_slot('kingbase8_kfs_logical_slot');

7 业务割接操作(业务低峰窗口执行)

前提:KFS 同步延迟≈0,数据一致性校验全部通过;提前确认新同城双中心集群故障切换功能验证正常。

  1. 源端业务侧回收读写权限,锁业务账号,阻断新业务写入源端旧集群。
  2. 停止正向 KFS 同步服务,清理正向同步资源
su - flysync
fsrepctl -service kes_source offline
fsrepctl -service kes_target offline
fsrepctl -service kes_source reset -all -y
fsrepctl -service kes_target reset -all -y
replicator stop
  1. 启动反向同步服务(目标集群→源旧集群,用于割接后回退)  
--启动反向同步
su - flysync_rev
fsrepctl -service kes_source_107 reset -all -y 
fsrepctl -service kes_target_52 reset -all -y 
fsrepctl -service kes_source_107 online
fsrepctl -service kes_target_52  online
fsrepctl services
  1. 业务应用切换连接地址,切换至新同城双中心集群。
  2. 割接后验证:业务读写访问、同城双中心内部同步、主备故障切换。
  3. 业务稳定运行一段时间,确认新集群稳定,可下线原有 1 主 2 备普通集群,停止反向同步服务。
su - flysync_rev
fsrepctl -service kes_source_107 offline
fsrepctl -service kes_target_52 offline
fsrepctl -service kes_source_107 reset -all -y 
fsrepctl -service kes_target_52 reset -all -y 
replicator stop

8 业务回退方案(割接异常场景)

割接后新集群出现性能、业务异常,执行回退,业务切回原有 1 主 2 备普通集群。

  1. 业务阻断访问新集群,回收账号权限。
  2. 停止反向同步服务,清理反向同步资源:
su - flysync_rev
fsrepctl -service kes_source_107 offline
fsrepctl -service kes_target_52 offline
fsrepctl -service kes_source_107 reset -all -y 
fsrepctl -service kes_target_52 reset -all -y 
replicator stop

3.   业务侧回收读写权限,锁业务账号,阻断新业务写入源端旧集群。

  1. 业务应用切回源旧集群地址,恢复业务访问。  

9 风险点与管控措施

风险项

风险说明

管控措施

网络带宽风险

1TB 备份传输、KFS 增量同步占用大量带宽,挤压源业务带宽

提前评估带宽;业务低峰期执行全量备份;监控网络流量

同步延迟风险

业务高峰期大量写入,KFS 产生同步延迟,割接时数据不一致

割接前必须确认同步延迟趋近于 0;业务低峰窗口执行割接;持续监控延迟指标

硬件部署约束风险

复用旧服务器部署两套同城双中心实例,端口冲突,违反架构规范

严格使用新增独立服务器部署目标双中心,禁止复用现有服务器

快照会话风险

创建快照的 ksql 会话意外断开,快照失效,备份数据不一致

专人值守该会话;备份完成后再执行 commit 关闭会话

割接风险

割接后业务异常

割接窗口预留回退时间;提前完成双中心故障切换预验证;完整回退方案就绪

10 关键注意事项

  1. 不停机迁移过程中,不支持DDL变更;如果需要DDL变更,需要在不停机迁移前或不停机迁移完成后进行
  2. KFS 版本差异:V2R2 源端创建逻辑复制槽;V2R3 源端创建物理复制槽,实施时注意版本差异。
  3. 大字段场景,KFS 配置务必开启 lob 相关参数,设置合理大对象阈值。
  4. 所有后台备份、还原操作,必须使用 nohup,避免 ssh 会话断开导致任务中断。
  5. 实施前完整备份源集群,保障业务兜底。


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69963491/viewspace-3180381/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
拥有Oracle 11g OCM,KCA,KCP,DCA,PGCA,PGCE等证书,墨天轮技术专家,墨天轮2024年度优秀作者,青学会成员。擅长主流Oracle、MySQL、PG安装部署、故障定位处理、性能优化,金仓、达梦、openGauss系等各种商用和开源国产数据库。

注册时间:2020-02-22

  • 博文量
    33
  • 访问量
    43729