-
一、一表带你了解防火墙常见的冗余备份方式冗余方式核心原理适用场景1. 主备模式(Active/Standby)两台防火墙一台作为主设备(Active) 承担业务流量,另一台作为备设备(Standby) 处于待命状态;主设备故障时,备设备自动接管业务。对成本敏感、业务连续性要求中等的场景(如中小企业、分支机构),需确保故障时业务不中断,但可接受短暂切换时间。2. 双主模式(Active/Active,负载分担)两台防火墙均处于活跃状态,通过负载均衡算法(如基于源 IP、目的 IP、会话)分担业务流量;单台设备故障时,另一台接管全部流量。高带宽需求、业务流量较大的场景(如数据中心出口、核心骨干网),需同时实现 “冗余备份” 和 “流量分担”,提升资源利用率。3. 集群模式(Cluster,堆叠 / 虚拟化)多台防火墙通过专用协议(如 VRRP、VGMP、IRF)虚拟化为一个逻辑设备,对外呈现单一 IP 和接口;内部自动实现流量分担、故障检测和业务接管。超大规模网络(如大型企业总部、云数据中心),需极致的可靠性和扩展性,支持 10 台以上设备集群,切换时间毫秒级。4. 链路冗余(多链路备份)单台防火墙通过多个物理接口连接不同链路(如双 ISP 出口),利用路由协议(如 BGP、OSPF)或链路检测协议(如 BFD)实现链路故障时的自动切换。单设备部署场景下,需避免 “链路单点故障”(如 ISP 线路中断),确保出口链路可靠性。5. 会话同步冗余(含 HRP 热备)主备 / 双主设备之间通过专用协议(如 HRP、HSRP)实时同步会话表、配置信息、状态信息(如 NAT 表、ACL 策略、连接状态),确保切换后业务不中断(用户无感知)。依赖 “状态检测” 的业务(如 TCP 长连接、VPN、在线交易),需避免故障切换时会话中断导致业务异常。 二、最常用的冗余备份方式:主备模式在所有冗余方式中,主备模式(尤其是基于 HRP 协议的热备主备模式) 是最广泛使用的1. 成本与复杂度平衡只需要 2 台防火墙即可部署,硬件成本低于双主模式(需两台设备均具备高吞吐能力)和集群模式(多台设备 + 专用集群模块)。配置逻辑简单,无需复杂的负载均衡算法或集群虚拟化配置,运维门槛低,适合中小型企业或分支机构的 IT 团队。2. 兼容性与普适性强几乎所有主流厂商(华为、华三、飞塔、 Palo Alto 等)的防火墙均原生支持主备模式,且兼容传统网络架构(如静态路由、VLAN、VPN 等),无需对现有网络进行大规模改造。3. 业务连续性保障到位结合 HRP(Hot Standby Protocol,热备协议)等会话同步技术后,主备切换时可实现配置、会话、状态信息的无缝同步,切换时间通常在 1-3 秒内(部分高端设备可达毫秒级),用户侧(如网页浏览、在线办公)基本无感知。4. 适用场景覆盖广无论是企业出口防火墙、内网分区防火墙,还是数据中心边界防火墙,主备模式均可满足 “避免单点故障” 的核心需求,尤其适合对 “资源利用率” 要求不高、但对 “稳定性” 要求明确的场景。 三、我们常说的镜像模式、主备模式、HRP 热备模式的核心区别三者的本质差异在于核心作用、数据流向、故障处理机制,需明确:HRP 热备模式是主备模式的 “增强版”,而镜像模式并非冗余备份方式,仅用于流量监控。对比维度镜像模式(Mirror Mode)主备模式(Active/Standby,基础版)HRP 热备模式(Active/Standby + HRP)核心作用流量复制与监控,无冗余备份能力。设备级冗余备份,解决设备单点故障。设备 + 会话级冗余备份,解决设备故障 + 会话中断问题。数据流向业务流量仅通过单台防火墙,同时复制一份流量到监控设备(如 IDS/IPS、日志服务器),不影响主流量转发。业务流量仅通过主设备;备设备不转发流量,仅处于 “待命” 状态(仅检测主设备心跳)。业务流量仅通过主设备;备设备实时同步主设备的配置、会话表、NAT 表等,处于 “热待命” 状态。故障处理主设备故障时,业务直接中断(无接管机制),仅监控端能看到故障前的流量日志。主设备故障(如断电、链路中断)时,备设备通过心跳检测(如 VGMP 协议)接管 IP 和业务,但已建立的会话会中断(如用户需重新登录、TCP 连接断开)。主设备故障时,备设备接管业务,由于已同步会话和状态信息,现有会话不中断(用户无感知,业务持续运行)。部署成本低(仅需 1 台防火墙 + 1 台监控设备,无需额外冗余设备)。中(需 2 台同型号防火墙,无需专用协议授权)。中高(需 2 台同型号防火墙,且需支持 HRP 协议(部分厂商需 License))。适用场景网络审计、入侵检测、日志分析(如企业内网行为监控、合规审计)。对会话连续性要求低的场景(如普通办公上网、非实时性业务)。对会话连续性要求高的场景(如 VPN 接入、在线交易、视频会议、云服务访问)。典型厂商实现华为(端口镜像)、华三(Mirroring)、Cisco(SPAN/RSPAN)。华为(基础主备)、华三(IRF 基础模式)、飞塔(Active/Standby)。华为(HRP 协议)、华三(VRRP + 会话同步)、深信服(双机热备)。四、总结一下下冗余备份核心逻辑:所有方式均以 “消除单点故障” 为目标,区别在于对 “资源利用率”“会话连续性”“扩展性” 的侧重。最常用选择:主备模式(含 HRP 热备)凭借 “低成本、易部署、高兼容” 成为主流,尤其适合 80% 以上的企业级场景。模式区分关键:镜像模式≠冗余备份,仅用于流量监控;基础主备模式解决 “设备故障”,但丢失会话;HRP 热备模式是基础主备的升级,通过会话同步实现 “业务无感知切换”。
-
openGauss连接类算子当前支持的连接类型包括Hash Join(哈希连接)、Merge Join(合并连接)和Nested Loop Join(嵌套循环连接)三种。这三种连接算子覆盖了数据库中最常见的表关联场景,每种算子都有其特定的适用场景和优化策略。一、Hash Join(哈希连接)Hash Join是openGauss中处理大数据集连接的核心算子,其实现逻辑基于哈希表的快速查找特性。适用场景:当其中一个输入表(通常为内表)的数据量较小且能完全放入内存时,Hash Join的性能最优。此时,优化器会将内表的数据按连接键构建哈希表,然后扫描外表并通过探测哈希表快速匹配符合条件的行。实现原理:Hash Join的执行过程分为两个阶段:构建阶段:从内表中读取数据,根据连接键计算哈希值,将数据存入内存中的哈希表(若数据量超过内存限制,会溢出到磁盘临时段)。探测阶段:扫描外表的每一行数据,计算连接键的哈希值,探测哈希表中是否存在匹配项。若存在,则输出关联后的行;若不存在,则跳过(内连接场景)。特点:内存依赖度高:若内表数据量过大无法完全放入内存,会导致频繁的磁盘I/O,性能下降。适用于等值连接:仅支持连接条件为等值(如a.id = b.id)的场景,不支持范围查询或非等值条件。二、Merge Join(合并连接)Merge Join是openGauss中处理已排序数据集连接的高效算子,其实现逻辑基于双指针遍历有序数据。适用场景:当两个输入表的数据均已按连接键有序排列(如通过索引扫描或预先排序)时,Merge Join的性能优于Hash Join。此时,无需构建哈希表,直接通过双指针遍历即可完成连接。实现原理:Merge Join的执行过程分为三个阶段:排序阶段:若输入表未排序,需先通过排序算子(如Sort)将两个表的数据按连接键排序(此步骤会增加额外开销,因此仅当数据已排序时使用Merge Join才划算)。初始化指针:为两个有序数据集设置初始指针(指向第一条数据)。双指针遍历:比较两个指针所指数据的连接键值:若键值相等,输出关联后的行,并同时移动两个指针(处理重复键值的情况)。若左表键值小于右表键值,移动左表指针。若左表键值大于右表键值,移动右表指针。特点:无内存依赖:仅需少量内存存储当前指针位置的行数据,适合处理大数据集。仅支持有序数据:若输入数据未排序,排序阶段的开销可能抵消Merge Join的性能优势。适用于等值或范围连接:支持连接条件为等值(如a.id = b.id)或范围(如a.id > b.id)的场景,但范围连接时性能会有所下降。三、Nested Loop Join(嵌套循环连接)Nested Loop Join是openGauss中最基础的连接算子,其实现逻辑基于双重循环遍历两个输入表的所有组合。适用场景:当其中一个输入表(通常为外表)的数据量极小(如几行或几十行)时,Nested Loop Join的性能可接受。此时,外表的小数据量使得双重循环的总迭代次数可控。实现原理:Nested Loop Join的执行过程分为两个循环:外表循环:遍历外表的每一行数据。内表循环:对于外表的每一行,遍历内表的所有行,检查连接条件是否满足。若满足,则输出关联后的行。特点:计算复杂度高:时间复杂度为O(N*M)(N为外表行数,M为内表行数),因此仅适用于小数据集场景。无数据依赖:无需数据排序或构建哈希表,实现简单。适用于笛卡尔积或小表驱动:常用于处理笛卡尔积(如CROSS JOIN)或外表极小的连接场景(如WHERE a.id = b.id AND a.id IN (1,2,3))。四、三种连接算子的对比与选择策略算子类型适用场景性能优势性能劣势Hash Join大数据集、内表可放入内存内存访问快、无排序开销内存依赖度高、仅支持等值连接Merge Join已排序数据集、大数据集无内存依赖、支持范围连接需要排序、仅支持有序数据Nested Loop Join小数据集、外表极小实现简单、无数据依赖计算复杂度高、仅适用于小场景五、总结一下下openGauss的连接类算子通过Hash Join、Merge Join、Nested Loop Join三种类型,覆盖了数据库中几乎所有常见的表关联场景。优化器会根据输入数据的大小、排序状态、连接条件等因素,自动选择最优的连接算子(也可通过enable_hashjoin、enable_mergejoin、enable_nestloop等参数手动调整)。咱们在使用时,可根据数据特征和查询需求,合理设计索引(如为Merge Join创建有序索引)或调整数据分布(如将小表作为内表),以最大化连接查询的性能。
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集replication、replication_slot指标时失败了,报错信息如下:time=2025-09-05T09:34:16.375+08:00 level=ERROR source=collector.go:207 msg="collector failed" name=replication duration_seconds=0.0711601 err="ERROR: Function pg_last_wal_receive_lsn() does not exist. (SQLSTATE 42883)"time=2025-09-05T09:34:16.674+08:00 level=INFO source=namespace.go:235 msg="error finding namespace" err="Error running query on database \"113.44.80.136:8000\": pg_stat_replication ERROR: Function pg_last_wal_receive_lsn() does not exist. (SQLSTATE 42883)"time=2025-09-05T09:34:16.711+08:00 level=INFO source=namespace.go:235 msg="error finding namespace" err="Error running query on database \"113.44.80.136:8000\": pg_replication_slots ERROR: Function pg_last_wal_receive_lsn() does not exist. (SQLSTATE 42883)"time=2025-09-05T09:34:16.755+08:00 level=ERROR source=collector.go:207 msg="collector failed" name=replication_slot duration_seconds=0.4515532 err="ERROR: Function pg_last_wal_receive_lsn() does not exist. (SQLSTATE 42883)"time=2025-09-11T15:33:59.609+08:00 level=ERROR source=gaussdb_exporter.go:684 msg="error scraping dsn" err="queryNamespaceMappings errors encountered, namespace: pg_stat_replication error: Error running query on database \"113.44.80.136:8000\": pg_stat_replication ERROR: Function pg_last_wal_receive_lsn() does not exist. (SQLSTATE 42883), namespace: pg_replication_slots error: Error running query on database \"113.44.80.136:8000\": pg_replication_slots ERROR: Function pg_last_wal_receive_lsn() does not exist. (SQLSTATE 42883)" dsn="gaussdb://root:PASSWORD_REMOVED@113.44.80.136:8000/circle_test?sslmode=disable"相关SQL:SELECT *, (CASE pg_is_in_recovery () WHEN 't' THEN pg_last_wal_receive_lsn () ELSE pg_current_wal_lsn () END) AS pg_current_wal_lsn, ( CASE pg_is_in_recovery () WHEN 't' THEN pg_wal_lsn_diff (pg_last_wal_receive_lsn (), PG_LSN ('0/0')) :: FLOAT ELSE pg_wal_lsn_diff (pg_current_wal_lsn (), PG_LSN ('0/0')) :: FLOAT END ) AS pg_current_wal_lsn_bytes, ( CASE pg_is_in_recovery () WHEN 't' THEN pg_wal_lsn_diff (pg_last_wal_receive_lsn (), replay_lsn) :: FLOAT ELSE pg_wal_lsn_diff (pg_current_wal_lsn (), replay_lsn) :: FLOAT END ) AS pg_wal_lsn_diff FROM pg_stat_replication;SELECT slot_name, DATABASE, active, (CASE pg_is_in_recovery () WHEN 't' THEN pg_wal_lsn_diff (pg_last_wal_receive_lsn (), restart_lsn) ELSE pg_wal_lsn_diff (pg_current_wal_lsn (), restart_lsn) END) AS pg_wal_lsn_diff FROM pg_replication_slots;SELECT slot_name, slot_type, CASE WHEN pg_is_in_recovery () THEN pg_last_wal_receive_lsn () - '0/0' ELSE pg_current_wal_lsn () - '0/0' END AS current_wal_lsn, 0 AS confirmed_flush_lsn, active FROM pg_replication_slots;错误提示很明确:SQL查询中引用了名为 pg_last_wal_receive_lsn() 的函数,但该函数在数据库系统中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统函数与监控工具期望的不一致?pg_last_wal_receive_lsn() 函数在当前版本的GaussDB中是否存在?这个函数是否是PostgreSQL特有的而非GaussDB的内置函数?解决方案:对于这类复制监控指标采集,GaussDB的正确实践是什么?是需要使用不同的系统函数,还是需要查询特定的系统视图来获取接收LSN信息?是否需要启用特定的复制监控功能或配置?版本差异:pg_last_wal_receive_lsn() 函数是否是某些PostgreSQL版本中特有的?我当前使用的GaussDB版本可能基于哪个PostgreSQL基础版本,以及GaussDB自身对此功能的支持情况如何?任何关于此问题的排查思路、系统函数差异说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集replication_slot指标时失败了,报错信息如下:time=2025-09-17T10:45:23.325+08:00 level=ERROR source=collector.go:207 msg="collector failed" name=replication_slot duration_seconds=0.6615468 err="ERROR: Column \"wal_status\" does not exist. (SQLSTATE 42703)"相关SQL:SELECT slot_name, slot_type, 0 AS current_wal_lsn, 0 AS confirmed_flush_lsn, active, 0, wal_status FROM pg_replication_slots;错误提示很明确:SQL查询中引用了名为 wal_status的列,但该列在目标表中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?replication_slot相关的系统视图究竟是哪个?(例如是pg_replication_slots吗?)这个视图在当前版本的GaussDB中是否不包含 wal_status列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:wal_status列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集replication_slot指标时失败了,报错信息如下:time=2025-09-17T10:17:36.080+08:00 level=ERROR source=collector.go:207 msg="collector failed" name=replication_slot duration_seconds=0.8542995 err="ERROR: Column \"safe_wal_size\" does not exist. (SQLSTATE 42703)"相关SQL:SELECT slot_name, slot_type, 0 AS current_wal_lsn, 0 AS confirmed_flush_lsn, active, safe_wal_size, '' FROM pg_replication_slots;错误提示很明确:SQL查询中引用了名为 safe_wal_size的列,但该列在目标表中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?replication_slot相关的系统视图究竟是哪个?(例如是pg_replication_slots吗?)这个视图在当前版本的GaussDB中是否不包含 safe_wal_size列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:safe_wal_size列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集replication_slot指标时失败了,报错信息如下:time=2025-09-16T17:01:36.715+08:00 level=ERROR source=collector.go:207 msg="collector failed" name=replication_slot duration_seconds=0.4178095 err="ERROR: Column \"confirmed_flush_lsn\" does not exist. (SQLSTATE 42703)"相关SQL:SELECT slot_name, slot_type, 0 AS current_wal_lsn, COALESCE(confirmed_flush_lsn, '0/0') - '0/0' AS confirmed_flush_lsn, active, 0, '' FROM pg_replication_slots;错误提示很明确:SQL查询中引用了名为 confirmed_flush_lsn 的列,但该列在目标表中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?replication_slot相关的系统视图究竟是哪个?(例如是pg_replication_slots吗?)这个视图在当前版本的GaussDB中是否不包含 confirmed_flush_lsn列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:confirmed_flush_lsn列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集stat_archiver指标时失败了,报错信息如下:time=2025-09-05T09:34:16.745+08:00 level=INFO source=namespace.go:235 msg="error finding namespace" err="Error running query on database \"113.44.80.136:8000\": pg_stat_archiver ERROR: Relation \"pg_stat_archiver\" does not exist on dn_6001_6002_6003. (SQLSTATE 42P01)"相关SQL:SELECT *, extract(epoch from now() - last_archived_time) AS last_archive_ageFROM pg_stat_archiver错误提示很明确:SQL查询中视图pg_stat_archiver不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?stat_archiver 相关的系统视图究竟是哪个?(例如是pg_stat_archiver吗?)解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:视图pg_stat_archiver是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集stat_user_tables指标时失败了,报错信息如下:time=2025-09-05T09:34:16.792+08:00 level=ERROR source=collector.go:207 msg="collector failed" name=stat_user_tables duration_seconds=0.4879153 err="ERROR: Column \"n_mod_since_analyze\" does not exist. (SQLSTATE 42703)"相关SQL:SELECT current_database() datname, schemaname, relname, seq_scan, seq_tup_read, idx_scan, idx_tup_fetch, n_tup_ins, n_tup_upd, n_tup_del, n_tup_hot_upd, n_live_tup, n_dead_tup, COALESCE(last_vacuum, '1970-01-01Z') as last_vacuum, COALESCE(last_autovacuum, '1970-01-01Z') as last_autovacuum, COALESCE(last_analyze, '1970-01-01Z') as last_analyze, COALESCE(last_autoanalyze, '1970-01-01Z') as last_autoanalyze, vacuum_count, autovacuum_count, analyze_count, autoanalyze_count, pg_indexes_size(relid) as indexes_size, pg_table_size(relid) as table_sizeFROM pg_stat_user_tables错误提示很明确:SQL查询中引用了名为 n_mod_since_analyze 的列,但该列在目标表中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?stat_user_tables 相关的系统视图究竟是哪个?(例如是pg_stat_user_tables吗?)这个视图在当前版本的GaussDB中是否不包含 n_mod_since_analyze 列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:n_mod_since_analyze 列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集stat_activity指标时失败了,报错信息如下:time=2025-09-10T17:22:38.015+08:00 level=INFO source=namespace.go:235 msg="error finding namespace" err="Error running query on database \"113.44.80.136:8000\": pg_stat_activity ERROR: Column \"wait_event\" does not exist. (SQLSTATE 42703)"相关SQL:SELECT pg_database.datname, tmp.state, tmp2.usename, tmp2.application_name, tmp2.backend_type, tmp2.wait_event_type, tmp2.wait_event, COALESCE(count,0) as count, COALESCE(max_tx_duration,0) as max_tx_duration FROM ( VALUES ('active'), ('idle'), ('idle in transaction'), ('idle in transaction (aborted)'), ('fastpath function call'), ('disabled') ) AS tmp(state) CROSS JOIN pg_database LEFT JOIN ( SELECT datname, state, usename, application_name, backend_type, wait_event_type, wait_event, count(*) AS count, MAX(EXTRACT(EPOCH FROM now() - xact_start))::float AS max_tx_duration FROM pg_stat_activity GROUP BY datname,state,usename,application_name,backend_type,wait_event_type,wait_event) AS tmp2 ON tmp.state = tmp2.state AND pg_database.datname = tmp2.datname错误提示很明确:SQL查询中引用了名为 wait_event 的列,但该列在目标表中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?stat_activity 相关的系统视图究竟是哪个?(例如是pg_stat_activity吗?)这个视图在当前版本的GaussDB中是否不包含 wait_event 列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:wait_event 列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集stat_activity指标时失败了,报错信息如下:time=2025-09-10T15:47:07.742+08:00 level=INFO source=namespace.go:235 msg="error finding namespace" err="Error running query on database \"113.44.80.136:8000\": pg_stat_activity ERROR: Column \"wait_event_type\" does not exist. (SQLSTATE 42703)"相关SQL:SELECT pg_database.datname, tmp.state, tmp2.usename, tmp2.application_name, tmp2.backend_type, tmp2.wait_event_type, tmp2.wait_event, COALESCE(count,0) as count, COALESCE(max_tx_duration,0) as max_tx_duration FROM ( VALUES ('active'), ('idle'), ('idle in transaction'), ('idle in transaction (aborted)'), ('fastpath function call'), ('disabled') ) AS tmp(state) CROSS JOIN pg_database LEFT JOIN ( SELECT datname, state, usename, application_name, backend_type, wait_event_type, wait_event, count(*) AS count, MAX(EXTRACT(EPOCH FROM now() - xact_start))::float AS max_tx_duration FROM pg_stat_activity GROUP BY datname,state,usename,application_name,backend_type,wait_event_type,wait_event) AS tmp2 ON tmp.state = tmp2.state AND pg_database.datname = tmp2.datname错误提示很明确:SQL查询中引用了名为 wait_event_type 的列,但该列在目标表中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?stat_activity 相关的系统视图究竟是哪个?(例如是pg_stat_activity吗?)这个视图在当前版本的GaussDB中是否不包含 wait_event_type 列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:wait_event_type 列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集stat_activity指标时失败了,报错信息如下:time=2025-09-05T09:34:16.780+08:00 level=INFO source=namespace.go:235 msg="error finding namespace" err="Error running query on database \"113.44.80.136:8000\": pg_stat_activity ERROR: Column \"backend_type\" does not exist. (SQLSTATE 42703)"相关SQL:SELECT pg_database.datname, tmp.state, tmp2.usename, tmp2.application_name, tmp2.backend_type, tmp2.wait_event_type, tmp2.wait_event, COALESCE(count,0) as count, COALESCE(max_tx_duration,0) as max_tx_duration FROM ( VALUES ('active'), ('idle'), ('idle in transaction'), ('idle in transaction (aborted)'), ('fastpath function call'), ('disabled') ) AS tmp(state) CROSS JOIN pg_database LEFT JOIN ( SELECT datname, state, usename, application_name, backend_type, wait_event_type, wait_event, count(*) AS count, MAX(EXTRACT(EPOCH FROM now() - xact_start))::float AS max_tx_duration FROM pg_stat_activity GROUP BY datname,state,usename,application_name,backend_type,wait_event_type,wait_event) AS tmp2 ON tmp.state = tmp2.state AND pg_database.datname = tmp2.datname错误提示很明确:SQL查询中引用了名为 backend_type 的列,但该列在目标表中不存在。我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?stat_activity 相关的系统视图究竟是哪个?(例如是pg_stat_activity吗?)这个视图在当前版本的GaussDB中是否不包含 backend_type 列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:backend_type 列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
技术大神们好,我在使用GaussDB时遇到一个监控采集方面的错误,特来求助。我的collector在尝试采集stat_database指标时失败了,报错信息如下:time=2025-09-05T09:34:16.484+08:00 level=ERROR source=collector.go:207 msg="collector failed" name=stat_database duration_seconds=0.1799696 err="ERROR: Column \"active_time\" does not exist. (SQLSTATE 42703)"错误提示很明确:SQL查询中引用了名为 active_time 的列,但该列在目标表中不存在。相关SQL:SELECT datid, datname, numbackends, xact_commit, xact_rollback, blks_read, blks_hit, tup_returned, tup_fetched, tup_inserted, tup_updated, tup_deleted, conflicts, temp_files, temp_bytes, deadlocks, blk_read_time, blk_write_time, stats_reset, active_timeFROM pg_stat_database;我想了解:问题根因:这是否是因为我的GaussDB版本(或特定模式)中,系统视图或系统表的结构与采集工具期望的不一致?stat_database 相关的系统视图究竟是哪个?(例如是pg_stat_database吗?)这个视图在当前版本的GaussDB中是否不包含 active_time 列?解决方案:对于这类监控指标采集,GaussDB的正确实践是什么?是需要查询不同的系统视图,还是需要启用特定的监控开关或配置?版本差异:active_time 列是否是某些更新版本中才加入的?我当前使用的GaussDB版本可能是什么?任何关于此问题的排查思路、系统视图结构说明或版本兼容性信息都将非常有帮助!感谢!背景信息/补充说明(可选):我使用的GaussDB版本是:gaussdb (GaussDB Kernel 505.2.1 build ff07bff6) compiled at 2024-12-27 09:22:42 commit 10161 last mr 21504 release采集工具是:Prometheus gaussdb_exporter希望得到大家的指点,谢谢!
-
在华为云CCE(云容器引擎)中,通过Web界面创建负载能成功而直接在计算节点后台使用containerd命令拉取镜像失败,通常是由于Web界面创建负载时,系统会自动处理镜像拉取所需的网络、认证和配置,而手动在节点上使用containerd命令则可能缺乏这些必要的配置或环境。 1. Web界面创建负载成功的原因通过CCE控制台创建负载(如Deployment)时,系统会自动完成以下操作,确保镜像拉取成功:镜像拉取策略(Image Pull Policy):在创建工作负载时,您可以配置镜像拉取策略(如Always、IfNotPresent)。如果未显式设置,Kubernetes默认策略为Always,即每次启动容器时都会尝试从镜像仓库拉取最新镜像。但Web界面创建时,系统会智能处理策略,避免因本地镜像缺失导致失败。自动使用镜像拉取密钥(ImagePullSecrets):如果镜像来自私有仓库(如华为云SWR或第三方仓库),Web界面创建负载时会自动注入认证密钥(如default-secret用于华为云SWR仓库)。这提供了必要的身份凭证,使拉取操作得以授权。而手动命令若未指定密钥,会因认证失败被拒绝。网络代理或加速器配置:CCE集群可能配置了镜像加速器或代理(如通过修改containerd的config.toml或设置image-pull-progress-timeout参数),以优化拉取过程或绕过网络限制。Web界面创建的负载会利用这些集群级配置,而手动命令可能未应用这些设置。节点网络权限:集群节点可能通过NAT网关、弹性IP或VPN访问公网或特定镜像仓库。Web界面创建的负载继承集群网络设置,而手动命令可能因节点网络配置问题(如路由缺失、防火墙规则)导致超时或连接失败。2. 手动使用containerd命令失败的原因及解决方案在节点后台直接使用ctr(containerd的命令行工具)拉取镜像时,常见失败原因包括:镜像地址错误或不存在:确保镜像地址完整且正确(包括仓库URL、命名空间、镜像名和标签)。例如,拉取华为云SWR镜像需使用完整格式:swr.<region>.myhuaweicloud.com/<namespace>/<image>:<tag>。操作建议:核对镜像地址,尝试通过Web界面获取准确的拉取指令。认证问题(私有镜像):手动命令需显式提供认证信息。若未登录或未指定密钥,会返回denied或401 Unauthorized错误。解决方案:对于华为云SWR镜像,使用crictl或ctr时通过--user参数指定用户名和密码(通常为IAM用户名和令牌):ctr -n k8s.io images pull --user <username>:<password> <image-url>对于第三方私有仓库,需先在集群中创建Secret,并在命令中引用或直接配置认证文件。网络连接问题:手动拉取可能因节点网络配置不当(如DNS解析失败、路由缺失或防火墙拦截)而失败,错误信息可能包含dial tcp timeout或no such host。解决方案:检查节点网络:确保节点可访问镜像仓库(例如,通过ping或curl测试连通性)。若集群使用代理或加速器,手动配置containerd以应用这些设置。具体步骤:编辑/etc/containerd/config.toml,在[plugins."io.containerd.grpc.v1.cri".registry.mirrors]下为仓库添加镜像端点(如加速器地址)。重启containerd:systemctl restart containerd。对于公网镜像,确保节点有公网访问能力(如绑定EIP或配置SNAT)。磁盘空间不足:节点磁盘空间耗尽会导致拉取失败,错误信息可能提示no space left on device。解决方案:清理节点磁盘(如删除未使用的容器或镜像),或扩容磁盘。containerd兼容性问题:某些旧格式镜像(如使用application/octet-stream mediaType的层)可能不被containerd支持。解决方案:重新使用高版本Docker(>=v1.11)打包镜像,确保使用现代格式。3. 问题排查步骤若手动拉取持续失败,建议按以下顺序排查:检查镜像地址和标签:确认镜像存在且地址正确。验证网络连通性:ping <registry-host> # 测试网络可达性nslookup <registry-host> # 检查DNS解析检查认证配置:对于私有镜像,确保使用正确的用户名/密码或Secret。在CCE控制台查看负载配置中使用的imagePullSecrets。查看containerd配置:确认/etc/containerd/config.toml中是否配置了正确的镜像加速器或代理。检查image-pull-progress-timeout参数是否设置过短(建议延长超时时间)。检查节点资源:使用df -h查看磁盘空间。使用crictl ps -a或docker ps -a检查是否有残留容器占用资源。查看详细错误日志:使用ctr -n k8s.io images pull --debug <image-url>获取详细错误信息。在节点上查看containerd日志:journalctl -u containerd --no-pager -n 100。总结一下下通过Web界面创建负载能成功拉取镜像,是因为CCE自动处理了认证、网络加速、资源调度等底层细节。而手动使用containerd命令失败,通常是由于:缺乏自动注入的认证密钥(imagePullSecrets)未应用集群配置的镜像加速器或网络代理命令参数或环境配置不正确1、确认镜像地址正确性:使用与 web 界面相同的完整镜像地址(如包含 SWR 地域域名的地址)。 2、配置仓库认证:通过nerdctl login swr.cn-xxx.myhuaweicloud.com输入 SWR 的访问密钥(AK/SK),或通过ctr credentials set配置认证。 3、检查网络连通性:在节点执行curl -v https://镜像仓库地址,确认网络和端口(443)是否通畅。 4、指定 namespace:CCE 中容器通常运行在k8s.io命名空间下,拉取时可指定ctr -n k8s.io images pull 镜像地址。
-
GaussDB(尤其是华为 GaussDB (for PostgreSQL)、GaussDB 300 等企业级分布式版本)作为面向高可用场景的数据库,其 DN(Data Node,数据节点)的主备同步是保障数据一致性与服务连续性的核心机制。根据不同版本和部署场景,GaussDB 支持物理同步和逻辑同步两大类主备同步方式。 一、核心的同步方式:物理的同步(主流的高可用选择)物理同步是 GaussDB DN 主备同步的默认且最常用方式,其核心是基于 “物理数据块复制” 实现主备数据一致性,本质是主库将物理变更(如数据页修改、事务日志)实时同步到备库,备库以 “物理镜像” 方式恢复数据,确保主备数据完全一致(字节级一致)。1. 具体实现原理物理同步依赖 GaussDB 的WAL(Write-Ahead Logging,预写日志)机制,全流程可拆解为 3 个关键步骤:步骤 1:主库生成 WAL 日志主库上所有数据修改操作(如 INSERT/UPDATE/DELETE、DDL 语句),会先写入 WAL 日志(顺序写入,性能高效),再落盘到实际数据文件。WAL 日志记录的是 “物理层面的变更指令”(如 “修改数据页 X 的偏移量 Y 为值 Z”),而非逻辑 SQL 语句。步骤 2:WAL 日志同步到备库主库通过专用的 “日志发送进程(WALSender)”,将实时生成的 WAL 日志按 “段(Segment)” 或 “流式(Stream)” 方式推送到备库;备库则通过 “日志接收进程(WalReceiver)” 监听并接收 WAL 日志,暂存到本地的 “备库 WAL 缓冲区”。步骤 3:备库恢复 WAL 日志备库的 “恢复进程(Startup Process)” 读取本地暂存的 WAL 日志,按照与主库相同的物理顺序 “重放(Replay)” 日志中的变更指令 —— 即还原主库的数据修改操作,将变更应用到备库的数据文件中,最终实现主备数据的物理一致。 2. 关键的特性(适配高可用场景)数据强一致性:备库是主库的物理镜像,无数据语义偏差,支持 “故障无缝切换”(主库故障后,备库可直接接管服务,无需数据修复);低延迟:采用 “流式同步” 时,主库生成 WAL 日志后会实时推送给备库,同步延迟通常在毫秒级,适配金融、电商等对实时性要求高的场景;支持 “同步 / 异步” 模式切换:同步模式:主库需等待备库确认 WAL 日志已接收并落盘后,才向应用返回 “事务提交成功”,确保数据零丢失(RPO=0);异步模式:主库提交事务后立即返回,WAL 日志异步推送给备库,牺牲少量一致性换取更低的主库响应延迟(适用于非核心业务)。 二、补充的同步方式:逻辑同步(灵活的场景适配)逻辑同步是基于 “逻辑数据变更” 的同步方式,核心是主库将数据修改操作解析为 “逻辑事件”(如 “对表 T 插入一行数据(id=1, name='A')”),备库通过解析逻辑事件重建数据,不依赖物理数据块结构。1. 具体实现原理逻辑同步依赖 GaussDB 的逻辑解码(Logical Decoding)功能,实现流程与物理同步差异显著:步骤 1:主库逻辑解码 WAL 日志主库开启 “逻辑解码” 后,WAL 日志不再仅记录物理变更,而是会被 “逻辑解码插件”(如 GaussDB 内置的pg_logical插件)解析为 “逻辑变更事件”—— 即提取 SQL 操作的语义(表名、字段、变更值等),生成结构化的逻辑日志(如 JSON/ProtoBuf 格式)。步骤 2:逻辑日志传输主库的 “逻辑日志发送进程” 将解析后的逻辑变更事件,通过专用协议(如基于 TCP 的逻辑复制协议)发送到备库(或其他目标端,如异构数据库、数据仓库)。步骤 3:备库应用逻辑事件备库的 “逻辑日志应用进程” 接收逻辑变更事件后,根据事件中的表结构和变更内容,生成对应的 SQL 语句(如 INSERT/UPDATE),并执行该 SQL 以修改备库数据,最终实现主备数据的逻辑一致。 2. 关键的特性(适配灵活场景)跨版本 / 跨结构同步:逻辑同步不依赖物理数据页格式,支持主备库不同 minor 版本(如主库 2.0、备库 2.1),甚至可同步到表结构略有差异的备库(如备库比主库多非关键字段);支持 “部分数据同步”:可指定同步某几张表、某类数据(如按分区过滤),无需同步整个 DN 的所有数据(适用于数据分片、读写分离场景,如备库仅同步查询高频表);兼容异构目标端:逻辑日志可同步到非 GaussDB 的系统(如 Elasticsearch、Hadoop),用于数据备份、数据分析等场景,但数据一致性弱于物理同步(可能存在语义解析偏差)。 三、一些个特殊的场景:混合同步策略(部分版本支持)为了平衡 “一致性” 和 “灵活性”,部分 GaussDB 版本(如 GaussDB 100)支持 “物理 + 逻辑” 混合同步,典型场景如:主备库用物理同步(保障核心数据一致):核心业务的 DN 主备采用物理同步,确保故障切换无数据丢失;从备库用逻辑同步(扩展数据用途):在备库上开启逻辑解码,将部分表的逻辑变更同步到只读节点或数据仓库,用于报表查询、数据分析,避免影响主库性能。 对比一下下对比维度物理同步逻辑同步同步对象物理 WAL 日志(数据块变更指令)逻辑变更事件(SQL 语义)数据一致性强一致(物理镜像,RPO=0)弱一致(逻辑重建,可能有语义偏差)延迟性能低延迟(毫秒级,流式同步)中延迟(需解码 + 生成 SQL,毫秒~秒级)适用场景高可用主备切换(金融、核心业务)部分数据同步、跨系统集成跨版本兼容性低(依赖物理页格式,同版本优先)高(不依赖物理格式,跨 minor 版本) 总结一下下GaussDB 的 DN 主备同步以物理同步为核心保障高可用,以逻辑同步为补充适配灵活场景,用户可根据业务的 “一致性要求、实时性需求、跨系统需求” 选择对应的同步方式。
-
案例介绍本案例选择Flask作为后端服务,并借助开发者空间云开发环境提供的免费GaussDB数据库和HCE2.0开发环境进行本地部署,便捷地提供了一种能够保障题库安全的在线考试系统。案例内容一、概述1.1 案例介绍Flask是一个用Python编写的轻量级Web应用框架。它被称为“微框架”,核心功能简单,提供了构建Web应用所需的最少工具。华为开发者空间,是为全球开发者打造的专属开发者空间,致力于为每位开发者提供一台云开发环境、一套开发工具和云上存储空间,汇聚昇腾、鸿蒙、鲲鹏、GaussDB、欧拉等华为各项根技术的开发工具资源,并提供配套案例指导开发者 从开发编码到应用调测,基于华为根技术生态高效便捷的知识学习、技术体验、应用创新。GaussDB是华为自主创新研发的分布式关系型数据库。该产品支持分布式事务,同城跨AZ部署,数据0丢失,支持1000+的扩展能力,PB级海量存储。同时拥有云上高可用,高可靠,高安全,弹性伸缩,一键部署,快速备份恢复,监控告警等关键能力,能为企业提供功能全面,稳定可靠,扩展性强,性能优越的企业级数据库服务.本案例借助开发者空间云开发环境,通过Flask与开发者空间提供的免费GaussDB数据库实例对接,直接使用 SQL 语句对GaussDB 数据库实例进行操作,完成一个现代化 Web 应用构建。1.2 适用对象企业个人开发者高校学生1.3 案例时间本案例总时长预计40分钟。1.4 案例流程 说明:申请华为云开发者空间的GaussDB数据库;进行华为云开发者空间的云开发环境进行文件创建与编辑;启用Flask Web 服务,适配GaussDB,在GaussDB在线操作页面建表于插入题目数据。1.5 资源总览本案例预计花费0.33元。资源名称规格单价(元)时长(分钟)华为开发者空间 - 云开发环境鲲鹏通用计算增强型 kc1 | 2vCPUs | 4G | HCE2.0免费40华为开发者空间 - 生态版GaussDB单副本集中式版 | 4 vCPUs | 16G | HCE OS 64bit (200GB)免费40弹性公网IP按需计费 5Mbit/s0.33元/时40 二、案例准备工作2.1 配置云开发环境根据案例《开发者空间 - 云开发环境使用指导》,请查看下面链接,配置云开发环境,并通过vscode链接工具登录云开发环境。本地VSCode基于华为开发者空间云开发环境完成小程序开发2.1 领取免费版GaussDB免费领取GaussDB在线试用版(2025年06月 21日 - 2025年 12月 31日),有1000个名额,数量有限,链接如下:免费领取GaussDB在线试用版(1-3工作日内报名审核通过后会有短信通知)(1)报名申请审核通过后,进入开发者空间工作台,会有GaussDB免费试用提示,点击立即开通即可。(2)填写GaussDB数据库开通参数:虚拟私有云:如下图到控制台创建,采用默认参数即可。安全组:采用默认安全组。管理员密码:自定义设置,保存好后续使用。(3)设置完后点击开通,开通成功后如下图提示:(4)开通成功后,点击立即前往进入GaussDB数据库实例页面,等待状态切换为"正常",如下图所示: (5)绑定弹性公网EIP,如果需要远程操作数据库必须要绑定公网EIP(EIP需购买,按需计费0.33元/小时,以控制台为准)点击数据库实例名称,进入GaussDB的基本信息界面: 点击绑定弹性公网IP,若开发者没有购买,则需要购买弹性公网IP。购买时选择按需计费,购买成功后截图如下:回到数据库基本信息界面,再次绑定公网IP,绑定成功截图如下:2.2 验证云开发环境与GaussDB互通通过xshell或windows命令终端登录云开发环境,测试GaussDB能否连接,如下是通 2.3 登录GaussDB数据库回到云数据库控制台,登录数据库:点击登录,再点击同意并继续输入密码,点击测试连接,再次点击登录,即可登录成功2.3.1 新建数据库登录成功后,点击新建数据库输入数据库名称 test 点击 确定 按钮,数据库创建成功: 2.3.2 创建数据库表点击 SQL操作,点击SQL查询库名选择test,Schema选择 public ,执行以下SQL语句,创建表:CREATE TABLE t_question ( id SERIAL PRIMARY KEY, question_text TEXT NOT NULL, option_a VARCHAR(255) NOT NULL, option_b VARCHAR(255) NOT NULL, option_c VARCHAR(255) NOT NULL, option_d VARCHAR(255) NOT NULL, correct_answer CHAR(1) NOT NULL);创建表成功:向表中插入测试题目和答案INSERT INTO t_question (question_text, option_a, option_b, option_c, option_d, correct_answer)VALUES ('华为云的旗舰数据库服务是什么?', 'RDS for MySQL', 'GaussDB', 'DWS', 'TaurusDB', 'B'), ('在华为云上,用于管理容器化应用的PaaS服务叫什么?', 'CCE', 'ECS', 'OBS', 'ELB', 'A'), ('华为云上用于对象存储的服务名称是?', 'SFS', 'EVS', 'OBS', 'VPC', 'C');执行SQL,插入成功:查询表中数据:SELECT *FROM t_question删除指定题目:DELETE FROM t_questionWHERE id = 1;再执行查询的SQL语句:SELECT *FROM t_question可以看到已成功删除id为1的数据。 三、 Flask部署与Python驱动安装通过本地IDE连接云开发环境,参考使用VSCode连接云开发环境通过VSCode连接成功后,打开终端 3.1 创建项目虚拟环境因为业务场景的Python开发,多数都是构建一个大型应用程序,并且不希望各种组件的各种版本之间相互冲突,所以需要设置一个虚拟环境。先需要更新下载源。执行如下命令 sudo yum -y updatesudo yum -y upgradepip3 install virtualenv -i https://repo.huaweicloud.com/repository/pypi/simple/ #安装virtualenvpython3 -m venv myenv #创建虚拟环境source myenv/bin/activate #激活环境 环境激活后,用户名前会有(myenv)字样,如上图所示。3.2 安装Flask Web 框架。安装之前,需要更新下pip。python3 -m pip install --upgrade pip -i https://pypi.tuna.tsinghua.edu.cn/simplepip3 install flask -i https://pypi.tuna.tsinghua.edu.cn/simple3.3 安装GaussDB数据库对应的Python驱动GaussDB数据库对应的Python驱动为psycopg2。即Flask Web 框架允许通过psycopg2驱动,连接GaussDB数据库,并操作数据对象。不建议直接用pip去安装psycopg2驱动。1.从华为云GaussDB数据库官方文档中下载驱动。wget https://dbs-download.obs.cn-north-1.myhuaweicloud.com/GaussDB/1750076538851/GaussDB_driver.zipunzip GaussDB_driver.zipcd GaussDB_driver/Centralized/Hce2.0_arm_64/tar zxvf GaussDB-Kernel_505.2.1_Hce_64bit_Python.tar.gz 解压后有两个文件夹:psycopg2:psycopg2库文件。lib:lib库文件。2.使用root用户将psycopg2复制到python安装目录下的site-packages文件夹下。sudo cp psycopg2 $(python3 -c 'import site; print(site.getsitepackages()[0])') -r3.修改psycopg2目录权限为755。sudo chmod 755 $(python3 -c 'import site; print(site.getsitepackages()[0])')/psycopg2 -R4.将psycopg2目录添加到环境变量$PYTHONPATH,并使之生效。export PYTHONPATH=$(python3 -c 'import site; print(site.getsitepackages()[0])'):$PYTHONPATH5.将解压后的上述lib目录,配置在环境变量LD_LIBRARY_PATH中。本案例对应的lib目录是/home/xxx/GaussDB_driver/Centralized/Hce2.0_arm_64/lib,读者根据自己实际情况做修改export LD_LIBRARY_PATH=/home/xxx/GaussDB_driver/Centralized/Hce2.0_arm_64/lib:$LD_LIBRARY_PATH6.复制驱动到 python 的 site-packagessudo cp -r /home/developer/GaussDB_driver/Centralized/Hce2.0_arm_64/psycopg2 \ /usr/lib/python3.9/site-packages/7.修改权限sudo chmod -R 755 /usr/lib/python3.9/site-packages/psycopg2注意:如果引入psycopg2报找不到libpq.so.5.5,是因为环境变量LD_LIBRARY_PATH没有包含libpq.so.5.5的目录路径,由于上述步骤5用export设置的临时环境变量,所以在新的会话中需要重新设置LD_LIBRARY_PATH指定之前解压的驱动lib目录3.4 通过本地IDE创建Flask Web工程在IDE里终端窗口创建web项目并进入。mkdir ~/testcd ~/test3.5 创建test项目的Web应用(1)在test的项目目录里,创建app.py文件和子目录templates以及templates下的index.html app.py:文件作为考试系统的后端,与GaussDB进行通信,对前端index.html提供数据index.html:用来展示题目与选项 (2)把以下代码复制粘贴到app.py,注意修改为自己的GaussDB的ip、账号、密码、数据库from flask import Flask, render_template, request, jsonifyimport psycopg2import psycopg2.extrasapp = Flask(__name__)# Database connection configurationdb_config = { 'host': 'your_gaussdb_host', 'user': 'your_user', 'password': 'your_password', 'database': 'test', 'port': 8000}def get_db_connection(): """Establish database connection""" conn = psycopg2.connect(**db_config) return conn@app.route('/')def index(): """Home route: Display all exam questions""" conn = get_db_connection() cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) cursor.execute('SELECT * FROM t_question') questions = cursor.fetchall() cursor.close() conn.close() return render_template('index.html', questions=questions)@app.route('/submit_all_answers', methods=['POST'])def submit_all_answers(): """Submit all answers route: Check if user answers are correct""" answers = {} # Dictionary to store question IDs and user answers correct_count = 0 # Loop through all the answers in the form data for question_index in range(1, len(request.form) // 2 + 1): question_id = request.form[f"question_id_{question_index}"] user_answer = request.form.get(f"answer_{question_index}") conn = get_db_connection() cursor = conn.cursor(cursor_factory=psycopg2.extras.DictCursor) cursor.execute('SELECT correct_answer FROM t_question WHERE id = %s', (question_id,)) result = cursor.fetchone() if result: correct_answer = result['correct_answer'] if user_answer == correct_answer: correct_count += 1 cursor.close() conn.close() return jsonify({ 'message': f'You answered {correct_count} questions correctly!', 'correct_count': correct_count })if __name__ == '__main__': app.run(debug=True, host='0.0.0.0', port=8080)(3)把以下代码复制粘贴到index.html中<!DOCTYPE html><html><head> <title>在线考试系统</title> <style> body { font-family: Arial, sans-serif; background-color: #f4f7fa; margin: 0; padding: 0; } .container { max-width: 900px; margin: 50px auto; background-color: #fff; padding: 20px; border-radius: 8px; box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1); } h1 { text-align: center; color: #333; } .question-container { border-bottom: 1px solid #ccc; margin-bottom: 20px; padding-bottom: 15px; } .question-container p { font-size: 18px; margin: 10px 0; } .question-container label { display: block; font-size: 16px; margin-bottom: 8px; } .question-container input[type="radio"] { margin-right: 10px; } .submit-btn { background-color: #4CAF50; color: white; padding: 12px 24px; border: none; border-radius: 5px; cursor: pointer; font-size: 16px; } .submit-btn:hover { background-color: #45a049; } </style></head><body> <div class="container"> <h1>在线考试</h1> <form action="/submit_all_answers" method="post"> {% for question in questions %} <div class="question-container"> <p><strong>{{ loop.index }}. {{ question.question_text }}</strong></p> <input type="hidden" name="question_id_{{ loop.index }}" value="{{ question.id }}"> <label><input type="radio" name="answer_{{ loop.index }}" value="A"> A. {{ question.option_a }}</label> <label><input type="radio" name="answer_{{ loop.index }}" value="B"> B. {{ question.option_b }}</label> <label><input type="radio" name="answer_{{ loop.index }}" value="C"> C. {{ question.option_c }}</label> <label><input type="radio" name="answer_{{ loop.index }}" value="D"> D. {{ question.option_d }}</label> </div> {% endfor %} <div style="text-align: center;"> <input type="submit" value="提交所有答案" class="submit-btn"> </div> </form> </div></body></html>(4)然后在终端中运行python3 app.py 在浏览器中打开http://127.0.0.1:8080即可看到在线考试页面 四、释放资源1. 删除虚拟私有云VPC进入虚拟私有云控制台,点击全选按钮,点击“删除”,会弹出关联资源列表的对话框,删除子网和弹性公网IP2. 删除弹性公网IP EIP进入弹性公网IP控制台,首先解绑弹性公网IP,然后删除。3. 删除GaussDB数据库实例进入GaussDB控制台,点击“更多 -> 删除实例”。注意:删除的实例会被移至回收站,但达到回收站策略设置的天数后,该实例会被永久删除,请谨慎操作。 至此,基于华为开发者空间云开发环境+GaussDB实现在线考试系统案例已全部完成。我正在参加【案例共创】第6期 开发者空间-基于云开发环境和GaussDB构建应用 cid:link_3
上滑加载中
推荐直播
-
华为云码道Agent集成与鸿蒙实战2026/08/11 周二 19:00-21:00
王一男-华为云码道产品规划专家;李炎-华为云码道产品专家;彭江敏-华为云鸿蒙端云一体化开发专家
本次直播带你解读华为云码道7月份产品新特性、新功能。更有专家演示码道Agent Space × 钉钉机器集成实战,从0到1打通消息通道;码道鸿蒙端云一体化实战,快速搭建员工签到系统。
回顾中 -
华为云开发者AI素养直播课·第五期2026/09/04 周五 16:00-18:00
林华鼎-华为云AI开发者运营负责人;蒋春阳-华为云AI开发者案例开发专家
本期直播内容: AI工具体验营 · 第5-8课连讲。Agent-Team 多智能体协作完成毕业设计实践
回顾中 -
华为云开发者AI素养ClassRoom·第六期2026/09/08 周二 19:00-20:00
樊渊-2026华为软件挑战赛冠军
高手来了:看软挑高手解析二维排样问题—从工业难题到算法突破
回顾中
热门标签