金仓KingbaseES V9读写分离集群部署超详细教程
文章目录
背景
事情的起因是 k神 和 黄哥 在偷偷摸摸玩金仓,我悄咪咪的凑了过来
什么?读写分离集群?看我操作~
一、部署目标
本文记录一次 KingbaseES V9 读写分离集群的部署过程。本文采用两节点主备架构,通过一键部署脚本 cluster_install.sh 完成集群初始化、主库创建、备库克隆、流复制配置、repmgr 管理、VIP 绑定以及守护进程启动。
本次规划如下:
| 项目 | 配置 |
|---|---|
| 主节点 | node1 |
| 备节点 | node2 |
| 主节点 IP | 192.168.40.112 |
| 备节点 IP | 192.168.40.113 |
| VIP | 192.168.40.115 |
| 网关 / trusted_servers | 192.168.40.2 |
| 数据库端口 | 54321 |
| securecmdd 端口 | 8890 |
| 安装用户 | kingbase |
| 数据库安装目录 | /home/kingbase/cluster/install/kingbase |
| 部署工具目录 | /KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip/ |
| 复制模式 | sync 同步复制 |
| 自动恢复级别 | auto_cluster_recovery_level=1 |
说明:本文中的“读写分离集群”是以主备流复制为基础。主库承担读写业务,备库可承担只读查询。如果业务系统需要自动识别 SQL 并完成读写路由,一般还需要结合应用连接池、中间件或 KingbaseRWC 相关组件进一步配置。
二、部署前检查
部署前需要确认以下内容:
- 两台服务器网络互通;
- 两台服务器系统时间同步;
- 两台服务器主机名、IP 地址规划正确;
- 数据库端口
54321未被占用; securecmdd端口8890未被占用;- VIP
192.168.40.115未被其他服务器占用; - 安装介质、授权文件、部署工具准备完整;
root用户和kingbase用户可以正常登录;- 防火墙、SELinux、资源限制等系统参数满足集群部署要求。
检查端口:
ss -lntp | egrep '54321|8890'
检查 VIP 是否已存在:
ip addr | grep 192.168.40.115
ping 192.168.40.115
正常情况下,部署前 VIP 不应该被任何节点占用。


三、操作系统基础配置
3.1 修改主机名
在 node1 执行:
hostnamectl set-hostname node1

在 node2 执行:
hostnamectl set-hostname node2

查看主机名:
hostname
3.2 配置主机名解析
两台服务器都需要修改 /etc/hosts:
vi /etc/hosts
添加如下内容:
192.168.40.112 node1
192.168.40.113 node2


保存后分别测试:
ping node1
ping node2


3.3 给普通用户增加 ping 权限
部分系统中普通用户默认无法执行 ping,部署脚本检查时可能会失败,因此需要给 /usr/bin/ping 增加执行权限。
两台服务器都执行:
chmod +x /usr/bin/ping
检查权限:
ls -l /usr/bin/ping


3.4 关闭防火墙或放通端口
实验环境可以直接关闭防火墙:
systemctl stop firewalld
systemctl disable firewalld


如果生产环境不能关闭防火墙,则至少需要放通:
22/tcp
54321/tcp
8890/tcp
3. 5 关闭 SELinux
查看 SELinux 状态:
getenforce
临时关闭:
setenforce 0
永久关闭:
vi /etc/selinux/config
修改为:
SELINUX=disabled
生产环境建议提前评估安全策略,不建议未经确认直接关闭。

3.6 检查系统时间同步
两台服务器时间必须保持一致:
date
timedatectl


如果时间偏差较大,需要配置 NTP 或 chrony。
四、在 node1 安装 KES 客户端组件
本文采用在 node1 上安装客户端组件的方式获取部署工具目录。
4.1 挂载安装镜像
在 node1 执行:
cd /install
ls
挂载 ISO:
mount KingbaseES_V009R001C001B0025_Lin64_install.iso /mnt
查看挂载内容:
ls /mnt
正常可以看到:
setup
setup.sh

4.2 创建安装目录
mkdir -p /KingbaseES/V9
chown -R kingbase:kingbase /KingbaseES/V9
chmod -R 755 /KingbaseES

4.3 图形化安装客户端组件
切换到图形界面,使用 kingbase 用户登录系统,然后执行:
cd /mnt
./setup.sh
加载的时候开新窗口见第五部分




安装类型选择客户端组件,安装路径选择:
/KingbaseES/V9




返回root用户注册系统服务
/KingbaseES/V9/install/script/root.sh

安装完成后检查部署脚本:
find /KingbaseES -name cluster_install.sh

五、准备授权文件 license.dat
在 node1 上进入授权文件所在目录:
cd /install
ls
解压授权文件:
unzip license_企业版_90天.zip
进入解压后的目录:
cd license_34148
将授权文件重命名为 license.dat:
mv license_34148_0.dat license.dat
复制到部署工具目录(第四部分完成后执行此操作):
cp license.dat /KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip/
检查授权文件是否存在:
find /KingbaseES -name license.dat
正常应返回:
/KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip/license.dat

六、创建集群部署目录
两台服务器均使用 kingbase 用户创建目录。
node1:
su - kingbase
mkdir -p /home/kingbase/cluster/install
node2:
su - kingbase
mkdir -p /home/kingbase/cluster/install
确认权限:
ls -ld /home/kingbase/cluster/install
如果权限异常,使用 root 调整:
chown -R kingbase:kingbase /home/kingbase/cluster


七、修改 install.conf 配置文件
进入部署工具目录:
cd /KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip
先备份配置文件:
cp install.conf install.conf.bak
编辑配置文件:
vi install.conf
核心配置如下:
all_ip=(192.168.40.112 192.168.40.113)
install_dir="/home/kingbase/cluster/install"
zip_package="/KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip/db.zip"
license_file=(license.dat)
db_user="system"
db_password="kingbase"
db_port="54321"
trusted_servers="192.168.40.2"
virtual_ip="192.168.40.115"
net_device=(ens192)
net_device_ip=(192.168.40.112 192.168.40.113)
deploy_by_sshd="1"
use_scmd=1
ssh_port="22"
scmd_port="8890"
synchronous='sync'
auto_cluster_recovery_level='1'
参数说明
| 参数 | 说明 |
|---|---|
| all_ip | 集群节点 IP 列表,顺序通常决定初始主备角色 |
| install_dir | 集群安装基础目录 |
| zip_package | 数据库压缩包 db.zip 的绝对路径 |
| license_file | 授权文件名,只写文件名即可 |
| db_password | 数据库 system 用户密码 |
| db_port | 数据库监听端口,默认 54321 |
| trusted_servers | 仲裁网关或可信服务器地址 |
| virtual_ip | 集群 VIP |
| net_device | 承载 VIP 的网卡名 |
| net_device_ip | 各节点网卡上的实际 IP 地址 |
| use_scmd | 是否使用 sys_securecmd 通信,1 表示使用 |
| synchronous | 同步复制模式,sync 表示同步集群 |
| auto_cluster_recovery_level | 自动恢复级别,1 表示启用自动恢复 |
查看网卡名称:
ip addr
如果实际网卡不是 ens192,例如是 eth0需要按实际情况修改:
net_device=(eth0)

检查关键配置:
cat install.conf | grep -iE '^trusted|virtual|use_scmd|auto_cluster|synchronous|net_device'

八、配置节点间 SSH 互信
以root用户在 node1 上进入部署工具目录:
cd /KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip
chmod +x trust_cluster.sh
chmod +x cluster_install.sh
ls -l trust_cluster.sh cluster_install.sh
执行互信配置脚本:
./trust_cluster.sh
执行过程中根据提示输入 yes 和对应用户密码。



如果出现:
Host key verification failed
可以先手动登录一次目标节点:
ssh 192.168.40.113
ssh 192.168.40.112
必要时清理旧的 known_hosts:
ssh-keygen -R 192.168.40.112
ssh-keygen -R 192.168.40.113
然后重新执行:
./trust_cluster.sh
验证互信:
ssh 192.168.40.112 hostname
ssh 192.168.40.113 hostname


如果无需输入密码并正常返回主机名,说明互信配置成功。
九、部署 securecmdd
securecmdd 是 Kingbase 集群内部通信的重要组件。如果配置 use_scmd=1,需要确保各节点能够正常启动 sys_securecmdd。
9.1 分发 securecmdd.zip
在 node1 执行:
cd /KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip
cp securecmdd.zip /home/kingbase/cluster/install/
scp securecmdd.zip kingbase@192.168.40.113:/home/kingbase/cluster/install/
9.2 两台节点解压
node1:
cd /home/kingbase/cluster/install
unzip securecmdd.zip

node2:
cd /home/kingbase/cluster/install
unzip securecmdd.zip

9.3 初始化并启动 securecmdd
node1 使用 root 执行:
cd /home/kingbase/cluster/install/securecmdd/bin
sh sys_HAscmdd.sh init
sh sys_HAscmdd.sh start

node2 使用 root 执行:
cd /home/kingbase/cluster/install/securecmdd/bin
sh sys_HAscmdd.sh init
sh sys_HAscmdd.sh start

检查服务:
systemctl list-dependencies | grep securecmdd.service
查看端口:
ss -lntp | grep 8890


9.4 部署前停止临时 securecmdd
如果后续使用 cluster_install.sh 自动部署并重新配置 securecmdd,可以在正式安装前停止当前临时 securecmdd。
node1:
cd /home/kingbase/cluster/install/securecmdd/bin
./sys_HAscmdd.sh stop

node2:
cd /home/kingbase/cluster/install/securecmdd/bin
./sys_HAscmdd.sh stop

十、执行一键部署
正式部署前,建议确认两台节点没有残留数据库进程:
ps -ef | grep kingbase | grep -v grep
如果有节点没有停的话需要停一下
su - kingbase
/KingbaseES/V9/KESRealPro/V009R001C001B0025/Server/bin/sys_ctl -D /KingbaseES/V9/data stop -m fast


如果之前部署失败,需要清理旧目录:
rm -rf /home/kingbase/cluster/install/kingbase
注意:该命令会删除原有数据库目录,生产环境严禁直接执行,必须确认无有效数据或已完成备份。
在 node1 上使用 kingbase 用户执行:
su - kingbase
cd /KingbaseES/V9/KESRealPro/V009R001C001B0025/ClientTools/guitools/DeployTools/zip
./cluster_install.sh







部署脚本会自动完成以下工作:
- 检查
install.conf文件格式; - 检查 VIP 是否已被占用;
- 检查节点网络连通性;
- 检查网卡与 IP 是否匹配;
- 检查数据库端口是否被占用;
- 检查
sys_securecmdd状态; - 检查安装目录是否存在;
- 检查系统参数;
- 创建集群安装目录;
- 解压
db.zip; - 分发数据库文件到备节点;
- 复制授权文件;
- 初始化并启动
sys_securecmdd; - 初始化主库;
- 修改数据库配置文件;
- 创建
esrep数据库和复制用户; - 注册主节点;
- 克隆备库;
- 启动备库;
- 注册备节点;
- 启动整个集群;
- 绑定 VIP;
- 启动
repmgrd和 HA 相关进程。
部署成功末尾一般会看到类似信息:
start up the whole cluster ... OK
Done.
十一、配置环境变量
为了后续执行数据库命令时不需要写完整路径,需要配置 kingbase 用户环境变量。
node1 执行:
su - kingbase
vi ~/.bash_profile
添加:
export KINGBASE_HOME=/home/kingbase/cluster/install/kingbase
export KINGBASE_DATA=/home/kingbase/cluster/install/kingbase/data
export PATH=$PATH:$KINGBASE_HOME/bin
export KINGBASE_PORT=54321
使配置生效:
source ~/.bash_profile
验证:
env | grep -iE 'KINGBASE_DATA|PATH|KINGBASE_PORT'

建议 node2 也配置相同环境变量:
export KINGBASE_HOME=/home/kingbase/cluster/install/kingbase
export KINGBASE_DATA=/home/kingbase/cluster/install/kingbase/data
export PATH=$PATH:$KINGBASE_HOME/bin
export KINGBASE_PORT=54321

十二、集群状态验证
12.1 查看数据库监听端口
netstat -nltp | grep 54321
正常应看到数据库监听在 54321 端口。


12.2 查看 securecmdd 端口
ss -lntp | grep 8890
正常应看到 sys_securecmdd 监听在 8890 端口。


12.3 查看集群状态
repmgr service status --compact
正常状态示例:

其中:
| 字段 | 含义 |
|---|---|
| primary | 当前主库 |
| standby | 当前备库 |
| running | 数据库运行正常 |
| repmgrd running | 守护进程运行正常 |
| Upstream | 当前备库跟随的上游主库 |
12.4 查看主备复制进程
在主节点查看:
ps -ef | grep -i walsender | grep -v grep
在两台节点查看:
ps -ef | grep -i repmgrd | grep -v grep
也可以统计:
ps -ef | grep -iE 'walsender|repmgrd' | grep -v grep | wc -l


12.5 查看 VIP 是否绑定
在主节点执行:
ip addr | grep 192.168.40.115
正常情况下,VIP 应绑定在当前主库节点上。

从其他机器测试:
ping 192.168.40.115

十三、读写验证
13.1 连接主库创建测试表
连接 VIP 或主库 IP:
ksql -h 192.168.40.115 -p 54321 -U system test
默认密码是:12345678ab
创建测试表:
create table rw_test(id int primary key, name varchar(50));
insert into rw_test values(1, 'primary insert test');
select * from rw_test;

13.2 在备库查询数据
连接备库 node2:
ksql -h 192.168.40.113 -p 54321 -U system test
查询:
select * from rw_test;
如果能查到主库插入的数据,说明主备同步正常。

13.3 在备库测试写入限制
在备库执行:
insert into rw_test values(2, 'standby write test');
正常情况下,备库为只读,不允许写入。如果写入被拒绝,说明备库只读状态正常。

十四、手工主备切换
计划内维护时,可以执行手工 switchover,将备库提升为主库,原主库降级为备库。
14.1 切换前检查
在任意节点执行:
repmgr service status --compact
确认当前主备状态正常,且 repmgrd 均为 running。

14.2 在备库执行切换
假设当前 node1 为主,node2 为备,则登录 node2:
su - kingbase
repmgr standby switchover
执行过程中,脚本会完成:
- 暂停 repmgrd;
- 检查当前主库状态;
- 停止旧主库;
- 释放旧主库 VIP;
- 提升备库为新主库;
- 新主库绑定 VIP;
- 原主库作为备库重新加入;
- 恢复 repmgrd;
- 完成 switchover。
成功时会出现类似信息:
STANDBY SWITCHOVER has completed successfully


14.3 查看切换事件
ksql esrep esrep -c "select node_id,event from repmgr.events where event='standby_switchover';"
正常可以看到:
node_id | event
--------+--------------------
2 | standby_switchover

14.4 查看切换后集群状态
repmgr service status --compact
切换后应看到原备库变为 primary,原主库变为 standby

十五、常见问题处理
分享一些我在部署时碰到过的一些问题
15.1 trust_cluster.sh 执行失败
常见报错:
Host key verification failed
处理方法:
ssh-keygen -R 192.168.40.112
ssh-keygen -R 192.168.40.113
ssh 192.168.40.112
ssh 192.168.40.113
./trust_cluster.sh
15.2 VIP 检查失败
如果提示 VIP 已存在,说明 192.168.40.115 已被占用。
检查:
ip addr | grep 192.168.40.115
arp -a | grep 192.168.40.115
ping 192.168.40.115
处理方式:
- 确认是否为旧集群残留 VIP;
- 如果是旧配置,先释放;
- 如果被其他业务占用,需要更换 VIP。
15.3 net_device 配置错误
如果部署时提示网卡 IP 检查失败,通常是 net_device 或 net_device_ip 配置错误。
检查实际网卡:
ip addr
根据实际情况修改:
net_device=(ens192)
net_device_ip=(192.168.40.112 192.168.40.113)
15.4 数据库端口被占用
检查端口:
ss -lntp | grep 54321
如果存在旧数据库进程,需要确认是否可以停止:
sys_ctl -D /home/kingbase/cluster/install/kingbase/data stop -m fast
或者清理旧部署目录:
rm -rf /home/kingbase/cluster/install/kingbase
生产环境必须先备份数据。
15.5 securecmdd 端口被占用
检查:
ss -lntp | grep 8890
停止旧服务:
cd /home/kingbase/cluster/install/securecmdd/bin
./sys_HAscmdd.sh stop
15.6 license 文件找不到
确认授权文件位置:
find /KingbaseES -name license.dat
确保 install.conf 中配置的是:
license_file=(license.dat)
并且 license.dat 与 install.conf、cluster_install.sh 在同一部署工具目录下。
15.7 环境变量不生效
检查:
env | grep KINGBASE
which ksql
which repmgr
如果找不到命令,重新加载:
source ~/.bash_profile
十六、部署完成后的建议
部署完成后,建议保留以下信息作为运维记录:
hostname
ip addr
cat /etc/hosts
env | grep -iE 'KINGBASE|PATH'
repmgr service status --compact
ps -ef | grep -iE 'kingbase|repmgrd|walsender' | grep -v grep
ss -lntp | egrep '54321|8890'
ip addr | grep 192.168.40.115
建议将 install.conf、部署日志、授权文件、集群状态截图统一归档,方便后续故障恢复、扩容、缩容和切换演练。



十七、总结
这次 KingbaseES V9 读写分离集群部署整体走下来,其实流程并不算特别复杂,但细节还是挺多的。真正容易出问题的地方,往往不是数据库本身,而是前期环境准备,比如主机名解析、SSH 互信、网卡名、授权文件路径、旧数据库进程是否停干净,以及 securecmdd 是否占用了端口。
本次部署中,node1 作为主库,node2 作为备库,最终通过 repmgr service status --compact 可以看到主备角色正常,54321 数据库端口和 8890 通信端口也都正常监听,主库上能够看到 walsender 进程,说明主备流复制已经建立成功。后面再通过 VIP 检查,可以确认业务访问入口也已经漂移到当前主库节点上。
个人觉得,部署这类集群时不要急着一上来就跑安装脚本,前面的检查一定要做扎实。尤其是 install.conf 里的路径和网卡配置,一旦写错,脚本执行到一半失败后还要清理残留目录,反而更浪费时间。还有一点就是授权文件 license.dat 一定要放到真正的部署工具目录下,不能只放在表面看起来像的目录里。
更多推荐

所有评论(0)