跳到主要内容

系统配置

系统配置​

本节对应本章一键安装中脚本自动完成的系统层配置,保留一键脚本未覆盖、需手工完成的操作系统层配置项。下述操作以 root 用户执行。

安装缺失依赖​

精简操作系统镜像(如最小化安装的 RHEL/CentOS)默认可能缺少 Halo 二进制所需的若干动态库。尝试运行二进制时会报共享库缺失:

[root@halo ~]# /u01/app/halo/product/dbms/16/bin/initdb --version
/u01/app/halo/product/dbms/16/bin/initdb: error while loading shared libraries: libcrypt.so.1: cannot open shared object file: No such file or directory

通过 dnf 安装缺失依赖:

dnf install -y libxcrypt-compat libpsl brotli procps-ng

安装完成后验证三件套二进制版本:

[root@halo ~]# export LD_LIBRARY_PATH=/u01/app/halo/product/dbms/16/lib
[root@halo ~]# /u01/app/halo/product/dbms/16/bin/initdb --version
initdb (Halo) 1.0.16.11 (260811)
[root@halo ~]# /u01/app/halo/product/dbms/16/bin/postgres --version
postgres (Halo) 1.0.16.11 (260811)
[root@halo ~]# /u01/app/halo/product/dbms/16/bin/psql --version
psql (Halo) 1.0.16.11 (260811)
[root@halo ~]# /u01/app/halo/product/dbms/16/bin/pg_ctl --version
pg_ctl (Halo) 1.0.16.11 (260811)
[root@halo ~]#

说明: 一键安装脚本会自动检测并安装上述依赖;手工部署时需自行安装。各依赖包作用:

  • libxcrypt-compat:提供 libcrypt.so.1(initdb、psql 需要)
  • libpsl:提供 libpsl.so.5(postgres 需要)
  • brotli:提供 libbrotlidec.so.1 等(postgres 需要)
  • procps-ng:提供 sysctl 命令(配置内核参数需要)

可用 ldd /u01/app/halo/product/dbms/16/bin/* | grep "not found" 全量扫描确认无残留缺失库。

创建 halo 用户与组​

创建 halo 用户组与用户,并将安装目录属主交接给 halo:

groupadd -g 1000 halo
useradd -u 1000 -g halo halo
chown -R halo:halo /u01/app/halo

实际终端输出如下:

[root@halo ~]# groupadd -g 1000 halo
[root@halo ~]# useradd -u 1000 -g halo halo
[root@halo ~]# id halo
uid=1000(halo) gid=1000(halo) groups=1000(halo)
[root@halo ~]# chown -R halo:halo /u01/app/halo
[root@halo ~]#

说明: halo 用户、用户组与安装目录无需提前手工创建,但手工部署时建议显式创建以保证 uid/gid 一致(示例为 1000)。如需使用其它 uid/gid,调整 groupadd/useradd 参数即可。

配置进程目录​

Halo 数据库需要额外的路径来存放临时进程文件。默认路径为 /var/run/halo,该路径安装时默认不存在,需要手工创建:

mkdir -p /var/run/halo
chown halo:halo /var/run/halo

实际终端输出如下:

[root@halo ~]# mkdir -p /var/run/halo
[root@halo ~]# chown halo:halo /var/run/halo
[root@halo ~]# ls -ld /var/run/halo
drwxr-xr-x 2 halo halo 6 Aug 11 07:09 /var/run/halo
[root@halo ~]#

注意: /var/run 目录下的用户内容在操作系统重启后会被系统自动清理。为防止因系统重启导致的路径丢失错误,可在 /etc/rc.local 中配置系统重启后自动重建路径:

vi /etc/rc.local

/usr/bin/mkdir /var/run/halo
/usr/bin/chown halo:halo /var/run/halo

并给 /etc/rc.d/rc.local 增加执行权限:chmod +x /etc/rc.d/rc.local。请勿将进程目录设置在系统临时目录 /tmp 下,/tmp 下的目录会被系统自动清理。

配置内核参数​

默认情况下,共享内存段通常是足够的,大多数情况下只需要调整系统信号量。一个典型的设置如下:

sysctl -w kernel.sem="4096 4194304 32768 1024"

实际终端输出如下:

[root@halo ~]# sysctl -w kernel.sem="4096 4194304 32768 1024"
kernel.sem = 4096 4194304 32768 1024
[root@halo ~]# sysctl kernel.sem
kernel.sem = 4096 4194304 32768 1024
[root@halo ~]#

说明: kernel.sem 四个字段依次为 SEMMSL SEMMNS SEMMNI SEMOPM。生产环境建议持久化写入 /etc/sysctl.conf 后执行 sysctl -p。一键安装脚本会自动检测并处理内核参数,使用一键脚本时无需手工配置。

表 2-1 内存与信号量参数要求

参数名称描述说明
SHMMAX共享内存段的最大尺寸(字节)至少 1KB
SHMALL可用共享内存的总量(字节)同 SHMMAX
SEMMNI最大信号量标识见下方计算公式
SEMMNS最大信号量SEMMNI 计算结果 × 17
SEMMSL每个集合中的最大信号量至少 17
SEMVMX信号量的最大值至少 1000

SEMMNI 的最低要求计算公式如下(max_connections 等四个参数均为数据库连接类参数,在 postgresql.conf 中配置):

ceil((max_connections + autovacuum_max_workers + max_wal_senders + max_worker_processes + 5) / 16)

即:以上四个连接类参数之和加 5,再除以 16 向上取整。

配置资源限制​

默认情况下,针对用户的资源限制(如可打开的文件数量 nofile 等)对 Halo 数据库运行来说是不足的,需要调整 /etc/security/limits.conf:

cat >> /etc/security/limits.conf <<'EOF'
halo soft nproc unlimited
halo hard nproc unlimited
halo soft nofile 1024000
halo hard nofile 1024000
halo soft stack unlimited
halo hard stack unlimited
halo soft memlock unlimited
halo hard memlock unlimited
halo soft core unlimited
halo hard core unlimited
EOF

切换到 halo 用户验证限制是否生效:

[root@halo ~]# su - halo -c "ulimit -n; ulimit -u"
1024000
unlimited
[halo@halo ~]$

说明: nofile(最大文件句柄)已生效为 1024000,nproc(最大进程数)已生效为 unlimited。生产环境建议同时配置 memlock、core 等项目。

关闭透明大页(THP)​

透明大页(THP)特性在数据库场景下存在缺陷,建议关闭:

echo never > /sys/kernel/mm/transparent_hugepage/enabled

实际终端输出如下:

[root@halo ~]# echo never > /sys/kernel/mm/transparent_hugepage/enabled
[root@halo ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@halo ~]#

说明: 输出中 [never] 带方括号表示当前生效值为 never,THP 已关闭。大页(HugePage)建议开启以提升内存访问性能;一键安装脚本会在步骤 11 自动配置大页,手工部署时可参考自行配置。生产环境建议将 THP 关闭与大页配置持久化(如 systemd 服务或 /etc/rc.local)。