ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

麒麟V10安装openGauss全记录:兼容性排查与源码编译实战

麒麟V10安装openGauss全记录:兼容性排查与源码编译实战 下午四点多我接手一台刚装好银河麒麟 V10 的服务器任务很明确把 openGauss 跑起来。当时我心里想的是数据库安装这种事最多半小时搞定。结果从下午一直折腾到晚上中间踩的坑一个接一个最后跑通的瞬间差点没绷住。多说一句项目记录里写的是 “opengauess”实际查下来就是 openGauss那个开源的集中式数据库。所以本文记录的就是麒麟 V10 环境下安装 openGauss 的完整问题排查过程。如果你正在做同样的事或者是第一次接触国产操作系统上的数据库部署这篇内容大概率能帮你省掉几个小时。先说结论麒麟 V10 本质上是一套 Linux 发行版但它和常见的 CentOS、Ubuntu 都有细节差异。openGauss 官方又没有针对麒麟系统的专用安装包所以核心难点不在于 openGauss 本身而在于怎么处理系统环境和数据库要求之间的各种“不匹配”。下面我把整个过程按问题域拆开讲。1. 拿到机器先别急着装花了10分钟确认版本省了一下午1.1 麒麟v10不是一个版本至少先把这几项看清楚不少人拿到机器就急着找安装包结果下载半天解压后一运行就报错回头才发现是架构不匹配。麒麟 V10 有多个变体有服务器版、桌面版有基于 ARM64 架构的常见于鲲鹏、飞腾处理器也有 x86_64 架构的不同批次的系统底层兼容目标还不一样有的偏 CentOS 7 的兼容层有的偏 openEuler 的。在动手之前先把下面这几项记下来cat /etc/os-release cat /etc/kylin-release uname -m getconf LONG_BIT cat /proc/version重点看两个信息系统的具体版本号比如 “Kylin Linux Advanced Server release V10” 这种CPU 架构aarch64还是x86_64。我当时查完之后确认手上的机器是 ARM64 架构的服务器版麒麟 V10。这个信息直接决定了后面下载哪个安装包。很多人第一次装失败就是因为在 x86 机器上下载了 ARM 包或者反过来。另外还有一个小细节如果机器上有多个磁盘df -h看一下挂载情况。openGauss 数据库空间会随业务增长安装时最好把数据目录放到容量充足的独立挂载点不要一股脑塞在根目录/下面。这个是老 DBA 的习惯后面出现“磁盘写满导致初始化失败”的时候你就知道这个检查有多重要了。1.2 依赖、磁盘和yum源安装前的底层准备麒麟 V10 服务器版一般自带可用的 yum 源但有时候内网环境或者定制版系统会把这些源精简掉。我当时执行yum makecache就发现有几个仓库连不上所以先切换到了系统 ISO 镜像做临时源确保依赖能装上。openGauss 安装需要一批基础依赖libaio、libaio-devel、flex、bison、ncurses-devel、glibc-devel、patch、readline-devel这些。如果是源码编译还需要gcc、gcc-c、cmake、make。可以先批量安装yum install -y libaio libaio-devel flex bison ncurses-devel glibc-devel patch readline-devel gcc gcc-c cmake make这里踩过一个小坑有些麒麟系统默认的gcc版本比较老这一点我在后面第 2 章详细说。另外如果在安装过程中报 Python 相关的依赖缺失也别慌通常是因为系统自带的 Python 版本或环境变量问题后面会讲到。磁盘检查也不能省。openGauss 官方对磁盘空间有最低要求但实际上编译安装时还需要额外的临时空间。建议至少保证安装包目录之外有 5GB 以上空闲空间否则编译到一半“No space left on device”整段白干。我那次就是边装边发现/tmp快满了清理了一堆临时文件才继续。2. 下载包选型二进制优先还是源码编译优先直接决定后面顺不顺利2.1 官网没有麒麟版安装包兼容关系要自己判断openGauss 官网下载页并不会提供 “Kylin V10” 专用包一般给的是针对 CentOS、openEuler 等系统的分发包。麒麟 V10 不是 CentOS也不是 openEuler所以这里就出现了一个问题到底下载哪个我的判断逻辑是先看系统自己的发行版底子。麒麟 V10 不同版本底子不同有的兼容 CentOS 7有的更接近 openEuler。可以用rpm -qi centos-release或cat /etc/redhat-release这类命令辅助判断不过不是每台机器都能查得出来。比较朴素的验证方法是“小成本试错”先下载一个自认为兼容性最高的二进制包解压后看能否正常运行不行再换。这里我没法给一个“选A一定对”的结论因为麒麟 V10 的变体太多了。但方向是明确的优先选择与系统 glibc 版本兼容的包而不是看名字像不像。系统里执行ldd --version就能看到 glibc 版本然后对比安装包的要求。2.2 二进制包方案快但容易被glibc和openssl卡住二进制包方案是最快的解压后直接安装依赖就能跑。openGauss 的分发包一般是一个 tar.gz 或多个 rpm 的组合里面包含了编译好的二进制文件、依赖库、脚本等。好处是不需要本地编译器省去了 gcc 版本问题的烦恼。但代价也明显如果系统 glibc 版本比较新或者缺少某些libssl.so、libcrypto.so之类的兼容库二进制包跑起来就会报error while loading shared libraries。这种情况我在现场见过不止一次最常见的就是缺libssl.so.1.1。一种处理思路是安装兼容版本库yum install -y openssl11 openssl11-devel然后用LD_LIBRARY_PATH指过去或者做软链接。但这样做有一定风险因为 openGauss 自带了一部分库在安装目录的lib下如果系统库和自带库混在一起版本冲突会更难排查。所以我的建议是如果系统提示缺某个.so先检查 openGauss 自带lib目录里有没有再决定是系统层面的问题还是安装包本身的问题。2.3 源码编译方案稳妥但要先搞定gcc源码编译最大的好处是能根据当前系统环境生成可执行文件glibc 不匹配的概率会低很多。代价是编译时间长而且对 gcc 版本有硬性要求。openGauss 文档里明确要求高版本 GCC一般是 7.3 以上如果系统自带的 gcc 是 4.8.5编译时大概率会翻车。麒麟 V10 有的版本自带 gcc 就是 4.8.5这是和 CentOS 7 兼容的产物。遇到这种情况有几个解决方向用 SCL 软件集安装更高版本 gcc例如devtoolset-7但麒麟的源里不一定有自行编译安装新版 gcc耗时较长切换到二进制包方案绕开编译。我当时先试了二进制包方案在解压后测试阶段碰到几个依赖库问题花了不少时间。后来决定转源码编译因为这台机器以后还要装其他组件编译器版本高了总归是好事。编译 gcc 的过程比较枯燥但值得记录一个关键点编译前需要yum install -y gmp-devel mpfr-devel libmpc-devel否则在 configure 阶段就会报错这又是一个容易提前踩的坑。2.4 我这次实际走的路线坦白讲我不建议所有人都一上来就源码编译。如果你只为了把 openGauss 跑起来做测试或者对系统依赖不熟悉优先试二进制包如果是为了生产环境长期使用源码编译一次后面会省心很多。我这次最终是按源码编译路线跑通。整个编译过程耗时大概一个多小时主要是 gcc 和 openGauss 本体各占一部分。编译完成后后续的安装反而比二进制包更顺因为很多依赖已经在那一次编译准备阶段一并解决了。如果你拿到的机器配置不高编译时间会更长这时候建议开个终端挂着随时看输出。3. 安装执行过程里的几类拦路虎3.1 缺依赖的报错排查不要盲目“yum install 一切”openGauss 的安装脚本跑起来后如果发现缺依赖会直接中断并提示缺少哪个包。很多人第一反应是yum install -y 包名装完继续跑结果下一个依赖又报错如此反复。更高效的做法是先了解脚本到底在用哪些命令。openGauss 的安装过程实质上是把二进制文件、动态库、配置模板拷贝到目标目录然后调用初始化程序。所以依赖问题主要集中在动态库缺失例如libaio.so.1命令不存在例如bison、flex系统版本判断脚本没有识别出麒麟系统。其中第三个问题最隐蔽。openGauss 的安装脚本有时会读取/etc/os-release里的字段如果发现既不是 centos 也不是 openEuler就可能直接走“不支持的系统”分支甚至什么都不说就失败。我当时查脚本源码发现它其实会对系统名做关键词匹配麒麟系统里IDkylin这个值它可能不认识。解决办法也简单不要纠结于“让脚本认识麒麟”而是手动走完它该走的步骤。比如把脚本里的系统判断条件临时改成支持的分发版名称或者干脆手动完成目录拷贝和环境变量配置。这里提示一句修改安装脚本前先备份原文件免得改错了无法恢复。3.2 “common包找不到”类报错的真实原因在安装过程中我碰到一个很典型的报错大概意思是提示找不到common相关包。一开始我以为是自己拼错了后来仔细看安装脚本才发现openGauss 分发包并不是一个单一文件而是包含多个子包比如 server、om、common 等。如果下载的时候漏了某一块或者解压后目录结构不完整安装脚本就会报“找不到 common 包”。网上很多人把这个报错写成“不存在 commom 包”其实错误文本里可能就是这个拼写但根因都一样安装脚本在固定路径下找某个 rpm 或目录没找到。解决思路也不复杂重新确认下载包完整性用官方提供的校验工具或 sha256 校验文件对比解压后查看子目录结构确保 server、common、om 这些模块都在同一个父目录下如果安装脚本允许指定目录把目录路径指到实际位置。我在现场遇到过另一种情况从内网仓库下载时rpm 包被重新命名过导致脚本按原文件名找不到。解决方法是在脚本中搜索文件名改成实际下载后的名字。3.3 openssl库和系统自带库冲突的处理思路麒麟 V10 系统自带的 openssl 版本一般比较新而 openGauss 部分历史版本依赖的是libssl.so.1.1或libcrypto.so.1.1。如果系统只有libssl.so.3在启动或初始化阶段就会报类似libssl.so.1.1: cannot open shared object file的问题。我的建议处理顺序是先查 openGauss 安装目录lib下有没有自带 libssl 相关文件很多官方包其实内置了只是没有写进LD_LIBRARY_PATH如果内置版本和系统版本冲突优先在启动脚本里把 openGauss 自己的 lib 目录放到LD_LIBRARY_PATH最前面避免加载系统库确认源码编译时到底链接的是哪个 openssl必要时在 configure 阶段用--with-openssl指定。这里有个容易忽略的细节不只是 openGauss 主程序它的gs_ctl、gsql、gs_initdb这些工具也会受库版本影响。排错的时候别只盯一个命令把常用工具都手动跑一遍ldd检查一下。4. 初始化实例权限、内核参数、日志判断一个都不能少4.1 为什么openGauss拒绝用root运行以及怎么正确切换用户openGauss 出于安全考虑禁止 root 用户直接初始化和运行实例。新手第一次跑初始化命令时经常被这个规则卡住还以为是权限不够直接chmod 777把整个目录改了最后问题反而更复杂。正确做法是创建专用系统用户useradd omm passwd omm然后把安装目录归属到这个用户chown -R omm:omm /opt/openGauss后面所有初始化、启动、连接操作都先切换到 omm 用户su - omm为什么要这样做因为 openGauss 实例一旦以 root 身份启动数据文件的权限边界会变得危险。这个设计其实和 PostgreSQL 的思路一致数据库专用账户对数据目录拥有完全控制权但不会影响系统其他部分。运维阶段很多“为什么连不上”“为什么启动失败”的问题有一半是因为用了错误的用户去执行命令。4.2 内核参数调整哪些是必须的哪些可以后调openGauss 对内核有一些参数要求主要集中在共享内存和进程数上。官方文档会给一组推荐值像kernel.sem、kernel.shmmax、kernel.shmall、fs.aio-max-nr、fs.file-max等。如果你不确定当前值可以一次性查出来sysctl kernel.sem kernel.shmmax kernel.shmall fs.aio-max-nr fs.file-max临时生效可以直接写sysctl -w kernel.sem250 32000 100 128 sysctl -w kernel.shmmax4294967295 sysctl -w kernel.shmall1048576但要注意临时方式重启后失效。如果要长期生效需要把参数写进/etc/sysctl.conf然后执行sysctl -p。这里区分一下“必须调”和“可以后调”不调kernel.sem的话初始化阶段很容易失败而vm.overcommit_memory这类参数不调整会影响数据库在高并发下的表现但不至于连初始化都过不去。如果你在低配置虚拟机上装内存本身就紧张调完共享内存参数后反而可能因为shmmax过大导致内存分配异常所以建议先小后大初始化成功后再按官方文档调整到生产值。4.3 初始化失败时的日志排查顺序初始化失败是最高频的问题而且报错信息往往很简短。我的排查顺序基本固定权限问题看安装目录和数据目录的 owner 是不是 ommls -l瞅一眼不是就 chown。磁盘空间df -h看数据目录所在分区是否已满满的话清理临时文件。环境变量确认PATH里有没有 openGauss 的bin目录LD_LIBRARY_PATH有没有指向 openGauss 的lib目录。日志文件在数据目录下的log子目录中找gs_initdb_*.log按时间戳排在最前面的就是最新的报错记录。有一个坑需要单独说日志文件里的时间戳不一定和当前时间一致因为可能是容器环境下时间未同步。不要只看文件名要tail -n 100翻一下内容根据具体错误去搜网上信息。5. 启动连库与开机自启收尾阶段最有价值的三件事5.1 gsql连不上的时候先按这个顺序自查初始化完成之后启动实例、用 gsql 连库按说应该一路畅通但实际总会冒出几个怪问题。我总结了一套自查清单进程是否在跑ps -ef | grep gauss端口是否监听ss -lntp | grep 5432防火墙是否放行firewall-cmd --list-ports环境变量是否在当前会话中生效echo $GAUSSHOME、echo $GAUSSDATA。如果 gsql 本机都连不上先看端口再看认证配置pg_hba.conf和监听配置postgresql.conf。openGauss 默认行为和 PostgreSQL 有相似之处但也有差异。有一个坑是改完监听地址后需要重启实例才能生效不要只 reload。连接的经典测试命令是gsql -d postgres -p 5432 -r如果出现口令错多半是初始化时设置的密码和当前输入不一致如果是could not connect to server大概率还是端口或监听地址的问题。5.2 给openGauss配置systemd或rc.local自启动openGauss 自带的启停工具是gs_ctl但它没有自动注册 systemd 服务。服务器重启后如果没人手动执行gs_ctl start数据库就不会起来。生产环境必须解决开机自启问题。我习惯用 systemd 管理配置文件大致是[Unit] DescriptionopenGauss Database Afternetwork.target [Service] Useromm Groupomm EnvironmentGAUSSHOME/opt/openGauss EnvironmentGAUSSDATA/opt/openGauss/data ExecStart/bin/su - omm -c /opt/openGauss/bin/gs_ctl start -D /opt/openGauss/data ExecStop/bin/su - omm -c /opt/openGauss/bin/gs_ctl stop -D /opt/openGauss/data Restarton-failure Typeforking [Install] WantedBymulti-user.target有几个注意事项不要用Userroot去跑gs_ctlopenGauss 会拒绝 root 启动所以用/bin/su - omm -c切换Typeforking是因为gs_ctl start会 fork 出后台进程如果类型设错systemd 可能会以为服务没起来反复拉起必须写对GAUSSDATA路径指向的是数据目录不是安装目录。如果不想折腾 systemd也可以用传统 rc.localsudo -u omm /opt/openGauss/bin/gs_ctl start -D /opt/openGauss/data然后给/etc/rc.d/rc.local加执行权限。但说实话systemd 的日志记录和状态管理更清晰我最终用的是 systemd 方案。5.3 建议趁早养成的备份和巡检习惯数据库起来不代表事情结束了运维阶段更重要。openGauss 自带gs_dump可以做逻辑备份我也建议定期把postgresql.conf、pg_hba.conf这些配置单独拷贝一份到安全位置。还有一个容易忽略的点日志文件会一直增长长时间不清理会占用大量空间。可以在系统层面配置 logrotate对$GAUSSDATA/log下的日志做周期切割。openGauss 的日志命名里有时间戳切割策略可以按天来做。我在实际使用中发现很多紧急故障其实都是“小事积累”出来的磁盘慢了、日志爆了、权限被误改了。所以建议隔一段时间就跑一遍gs_checkperf之类的工具做健康检查或者至少看下日志目录大小和进程 CPU 占用。趁早养成这些习惯后面能省掉不少救火时间。再说回我这次安装过程最耗时间的部分并不是 openGauss 本身的安装动作而是我在反复试错系统兼容性。如果你现在正准备在一台麒麟 V10 上部署 openGauss我的建议是先把系统版本、架构、glibc 版本这三个信息查清楚再决定用二进制包还是源码编译。看到报错先稳定心态按“日志路径 → 环境变量 → 权限 → 依赖库”的顺序排查很多坑其实不需要全踩一遍也能绕过去。
返回列表