背景

事情的起因是 k神 和 黄哥 在偷偷摸摸玩金仓,我悄咪咪的凑了过来

什么?读写分离集群?看我操作~

一、部署目标

本文记录一次 KingbaseES V9 读写分离集群的部署过程。本文采用两节点主备架构,通过一键部署脚本 cluster_install.sh 完成集群初始化、主库创建、备库克隆、流复制配置、repmgr 管理、VIP 绑定以及守护进程启动。

本次规划如下:

项目配置
主节点node1
备节点node2
主节点 IP192.168.40.112
备节点 IP192.168.40.113
VIP192.168.40.115
网关 / trusted_servers192.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 相关组件进一步配置。

二、部署前检查

部署前需要确认以下内容:

  1. 两台服务器网络互通;
  2. 两台服务器系统时间同步;
  3. 两台服务器主机名、IP 地址规划正确;
  4. 数据库端口 54321 未被占用;
  5. securecmdd 端口 8890 未被占用;
  6. VIP 192.168.40.115 未被其他服务器占用;
  7. 安装介质、授权文件、部署工具准备完整;
  8. root 用户和 kingbase 用户可以正常登录;
  9. 防火墙、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

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

部署脚本会自动完成以下工作:

  1. 检查 install.conf 文件格式;
  2. 检查 VIP 是否已被占用;
  3. 检查节点网络连通性;
  4. 检查网卡与 IP 是否匹配;
  5. 检查数据库端口是否被占用;
  6. 检查 sys_securecmdd 状态;
  7. 检查安装目录是否存在;
  8. 检查系统参数;
  9. 创建集群安装目录;
  10. 解压 db.zip;
  11. 分发数据库文件到备节点;
  12. 复制授权文件;
  13. 初始化并启动 sys_securecmdd;
  14. 初始化主库;
  15. 修改数据库配置文件;
  16. 创建 esrep 数据库和复制用户;
  17. 注册主节点;
  18. 克隆备库;
  19. 启动备库;
  20. 注册备节点;
  21. 启动整个集群;
  22. 绑定 VIP;
  23. 启动 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

执行过程中,脚本会完成:

  1. 暂停 repmgrd;
  2. 检查当前主库状态;
  3. 停止旧主库;
  4. 释放旧主库 VIP;
  5. 提升备库为新主库;
  6. 新主库绑定 VIP;
  7. 原主库作为备库重新加入;
  8. 恢复 repmgrd;
  9. 完成 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

处理方式:

  1. 确认是否为旧集群残留 VIP;
  2. 如果是旧配置,先释放;
  3. 如果被其他业务占用,需要更换 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 一定要放到真正的部署工具目录下,不能只放在表面看起来像的目录里。

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐