数据库运维8 min read

我在生产环境部署KingbaseES V8的填坑记录

我在生产环境部署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自带的部署工具试试一键部署集群的效果,到时候再写一篇记录。

分享:

相关文章