基于openEuler系统实现openGauss 6.0 LTS企业版高可用主备部署方案

基于openEuler系统实现openGauss 6.0 LTS企业版高可用主备部署方案

一、openGauss介绍

1.1 openGauss简介

openGauss 是一款企业级开源关系型数据库,深度融合了华为在数据库领域多年的研发经验,基于 PostgreSQL 发展而来,采用木兰宽松许可证 v2 发布。它面向多核架构实现极致性能,提供全链路数据安全、AI 驱动的智能调优与高效运维能力,全面开放且生态友好。openGauss 6.0 LTS 版本在高性能、高可用、强扩展的基础上,进一步增强了分布式事务支持、存储引擎优化和安全性,支持 SQL 与 JSON 数据类型,具备高并发、高吞吐的数据处理能力,广泛适用于金融、电信、政务等关键行业,致力于为用户提供长期稳定、高效可靠的数据管理解决方案。

1.2 openGauss架构图

openGauss是单机系统,支持一主多备,最多支持八个备机。

名称 描述
OM 运维管理模块(Operation Manager),提供数据库日常运维和配置管理的接口与工具。
CM 数据库管理模块(Cluster Manager),负责监控和管理数据库系统中的各个功能单元和物理资源,确保整个系统的稳定运行。
客户端驱动 负责接收来自应用的访问请求,并与 openGauss 实例通信,发送 SQL 命令并返回执行结果。
openGauss(主备) openGauss 主备实例(Datanode),负责存储业务数据、执行数据查询任务并向客户端返回结果,支持一主多备架构,建议主备部署在不同物理节点上。
Storage 服务器本地存储资源,用于持久化存储数据。

二、实践环境介绍

2.1 实践介绍

  1. 本次实践基于个人测试环境进行,生产环境请谨慎使用。
  2. 在局域网单可用区(AZ)部署中,采用一主一备架构并使用同步复制方式,以保障数据安全性和高可用性。
  3. 对于对性能要求极高且可容忍少量数据丢失的场景,可选择异步复制方式作为替代方案。
  4. 实验所使用的操作系统为openEuler 22.03 LTS。
  5. 实践目标是部署 openGauss 6.0.2(LTS)的高可用主从架构。

2.2 实践环境规划

Hostname IP地址 系统版本 openGauss版本 角色 备注
openEuler01 192.168.3.51 openEuler 22.03 LTS openGauss 6.0.2(LTS) ——
openEuler02 192.168.3.52 openEuler 22.03 LTS openGauss 6.0.2(LTS) ——

2.3 软硬件配置要求

  • 官方推荐配置

注:具体要求请参照官方文档中提供的详细信息。

  • 本次实践环境配置

本次实验采用较低配置以适应测试环境的需求:

  • CPU: 4核(4C)
  • 内存: 8GB(8G)
  • 存储: 600GB(600G)
  • 节点数量: 两台虚拟机环境

提示:此配置适用于个人或小规模测试场景,生产环境部署需根据实际情况调整配置。

三、环境准备工作

3.1 配置hosts文件

  • 两个节点都需要配置主机名:

主数据库(节点1服务器):

hostnamectl set-hostname openEuler01

从数据库(节点2服务器):

hostnamectl set-hostname openEuler02
  • 配置hosts文件,如下所示:
vim /etc/hosts
192.168.3.51 openEuler01
192.168.3.52 openEuler02

3.2 安全设置

  • 关闭selinux
setenforce 0
sed -i 's/SELINUX=enforcing/SELINUX=disabled/' /etc/selinux/config
  • 停止本地防火墙
systemctl stop firewalld
systemctl disable firewalld

3.3 设置字符集

两台节点同时执行以下命令,设置字符集。

echo "export LANG=en_US.UTF-8"  >> /etc/profile
source /etc/profile

3.4 设置时区

  • 设置时区为上海时区,如下所示:
timedatectl set-timezone Asia/Shanghai
  • 设置时间同步:
chronyc -a makestep

3.5 关闭swap交换内存(可选)

当系统拥有充足的内存时,建议关闭交换分区(swap),以提高数据库访问性能。如果系统内存不足,则应保持交换分区开启,以避免因内存耗尽而导致的系统稳定性问题。这样可以根据实际的硬件资源状况优化数据库的操作效率。

swapoff -a

3.6 安装相关依赖工具

执行以下命令,安装以下相关工具。

yum install -y libaio  libaio-devel readline-devel expect  bzip2  flex bison ncurses-devel glibc-devel patch openssl-devel sqlite-devel libnsl

四、新建安装用户

4.1 新建用户

  1. 安装openGauss前需确保数据库包解压路径和安装路径具有读、写、执行权限,且安装路径必须为空目录。
  2. 安装过程中将自动创建名为"omm"的数据库用户,该用户由安装脚本根据指定参数生成。
  3. "omm"用户将作为openGauss的管理员账户,负责后续系统的运行维护及管理操作。
groupadd opgdb
useradd -g opgdb -m omm
echo "Huawei1234%" | sudo passwd --stdin omm

4.2 目录规划

  • openGauss 相关目录的整体规划,如下所示:
目录路径 用途说明
/data/opengauss/download 数据库安装包存放目录
/data/opengauss/soft 数据库安装目录
/data/opengauss/log/ 日志目录
/data/opengauss/tmp 临时文件目录
/data/opengauss/tools 数据库工具目录
/data/opengauss/core 数据库 core 文件目录

4.3 目录授权

为保证/data/opengauss目录下omm用户有相关读写、执行权限,我们需要进行权限设置。

mkdir -p /data/opengauss
chown -R omm:opgdb  /data/opengauss

五、主节点安装openGauss

5.1 下载软件包到主节点

我们在openGauss官网下载openGauss企业版软件包,如下所示

  • 创建/data/opengauss/download目录,执行以下命令即可。
mkdir -p /data/opengauss/download  && cd /data/opengauss/download
  • 通过Xshell的Xftp工具,将下载的openGauss软件包上传到/data/opengauss/download目录。
[root@openEuler01 download]# ll
total 155M
-rw-r--r--. 1 root root 155M Jul 26 12:28 openGauss-All-6.0.2-openEuler22.03-x86_64.tar.gz

5.2 编辑集群配置文件

官方的集群一主一备配置模板文件,内容如下:

<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <!-- openGauss整体信息 -->
    <CLUSTER>
        <!-- 数据库名称 -->
        <PARAM name="clusterName" value="Cluster_template" />
        <!-- 数据库节点名称(hostname) -->
        <PARAM name="nodeNames" value="node1_hostname,node2_hostname" />
        <!-- 数据库安装目录-->
        <PARAM name="gaussdbAppPath" value="/opt/huawei/install/app" />
        <!-- 日志目录-->
        <PARAM name="gaussdbLogPath" value="/var/log/omm" />
        <!-- 临时文件目录-->
        <PARAM name="tmpMppdbPath" value="/opt/huawei/tmp"/>
        <!-- 数据库工具目录-->
        <PARAM name="gaussdbToolPath" value="/opt/huawei/install/om" />
        <!-- 数据库core文件目录-->
        <PARAM name="corePath" value="/opt/huawei/corefile"/>
        <!-- 节点IP,与数据库节点名称列表一一对应 -->
        <PARAM name="backIp1s" value="192.168.0.1,192.168.0.2"/> 
    </CLUSTER>
    <!-- 每台服务器上的节点部署信息 -->
    <DEVICELIST>
        <!-- 节点1上的部署信息 -->
        <DEVICE sn="node1_hostname">
            <!-- 节点1的主机名称 -->
            <PARAM name="name" value="node1_hostname"/>
            <!-- 节点1所在的AZ及AZ优先级 -->
            <PARAM name="azName" value="AZ1"/>
            <PARAM name="azPriority" value="1"/>
            <!-- 节点1的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->
            <PARAM name="backIp1" value="192.168.0.1"/>
            <PARAM name="sshIp1" value="192.168.0.1"/>
            
	    <!--dn-->
            <PARAM name="dataNum" value="1"/>
	    <PARAM name="dataPortBase" value="15400"/>
	    <PARAM name="dataNode1" value="/opt/huawei/install/data/dn,node2_hostname,/opt/huawei/install/data/dn"/>
            <PARAM name="dataNode1_syncNum" value="0"/>
        </DEVICE>

        <!-- 节点2上的节点部署信息,其中“name”的值配置为主机名称 -->
        <DEVICE sn="node2_hostname">
            <!-- 节点2的主机名称 -->
            <PARAM name="name" value="node2_hostname"/>
            <!-- 节点2所在的AZ及AZ优先级 -->
            <PARAM name="azName" value="AZ1"/>
            <PARAM name="azPriority" value="1"/>
            <!-- 节点2的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->
            <PARAM name="backIp1" value="192.168.0.2"/>
            <PARAM name="sshIp1" value="192.168.0.2"/>
	</DEVICE>
    </DEVICELIST>
</ROOT>

在/data/opengauss/download目录下,编辑集群配置文件一主一备cluster_config.xml文件。需要根据自己的实际环境进行修改,本次实践环境修改后的配置文件内容如下:

vim clusterconfig.xml
<?xml version="1.0" encoding="UTF-8"?>
<ROOT>
    <!-- openGauss整体信息 -->
    <CLUSTER>
        <!-- 数据库名称 -->
        <PARAM name="clusterName" value="Cluster_myo" />
        <!-- 数据库节点名称(hostname) -->
        <PARAM name="nodeNames" value="openEuler01,openEuler02" />
        <!-- 数据库安装目录-->
        <PARAM name="gaussdbAppPath" value="/data/opengauss/soft" />
        <!-- 日志目录-->
        <PARAM name="gaussdbLogPath" value="/data/opengauss/log" />
        <!-- 临时文件目录-->
        <PARAM name="tmpMppdbPath" value="/data/opengauss//tmp"/>
        <!-- 数据库工具目录-->
        <PARAM name="gaussdbToolPath" value="/data/opengauss/tools" />
        <!-- 数据库core文件目录-->
        <PARAM name="corePath" value="/data/opengauss/core"/>
        <!-- 节点IP,与数据库节点名称列表一一对应 -->
        <PARAM name="backIp1s" value="192.168.3.51,192.168.3.52"/>
    </CLUSTER>
    <!-- 每台服务器上的节点部署信息 -->
    <DEVICELIST>
        <!-- 节点1上的部署信息 -->
        <DEVICE sn="openEuler01">
            <!-- 节点1的主机名称 -->
            <PARAM name="name" value="openEuler01"/>
            <!-- 节点1所在的AZ及AZ优先级 -->
            <PARAM name="azName" value="AZ1"/>
            <PARAM name="azPriority" value="1"/>
            <!-- 节点1的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->
            <PARAM name="backIp1" value="192.168.3.51"/>
            <PARAM name="sshIp1" value="192.168.3.51"/>

	    <!--dn-->
            <PARAM name="dataNum" value="1"/>
	    <PARAM name="dataPortBase" value="15400"/>
	    <PARAM name="dataNode1" value="/data/opengauss/data/dn,openEuler02,/data/opengauss/data/dn"/>
            <PARAM name="dataNode1_syncNum" value="0"/>
        </DEVICE>

        <!-- 节点2上的节点部署信息,其中“name”的值配置为主机名称 -->
        <DEVICE sn="openEuler02">
            <!-- 节点2的主机名称 -->
            <PARAM name="name" value="openEuler02"/>
            <!-- 节点2所在的AZ及AZ优先级 -->
            <PARAM name="azName" value="AZ1"/>
            <PARAM name="azPriority" value="1"/>
            <!-- 节点2的IP,如果服务器只有一个网卡可用,将backIP1和sshIP1配置成同一个IP -->
            <PARAM name="backIp1" value="192.168.3.52"/>
            <PARAM name="sshIp1" value="192.168.3.52"/>
	</DEVICE>
    </DEVICELIST>
</ROOT>
  • 注意事项:
  1. 请确保节点1和节点2的主机名(name)与系统实际主机名保持一致,避免节点识别异常。
  2. 集群名称(clusterName)建议根据实际业务或环境命名,确保集群唯一性和可识别性。
  3. 各目录路径(如安装目录、日志目录等)需与前期规划一致,并确保路径实际存在且权限正确。
  4. 每个节点的 backIp1sshIp1 应根据服务器网络配置准确填写,确保节点间通信正常。
  5. 节点IP列表(backIp1s)需与 nodeNames 中的主机名顺序一一对应,确保集群配置一致性。
  6. 在多节点部署中,务必确认各节点的可用区(azName)和优先级(azPriority)配置一致。
  7. 若为双机部署,需确保主备节点数据目录配置正确,并满足数据同步和故障切换需求。

5.3 解压软件包

  • 解压openGauss安装包,如下所示:
 tar -xzf openGauss-All-6.0.2-openEuler22.03-x86_64.tar.gz

[root@openEuler01 download]# tar -xzf openGauss-All-6.0.2-openEuler22.03-x86_64.tar.gz
[root@openEuler01 download]# tar -xzf openGauss-OM-6.0.2-openEuler22.03-x86_64.tar.gz
[root@openEuler01 download]# ll
total 310M
-rw-r--r--.  1 root root 2.5K Jul 26 12:30 clusterconfig.xml
drwxr-xr-x. 19 root root 4.0K Jul 15 17:47 lib
-rw-r--r--.  1 root root 155M Jul 26 12:28 openGauss-All-6.0.2-openEuler22.03-x86_64.tar.gz
-rw-r--r--.  1 root root    0 Jul 15 17:49 openGauss-CM-6.0.2-openEuler22.03-x86_64.sha256
-rw-r--r--.  1 root root  24M Jul 15 17:49 openGauss-CM-6.0.2-openEuler22.03-x86_64.tar.gz
-rw-r--r--.  1 root root   65 Jul 15 17:47 openGauss-OM-6.0.2-openEuler22.03-x86_64.sha256
-rw-r--r--.  1 root root  23M Jul 15 17:47 openGauss-OM-6.0.2-openEuler22.03-x86_64.tar.gz
-rw-r--r--.  1 root root   65 Jul 15 17:49 openGauss-Server-6.0.2-openEuler22.03-x86_64.sha256
-rw-r--r--.  1 root root 109M Jul 15 17:49 openGauss-Server-6.0.2-openEuler22.03-x86_64.tar.bz2
drwxr-xr-x. 11 root root 4.0K Jul 15 17:47 script
-rw-------.  1 root root   65 Jul 15 17:46 upgrade_sql.sha256
-rw-------.  1 root root 640K Jul 15 17:46 upgrade_sql.tar.gz
-rw-r--r--.  1 root root   35 Jul 15 17:47 version.cfg
  • 进入到工具脚本存放目录下,如下所示:
[root@openEuler01 download]#  cd script/
[root@openEuler01 script]# ls
base_diff     gs_check      gs_ddr        gs_perfconfig     gs_ssh         impl         os_platform   ssh-agent
base_utils    gs_checkos    gs_dropnode   gs_postuninstall  gs_sshexkey    __init__.py  py_pstree.py  ssh-copy-id
config        gs_checkperf  gs_expansion  gs_preinstall     gs_uninstall   killall      scp           ssh-keygen
domain_utils  gs_checkse    gs_install    gspylib           gs_upgradechk  local        ssh           transfer.py
gs_backup     gs_collector  gs_om         gs_sdr            gs_upgradectl  osid.conf    ssh-add       upgrade_checker

5.4 初始化环境安装

我们在root账号下,执行以下初始化环境安装脚本。在执行过程中,会提示我们输入节点2服务器openGuass02的root账号密码,并且需要输入我们之前新的omm的用户密码,根据提示一步步完成即可。

./gs_preinstall -U omm -G opgdb  -X /data/opengauss/download/clusterconfig.xml
  • -U omm:指定 openGauss 数据库服务运行时使用的用户名为 omm
  • -G opgdb:指定 -U 参数所定义的用户 omm 所属的主要组为 opgdb
  • -X /data/opengauss/download/clusterconfig.xml:指定包含集群配置信息的 XML 文件路径,用于指导 gs_preinstall 脚本进行预安装操作。

5.5 执行安装(主节点操作)

我们在主节点切换omm用户,如下所示:

su - omm

执行以下命令,进入脚本目录。

cd /data/opengauss/download/script  && cd /data/opengauss/download/script

执行以下一键安装脚本,执行过程中会提示我们输入数据库用户密码,默认是创建omm数据库用户。看到如下Successfully started cluster.提示后,我们的一主一备openGauss集群部署完成。

gs_install -X /data/opengauss/download/clusterconfig.xml  --gsinit-parameter="--locale=en_US.utf8"

5.6 验证安装

我们以 当前omm 用户身份执行以下命令检查数据库状态,确保“cluster_state”显示为“Normal”,此时数据库状态正常。

[omm@openEuler01 script]$ gs_om -t status
-----------------------------------------------------------------------

cluster_name    : Cluster_myo
cluster_state   : Normal
redistributing  : No

-----------------------------------------------------------------------

我们查看 openGauss 集群的详细信息,可执行以下命令。通过输出结果我们可以知道当前 openGauss 集群状态正常,cluster_state 显示为 “Normal”,表示集群处于可正常使用状态。 数据节点状态显示:主节点(Primary)运行在 openEuler01 上,备节点(Standby)运行在 openEuler02 上,两者均处于正常运行状态。

[omm@openEuler01 script]$ gs_om -t status --detail
[   Cluster State   ]

cluster_state   : Normal
redistributing  : No
current_az      : AZ_ALL

[  Datanode State   ]

    node       node_ip         port      instance                        state
----------------------------------------------------------------------------------------------
1  openEuler01 192.168.3.51    15400      6001 /data/opengauss/data/dn   P Primary Normal
2  openEuler02 192.168.3.52    15400      6002 /data/opengauss/data/dn   S Standby Normal

5.7 测试连接数据库

在 openGauss 集群部署完成后,系统会自动创建一个名为 postgres 的默认数据库。首次连接时,可以使用该数据库进行功能测试,连接方式如下所示:

gsql -d postgres -p 15400

  1. 使用 gsql 命令连接数据库时,命令格式为 gsql -d postgres -p 15400
  2. 在此命令中,postgres 是你要连接的数据库名称。
  3. 参数 15400 表示数据库主节点的默认端口号。
  4. 此端口号对应于 XML 配置文件中的 dataPortBase 值。
  5. 根据自己的实际环境配置,替换 postgres 和端口号以匹配你的设置。
  6. 确保使用正确的数据库名称和端口号进行连接测试。

六、踩坑记录

6.1 python版本不兼容报错

最初在 openEuler 24.03 LTS 系统上尝试安装适用于 openEuler 22.03 LTS 的 openGauss 6.0 LTS 安装包,结果在执行初始化环境安装脚本时,由于 Python 版本不兼容导致安装失败。具体的错误信息表明了版本间的不匹配问题。将操作系统更换为 openEuler 22.03 LTS 并确保所有相关组件的版本一致后,该问题得以解决。这说明保持系统和软件包之间的版本兼容性是成功部署的关键。


6.2 缺失系统基本软件工具

在执行初始化环境安装脚本过程中,系统报错提示在远程主机 openEuler02 上无法执行 /bin/tar 命令,经排查发现是由于该节点未安装 tar 工具,导致脚本执行失败。这是因为在集群部署过程中,openGauss 的预安装脚本需要依赖一些基础工具来完成安装包的解压与分发。为解决该问题,在 openEuler02 节点上通过 yum 安装了 tar 及常用的 vim 工具,命令如下:

yum -y install tar vim

安装完成后,重新执行预安装脚本,问题得以解决,安装流程恢复正常。该问题提醒我们在部署前应确保所有节点的基础环境和常用工具已准备就绪。

报错如下所示

./gs_preinstall -U omm -G opgdb  -X /data/opengauss/download/cluster_config.xml

七、测试主备数据同步

7.1 创建测试数据

创建测试数据库,这里我们创建一个测试数据库jeven_db。

CREATE DATABASE jeven_db;
  • 创建数据表
CREATE TABLE electronics_products (
    product_id INT PRIMARY KEY,
    product_name VARCHAR(100),
    brand VARCHAR(50),
    price NUMERIC(10, 2),
    stock INT,
    release_date DATE
);
  • 插入测试数据
INSERT INTO electronics_products VALUES
(1, 'Smartphone X1', 'Brand A', 4999.99, 100, '2025-01-15'),
(2, 'Laptop Pro', 'Brand B', 12999.00, 50, '2025-02-20'),
(3, 'Wireless Headphones', 'Brand C', 899.99, 200, '2025-03-10');
  • 执行以下命令,查询数据表内容。
SELECT * FROM electronics_products;

7.2 在从节点上查看主从同步

登录从节点服务器openGauss02,切换omm用户登录。

su - omm

连接到备节点数据库,如下所示:

gsql -d postgres -p 15400

查询电子产品表测试数据,可以看到数据已经正常同步了。

openGauss=#  SELECT * FROM electronics_products;
 product_id |    product_name     |  brand  |  price   | stock |    release_date
------------+---------------------+---------+----------+-------+---------------------
          1 | Smartphone X1       | Brand A |  4999.99 |   100 | 2025-01-15 00:00:00
          2 | Laptop Pro          | Brand B | 12999.00 |    50 | 2025-02-20 00:00:00
          3 | Wireless Headphones | Brand C |   899.99 |   200 | 2025-03-10 00:00:00
(3 rows)

openGauss=#

八、总结


通过本次基于 openEuler 系统对 openGauss 6.0 LTS 企业版的高可用主备部署实践,不仅加深了对国产数据库架构的理解,也提升了在实际环境中排查问题、解决问题的能力。整个部署过程中虽然遇到了诸如系统版本与数据库版本不兼容、配置文件错误、主备同步异常等问题,但通过仔细阅读官方文档、分析日志信息以及不断尝试,最终顺利完成了高可用集群的搭建。整个过程虽有波折,但也正是这些“踩坑”经历,让我对 openGauss 的运行机制和部署流程有了更加深入和全面的掌握。openGauss 作为一款高性能、高可靠性的国产数据库,不仅具备成熟数据库应有的稳定性和安全性,还在性能优化、智能运维等方面不断创新,真正体现了国产数据库的崛起与进步,值得在更多企业级场景中推广应用。