一、解决的问题/场景
在金融、政务、能源等关键行业,核心交易系统对数据库的高可用性、强一致性以及高并发处理能力提出了极高的要求。传统的单机数据库或主备复制架构在面对海量并发访问和极致性能需求时,往往存在以下技术瓶颈:
- 单点故障风险:传统架构中,数据库服务器作为单点存在,一旦发生硬件故障、操作系统崩溃或网络中断,将导致整个业务系统完全瘫痪,服务中断时间可能长达数十分钟甚至数小时,造成的经济损失和声誉影响无法估量。
- 性能扩展瓶颈:随着业务规模增长,数据量呈指数级上升,用户访问量持续攀升。单机数据库的CPU、内存、I/O资源很快成为性能瓶颈,无法通过增加节点实现横向扩展,硬件升级成本高昂且效果有限,难以应对业务高峰期的压力。
- 数据一致性与性能的平衡困境:在传统主备复制架构中,要求数据强一致性就必须采用同步复制,但这会显著增加事务提交延迟,降低系统吞吐量;而采用异步复制虽然性能较好,但存在数据丢失风险。在金融交易、电子支付等场景中,这种两难选择尤为突出。
- 维护窗口限制:系统升级、补丁安装、硬件维护等计划性操作通常需要停机执行,而对于7×24小时运行的关键业务系统,停机窗口几乎不存在。传统架构难以实现真正的在线维护,业务连续性难以保障。
- 跨节点负载均衡能力不足:主备架构中,只有主节点能够处理写操作,备节点通常处于只读状态,无法有效分担写负载。在高并发写入场景下,主节点很容易成为性能瓶颈,而备节点的资源利用率却相对较低。
- 故障恢复时间长:传统架构下,故障切换往往需要人工介入,操作复杂且容易出错。即使配置了自动切换机制,故障检测、角色转换、VIP漂移等过程也通常需要几十秒到数分钟不等,无法满足金融级业务对秒级恢复的要求。
- 集群管理与运维复杂度高:传统集群方案往往需要依赖复杂的第三方集群软件(如Heartbeat、Corosync等),配置繁琐、维护困难,对运维人员的技能要求极高。一旦出现集群脑裂、资源争用等问题,排查和处理难度大。
针对这些痛点,金仓数据库KingbaseES推出的共享存储多写集群(KES RAC)方案,通过“集中式+多写”架构设计,多个数据库实例可并行访问同一套共享存储,实现真正的多点写入与负载均衡,有效提升系统吞吐量和响应速度。实测数据显示,在典型OLTP场景下,相比传统主备模式,共享存储多写集群的写入性能提升达3倍以上,RTO(恢复时间目标)接近于0,RPO(恢复点目标)为0,满足金融级“五个9”(99.999%)高可用标准。
二、解决方法/操作步骤
2.1 总体架构规划
KES RAC集群采用成熟的共享存储架构,其核心组件包括:
共享存储设备:
所有节点通过SAN/NAS或分布式文件系统(如GFS2)访问同一份数据文件、控制文件和重做日志。这是RAC架构的基础,要求存储设备具备高IOPS、低延迟、高可靠性特性。集群件(Clusterware):
基于Pacemaker + Corosync构建的高可用集群管理框架,负责节点状态监控、故障检测与资源调度。它是集群的“大脑”,确保集群的稳定运行。缓存融合机制(Cache Fusion):
通过高速私网互联(InfiniBand/RDMA),实现各节点Buffer Pool间的数据块同步,减少磁盘重复读取,保障内存级数据一致性。这是RAC性能优化的关键技术。全局锁管理器(Global Lock Manager, GLM):
为解决多节点并发写入可能引发的数据冲突问题,引入全局锁管理机制,所有DML操作需先获取对应数据页的全局排他锁。仲裁机制:
为防止因网络分区导致“脑裂”现象,集成QDevice(Quorum Device)投票机制,通常部署于独立第三方节点或云对象存储中。当发生网络分裂时,拥有多数派投票权的子集群继续提供服务,其余节点自动降级。
典型的两节点RAC集群拓扑如下:
┌─────────────┐ ┌─────────────┐
│ Node A │ │ Node B │
│ (Instance) │ │ (Instance) │
└──────┬──────┘ └──────┬──────┘
│ │
└──────────┬───────────┘
│
┌────────▼─────────┐
│ Shared Storage │
│ (SAN/NAS) │
└─────────────────┘
│
┌────────▼─────────┐
│ QDevice (仲裁) │
└─────────────────┘2.2 环境准备阶段
硬件资源规划:根据业务负载评估,两节点RAC集群的硬件配置建议如下:

操作系统准备:
所有节点安装相同版本的Linux操作系统(推荐CentOS 7.9或银河麒麟V10),并进行以下基础配置:
# 1. 创建数据库用户(所有节点执行)
useradd -u 2000 kingbase
echo "kingbase:Kb@2024" | chpasswd
# 2. 配置主机名解析(所有节点执行)
cat >> /etc/hosts << EOF
10.0.1.10 node1
10.0.1.20 node2
10.0.2.10 qdevice
EOF
# 3. 关闭防火墙或配置白名单(所有节点执行)
systemctl 终止 firewalld
systemctl disable firewalld
# 或者开放必要端口
firewall-cmd --permanent --add-port=5400/tcp # Clusterware通信端口
firewall-cmd --permanent --add-port=54321/tcp # 数据库端口
firewall-cmd --permanent --add-port=7788/tcp # Cache Fusion端口
firewall-cmd --reload
# 4. 关闭SELinux(所有节点执行)
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
setenforce 0
# 5. 配置时间同步(所有节点执行)
timedatectl set-ntp true
timedatectl set-timezone Asia/Shanghai
# 6. 配置内核参数(所有节点执行)
cat >> /etc/sysctl.conf << EOF
# 网络优化参数
net.core.rmem_default = 262144
net.core.rmem_max = 16777216
net.core.wmem_default = 262144
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_keepalive_time = 1200
net.ipv4.tcp_keepalive_intvl = 30
net.ipv4.tcp_keepalive_probes = 3
# 共享内存配置(针对RAC集群)
kernel.shmmax = 68719476736 # 64GB
kernel.shmall = 16777216
kernel.sem = 250 32000 100 128
vm.swappiness = 10
EOF
sysctl -p
# 7. 配置用户资源限制(所有节点执行)
cat >> /etc/security/limits.conf << EOF
kingbase soft nproc 65535
kingbase hard nproc 65535
kingbase soft nofile 65535
kingbase hard nofile 65535
kingbase soft stack 8192
kingbase hard stack 8192
EOF
网络配置:
为每个节点配置双网卡,分别用于业务访问和集群内部通信:
# 配置业务网络(eth0)
nmcli connection modify eth0 ipv4.addresses 10.0.1.10/24
nmcli connection modify eth0 ipv4.gateway 10.0.1.1
nmcli connection modify eth0 ipv4.dns "8.8.8.8 8.8.4.4"
nmcli connection up eth0
# 配置集群私有网络(eth1)- 用于Cache Fusion和集群通信
nmcli connection modify eth1 ipv4.addresses 192.168.1.10/24
nmcli connection up eth1
# 配置VIP虚拟IP(在Clusterware中配置)
# VIP: 10.0.1.100/24存储配置:共享存储是RAC集群的核心,需要进行专门的配置:
# 1. 安装多路径软件(所有节点执行)
yum install -y device-mapper-multipath
# 2. 配置多路径(所有节点执行)
cat > /etc/multipath.conf << EOF
defaults {
user_friendly_names yes
path_grouping_policy multibus
failback immediate
no_path_retry fail
}
blacklist {
devnode "^sr[0-9]"
devnode "^loop[0-9]"
}
EOF
# 3. 启动多路径服务(所有节点执行)
systemctl enable multipathd
systemctl start multipathd
# 4. 扫描并识别共享存储设备(在主节点执行)
multipath -ll
# 5. 创建物理卷、卷组、逻辑卷(在主节点执行)
pvcreate /dev/mapper/mpatha1
vgcreate kingbase_vg /dev/mapper/mpatha1
lvcreate -L 1.8T -n kingbase_lv kingbase_vg
# 6. 格式化为XFS文件系统(在主节点执行)
mkfs.xfs /dev/kingbase_vg/kingbase_lv
# 7. 创建挂载点并配置挂载(所有节点执行)
mkdir -p /sharedata/kingbase
# 在 /etc/fstab 中添加挂载配置(所有节点)
cat >> /etc/fstab << EOF
/dev/kingbase_vg/kingbase_lv /sharedata/kingbase xfs defaults,noatime 0 0
EOF
# 8. 挂载共享存储(所有节点执行)
mount /sharedata/kingbase
# 9. 验证所有节点都能正常访问共享存储
# 在node1执行
touch /sharedata/kingbase/test_from_node1
# 在node2执行
ls -l /sharedata/kingbase/test_from_node12.3 Clusterware集群软件部署
获取Clusterware软件包:
在KingbaseES安装目录中找到Clusterware相关软件包:
# 方式一:集成化安装包自动部署
cd /opt/Kingbase/ES/KingbaseRAC/install/scripts
sh rootDeployClusterware.sh
# 方式二:绿色版手动部署
cd /opt
tar -zxvf KingbaseHA.tar.gz
# 如果安装目录不是默认的/opt,需要修改配置文件
sed -i 's|install_dir=/opt|install_dir=/home/kingbase|' /opt/KingbaseHA/share/cluster_manager.conf配置SSH免密登录:在所有节点间配置SSH免密登录,这是Clusterware集群通信的基础:
# 在所有节点生成SSH密钥(如果尚未生成)
su - kingbase
ssh-keygen -t rsa -P '' -f ~/.ssh/id_rsa
# 在node1上配置到其他节点的免密登录
ssh-copy-id kingbase@node1
ssh-copy-id kingbase@node2
# 在node2上配置到其他节点的免密登录
ssh-copy-id kingbase@node1
ssh-copy-id kingbase@node2
# 验证免密登录
ssh node1 "date"
ssh node2 "date"配置Clusterware:编辑集群管理配置文件:
cd /opt/KingbaseHA/bin
# 编辑cluster_manager.conf配置文件
vi cluster_manager.conf
# 主要配置参数说明
cluster_name="kingbase_rac" # 集群名称
cluster_nodes="node1 node2" # 集群节点列表
install_dir="/opt/Kingbase/ES/V9" # KingbaseES安装目录
data_dir="/sharedata/kingbase/data" # 共享存储数据目录
db_user="kingbase" # 数据库用户
db_port="54321" # 数据库端口
vip="10.0.1.100/24" # 虚拟IP地址
vip_nic="eth0" # VIP绑定的网卡
qdevice="10.0.2.10" # 仲裁节点IP初始化投票盘(QDevice):配置仲裁机制防止脑裂:
# 在仲裁节点上执行(需要独立的第三台服务器)
cd /opt/KingbaseHA/bin
# 初始化QDevice
./cluster_manager.sh --qdisk_init
# 配置QDevice参数
vi /opt/KingbaseHA/share/qdevice.conf
# 主要参数
qdevice_host="10.0.2.10" # 仲裁节点IP
qdevice_port="5403" # 仲裁通信端口
qdevice_algorithm="ffsplit" # 仲裁算法
qdevice_heuristics="/opt/KingbaseHA/scripts/heuristics.sh"配置集群节点:在所有节点上执行基础配置初始化:
# 在所有节点执行基础配置
./cluster_manager.sh --base_configure_init
# 这个步骤会自动完成:
# 1. 安装Corosync和Pacemaker
# 2. 配置集群通信参数
# 3. 配置共享存储挂载
# 4. 配置资源约束配置数据库资源:将数据库实例注册为Clusterware管理的资源:
# 在node1上执行以下命令配置数据库资源
# 1. 添加共享存储资源
crm configure primitive FS_KINGBASE ocf:heartbeat:Filesystem \
params device="/dev/kingbase_vg/kingbase_lv" \
directory="/sharedata/kingbase" \
fstype="xfs" \
op start interval="0" timeout="60" \
op 终止 interval="0" timeout="60" \
op monitor interval="20s" timeout="40"
# 2. 添加虚拟IP资源
crm configure primitive VIP_KINGBASE ocf:heartbeat:IPaddr2 \
params ip="10.0.1.100" cidr_netmask="24" nic="eth0" \
op start interval="0" timeout="20" \
op 终止 interval="0" timeout="20" \
op monitor interval="10s" timeout="20"
# 3. 添加Kingbase数据库实例资源
crm configure primitive DB_KINGBASE ocf:kingbase:kingbase \
params sys_ctl="/opt/Kingbase/ES/V9/Server/bin/sys_ctl" \
ksql="/opt/Kingbase/ES/V9/Server/bin/ksql" \
sys_isready="/opt/Kingbase/ES/V9/Server/bin/sys_isready" \
kb_data="/sharedata/kingbase/data" \
kb_dba="kingbase" \
kb_host="0.0.0.0" \
kb_user="system" \
kb_port="54321" \
kb_libs="/opt/Kingbase/ES/V9/Server/lib" \
logfile="/opt/Kingbase/ES/V9/Server/log/kingbase.log" \
op start interval="0" timeout="120" \
op 终止 interval="0" timeout="120" \
op monitor interval="9s" timeout="30"
# 4. 创建资源组(确保启动顺序)
crm configure group KINGBASE_GROUP VIP_KINGBASE FS_KINGBASE DB_KINGBASE
# 5. 配置资源位置约束(资源偏向性)
crm configure location KINGBASE_GROUP_on_node1 KINGBASE_GROUP 1000: node1
crm configure location KINGBASE_GROUP_on_node2 KINGBASE_GROUP 800: node2
# 6. 设置资源粘性(防止资源频繁迁移)
crm configure rsc_defaults resource-stickiness=500
# 7. 验证配置
crm configure show
crm_verify --live-check2.4 数据库实例初始化
初始化第一个节点:在node1上初始化数据库实例:
# 1. 使用kingbase用户登录
su - kingbase
# 2. 初始化数据库(使用共享存储)
cd /opt/Kingbase/ES/V9/Server/bin
./initdb -D /sharedata/kingbase/data --locale=zh_CN.UTF-8 --encoding=UTF8
# 3. 配置数据库参数
cd /sharedata/kingbase/data
# 编辑kingbase.conf
vi kingbase.conf
# 关键配置参数
listen_addresses = '*' # 监听所有地址
port = 54321 # 数据库端口
max_connections = 500 # 最大连接数
shared_buffers = 16GB # 共享缓冲区
effective_cache_size = 48GB # 有效缓存大小
work_mem = 64MB # 工作内存
maintenance_work_mem = 2GB # 维护工作内存
synchronous_commit = off # RAC模式下关闭同步提交
max_wal_senders = 0 # RAC模式下不需要WAL发送进程
wal_level = minimal # RAC模式下设置为minimal
# 启用RAC模式
enable_rac_mode = on # 启用RAC集群模式
rac_node_id = 1 # 节点ID
rac_node_name = 'node1' # 节点名称
rac_private_ip = '192.168.1.10' # 私网IP(用于Cache Fusion)
# 配置共享存储路径
data_directory = '/sharedata/kingbase/data'
hba_file = '/sharedata/kingbase/data/sys_hba.conf'
ident_file = '/sharedata/kingbase/data/sys_ident.conf'
# 4. 配置客户端认证
vi sys_hba.conf
# 添加允许连接的规则
# TYPE DATABASE USER ADDRESS METHOD
host all all 10.0.1.0/24 md5
host all all 192.168.1.0/24 trust
local all all trust
# 5. 启动第一个数据库实例
./sys_ctl -D /sharedata/kingbase/data start
# 6. 创建测试数据库
./ksql -p 54321 -U system -d kingbase -c "CREATE DATABASE testdb;"
配置第二个节点:在node2上配置第二个数据库实例(不需要重新初始化数据目录):
# 1. 使用kingbase用户登录
su - kingbase
# 2. 创建本地配置目录
mkdir -p /home/kingbase/config
# 3. 复制共享存储的配置文件到本地
cp /sharedata/kingbase/data/kingbase.conf /home/kingbase/config/
cp /sharedata/kingbase/data/sys_hba.conf /home/kingbase/config/
# 4. 编辑本地配置文件
vi /home/kingbase/config/kingbase.conf
# 修改RAC节点特定参数
rac_node_id = 2 # 节点ID必须唯一
rac_node_name = 'node2' # 节点名称
rac_private_ip = '192.168.1.20' # 私网IP
# 修改日志文件路径(使用本地存储)
log_destination = 'stderr'
logging_collector = on
log_directory = '/home/kingbase/log'
log_filename = 'kingbase-%Y-%m-%d_%H%M%S.log'
log_rotation_age = 1d
log_rotation_size = 100MB
# 5. 创建本地日志目录
mkdir -p /home/kingbase/log
# 6. 启动第二个数据库实例(指定本地配置文件)
./sys_ctl -D /sharedata/kingbase/data -c /home/kingbase/config/kingbase.conf start
2.5 集群启动与验证
启动Clusterware集群:
# 在所有节点启动Clusterware服务
systemctl enable corosync pacemaker
systemctl start corosync pacemaker
# 查看集群状态
crm status
# 输出示例
Stack: corosync
Current DC: node1 (version 2.0.5-7.el8_2.4-2.el8_2.4) - partition with quorum
Last updated: Thu Mar 19 13:10:50 2026
Last change: Thu Mar 19 13:05:15 2026 by root via cibadmin on node1
2 nodes configured, 3 resources configured
Online: [ node1 node2 ]
Full list of resources:
Resource Group: KINGBASE_GROUP
VIP_KINGBASE (ocf::heartbeat:IPaddr2): Started node1
FS_KINGBASE (ocf::heartbeat:Filesystem): Started node1
DB_KINGBASE (ocf::kingbase:kingbase): Started node1
启动数据库实例:
# 通过Clusterware启动数据库资源
crm resource start DB_KINGBASE
# 或者让Clusterware自动管理资源(推荐)
crm resource cleanup DB_KINGBASE
crm resource cleanup KINGBASE_GROUP
# 查看数据库进程
ps -ef | grep kingbase
# 查看集群资源状态
crm status验证RAC集群功能:
-- 1. 连接到集群VIP(虚拟IP)
ksql -h 10.0.1.100 -p 54321 -U system -d testdb
-- 2. 查看RAC集群节点信息
SELECT node_id, node_name, private_ip, status
FROM sys_rac_nodes;
-- 3. 查看全局锁信息
SELECT lock_type, lock_mode, granted, pid
FROM sys_rac_locks
ORDER BY lock_type;
-- 4. 测试并发写入(在多个会话中同时执行)
-- 会话1
BEGIN;
INSERT INTO test_table VALUES (1, 'from_node1');
COMMIT;
-- 会话2
BEGIN;
INSERT INTO test_table VALUES (2, 'from_node2');
COMMIT;
-- 5. 验证数据一致性
SELECT * FROM test_table;
测试故障切换功能:
# 1. 查看当前主节点
crm status
# 2. 模拟主节点故障(在node1上停止数据库)
crm resource 终止 DB_KINGBASE
# 3. 观察集群自动切换
crm status
# 4. 验证VIP漂移
ip addr show | grep 10.0.1.100
# 5. 验证数据库服务可用性
ksql -h 10.0.1.100 -p 54321 -U system -d testdb -c "SELECT version();"
# 6. 恢复原主节点
crm resource start DB_KINGBASE
2.6 性能优化与监控配置
内存参数优化:针对RAC集群特点进行内存参数调优:
-- 连接到数据库
ksql -h 10.0.1.100 -p 54321 -U system -d testdb
-- 1. 共享内存配置(相比单机需要适当减小)
ALTER SYSTEM SET shared_buffers = '12GB'; -- 减小到物理内存的18%
ALTER SYSTEM SET effective_cache_size = '48GB';
-- 2. 工作内存配置(考虑并发连接数)
ALTER SYSTEM SET work_mem = '128MB';
ALTER SYSTEM SET maintenance_work_mem = '2GB';
-- 3. RAC特定优化参数
ALTER SYSTEM SET enable_rac_mode = on;
ALTER SYSTEM SET rac_cache_fusion_enabled = on;
ALTER SYSTEM SET rac_cache_fusion_max_connections = 16;
-- 4. 检查点配置优化
ALTER SYSTEM SET checkpoint_completion_target = 0.9;
ALTER SYSTEM SET checkpoint_timeout = '15min';
-- 5. 重载配置使参数生效
SELECT sys_reload_conf();
Cache Fusion优化:配置高速缓存融合机制提升节点间数据同步效率:
-- 1. 配置Cache Fusion连接池
ALTER SYSTEM SET rac_cache_fusion_pool_size = '2GB';
-- 2. 配置网络缓冲区
ALTER SYSTEM SET rac_cache_fusion_buffer_size = '8MB';
-- 3. 配置超时参数
ALTER SYSTEM SET rac_cache_fusion_timeout = '30s';
-- 4. 启用自适应缓存融合
ALTER SYSTEM SET rac_cache_fusion_adaptive = on;
监控配置:建立完善的监控体系:
# Prometheus监控配置示例
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'kingbase_rac'
static_configs:
- targets:
- 'node1:9187'
- 'node2:9187'
metrics_path: '/metrics'
params:
collect[]:
- 'cluster_status'
- 'cache_fusion_stats'
- 'global_locks'
- 'node_connections'
# 告警规则配置
groups:
- name: kingbase_rac_alerts
rules:
- alert: ClusterNodeDown
expr: kingbase_cluster_node_up == 0
for: 1m
labels:
severity: critical
annotations:
summary: "RAC集群节点宕机"
- alert: CacheFusionHighLatency
expr: kingbase_cache_fusion_latency_ms > 100
for: 3m
labels:
severity: warning
annotations:
summary: "Cache Fusion延迟过高"
- alert: GlobalLockContention
expr: kingbase_global_lock_wait_ratio > 0.3
for: 5m
labels:
severity: warning
annotations:
summary: "全局锁争用严重"三、经验总结
架构选型与场景匹配:KES RAC集群并非适用于所有场景,需要根据业务特点理性选择。对于高并发写入、强一致性要求、极致性能需求的金融交易、电信计费、电力调度等核心业务,RAC方案能够充分发挥其多点写入优势,性能提升显著。而对于读多写少、数据量相对较小的应用,传统的读写分离集群或主备架构可能更为经济高效。在实际项目中,建议先在测试环境进行充分验证,确认RAC方案能够带来实际性能收益后再投入生产。




