我在生产环境部署KingbaseES V8的填坑记录
项目需要把一套政务系统从Oracle迁到国产数据库,选了人大金仓的KingbaseES V8。之前只玩过MySQL和PostgreSQL,国产数据库还是头一回正经部署。网上查了一圈,靠谱的资料不多,官方文档倒是挺全但读起来有点硬。这篇记录一下整个部署过程和踩的坑。
环境准备
服务器是两台飞腾腾锐D2000,跑银河麒麟V10 SP1,上面还有个防火墙和SELinux——后来发现这俩东西给我添了不少麻烦。
先建用户。KingbaseES不能用root装,必须建个普通用户:
useradd -m kingbase
passwd kingbase
然后建安装目录,/opt/Kingbase/ES/V8是默认路径,改不改随你:
mkdir -p /opt/Kingbase/ES/V8
chown -R kingbase:kingbase /opt/Kingbase/ES/V8
第一个坑:内核参数
文档里列了一堆需要改的内核参数,照着/etc/sysctl.conf加上了:
fs.aio-max-nr = 1048576
fs.file-max = 6815744
kernel.shmall = 2097152
kernel.shmmax = 4294967295
kernel.shmmni = 4096
kernel.sem = 250 32000 100 128
net.ipv4.ip_local_port_range = 9000 65500
net.core.rmem_default = 262144
net.core.rmem_max = 4194304
net.core.wmem_default = 262144
net.core.wmem_max = 1048576
改完 sysctl -p 生效,然后问题来了——重启之后shmmax的值又变回去了。查了半天发现是这机器的/etc/sysctl.d/下面有个麒麟自己的配置文件,优先级比sysctl.conf高,把我们的值给盖了。直接把它干掉或者把自己的配置写到/etc/sysctl.d/99-kes.conf就好了。
还有limits.conf也要改,主要是文件描述符和进程数:
kingbase soft nofile 65536
kingbase hard nofile 65535
kingbase soft nproc 65536
kingbase hard nproc 65535
这里有个细节:nofile的hard值不能超过/proc/sys/fs/nr_open,不然用户登录会直接失败。机器默认大概是1048576所以一般没事,但万一被改小过就要注意了。
第二个坑:RemoveIPC
这是systemd搞出来的坑。麒麟V10下/etc/systemd/logind.conf里有个参数叫RemoveIPC,默认在部分系统上居然是yes。它的作用是用户退出登录时清理所有IPC资源,包括数据库的共享内存段。后果就是——你su切换用户之后,之前用户启动的数据库进程会因为共享内存被回收而莫名其妙挂掉。
# 改这个文件
echo 'RemoveIPC=no' >> /etc/systemd/logind.conf
systemctl daemon-reload
systemctl restart systemd-logind.service
这个问题是KingbaseES、Oracle、PostgreSQL共有的坑,跟数据库本身没关系,纯属Linux发行版给挖的。
第三个坑:License文件
KingbaseES是个商业数据库,需要License文件。拿到的是一个叫license.dat的文件,有有效期、连接数限制和MAC地址绑定。装之前一定要确认license跟机器的MAC匹配,不然装完数据库起不来。
怎么查MAC:
ifconfig | grep ether
ip addr show | grep link/ether
如果换了网卡或者跑了虚拟机,MAC变了就得重新申请License。记住了:装之前先把授权文件的MAC和服务器的MAC对一遍,能省你一个小时。
正式开始安装
把ISO挂载上:
mount KingbaseES_V008R006C008B0014_Lin64_install.iso /mnt/kingbase
三种安装方式:
- 图形化:
sh setup.sh,适合有桌面环境的 - 命令行:
sh setup.sh -i console,适合纯终端操作 - 静默:
sh setup.sh -i silent -f silent.cfg,适合批量部署
生产服务器没图形界面,我用命令行模式。交互流程大概这样:接受许可 → 选完全安装 → 指定license路径 → 确认安装目录 → 开始安装 → 初始化数据库。
初始化数据库时这些参数要确认清楚:
| 参数 | 默认值 | 建议 |
|---|---|---|
| 端口 | 54321 | 别跟PG的5432冲突就行 |
| 管理员用户 | system | 非必须别改 |
| 字符集 | UTF8 | 需要GBK或GB18030的按需改 |
| 兼容模式 | ORACLE | 从Oracle迁过来的保持ORACLE |
| 大小写敏感 | 是 | 从MySQL迁的记得改成"否" |
| 块大小 | 8k | 大量BLOB或宽表的考虑16k/32k |
兼容模式这里是个关键选择。 如果是新项目,PG模式最省心——跟原生PostgreSQL几乎一样。如果是从Oracle迁过来的,ORACLE模式能省掉大量SQL改写的工作。MySQL模式暂不推荐,成熟度不如前两个。
安装后验证
装完之后跑几个检查:
# 看版本
/opt/Kingbase/ES/V8/Server/bin/kingbase -V
# 用ksql连一下
/opt/Kingbase/ES/V8/Server/bin/ksql -p 54321 -U system test
# 密码输入初始化时设的那个
# 进去之后看看能不能正常查
select version();
select now();
如果缺动态库,用这个找出来:
cd /opt/Kingbase/ES/V8/Server/bin
ldd * | grep "not found"
有缺失的话去Server/lib下面找,找到就加一下环境变量:
export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/opt/Kingbase/ES/V8/Server/lib
注册系统服务
想让数据库开机自启,要跑一下root.sh脚本(注意切到root):
/opt/Kingbase/ES/V8/install/script/root.sh
之后启停就可以用sys_ctl了:
# 启动
sys_ctl -w start -D /opt/Kingbase/ES/V8/data -l "/opt/Kingbase/ES/V8/data/sys_log/startup.log"
# 停止
sys_ctl stop -m fast -w -D /opt/Kingbase/ES/V8/data
配置防火墙和SELinux
回到开头提的那个问题。数据库起来了但外部连不上,一查是防火墙拦了:
firewall-cmd --add-port=54321/tcp --permanent
firewall-cmd --reload
SELinux如果开了强制模式也会拦,最简单的处理是临时关掉验证:
setenforce 0
长期方案是配SELinux策略允许54321端口。/etc/selinux/config里改SELINUX=permissive也行,但安全审计可能不乐意。看你的环境要求。
再说说静默安装
两台机器我后来是用静默安装做的,因为配置一模一样,写好silent.cfg直接批量跑。关键参数长这样:
CHOSEN_INSTALL_SET=Full
KB_LICENSE_PATH=/home/kingbase/license.dat
USER_INSTALL_DIR=/opt/Kingbase/ES/V8
USER_SELECTED_DATA_FOLDER=/data/kingbase
DB_PORT=54321
DB_USER=system
DB_PASS=YourComplexPass123
ENCODING_PARAM=UTF8
DATABASE_MODE_PARAM=ORACLE
CASE_SENSITIVE_PARAM=YES
BLOCK_SIZE_PARAM=8k
ENCRYPT_METHOD_PARAM=sm4
AUTHENTICATION_METHOD_PARAM=scram-sha-256
然后一行命令搞定:
sh setup.sh -i silent -f /home/kingbase/silent.cfg
总结
整个部署过程不算复杂,KingbaseES的安装流程跟Oracle有几分相似,对用过Oracle的人很友好。真正花时间的是前置的环境检查——内核参数、RemoveIPC、License MAC这仨坑,提前注意到的话半小时就装完了。
另一个收获是:麒麟V10对数据库的支持还是有一些小问题需要自己处理(内核对共享内存的限制策略、SELinux默认策略等),但这更多是OS层面的,跟KingbaseES本身关系不大。
后续计划把主备集群搭起来,用KingbaseES自带的部署工具试试一键部署集群的效果,到时候再写一篇记录。