Halo Tech

真的不用配环境:即教即会的懒人部署法

声明:本文基于 Halo Database 16 集群交互式安装脚本的真实功能创作,所有技术细节均有源码支撑,绝非虚构。

 一、救命啊张总!

周一早上九点,辉仔工位上弥漫着一股"大事不妙"的气息。

辉仔:张总!救命啊!

张总(端着保温杯慢悠悠走过来):咋了,数据库又删了?

辉仔:比那严重……领导让我这周把 Halo Database 集群搭好,三台服务器,一主两从,还要带高可用管控。我连单机都没装过啊!

张总:哦,那你之前咋装的?

辉仔:我……我没装过。上次看部署文档,第一步就让我改内核参数,kernel.sem = 4096 4194304 32768 1024,我心想这四个数是啥意思,改错了会不会炸?然后我直接关了网页。

张总(笑着坐下):那你还记得上次小王装 Halo Database 装了多久吗?

辉仔:听说了,搞了三天,最后发现是防火墙没关,端口不通。

张总:不止防火墙。他 SELinux 没关,limits.conf 没配,环境变量写错了两处,postgresql.conf 里的 shared_buffers直接用了默认的 128MB——8G 内存的机器,相当于开了辆法拉利只跑一档。然后搭建流复制的时候,从库的主库 IP 填成了自己的 IP,等于自己跟自己握手,能成功就见鬼了。

辉仔(脸色越来越白):还有呢?

张总:Oracle 兼容模式创建完,忘了装内置包。应用跑起来报 DBMS_LOB not found,他又回头补装。一来一回,三天就这么没了。

辉仔:那我现在咋办?领导说周五之前必须交差……

张总(从电脑里打开一个文件):用这个。

屏幕上是一个脚本文件:

[root@haloAutotest156 ~]# tar -xzf halo_1.0.16.x86_64.build260413.tar.gz
[root@haloAutotest156 ~]# cd product
[root@haloAutotest156 product]# ls -l 总用量 132drwxrwxr-x 3 halo halo     16  4月 13 01:51 dbms-rwxrwxr-x 1 halo halo 131520  4月 13 01:53 halo_1.0.16_installerdrwxrwxr-x 3 halo halo     54  6月 29  2023 instantclient_21_11drwxrwxr-x 5 halo halo     51  4月 13 01:53 shield
halo_1.0.16_installer

辉仔:就……一个脚本?

张总:别小看它。上次我在一台干净的服务器上,15 分钟,从裸机到三节点集群全部跑通。

辉仔:不信。你当是点外卖呢?

张总:你把服务器打开,我带你走一遍就知道了。

 二、回忆噩梦:之前装 Halo Database 是种什么体验

在开始之前,张总让辉仔先把之前手动部署的流程列出来,看看有多少坑。

辉仔翻开之前的笔记,越看越头大:

手动部署 Halo Database 集群大致流程:1. 检查操作系统版本(CentOS? Ubuntu? 麒麟? openEuler?)2. yum install 十几个依赖包(libaio、libcurl、libxml2、icu、readline、openssl……)3. 关闭 SELinux(改 /etc/selinux/config,还要 setenforce 0)4. 关闭防火墙(systemctl stop/disable firewalld)5. 修改内核参数(kernel.sem、vm.nr_hugepages)6. sysctl -p 生效7. 创建 halo 用户组、用户8. 配置 limits.conf(nofile、nproc、memlock、stack、core 全设 unlimited)9. 创建安装目录、数据目录、归档目录10. 修改目录权限11. 配置 halo 用户的 .bash_profile(HALO_BASE、HALO_HOME、ORACLE_HOME……)12. 配置 /var/run/halo 目录和开机自启13. 初始化数据库(pg_ctl init)14. 修改 postgresql.conf(十几个参数)15. 修改 pg_hba.conf16. 拷贝 license.lic17. 启动数据库18. 创建数据库用户(dbadmin、replica、pgrewind、clustermgr)19. 创建兼容模式数据库(Oracle/MySQL/PostgreSQL)20. 安装扩展和内置包21. 搭建流复制(从库)22. 安装配置 etcd23. 安装配置 clustermgr

辉仔:23 步。23 步啊张总!我高考都没这么费劲。

张总:而且每一步都可能出错。你看看第 14 步,postgresql.conf要改的参数:

参数
说明
是否需要手动计算
listen_addresses
监听地址
否
port
数据库端口
否
shared_buffers
共享缓存
是(内存的40%)
effective_cache_size
有效缓存
是(内存的50%)
max_worker_processes
最大工作进程
是(CPU核数)
max_parallel_workers
最大并行工作进程
是(CPU核数)
work_mem
工作内存
否
wal_buffers
WAL缓存
否
random_page_cost
随机页成本
否(但得知道SSD要改成1.1)
checkpoint_completion_target
检查点目标
否
max_wal_size / min_wal_size
WAL大小
否
log_destination + logging_collector
日志配置
否
_enable_backend_fault_tolerance
异常恢复
否(但得知道有这个参数)

张总:光是标"是"的那几个,你就得先查机器配置,再算比例,再改文件。8GB 内存的机器,shared_buffers应该是多少?

辉仔:8×1024×40%……3276 MB,约 3GB?

张总:对了。但万一你算错了呢?万一是 16G 呢?万一是 32G 还要配大页呢?

辉仔:行行行,我信了,用脚本。快教我。

 三、脚本登场:开箱即用

张总带着辉仔来到测试服务器前,把安装包和license传上去。

张总:首先,解压安装包,进入product目录,直接跑。

./halo_1.0.16_installer

屏幕亮了:

============================================================  Halo Database Cluster Installation Script  Halo Database 集群安装脚本============================================================
请选择语言 / Please select language (cn/en):

辉仔:哟,还能选语言?

张总:输入 cn用中文,输入 en 用英文。整个安装过程的所有提示都会跟着切换。上次有个外企客户,运维团队一半中国人一半印度人,两边都能用。

辉仔:这倒是贴心。然后呢?

张总:选完语言,脚本第一件事不是让你装东西,而是先帮你检查环境。

屏幕上显示:

检测到操作系统: centos

张总:看到了吗?它自动检测了操作系统。CentOS、Ubuntu、Debian、麒麟、openEuler,甚至 UOS,它都能识别。不同系统用不同的包管理器,不同的防火墙策略,全部自动适配。

辉仔:那之前小王在 Ubuntu 上用 CentOS 的命令装依赖,肯定装不上……

张总:对。这个脚本在 Ubuntu 上会自动切换成 apt-get,连 SELinux 都会帮你跳过——因为 Ubuntu 没有 SELinux。

四、实战演示:单机版——真就"点一下"

张总:环境检测完了,进入主菜单:

 安装类型说明:  ▶ Halo Database      - Halo Database数据库  ▶ etcd        - 键值数据库组件  ▶ clustermgr  - 管控组件  ✅ all         - 全部组件,包含Halo Database、键值数据库组件、管控组件输入安装类型,Halo Database/etcd/clustermgr/all

辉仔:我先装个单机版试试,选 Halo Database 就行吧?

张总:对,输入 Halo Database。

请输入Halo Database指定安装目标路径: (直接回车默认 /u01/app/halo)

辉仔:我直接回车。

输入值为空,使用默认Halo Database安装路径:/u01/app/halo正在复制 product 到 /u01/app/halo操作成功!已进入目录:/u01/app/halo/product

张总:接下来它会问你装主库还是从库。

输入Halo Database数据库安装类型:主库输入m,从库输入s

辉仔:单机版肯定是主库,输入m。

张总点了点头。

然后屏幕开始滚动——但不是让辉仔操作的,是脚本自己在干活:

1、开始安装数据库依赖包  → yum 安装依赖包(libaio、libcurl、libxml2、icu、readline、openssl...)  → 修改selinux  → 关闭服务器防火墙  → 修改服务器内存和信号量  → 增加halo用户组资源限制  安装数据库依赖包结束2、创建halo用户  → UID: 30003、创建数据库目录  当前软件安装目录:/u01/app/halo/product  输入数据库目录,回车默认配置/data/halo

辉仔:等等,它又在问我了。

张总:这是数据库的数据存放目录,你直接回车用默认值就行。也可以输自己的路径。

辉仔:我输入 /data/halo 呗……不对,我打错了,输成了 data/halo/,少了开头的斜杠,还多了结尾的斜杠。

张总(笑了):没事,你直接输,看脚本怎么处理。

辉仔小心翼翼地输入了data/halo/。

输入绝对路径未以/开头,且用/结尾修正为/data/halo

辉仔:卧槽?它自动帮我修正了?

张总:这就是交互式脚本的好处。不管你怎么输——少了开头斜杠、多了结尾斜杠、甚至敲了三个斜杠——它都能自动纠正。但你要是作死输入/或者 /root,它直接拒绝:

错误:数据目录不能是 /、/.、/root 或 /root 下的子目录!请选择其他目录,如 /data/

辉仔:这防呆设计……是怕了我这种人吧。

张总:就是防你这种人的。

脚本继续滚动:

4、检查halo安装版本  pg_ctl (Halo Database) 16.x5、初始化halo数据库6、配置halo数据库  → 配置pg_hba.conf  → 配置postgresql.conf  → shared_buffers = 3GB        ← 自动计算!  → effective_cache_size = 4GB  ← 自动计算!  → max_worker_processes = 8    ← 自动检测CPU!  → max_parallel_workers = 8

辉仔:等等等等!这些参数它自己算的?

 张总:对。脚本检测到这台机器是 8GB 内存、8 核 CPU,所以shared_buffers自动设成了 3GB(8G × 40%),effective_cache_size 设成 4GB(8G × 50%),工作进程数设成 8。不用你拿计算器。

辉仔:那如果是 64G 内存的机器呢?

张总:那就自动算成 25GB 和 32GB。如果内存小于 4GB,它会直接跳过调优,用默认参数——因为算出来的值太小了,调了反而不如默认的好。

辉仔:那 random_page_cost = 1.1呢?

张总:这个参数是对 SSD 存储的优化,默认值是 4.0(机械硬盘),SSD 上改成 1.1 查询规划器会更倾向于走索引扫描。脚本自动帮你改了,你甚至不需要知道有这个参数。

接着到了归档日志配置:

7、配置归档日志是否配置归档日志,请输入yes/no

辉仔:啥是归档日志?

张总:你可以理解为数据库的行车记录。所有操作都会记录下来,万一数据丢了,靠归档日志可以恢复到任意时间点。

辉仔:那肯定要开啊!

张总:输入 yes。它会让你输归档目录,直接回车就行,默认在数据目录下创建。

输入数据库归档目录,回车默认在数据库目录创建输入为空,使用默认值:/data/halo/archivedir创建归档日志路径

然后脚本自动拷贝 license 文件、启动数据库:

8、拷贝license.lic到/u01/app/halo/product/dbms/169、启动halo数据库

辉仔:这就启动了?我还没创建用户呢。

张总:下一步就是。

10、是否创建兼容模式数据库,请输入all/oracle/mysql/postgresql,回车默认不创建

辉仔:我要 Oracle 和 MySQL 两种兼容模式,能选吗?

张总:输入 all,三种全给你装上。

辉仔输入 all,脚本开始创建兼容模式:

创建用户  → dbadmin(管理员)  → replica(流复制用户)  → pgrewind(回放用户)  → clustermgr(管控用户)PostgreSQL模式端口设置为: 5432Oracle模式端口设置为: 1521  → 创建兼容Oracle模式数据库  → 创建 aux_oracle 扩展  → 开启全局临时表  → 配置同义词支持  → 安装 Oracle 内置包(DBMS_AQ、DBMS_LOB、DBMS_UTILITY...)  → 安装 pg_dbms_job 定时任务扩展  完成oracle兼容模式数据库创建
MySQL模式端口设置为: 3306  → 创建兼容MySQL模式数据库  → 创建 mysql 用户  → 创建 aux_mysql 扩展  完成mysql兼容模式数据库创建
完成全部兼容模式数据库创建

辉仔:这……Oracle 内置包都自动装了?上次小王不就是漏装了 DBMS_LOB 吗?

张总:对,脚本把 DBMS_AQ、DBMS_LOB、DBMS_UTILITY、UTL_RAW、UTL_ENCODE、DBMS_LOCK 这些常用包全部自动装上,不会再出现"应用跑起来才发现缺包"的问题。

最后一步:

11、配置大页  内存太小不设置大页    ← 这台测试机只有8G,不配置大页

张总:如果机器内存大于等于 32GB,并且是 openEuler 系统,脚本会自动计算大页数量并配置。测试机内存小,就跳过了。

整个过程,辉仔一共只输入了 5 次:语言选择、安装类型、安装路径(回车)、主从选择、兼容模式选择。其余全部是脚本自动完成。

辉仔:我数了一下,我总共按了 5 次键盘,其中 3 次是回车……

张总:所以叫"傻瓜式安装"。

五、实战演示:集群版——连锁店开张

单机版装完,辉仔信心大增。

辉仔:张总,那集群版呢?一主两从那种。

张总:好,我们换两台新机器。先在主库上重复刚才的操作——不过这次注意看区别。

在主库上,操作跟单机版完全一样。装完后,张总带着辉仔来到从库服务器。

./halo_1.0.16_installer

选语言 → 选 Halo Database → 输路径 →这次选 s(从库)。

安装Halo Database数据库--从库1、开始安装数据库依赖包2、创建halo用户3、创建数据库目录4、检查halo安装版本5、拷贝license.lic6、创建流复制

到第 6 步,脚本开始交互式引导:

物理流复制开始:1、请输入数据库主库 IP 地址,例如:10.10.68.168

辉仔:我输入主库 IP:192.168.1.100

192.168.1.100 可用。输入数据库主库 IP 地址为:192.168.1.100

辉仔:它还帮我校验了 IP 格式?

张总:对,如果你输了个 999.999.999.999或者一串乱码,它会直接提示"格式错误"。

2、输入数据库流复制用户名,例如:replica

辉仔:用默认的 replica 就行。

3、输入流复制用户密码

辉仔:输密码的时候屏幕上啥也不显示?

张总:read -s静默输入,密码不会显示在屏幕上。别慌,你尽管输,输完按回车。

辉仔输入了密码。

4、输入流复制端口,例如:1921,默认为1921

辉仔:直接回车。

输入的端口为空!默认为1921输入端口为:1921
5、输入复制槽名称,默认为hostname

辉仔:啥是复制槽?

张总:想象一下,主库是一个快递分拣中心,从库是下面的配送站。复制槽就是主库给每个配送站留的一个专属窗口——即使某个配送站暂时断线了,主库也会把它的快递一直留着,等它恢复了一起发。如果不设复制槽,从库一断线,主库就把旧日志清理了,从库再也追不上了。

辉仔:哦!那我直接回车用默认的?

张总:对,脚本会自动用主机名作为复制槽名称。如果主机名是localhost,它会自动换成 IP 地址——因为叫 localhost的机器太多了,会重名。

删除重名复制槽创建流复制pg_basebackup -F p -X stream -v -P -h 192.168.1.100 -p 1921 -U replica ...从库数据目录降权

辉仔:它已经在同步主库数据了?

张总:对,pg_basebackup正在把主库的全量数据拉过来。你看到那个进度条了吗?等它跑完,从库就自动配好了流复制,不需要你手动写recovery.conf——脚本用了 -R参数自动生成,还自动创建了复制槽。

7、启动halo数据库8、配置大页

辉仔:从库也装好了?就这?

张总:就这。

 六、etcd 和 clustermgr:集群的"大脑"和"保安"

辉仔:那 etcd 和 clustermgr 呢?这三个从库都要装吗?

张总:etcd 是集群的大脑,clustermgr 是保安。etcd 负责存集群的状态信息——谁是主库、谁是从库、谁在线谁离线。clustermgr 负责监控和自动切换——主库挂了,它自动把从库提升为主库,对外提供服务的 VIP 也会漂移到新主库。

辉仔:那先把 etcd 装上。

重新运行脚本,这次选etcd:

二、安装etcdStarting to run etcd configuration setupPlease input IP list where etcd cluster will be runninge.g. 192.168.1.1,192.168.1.2,192.168.1.3

辉仔:我输入三台机器的 IP,用逗号分开?

张总:对,192.168.1.100,192.168.1.101,192.168.1.102。

192.168.1.100 will be used as node IPInitializing done.

张总:脚本自动完成了:识别当前节点 IP、生成 etcd 配置文件、创建 systemd 服务、设置开机自启。在三台机器上各跑一次,etcd 集群就搭好了。

辉仔:比我想象中简单多了。上次看文档,etcd 那一堆 ETCD_INITIAL_CLUSTER、ETCD_LISTEN_PEER_URLS参数看得我头皮发麻。

张总:脚本全部帮你拼好了。你只需要知道三台机器的 IP。

接下来装 clustermgr,选 clustermgr:

三、安装clustermgrPlease input IP list where etcd cluster will be runninge.g. 192.168.1.1,192.168.1.2,192.168.1.3

先输入 etcd 集群的 IP(跟刚才一样)。然后脚本开始引导配置高可用参数:

Input current node nameDefault: node100Input VIP for the HA cluster

辉仔:VIP 是啥?

张总:Virtual IP,虚拟 IP。你可以理解为集群的"门牌号"。不管主库从库怎么切换,应用永远连接这个 VIP,VIP 会自动飘到当前的主库上。就像连锁店换了个店长,但店面的地址和电话不变。

辉仔:哦,那我输入一个未使用的 IP:192.168.1.200

192.168.1.200 will be used as VIPInput network interface to bind the VIP
Default: eth0Input VIP netmask
Default: 255.255.255.0Input VIP broadcast addressDefault: 192.168.1.255

辉仔:网卡、子网掩码、广播地址,它都有默认值?

张总:对,脚本会自动检测当前服务器的网络配置,把这些值预填好。你直接回车就行,除非你的网络拓扑比较特殊。

Initializing done.

张总:clustermgr 配置完成。脚本自动生成了配置文件 clustermgr_halo.yml、systemd 服务文件、还有 VIP 切换的回调脚本 clustermgr_callback.sh。还帮你配了 sudoers 权限——因为切换 VIP 需要 ip命令的 root 权限。

辉仔:以前这些 YAML 文件都是手动写吧?

张总:对,缩进错一个空格,整个服务就起不来。现在脚本根据模板自动替换,不会出错。

 七、健康检查:装完了,能跑吗?

辉仔:集群装完了,但我不确定有没有问题……

张总:来,我们验证一下。

# 检查数据库版本su - halo -c "pg_ctl -V"# 输出:pg_ctl (Halo Database) 16.x
# 检查数据库是否在运行su - halo -c "pg_ctl status"# 输出:pg_ctl: server is running (PID: 12345)
# 连接数据库,查看版本su - halo -c "psql -c 'SELECT version();'"# 输出:Halo Database 16.x on x86_64-pc-linux-gnu
# 检查流复制状态(在主库上执行)su - halo -c "psql -c 'SELECT * FROM pg_stat_replication;'"# 输出:能看到从库的连接信息,state = streaming
# 检查兼容模式端口ss -tulpn | grep halo# 1921(默认端口)、1521(Oracle)、3306(MySQL)、5432(PostgreSQL)
# 检查 etcd 状态systemctl status etcd# active (running)
# 检查 clustermgr 状态systemctl status clustermgr# active (running)

辉仔:全绿!

张总:再测一下高可用切换。我把主库的数据库停了,看看 clustermgr 会不会自动把从库提升为主库。

张总在主库上执行 su - halo -c "pg_ctl stop"。

辉仔(紧张地盯着屏幕):VIP 飘了吗?

几秒后,在从库上检查:

ip addr | grep 192.168.1.200# inet 192.168.1.200/32 scope global eth0

辉仔:VIP 已经飘过来了!新主库已经接管了!

张总:clustermgr 检测到主库挂了,自动执行了故障切换:把从库提升为主库,把 VIP 漂移到新主库。应用完全无感知,因为它一直连的是 VIP,VIP 背后的机器变了它不知道也不需要知道。

辉仔:这……这也太牛了吧。

 八、脚本解决的五大痛点

辉仔回到工位上,开始整理笔记。他把这个脚本解决的痛点总结成了五条:

痛点一:不知道第一步该干嘛

以前:打开文档,23 步操作,光看完就要半小时,还不一定看得懂。

现在:运行脚本,按提示走。每一步都有说明,每一步都有默认值。不知道的直接回车。

 痛点二:参数配置像拆弹

以前:shared_buffers要按内存比例算,kernel.sem四个数不知道啥意思,random_page_cost默认值对 SSD 不友好。

现在:脚本自动检测硬件配置,自动计算最优参数。你甚至不需要知道这些参数存在。

痛点三:兼容模式装不全

以前:Oracle 模式装完了,忘了装 DBMS_LOB。MySQL 模式忘了装 aux_mysql 扩展。应用一跑就报错,回头补装又折腾半天。

现在:输入 all,三种兼容模式 + 所有内置包 + 所有扩展,一键全部装完。

 痛点四:集群配置太复杂

以前:从库搭建流复制,要手动配 IP、端口、用户、密码、复制槽,改 pg_hba.conf、执行pg_basebackup、手动写恢复配置。etcd 集群要拼一堆配置参数,clustermgr 的 YAML 文件缩进错一格就启动失败。

现在:交互式引导,问你几个问题就搞定。配置文件自动生成,不会出错。

痛点五:排错无从下手

以前:装了三天没成功,不知道哪一步出了问题。日志?不存在的。

现在:每一步操作都记录到带时间戳的日志文件中:

Install_Halo16_20260413153000.log

出了问题,打开日志一看就知道哪一步失败了。

九、辉仔的蜕变

周五下午,辉仔在公司的技术分享会上做了一个汇报。

PPT 最后一页写着:

部署 Halo Database 集群,从手动操作的 23 步、3 天、无数个坑,变成了运行一个脚本、输入 5 次键盘、15 分钟完成。

以前是"跪着求软件装上",现在是"站着把活干完"。

台下有人问:"辉仔,你现在是数据库专家了吗?"

辉仔笑着说:"不是,我只是会用工具了。真正厉害的不是我,是写脚本那个人。"

张总坐在后排,喝了口保温杯里的茶,微微笑了。

十、快速上手指南

如果你也想试试这个脚本,三步搞定:

第一步:准备一台 Linux 服务器(CentOS/Ubuntu/麒麟/openEuler 都行),上传 Halo Database 安装包和license。

第二步:进入product目录运行脚本。

./halo_1.0.16_installer

第三步:跟着提示走。不知道的按回车用默认值,选错了重新跑一遍就行。

小贴士:

  • 集群部署时,数据库目录和归档目录在所有节点上必须保持一致

  • 脚本需要 root 用户执行

  • 确保 license.lic 文件已上传到服务器

  • 安装过程会自动生成日志文件,建议保留以备排查

觉得这篇文章有用?

点个赞,让更多被数据库部署折磨的小伙伴看到。

转发给你那个还在手动敲命令的同事——别让他继续跪着了。

关注我们,后续还有更多 Halo Database 实战干货。

别问,问就是脚本替你跪着求软件装上了。现在轮到你站着了。