首页 > 数据库 > 国内数据库 > 金仓数据库普通集群向同城双中心架构不停机改造实施方案
|
项目 |
版本信息 |
服务器信息 |
|
源端集群 |
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分钟以内 | |
现有生产环境为 KES 普通集群(1 主 2 备),数据库版本 V8R3PSI008,业务数据约 1TB,承载线上业务持续运行。 当前服务器硬件上已经部署另一套不同端口的 KES 同城双中心实例。
⚠️ 同一台物理服务器不允许同时部署两套不同实例端口的同城双中心集群, 无法在现有服务器直接原地改造集群为同城双中心 。
不可复用现有业务服务器做改造, 必须新增独立服务器资源,部署一套全新的 KES 同城双中心集群 。
将现有 1 主 2 备 KES 普通集群改造为 KES 同城双中心架构; 受硬件部署约束,申请新增独立服务器资源部署全新同城双中心集群。 采用 快照 SCN 备份还原 + KFS 增量日志同步 实现源业务不停机迁移;数据校验完成后执行业务割接,完成架构改造。
特别说明: 不停机迁移过程中,不支持DDL变更;如果需要DDL变更,需要在不停机迁移前或不停机迁移完成后进行
申请独立新增服务器部署全新 KES 同城双中心集群; 源端原有普通集群全程保持业务对外提供服务,不停止业务; 通过
sys_dump
快照全量备份还原完成初始数据迁移,KFS 做增量日志同步追平迁移期间新增业务数据; 数据一致性校验通过后,业务窗口执行割接切换;割接异常支持回退原有旧集群。
sys_dump
远程快照备份源端业务库 → 目标端本地
sys_restore
还原全量数据 → KFS 增量同步持续追增量数据 → 数据校验 → 业务割接。架构示意图:源端 KES 普通集群(1 主 2 备)→【sys_dump 远程备份】→目标端生产中心 sys_restore 本地还原,KFS 增量同步,目标端包含生产中心、灾备中心。

前置: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
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
/home/flysync/software
,解压,配置 JDK、Ruby 环境变量,写入
.bash_profilejdk-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
输出正常。

--安装依赖包 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/
使用 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

重要:
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中参数,确认无误。
decoderbufs.so
、
kfs_current_query.so
动态库、
decoderbufs.control
扩展文件;缺失则从 KFS 安装包拷贝到 KES 对应 lib、share/extension 目录。
es_rep.conf
参数,逻辑复制必须开启
wal_level=logical说明:
cd /home/kingbase/cluster/install/kingbase/lib/ ls -l decoderbufs.so kfs_current_query.so

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
cd /home/kingbase/cluster/install/kingbase/share/extension ls -l decoderbufs.control
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
\du+ 若没有,赋予超管权限 alter user zyzxyx superuser;
集群架构下默认已包含复制权限
cd /home/kingbase/cluster/install/kingbase/data cat sys_hba.conf | grep replication

修改集群所有节点
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
检查system用户是否能免密访问数据库, 如果不能,配置system用户免密访问数据库。为了步骤 5.2 后台创建扩及复制槽导出快照号。
sys_encpwd -H \* -U system -D \* -P 54321 -W kingbase
创建业务用户、业务库、业务 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;
./fspm install
,拷贝 license 文件。正向同步服务安装示例
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
业务全程不中断;通过快照导出一致性快照号,保障备份点数据一致性。
关键步骤:
fsrepctl -service 服务名 reset -db -y # 清理中间表
特别强调: 不停机迁移过程中,不支持DDL变更;如果需要DDL变更,需要在不停机迁移前或不停机迁移完成后进行
说明:不停机迁移,用的是逻辑复制槽保存的断点来实现指定断点启动。物理复制槽的作用是把wal日志复制到本地。
将源端 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_服务名模式下创建中间表,如图:

⚠️ 重要约束: 该 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、用这个快照号进行不停机迁移。
目标端生产中心主节点 kingbase 用户操作
--配置免密远程访问源端业务数据库 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
--后台执行备份脚本,避免会话断开,备份终止 nohup sh smrz_full_backup.sh &
目标端生产中心节点执行还原,后台运行避免会话中断
--配置免密远程访问源端业务数据库 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 &
备份并还原执行完毕后,回到源端 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;
必须操作,如果不清理,有可能会保存旧的断点和KUFL
su - flysync replicator restart offline fsrepctl services fsrepctl -service kes_source reset -kufl -y #清理 kufl 文件 fsrepctl -service kes_source reset -db -y # 清理中间表
SELECT x'012035D08'::bigint; 注意:需要去除/,且/后的内容如果不足8位,需要在高位补0
输出如下:
smrz=# SELECT x'012035D08'::bigint; int8 ----------- 302210312 (1 row)
fsrepctl -service kes_source online -from-event kb:302210312:302210312 fsrepctl services
fsrepctl -service kes_target reset -all -y fsrepctl -service kes_target online
持续监控 KFS 同步延迟,等待同步延迟趋近于 0,源目标数据基本追平。
fsrepctl services fsrepctl -service kes_target perf
观察appliedLastSeqno是否追平,appliedLatency延迟值小于1s


有以下2种办法:
注意:本业务包含大字段,校验任务开启 “校验大对象” 选项;大数据量场景可选择抽样校验,业务重要表选择全量校验。
扩展:查看目标端库中的中间表,在同步数据库里的flysync_源端服务名模式/flysync_目标端端服务名模式下

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



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

注意: 数据在追平后需要删除步骤5.2创建的逻辑复制槽,否则会卡wal日志
select * from sys_replication_slots ;
select sys_drop_replication_slot('kingbase8_kfs_logical_slot');


前提:KFS 同步延迟≈0,数据一致性校验全部通过;提前确认新同城双中心集群故障切换功能验证正常。
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
--启动反向同步 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
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
割接后新集群出现性能、业务异常,执行回退,业务切回原有 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. 业务侧回收读写权限,锁业务账号,阻断新业务写入源端旧集群。
|
风险项 |
风险说明 |
管控措施 |
|
网络带宽风险 |
1TB 备份传输、KFS 增量同步占用大量带宽,挤压源业务带宽 |
提前评估带宽;业务低峰期执行全量备份;监控网络流量 |
|
同步延迟风险 |
业务高峰期大量写入,KFS 产生同步延迟,割接时数据不一致 |
割接前必须确认同步延迟趋近于 0;业务低峰窗口执行割接;持续监控延迟指标 |
|
硬件部署约束风险 |
复用旧服务器部署两套同城双中心实例,端口冲突,违反架构规范 |
严格使用新增独立服务器部署目标双中心,禁止复用现有服务器 |
|
快照会话风险 |
创建快照的 ksql 会话意外断开,快照失效,备份数据不一致 |
专人值守该会话;备份完成后再执行 commit 关闭会话 |
|
割接风险 |
割接后业务异常 |
割接窗口预留回退时间;提前完成双中心故障切换预验证;完整回退方案就绪 |
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69963491/viewspace-3180381/ ,如需转载,请注明出处,否则将追究法律责任。