ARTICLE DETAIL

资讯详情

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

银河麒麟V10 ARM架构源码编译安装PostgreSQL全流程指南

银河麒麟V10 ARM架构源码编译安装PostgreSQL全流程指南 先说结论在银河麒麟V10的ARM架构机器上装PostgreSQL最稳的路子就是源码编译安装。官方提供的Linux二进制包基本都是x86架构在ARM上直接跑会报“Exec format error”而麒麟自己的软件源里PostgreSQL版本又普遍偏老满足不了生产需求。这篇博文就把我从环境准备、源码编译、初始化配置到注册成系统服务的完整过程记录下来照着走基本能一次成功。我这次部署的环境是银河麒麟V10SP1/SP2均可适用服务器版和桌面版差别不大CPU是飞腾PhytiumARM架构操作系统内核是4.19系列。这个组合在政务、金融、能源这些信创项目里特别常见如果你也是类似的国产化环境那这篇文章正好对口。1. 部署前的环境检查与方案选型1.1 为什么要放弃yum安装和官方二进制包很多刚接触麒麟系统的朋友第一反应是执行yum install postgresql这个思路本身没问题但实际装完会发现几个坑。第一麒麟V10自带的软件源里PostgreSQL版本是10或者12不同版本仓库略有差异对于新项目来说版本确实偏老很多新特性用不上。第二更关键的是如果你用的不是麒麟默认源而是直接从PostgreSQL官网下载RPM包那几乎必然踩到架构不匹配的坑——官网默认提供的是x86_64的rpmARM机器装不上。第三就算你找到了ARM版本的rpm依赖关系也可能和麒麟的基座对不上yum解析依赖的时候容易把系统里已有的库版本动掉风险很高。所以在这类国产化平台上我最终选择源码编译。虽然编译耗时稍微长一点但好处是可以精确控制版本、安装路径、编译参数完全不依赖外部源干净可控。对于生产环境的数据库来说可控性比省那十几分钟重要得多。1.2 版本选择我为什么推荐PostgreSQL 14或15编译安装之前先定版本。截至我写这篇文章的时间点PostgreSQL官方主推的稳定版本是14、15、16其中14和15的社区生态最成熟遇到的坑也最少。PostgreSQL版本适用场景说明12/13老项目兼容如果原有业务跑在12上建议保持一致减少升级成本14生产环境主力推荐稳定、性能好、监控体系完善信创项目里验证案例多15新项目推荐新增merge命令、更多压缩选项性能进一步提升16尝鲜新特性最多但第三方工具兼容性还在完善我自己这次选的是PostgreSQL 14.11因为在飞腾ARM平台上我已经用这个版本做过多次压测表现稳定。如果你是新项目直接上15也没问题操作步骤完全一样。下载源码包的时候注意官网下载页面有“源代码”栏目要选.tar.gz格式的源码包而不是那些带linux-x64字样的二进制包。ARM架构下源码编译是通吃的不需要区分aarch64还是x86。2. 基础依赖安装与编译环境准备2.1 确认系统版本和CPU架构开始之前先把环境摸清楚这一步很多人会跳过导致后面编译到一半才发现缺东西。# 查看麒麟系统版本 cat /etc/kylin-release # 查看内核架构 uname -m # 查看CPU信息确认是飞腾还是鲲鹏 lscpu | grep Architecture lscpu | grep Model name正常情况下uname -m应该输出aarch64这就是ARM 64位架构。如果这里输出的是x86_64说明你拿到的其实不是ARM机器那后面的步骤虽然也能用但建议直接改用官方二进制包更省事。我这次部署时还顺便检查了内存和磁盘。数据库机器建议内存至少4G起步磁盘要预留足够的空间给数据目录。如果你的机器配置比较低比如内存只有2G那编译时要用make -j2而不是make -j4防止内存溢出。2.2 安装编译工具链和依赖库源码编译PostgreSQL需要的依赖不多核心就三样gcc编译器、readline库psql命令行编辑用、zlib库压缩支持。另外还需要make工具。麒麟系统的软件源和CentOS高度兼容直接用yum装就行yum install -y gcc make readline-devel zlib-devel这里有三个容易漏的细节提醒一下必须要装readline-devel而不是readline。只装运行库不装开发库的话在./configure阶段会报错readline library not found排查起来会耽误时间。zlib-devel不装的话configure 阶段可能能过但make的时候会报错而且将来做备份压缩的时候也没法用gzip格式。既然都到源码编译这步了这两件事一步到位。如果系统提示yum源不可用检查一下/etc/yum.repos.d/下的源文件是否指向了正确的地址。麒麟V10默认源有时指向内网地址如果你不在内网环境需要把源换成公开源或者挂载本地ISO。这个属于基础问题处理方法就不展开了但确实有朋友卡在这一步很久。2.3 创建专用的postgres系统用户数据库服务不建议直接用root跑这是行业共识。PostgreSQL官方也明确要求不能用root初始化数据目录。所以我们要先创建一个低权限的专用用户# 创建postgres用户不创建家目录之外的额外配置 useradd -m -d /home/postgres -s /bin/bash postgres # 设置密码生产环境建议用强密码 passwd postgres创建完之后可以先验证一下用户是否正常id postgres输出类似uid1001(postgres) gid1001(postgres) groups1001(postgres)就说明创建成功了。这里有个小细节-m参数会同时创建/home/postgres家目录后面我们配置环境变量、放脚本之类的都会用到这个目录。3. PostgreSQL源码编译与安装全流程3.1 下载源码包这一步去PostgreSQL官网源码下载页面找对应版本的.tar.gz文件即可。如果你服务器的网络访问外网比较慢也可以考虑用国内的镜像源下载速度会明显更快。# 下载PostgreSQL 14.11源码包版本号按需替换 wget https://ftp.postgresql.org/pub/source/v14.11/postgresql-14.11.tar.gz # 如果你的网络访问不了外网找一台能上网的机器下载后上传到服务器也可以下载完成后记得校验一下文件完整性# 查看官方提供的MD5值和本地计算的比对 md5sum postgresql-14.11.tar.gz这个习惯在编译安装任何软件时都建议保留源码包如果传输损坏编译到一半报错会非常痛苦排查起来也很费时间。3.2 解压与configure参数配置# 解压源码包 tar -zxvf postgresql-14.11.tar.gz cd postgresql-14.11进入源码目录后接下来是核心步骤执行configure脚本。这个脚本会检查系统环境、检测依赖库并生成Makefile。我的编译参数如下./configure --prefix/usr/local/pgsql --with-pgport5432 --with-wal-segsize64参数说明如下--prefix/usr/local/pgsql指定安装路径。后续所有可执行文件都会装到/usr/local/pgsql/bin下数据目录另建两者分开。--with-pgport5432指定默认端口这里用PostgreSQL的标准端口5432。--with-wal-segsize64把WAL日志单个文件大小设为64MB这个参数在高并发写入场景下能减少WAL切换频率对性能有一定提升。如果你确定不需要某个功能也可以加--without-readline之类的参数禁用它但我不建议这么做因为默认配置已经很合理没必要为了省那点依赖折腾。configure执行完成后可以留意一下输出的关键信息比如checking for gcc... yes、checking for readline.h... yes确认依赖全部通过。3.3 make编译与make install安装编译这一步在ARM机器上需要一点耐心因为ARM架构相比x86单核性能还是会弱一些。建议直接用多线程编译# 4线程编译如果机器核心数多可以加到8 make -j4 # 编译完成后安装 make install我在飞腾FT-2000/64核机器上编译PostgreSQL 14.11make -j8大约用了不到10分钟。如果是在低配的4核机器上预计要20到30分钟这都正常不用焦虑。编译过程中如果出现warning警告一般可以忽略不影响的。但如果出现error错误就要停下来排查了最常见的错误还是缺少依赖库。另外提醒一点make install默认把文件安装到/usr/local/pgsql目录如果这个目录root没有写权限记得在编译之前就用root执行一遍mkdir -p /usr/local/pgsql并赋予权限或者直接以root身份执行install。安装完成后验证一下可执行文件/usr/local/pgsql/bin/postgres --version能正常输出版本号就说明编译安装环节已经通过了。4. 数据库初始化与基础配置实战4.1 初始化数据目录编译安装完成后数据库还没有真正“建库”。PostgreSQL需要先执行initdb来初始化数据目录这一步骤会生成基础的系统库、配置文件和无权限隐患的数据文件。建议将数据目录单独放在一个独立分区下和安装目录分开这样将来重装软件不会影响数据数据备份恢复也更方便。生产环境我一般放在/data/pgsql/data下# 创建数据目录 mkdir -p /data/pgsql/data # 把数据目录所有者改成postgres用户 chown -R postgres:postgres /data/pgsql/data # 切换用户执行初始化 su - postgres -c /usr/local/pgsql/bin/initdb -D /data/pgsql/data -E UTF8 --localeen_US.UTF-8 -U postgres这里的参数要解释一下-D指定数据目录路径。-E UTF8指定数据库集群默认编码为UTF-8。这个必须设否则默认编码可能是SQL_ASCII将来存中文数据会出乱码问题。--localeen_US.UTF-8指定排序规则和字符分类规则。-U postgres指定数据库超级用户名这里我们指定为postgres如果不指定默认会取当前系统用户名。初始化过程中会提示你设置数据库超级用户的密码但说实话初始化时设置的密码只在本地连接时生效后面我们修改配置文件后远程连接还需要再设置一次或者直接用ALTER USER改。我一般习惯初始化时不设起来之后在psql里用ALTER USER postgres WITH PASSWORD 强密码;设置更清晰。初始化完成后数据目录下会生成postgresql.conf、pg_hba.conf、PG_VERSION等文件这几个文件就是我们马上要改的核心配置文件。4.2 修改监听地址、端口与连接数默认情况下PostgreSQL只监听localhost这意味着外部机器无论怎么配防火墙都连不上来。需要改一下postgresql.conf配置文件# 修改数据目录下的postgresql.conf vi /data/pgsql/data/postgresql.conf打开后找到以下三处修改或取消注释listen_addresses 0.0.0.0 # 监听所有网卡如果只想监听内网IP可写具体IP port 5432 max_connections 200 # 默认100按业务并发量调整listen_addresses是核心不改的话远程连接必失败。这里我一般直接填0.0.0.0表示监听所有网络接口。如果你的机器有多个网卡只想监听其中一个写成具体的IP地址会更安全。max_connections要结合机器内存来调整。每个连接大约占用5到10MB内存200个连接大约需要1到2GB内存按需设置即可不要盲目调到1000否则内存不足时会很尴尬。另外还有一个容易被忽略的参数shared_buffers共享缓冲区大小。PostgreSQL默认只有128MB在ARM机器上建议调到物理内存的25%左右。比如机器内存16G可以设为4GBshared_buffers 4GB这个参数需要重启数据库才能生效。如果你的机器内存比较小比如只有8G那就设为2G。4.3 配置pg_hba.conf远程访问认证规则光改监听地址还不够PostgreSQL还有一个独立的访问控制文件pg_hba.conf用来控制哪些IP可以通过什么方式认证连接。这个文件很容易被忽略但恰恰是远程连不上的头号原因。打开pg_hba.confvi /data/pgsql/data/pg_hba.conf在文件末尾追加或修改以下内容# 允许本地连接信任认证 local all all trust # 允许内网网段通过密码连接 host all all 0.0.0.0/0 scram-sha-256最简单的做法是把所有连接都改成scram-sha-256认证同时把地址范围放开到允许的网段。如果是内网测试环境可以直接写host all all 0.0.0.0/0 scram-sha-256这样所有IP都能通过密码连接。生产环境建议精确到网段比如host all all 192.168.1.0/24 scram-sha-256scram-sha-256是PostgreSQL 14默认的密码认证方式比老旧的md5更安全。如果你是为了兼容老客户端可以临时用md5但新项目一律建议scram-sha-256。改完这两个配置文件后还需要重新加载或重启数据库才能生效# 如果数据库还没启动直接用pg_ctl启动 su - postgres -c /usr/local/pgsql/bin/pg_ctl -D /data/pgsql/data -l /data/pgsql/logfile start # 如果数据库已经启动了可以reload配置 su - postgres -c /usr/local/pgsql/bin/pg_ctl -D /data/pgsql/data reload4.4 环境变量配置为了方便日常使用建议把PostgreSQL的bin目录加到PATH环境变量中。编辑/home/postgres/.bash_profile或/etc/profilevi /etc/profile在文件末尾追加export PATH/usr/local/pgsql/bin:$PATH export PGDATA/data/pgsql/data export PGHOSTlocalhost保存后执行source /etc/profile让环境变量立即生效。这样后续可以直接使用psql、pg_ctl等命令不用每次写完整路径。PGDATA环境变量设置后执行pg_ctl时不需要再加-D参数也减少出错概率。5. 注册systemd服务实现开机自启5.1 编写postgresql.service服务文件二进制方式安装的PostgreSQL不会自动注册成系统服务这意味着重启机器后数据库不会自动启动这对于生产环境是完全不能接受的。解决方法是写一个systemd服务文件。麒麟V10使用systemd管理服务和CentOS 7一致。创建一个服务文件vi /etc/systemd/system/postgresql.service写入以下内容[Unit] DescriptionPostgreSQL database server Afternetwork.target [Service] Typeforking Userpostgres Grouppostgres ExecStart/usr/local/pgsql/bin/pg_ctl -D /data/pgsql/data -l /data/pgsql/logfile start ExecStop/usr/local/pgsql/bin/pg_ctl -D /data/pgsql/data stop ExecReload/usr/local/pgsql/bin/pg_ctl -D /data/pgsql/data reload PIDFile/data/pgsql/data/postmaster.pid Restarton-failure [Install] WantedBymulti-user.target几个关键字段解释一下TypeforkingPostgreSQL的pg_ctl启动后会fork出后台进程所以要指定为forking类型。User/Group指定以postgres用户运行数据库进程权限控制更安全。ExecStart启动命令。-l参数指定日志文件路径这个文件必须存在且postgres用户有写权限。PIDFile指定PID文件路径systemd通过它来跟踪进程状态。Restarton-failure进程异常退出时自动重启这是生产环境的保命配置。5.2 启动、停止、开机自启操作服务文件写好后执行以下命令# 重新加载systemd配置 systemctl daemon-reload # 启动服务 systemctl start postgresql # 查看服务状态 systemctl status postgresql # 设置开机自启 systemctl enable postgresql确认状态为active (running)就说明服务配置成功了。设置开机自启后以后机器重启数据库会自动拉起不需要人工干预。这里分享一个容易踩的坑PIDFile指定的postmaster.pid文件是数据库启动时自动生成的如果这个文件路径不对systemd有时会报“Server still starting up”或状态异常。遇到这种情况先检查一下-D数据目录路径是否配置正确再配合journalctl -u postgresql看详细日志基本能定位。另外如果你之前手工用pg_ctl启动过数据库这会儿要先停掉再启动systemd服务否则端口会被占用# 停掉手工启动的数据库 su - postgres -c /usr/local/pgsql/bin/pg_ctl -D /data/pgsql/data stop # 重新启动systemd服务 systemctl restart postgresql6. 防火墙放行与远程连接配置6.1 麒麟系统的防火墙处理数据库都配好监听远程访问了如果防火墙没放行还是白搭。麒麟V10默认使用firewalld作为防火墙管理工具和CentOS一样。先查看防火墙状态systemctl status firewalld如果防火墙是开启状态需要放行5432端口# 放行5432端口TCP firewall-cmd --permanent --add-port5432/tcp # 重新加载防火墙规则 firewall-cmd --reload # 验证端口是否放行 firewall-cmd --list-ports这里有两个要点补充第一--permanent参数很关键加了才会永久生效否则只是临时放行重启防火墙后规则就没了。第二如果前面修改postgresql.conf时没有改listen_addresses那么就算防火墙放行了也连不上这两个配置必须都正确才行。另外一些云平台或虚拟化环境还有安全组规则即使操作系统层面端口放行了安全组没放行也一样连不上。我遇到过几次这种问题都是卡在安全组上排查的时候可以优先确认一下。6.2 创建远程连接用户默认的postgres超级用户虽然可以通过密码远程连接但出于安全考虑生产环境我习惯单独建一个业务用户而不是所有应用都怼着超级用户用。先切换到postgres用户进入psqlsu - postgres psql -d postgres在psql里执行-- 创建业务用户设置密码 CREATE USER app_user WITH PASSWORD 这里填强密码; -- 创建业务数据库指定所有者 CREATE DATABASE app_db OWNER app_user; -- 授予全部权限如果需要 GRANT ALL PRIVILEGES ON DATABASE app_db TO app_user;操作完成后退出psql\q然后在本地用新用户测试连接psql -h 127.0.0.1 -U app_user -d app_db能连上就说明远程访问的基础已经打通了。剩下的就是在业务应用里把数据库连接串改成这台服务器的IP、5432端口、对应的用户名和密码。6.3 远程连接失败快速排查远程连接失败是最常见的问题我整理了一个排查顺序照着走一遍基本能定位症状可能原因排查命令/方法could not connect to server: Connection refused数据库没监听该地址查看postgresql.conf中的listen_addresses设置Connection timed out防火墙或安全组拦截检查firewalld放行、云安全组规则no pg_hba.conf entry for hostpg_hba.conf未放行IP查看pg_hba.conf确认地址范围包含客户端IPpassword authentication failed密码错误或认证方式不匹配确认密码确认认证方式是否为scram-sha-256database does not exist数据库名写错用\l查看已存在的数据库列表如果这些都已经检查过还是连不上可以试试在数据库服务器上执行netstat -tlnp | grep 5432确认PostgreSQL进程是否在监听所有地址。如果显示的是127.0.0.1:5432说明listen_addresses没生效需要检查配置后reload或重启。7. 常见错误与避坑经验总结7.1 高频报错对照表我把整个过程中容易遇到的报错整理成一个速查表方便大家对照排查报错信息出现阶段解决办法configure: error: readline library not foundconfigure安装readline-develconfigure: error: zlib library not foundconfigure安装zlib-develmake: gcc: Command not foundmake安装gcc、makeinitdb: error: cannot be run as rootinitdb切换到postgres用户执行FATAL: data directory /data/pgsql/data does not exist启动检查路径是否正确目录是否存在FATAL: could not create lock file /var/run/postgresql/.s.PGSQL.5432.lock启动/var/run/postgresql目录权限不足手动创建并授权psql: could not connect to server: No such file or directory连接数据库进程未启动或socket目录不存在7.2 ARM架构上的专属优化建议既然是在ARM平台上部署最后还是想单独聊几个ARM环境独有的优化点。第一编译参数建议加-O2优化。PostgreSQL默认的编译优化等级在ARM平台上有一定提升空间可以在configure之前设置环境变量export CFLAGS-O2 -marcharmv8-afpsimd-marcharmv8-afpsimd表示启用ARMv8的浮点和SIMD指令对PostgreSQL的排序、哈希、聚合等操作有不错的性能提升。这个参数在飞腾、鲲鹏上都验证过兼容性没问题。第二如果业务主要是OLAP类型的分析查询可以考虑在PostgreSQL 15及以上版本中开启JIT编译默认就是开启的在ARM平台上JIT对复杂查询的提升很明显。第三数据库进程的CPU亲和性设置。ARM服务器一般核心数多比如我用的飞腾64核机器可以把数据库进程绑定到某几个核上避免频繁跨核调度带来的性能损耗。具体可以通过taskset命令配合systemd设置# 在service文件[Service]段中增加CPUAffinity配置 CPUAffinity0-31这个配置需要根据实际CPU核数调整只适合数据库独占整机或至少独占一部分核心的情况。7.3 备份与安全加固 Checklist最后是几个收尾必做的安全加固动作每个都是我在实际项目中踩过坑或者被安全扫描逼着改过的修改postgres系统用户的密码并禁止root直接登录编辑/etc/ssh/sshd_config设置PermitRootLogin no当然这种操作需按单位安全策略来。数据库超级用户postgres必须设置强密码且不要在多个环境复用同一个密码。按照最小权限原则创建业务用户不要所有应用都用超级用户连接数据库。pg_hba.conf里能写具体IP就不要写0.0.0.0/0至少精确到业务网段。开启数据库日志记录方便将来排障和审计在postgresql.conf里设置logging_collector on、log_directory log、log_filename postgresql-%Y-%m-%d.log。有条件的话把数据目录放在单独的磁盘分区或独立LVM上方便扩容和备份恢复。照着一路配置下来你应该已经有一个稳定运行的PostgreSQL服务了。我个人实际操作下来的最大感受是ARM架构本身并不是什么障碍真正的坑在于环境差异依赖缺了什么、防火墙挡住没放行、配置文件里漏改了一个参数这些才最耗费时间。所以这篇指南里我把每个步骤背后的原因也解释了一遍目的就是让大家踩坑时能自己定位而不是死记命令。如果你在生产环境部署过程中还遇到文章里没有覆盖到的问题欢迎按这个思路自查——检查架构、检查依赖、检查监听、检查防火墙、检查认证规则绝大多数问题都逃不出这五步。
返回列表