• [干货汇总] 【数据库系列】Prometheus搭乘华为云GaussDB(for Influx):让监控数据更安全
    本文分享自华为云社区《[Prometheus搭乘华为云GaussDB(for Influx):让监控数据更安全](https://bbs.huaweicloud.com/blogs/338833?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=database&utm_content=content)》,作者:高斯Influx官方博客。 # 背景 Prometheus 作为一个独立的开源项目,开发者和用户社区非常活跃,目前已经有超过650+位贡献者参与其研发工作上,并且超过120+项的第三方集成。是目前很受欢迎的系统监控和告警工具包。但是Prometheus默认使用本地数据库存储数据,作为正式业务,面临无法弹性扩容、没有副本、没有备份等问题。 GaussDB(for Influx)是一款分布式架构,云原生的时序数据库。可无缝被Prometheus集成,在协议上原生支持Prometheus远端存储对接至GaussDB(for Influx),解决了Prometheus在使用本地数据库存储数据的痛点问题。 # Prometheus的优势和不足 ## Prometheus 优势 Prometheus是一款开源的数据监控告警系统,支持数据的采集,存储,可视化以及告警功能。 1、Prometheus部署简单,依赖少。核心部分只有一个单独的二进制文件,不存在任何的第三方依赖(数据库,缓存等等) ,只需要下载一个包就可以运行起来。 2、功能完整,包括数据采集,存储,可视化,告警等功能,其基本架构如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/1/1648781148154980425.png) 数据采集部分,exporter用来采集监控数据,并向Prometheus server提供标准格式的监控数据。 数据存储部分,Prometheus Server负责数据的抓取和存储,其定时在目标上抓取metrics(指标)数据并保存到本地存储里面。Prometheus采用了一种Pull(拉)的方式获取数据,不仅降低客户端的复杂度,客户端只需要采集数据,无需了解服务端情况,而且服务端可以更加方便的水平扩展。Prometheus默认存储是一套TSDB本地部署的时序数据库。通过对接第三方时序数据库扩展历史数据的存储。 数据可视化部分默认提供了自带的UI界面,同时支持开源的Grafana工具。 ## Prometheus本地存储的问题 Prometheus的默认部署的本地时序数据库,可以减少其自身运维和管理的复杂度,能够满足大部分用户监控规模的需求,但是随着业务的增长和数据规模的不断扩大,本地存储存在一些无法解决的问题: 1、存储大小有限,且无法灵活扩容。存储容量有限,无法存储时间太长的数据,存储能力的扩展目前依赖磁盘的扩展,本地磁盘的扩展涉及到迁移数据等。 2、没有副本,可靠性不足。本地存储数据只有一份,没有副本架构,一旦磁盘或者数据损坏,无法修复。 3、存储成本高。数据库一般使用性能较高的SSD,数据存储成本高。 4、存储安全性低。所有人都可以看到本地的数据,数据安全性不足。 5、数据难共享。本地存储的数据库,不利于其他分析组件的数据共享。 6、缺少备份能力。本地数据库没有备份能力,一旦业务数据损坏,无法恢复数据。 # GaussDB(for Influx)如何解决上述问题 GaussDB(for Influx)作为一款采用分布式架构,云原生的时序数据库,作为Prometheus的远程存储,完美解决了使用本地数据库存储时遇到的问题,并且可维护性,读写性能等方面也做了很多的优化。 1、存储按需扩容。GaussDB(for Influx)依托云原生能力,采用计算存储分离架构,存储使用分布式共享存储,实现了秒级扩容,且在扩容过程中不中断业务,可以根据业务需求灵活进行扩展,不担心随着业务增长,存储不足的问题。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/1/1648781177412260104.png) 2、三副本高可用架构。GaussDB(for Influx)基于华为分布式共享存储,将数据存为3副本,保证数据可靠性。业务写一份数据到数据库,系统会根据一定的策略将数据复制成3份,分别存储。如果其中一份数据损坏,系统会根据其他两份数据,重新恢复出被损坏的数据。 3、支持冷热存储分离。GaussDB(for Influx)支持数据冷热分离存储,时序数据随着时间的推移,其被查询和分析的概率越来越低。用户可以根据时序数据的特点以及业务需求将数据划分为热数据和冷数据,热数据保存在分布式共享存储上保证读写的性能。冷数据保留在低成本存储上,降低存储的成本。GaussDB(for Influx)支持一键购买冷存储,如下图所示,可以根据需要购买对应的冷存储空间。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/1/1648781186013793466.png) 4、数据安全性高。GaussDB(for Influx)的存储文件对业务是不可见的,客户只能通过InfluxQL语句来访问数据,而无法看到真实文件。降低了数据被损坏和泄露的风险。 5、数据访问共享分析。数据存储到远端时,其他组件可以通过数据库访问地址,直接访问采集到的数据。 6、支持备份功能。GaussDB(for Influx)依托云原生能力,支持全量备份和增量备份,数据一旦异常,可以选择历史备份迅速恢复。 除了以上优势外,GaussDB(for Influx)还在在计算能力方面,采用集群架构,支持灵活扩容。在写入性能,查询性能,数据压缩率等方面做了很多优化。 # Prometheus使用GaussDB(for Influx) **配置** Prometheus使用GaussDB(for Influx)非常方便。在华为云上购买GaussDB(for Influx)实例后,只需要在配置文件prometheus.yml中添加以下配置项,然后重启Prometheus服务即可。 remote_write: - url:"http://127.0.0.1:8086/api/v1/prom/write?db=prometheus&u=rwuser&p=****** remote_read: - url: “http://127.0.0.1:8086/api/v1/prom/read?db=prometheus&u=rwuser&p=****** - 127.0.0.1:8086: 链接GaussDB(for Influx)实例的IP和端口,需要保证Prometheus部署机器的网络可以连通该IP。 - db=prometheus:数据写入指定的数据库名称。 - u=rwuser&p=******:购买GaussDB(for Influx)实例时的账号密码。 其余参数不变。 **验证** 重启后就可以通过Prometheus自带的界面来查询数据了。在浏览器中输入http://localhost:9090,打开Prometheus界面,输入一条查询语句,如下图: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/1/1648781231103698794.png) 可以看到已经可以查到相关数据。也可以通过登录GaussDB(for Influx)来查看写入的数据情况。登录数据库后,执行以下语句 use Prometheus show measurements 可以看到Prometheus已经成功的写入数据了。如下图: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20224/1/1648781251229302143.png)
  • [应用案例] DWS系统表(系统视图)权限收回的验证
    前言要屏蔽一个普通用户在DATA studio中对系统表和系统视图查询权限,做了验证,得出下面内容,可能理解不到位,欢迎各位大神纠正弥补关于public翻阅DWS和原生postgres权限说明文档了解到,当新创建一个数据库后,就会默认带public组,也会有自己的同名schema:public;public默认拥有登录数据库和使用schema:public的权限。当我们新建一个用户,该用户默认是在public下面,继承了public所有权限。所以新建用户一般是默认有连接数据库和在public下建表的权限的。所以在创建数据库后,通常要执行如下语句:- 收回public对数据库的权限 revoke all privileges on database dbXXX from public; (此时新建用户utest无法登录数据库dbxxx) - 收回public对schema的权限 revoke usage privilegs on shcema public from public (此时用户XXX无法在数据库dbxxx中,默认public创建表) - grant connect on database dbxxx to uxxx; (赋uxxx对dbxxx的登录权限)系统表(视图)权限1,主要验证了系统表,例如 SCHEMA:pg_catalog下的一些表。public组默认拥有对系统对象(系统表,视图,函数等)访问权限,所以用户xxxt默认拥有对系统表的访问权限。2,对系统表访问权限的收回,一定要收回角色public的访问权限,然后继承public的所有用户相应权限也会收回revoke select on table pg_tables from public; --因继承关系,此时用户uxxx就无权访问pg_tables3,对系统表相关权限的收回,要在相应的数据库内操作。例如让用户uxxx在数据库dbxxx中禁止访问pg_tables,管理员要连接dbxxx后进行相应操作。如果管理员默认进入postgres或者其他库,执行revoke,那么收回的是相应库的系统表权限,而uxxx在库dbxxx中的权限是无法收回的。也就是说同样的用户,在不同的库中,对同样的系统表可以拥有不同的权限。4,大部分系统表和视图在schema:pg_catalog下,如果收回用户对pg_catalog的使用权限,就无法访问该模式下的所有表。revoke usage on schema pg_catalog from public (慎重操作,会影响用户登录数据库)关于Data Studio 和 pgsql回收系统表权限收回public对schema:pg_catalog的usage权限,两个工具都无法登录数据库,客户端工具登录数据库,要查询到一些系统表和视图,且工具不同,使用到的系统表也不一样。举例说明,例如回收pg_class的访问权限: revoke select on table pg_class from public ; //用管理员回收权限 grant usage on scheme schxxx to uxxx; //用管理员给某一个只读用户赋权一个schxxx的使用权限 create table schxxx.t1(a int); //管理员在模式schxxx下创建一个表t1 grant select on table schxxx.t1 to uxxx;//管理员在表t1上,给只读用户uxxx赋查询权限然后用uxxx用户登录两个客户端:pgsqlData Studio都可以登录,但是在Data Studio中,将不会展示出所有系统对象和用户表t1,此时达到了在DataStudio中,屏蔽系统模式的效果。在gsql中,uxxx可以访问t1表,而Data Studio中无法查询t1表重点说明我们在对系统表权限收回中,一定要慎重,特别是public权限的收回,可能会影响其他用户对系统表的使用
  • [其他] 安装裸金属dws工步报错,在IAM申请DWS管理租户op_svc_dws失败
    【安装部署】【工步报错】在IAM申请DWS管理租户op_svc_dws失败【问题现象】报错:"ConsoleOnlineUtil" object has no attribute 'online_silvan_address'【解决方法】日志详情中可见报错文件路径,找到报错文件,修改self.online_silvan_address=self.online_silvan_address 为self.online_silvan_address = self.get_online_silvan_address()
  • [其他] BMS重启卡主影响DWS集群
    问题描述:BMS重启失败,一直卡在:A start job is  running for NetworkConfig问题现象:问题处理:1.查看有没有硬件事件告警,有则联系硬件进行处理   历史处理经验一:对硬件进行热插拔后恢复正常2.如果重启的节点上有cn,则进行cn剔除,不影响集群运行,剔除可参考https://bbs.huaweicloud.com/forum/forum.php?mod=viewthread&tid=150170
  • [其他] GaussDB(DWS) 创建分区表来提升SQL性能
    在GaussDB(DWS) 上执行查询时,经常会发现性能瓶颈点在表的扫描上, 查看磁盘IO使用情况,发现使用率经常达到100%。针对上述场景,结合SQL语句的业务场景,如果表的某一列有日期特征,在查询条件中也经常使用这个日期列过滤数据,那么我们就可以考虑将这个表建成分区表。分区表是把逻辑上的一张表根据某种方案分成几张物理块进行存储。这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。分区表和普通表相比具有以下优点:改善查询性能:对分区对象的查询可以仅搜索自己关心的分区,提高检索效率。增强可用性:如果分区表的某个分区出现故障,表在其他分区的数据仍然可用。方便维护:如果分区表的某个分区出现故障,需要修复数据,只修复该分区即可。GaussDB(DWS)支持的分区表为范围分区表。范围分区表:将数据基于范围映射到每一个分区。这个范围是由创建分区表时指定的分区键决定的。分区键经常采用日期,例如将销售数据按照月份进行分区。(一)建分区表语句例子CREATE TABLE pt_table1(id INT, create_time TIMESTAMP, conent TEXT) WITH (orientation=column) DISTRIBUTE BY HASH (id) PARTITION BY RANGE (create_time) ( PARTITION P202203 start('2022-03-01'::timestamp) end('2022-04-01'::timestamp) every (interval '1 day') ) ENABLE ROW MOVEMENT;上面的这个语句按天建立了一个列存分区表,建立了一个月的分区,其中2022-03-01之前的数据保存在第一个分区里,3月的数据按天保存在每个分区里。(二)查看分区信息的语句select * from user_tab_partitions where schema = 'public' and table_name = 'pt_table1' order by high_value;(三)增加新分区ALTER TABLE pt_table1 ADD PARTITION P202204 START('2022-04-01'::timestamp) END('2022-05-01'::timestamp) EVERY(interval '1 day');(四)增加历史分区对历史数据增加分区,需要使用分区的SPLIT方法。ALTER TABLE pt_table1 SPLIT PARTITION P202203_0 into (PARTITION P202202 START('2022-02-01'::timestamp) END('2022-03-01'::timestamp) EVERY (interval '1 day'));(五)增加MAXVALUE分区将超过右边界的值都放入一个分区,可以使用MAXVALUE分区ALTER TABLE pt_table1 ADD PARTITION pmax END(MAXVALUE);(六)指定分区名查询分区的数据SELECT COUNT(*) FROM pt_table1 PARTITION (P202202_1);使用分区表后SQL的性能往往会带来数十倍到百倍的提升,并且磁盘的读IO会大幅下降,还有更多的表设计最佳实践,请参考以下链接:https://support.huaweicloud.com/bestpractice-dws/dws_05_0046.html
  • [生态空间] GaussDB(DWS)运维 -- sequence相关
    【DWS的序列概述】GaussDB(DWS)是一个share nothing架构的产品,seqeunce编号需要通过GTM统一分配。集群规模越大、节点数越多、sequence调用越频繁,sequnce对GTM的压力就越大。对于seqeunce的使用一般有如下建议建议业务中不要大量使用sequence,建议不要超过50个如果业务允许,建议使用uuid替换sequence使用sequence的时候,需要定义cache值不小于100【序列相关信息查询】建议定义如下视图进行查询CREATE OR REPLACE FUNCTION public.dfm_get_seqence_info ( OUT namespace text, -- 序列的schema OUT sequencename text, -- 序列名称 OUT min_value bigint, -- 序列最小值 OUT max_value bigint, -- 序列最大值 OUT start_value bigint, -- 起始值 OUT increment_by bigint, -- 增加步长 OUT cache_value bigint, -- cache值 OUT is_cycled boolean -- 是否可以循环使用 ) RETURNS SETOF record LANGUAGE plpgsql NOT FENCED NOT SHIPPABLE AS $function$ DECLARE rowObject record; rowDetail record; queryObjectStr text; queryDetailStr text; BEGIN --Get all the node names queryObjectStr := 'SELECT c.oid, relname, n.nspname FROM pg_class c INNER JOIN pg_namespace n on c.relnamespace = n.oid WHERE c.relkind = ''S'''; FOR rowObject IN EXECUTE(queryObjectStr) LOOP queryDetailStr := 'SELECT start_value, increment_by, max_value, min_value, cache_value, is_cycled FROM ' || quote_ident(rowObject.nspname) || '.' || quote_ident(rowObject.relname); FOR rowDetail IN EXECUTE(queryDetailStr) LOOP namespace = rowObject.nspname; sequencename = rowObject.relname; start_value = rowDetail.start_value; increment_by = rowDetail.increment_by; max_value = rowDetail.max_value; min_value = rowDetail.min_value; cache_value = rowDetail.cache_value; is_cycled = rowDetail.is_cycled; RETURN next; END LOOP; END LOOP; RETURN; END; $function$ ; CREATE VIEW public.dfm_get_seqence_info AS SELECT * FROM public.dfm_get_seqence_info();示例postgres=# CREATE SEQUENCE public.test_seq; CREATE SEQUENCE Time: 13.917 ms postgres=# CREATE TABLE public.test_serial(a bigserial, b int) DISTRIBUTE BY ROUNDROBIN; NOTICE: CREATE TABLE will create implicit sequence "test_serial_a_seq" for serial column "test_serial.a" SQLSTATE: 00000 LOCATION: CreateSeqOwnedByTable, parse_utilcmd.cpp:144 CREATE TABLE Time: 16.572 ms postgres=# CREATE SEQUENCE public.test_seq_1; CREATE SEQUENCE Time: 13.412 ms postgres=# CREATE TABLE public.test_serial_default(a bigint default nextval('public.test_seq_1'::regclass), b int) DISTRIBUTE BY ROUNDROBIN; CREATE TABLE Time: 12.006 ms postgres=# SELECT * FROM public.dfm_get_seqence_info; namespace | sequencename | min_value | max_value | start_value | increment_by | cache_value | is_cycled -----------+-------------------+-----------+---------------------+-------------+--------------+-------------+----------- public | test_seq | 1 | 9223372036854775807 | 1 | 1 | 1 | f public | test_serial_a_seq | 1 | 9223372036854775807 | 1 | 1 | 1 | f public | test_seq_1 | 1 | 9223372036854775807 | 1 | 1 | 1 | f (3 rows)【序列和表的bind关系查询】查询sequence和表的bind关系,主要场景有两个表的字段类型为bigserial或者serial类型,内置生成一个序列表的字段的默认值为序列的序列号这两个场景在上述里面都有casepostgres=# SELECT postgres-# pg_get_userbyid(c1.relowner) AS seqowner, -- sequence的用户 postgres-# n1.nspname AS seqschema, -- sequence的schema postgres-# c1.relname AS seqname, -- -- sequence的名称 postgres-# (pg_sequence_parameters(c1.oid)).minimum_value AS minvalue, -- sequence的最小值 postgres-# (pg_sequence_parameters(c1.oid)).maximum_value AS maxvalue, -- sequence的最大值 postgres-# (pg_sequence_parameters(c1.oid)).increment AS incrementby, -- sequence的步长 postgres-# pg_get_userbyid(c.relowner) AS tableowner, -- 关联的表的owner postgres-# n.nspname AS tableschema, -- 关联的表的schema postgres-# c.relname AS tablename,-- 关联的表的名称 postgres-# a.attname, -- -- 关联的表的列的名称 postgres-# d.adsrc as defaultexpression -- 关联的sequence的表达式 postgres-# FROM pg_catalog.pg_class c postgres-# INNER JOIN pg_catalog.pg_namespace n ON n.oid = c.relnamespace postgres-# INNER JOIN pg_catalog.pg_attribute a ON a.attrelid = c.oid postgres-# INNER JOIN pg_catalog.pg_attrdef d ON d.adrelid = c.oid AND d.adnum = a.attnum postgres-# INNER JOIN pg_catalog.pg_depend p ON p.objid = d.oid postgres-# INNER JOIN pg_catalog.pg_class c1 ON c1.oid = p.refobjid postgres-# INNER JOIN pg_catalog.pg_namespace n1 ON n1.oid = c1.relnamespace postgres-# WHERE c.relkind = 'r'::"char" AND c.oid > 16384 postgres-# AND n.nspname not in ('pg_toast', 'cstore', 'pg_catalog') postgres-# AND a.attnum > 0 postgres-# AND p.classid='pg_catalog.pg_attrdef'::regclass postgres-# AND refclassid = 'pg_catalog.pg_class'::regclass postgres-# AND p.refobjsubid = 0 postgres-# AND c1.relkind = 'S'::"char" postgres-# ; seqowner | seqschema | seqname | minvalue | maxvalue | incrementby | tableowner | tableschema | tablename | attname | defaultexpression -----------+-----------+-------------------+----------+---------------------+-------------+------------+-------------+---------------------+---------+---------------------------------------- j00565968 | public | test_serial_a_seq | 1 | 9223372036854775807 | 1 | j00565968 | public | test_serial | a | nextval('test_serial_a_seq'::regclass) j00565968 | public | test_seq_1 | 1 | 9223372036854775807 | 1 | j00565968 | public | test_serial_default | a | nextval('test_seq_1'::regclass) (2 rows)【替换方案】实际业务中使用sequence一般有两个场景保证表数据均匀分布。这种场景可以把sequence字段替换为uuidpostgres=# DROP TABLE public.test_serial; DROP TABLE Time: 19.871 ms postgres=# CREATE TABLE public.test_serial(a text DEFAULT sys_guid(), b int) DISTRIBUTE BY HASH(a); CREATE TABLE Time: 19.245 ms或者使用roundrobin分布替换,然后删除sequence相关列postgres=# ALTER TABLE public.test_serial DISTRIBUTE BY ROUNDROBIN; ALTER TABLE Time: 218.796 ms postgres=# ALTER TABLE public.test_serial DROP COLUMN a; ALTER TABLE Time: 9.509 ms保证字段数据的唯一性。这种场景可以使用uuid()+主键的方式实现postgres=# DROP TABLE public.test_serial; DROP TABLE Time: 18.786 ms postgres=# CREATE TABLE public.test_serial(a text DEFAULT sys_guid(), b int, primary key(a)) DISTRIBUTE BY HASH(a); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "test_serial_pkey" for table "test_serial" CREATE TABLE注:理论上一个集群内的uuid不会重复,但还是建议表上增加主键约束
  • [生态空间] 【dws812】【用户的connect权限问题】同一个版本的不同集群创建用户后一个有connect权限,一个没有
    【功能模块】【操作步骤&问题现象】1、分别登录集群database,创建user2、使用新创建的user登录集群,一个可以正常登录,一个登录报错没有connect权限【截图信息】该集群可以正常登录登录报错的集群【日志信息】(可选,上传日志内容或者附件)
  • [其他] 【变更】GaussDB升级8.1.1,manager升级8.0.2.1后,页面监控不再显示
    一、问题现象GaussDB升级8.1.1,manager升级8.0.2.1后,页面监控历史数据正常展示,升级后监控不显示二、问题分析1.监控数据是oma进程上报给pms服务,查看oma文件的依赖库 ll /opt/huawei/Bigdata/om-agent/OMA/bin/omm_agent.bin,发现部分依赖库not found2.联系客户, 发现升级时使用setuptool工具是老版本自带的,本次升级没有下载新版本工具三、解决方法1.客户补做升级指导书中,补充rpm包和提交preinstall章节2.再次检查依赖库是否完整,依赖库 ll /opt/huawei/Bigdata/om-agent/OMA/bin/omm_agent.bin已恢复3.重启相关进程4.页面监控恢复正常
  • [其他] GaussDB(DWS) JDBC连接报错和性能问题定位
    1. 建议首先查看定位指南:GaussDB for DWS JDBC问题定位指南2. 检查JDBC的jar包是否正确,查看JDBC包与驱动类有两种JDBC的驱动jar包:gsjdbc4.jar:与PostgreSQL保持兼容的驱动包,其中类名、类结构与PostgreSQL驱动完全一致,曾经运行于PostgreSQL的应用程序可以直接移植到当前系统使用。gsjdbc200.jar:如果同一JVM进程内需要同时访问PostgreSQL及GaussDB(DWS)请使用此驱动包,它的主类名为“com.huawei.gauss200.jdbc.Driver”(即将“org.postgresql”替换为“com.huawei.gauss200.jdbc”),数据库连接的URL前缀为“jdbc:gaussdb”,其余与gsjdbc4.jar相同。注意:如果应用中同时使用开源postgresql-XX.X.X.jar驱动包,请使用gsjdbc200.jar,将主类名修改为“com.huawei.gauss200.jdbc.Driver”,url前缀修改为“jdbc:gaussdb”,避免冲突。3.JDBC的jar包版本判断方法【方法一】在windows上解压,查询META-INF目录下MANIFEST.MF文件内容,其中Version就是对应的版本。若MANIFEST.MF中存在Bundle-Vendor: PostgreSQL Global Development Group则为开源【方法二】步骤1:在linux上解压,其中xxxx是JDBC驱动包文件名jar -xvf xxxx步骤2:查看gs_version版本信息cat META-INF/MANIFEST.MF例如下面是JDBC 8.0.0版本:Manifest-Version: 1.0Ant-Version: Apache Ant 1.10.5Created-By: 1.8.0_232-Huawei_JDK_V100R001C00SPC171B003-b09 (Huawei Tec hnologies Co., Ltd)gs_version: (GaussDB A 8.0.0 build 9edcabca) compiled at 2020-05-06 23 :02:57 commit 7745 last mr 12970如果是开源的postgres的JDBC包,建议更换为DWS的JDBC包防止有性能及未知的问题。3.JDBC的代码示例:常用示例4.JDBC性能问题分析案例【JDBC问题的定位方法】分析JDBC的问题时,我们可以在连接串中打开日志功能,请参考以下URL:jdbc:postgresql://192.168.0.1:8000/test?loggerLevel=TRACE&loggerFile=jdbc.log在日志jdbc.log中可以看到语句执行过程中,JDBC和DWS集群的交互过程。案例一 查询中有大量系统表访问语句集群CPU消耗高在某局点的应用中,业务在执行SQL前,会使用JDBC的接口ResultSetMetaData.getColumnTypeName获取列属性,在jdbc.log日志中可以看到有大量的系统表查询语句。三月 18, 2022 2:28:49 下午 org.postgresql.core.v3.QueryExecutorImpl sendParse非常详细:  FE=> Parse(stmt=null,query="select * from t1 where id = $1",oids={23})……三月 18, 2022 2:28:49 下午 org.postgresql.core.v3.QueryExecutorImpl sendParse非常详细:  FE=> Parse(stmt=null,query="SELECT c.oid, a.attnum, a.attname, c.relname, n.nspname, a.attnotnull OR (t.typtype = 'd' AND t.typnotnull), pg_catalog.pg_get_expr(d.adbin, d.adrelid) LIKE '%nextval(%' FROM pg_catalog.pg_class c JOIN pg_catalog.pg_namespace n ON (c.relnamespace = n.oid) JOIN pg_catalog.pg_attribute a ON (c.oid = a.attrelid) JOIN pg_catalog.pg_type t ON (a.atttypid = t.oid) LEFT JOIN pg_catalog.pg_attrdef d ON (d.adrelid = a.attrelid AND d.adnum = a.attnum) JOIN (SELECT 16979 AS oid , 1 AS attnum UNION ALL SELECT 16979, 2 UNION ALL SELECT 16979, 3) vals ON (c.oid = vals.oid AND a.attnum = vals.attnum) ",oids={})问题根因:查询为简单语句,走了Light Proxy(CN轻量化),将语句下发给了单个DN去处理,常见的场景过滤条件是分布列的等值查询(Where id = 1),或者向一个DN插入数据的INSERT语句。这种情况,系统表语句中对应的OID都是数据节点的OID,在CN节点上查询没有结果,因此列的元数据信息没有在JDBC的连接中缓存,造成每次访问列信息都去做一次查询。规避方法:关闭enable_light_proxy参数,命令为:gs_guc reload -Z coordinator -Z datanode -N all -I all -c "enable_light_proxy = off"案例二 调用JDBC的addBatch和executeBatch批量插入数据性能差问题根因:使用的是开源postgresql-XX.X.X.jar驱动包,替换为gsjdbc200.jar后性能恢复案例三 连接报错FATAL: Invalid username/password,login denied.问题根因:使用的是开源postgresql-XX.X.X.jar驱动包,替换为gsjdbc200.jar后连接成功案例四 使用JDBC连接池后,报错Caused by: java.net.SocketException: 打开的文件过多问题根因:连接池的写法存在问题,在Java中反复初始化连接池,建立的物理连接保存在连接池里不断的堆积,最终造成打开文件数过多。解决方案:按照文档正确使用JDBC连接池对象。案例五 使用JBDC的批量模式插入数据,报错字段超长,但报错信息中的Batch entry 0 INSERT INTO不是报错的那条数据。问题根因:没有开启JDBC的批量模式造成报错的数据不是异常的数据。解决方案:在JDBC的连接串中设置batchMode=true后问题解决案例六 使用JDBC执行语句,插入数据量大时报错 Unable to interpret the update count in command completion tag:insert 0 30219884931问题根因:开源PG的JDBC 8.x版本存在该问题,在9.x版本修复。解决方案:升级JDBC驱动版本。案例七 业务报错:Exception in thread "main" org.postgresql.util.PSQLException: ERROR: pooler: Communication failure, failed to send session commands or invalid incoming data, error count: 2.问题根因:JDBC的URL写错,写成currentSchema=db1?useSSL=false,其中db1?useSSL=false解析成schema名字。JDBC将set search_path=jwy_pic?useSSL=false; 语句发送到DN,造成报错退出。解决方案:URL的参数之间的连接使用&,例如currentSchema=db1&useSSL=false。
  • [其他] DWS监控面板添加监控视图前端报404
    【问题现象】DWS监控面板添加监控视图前端报404【问题版本】HCS 8.1.0  DWS 8.1.1.5【具体现象】1、前端报错404的url为dws/rest/v1/xxx/clusters/xxx/dms/monitoring/performance/check-duplicate2、进入FCD后台查看url_mapping.json文件,过滤查找check-duplicate,没有 ,check-duplicate接口未注册【解决方案】注:本文中的解决方案仅限于新搭的未做过升级的环境,新升级环境遇此问题请联系研发1、在FCD后台找到配置文件,/opt/FusionCloudDeploy/FusionCloudDeploy/plugins_cloudservices/DWS/conf/url_mapping.json2、注册接口,将接口配置写入url_mapping.json{"sendTimout": 0,"targetService": "DatabaseManager","method": "POST","endpointId": "dws","targetUri": "/v1/{project_id}/clusters/{cluster_id}/dms/monitoring/performance/check-duplicate","readTimout": 70,"targetProtocol": "https","uri": "/rest/v1/{project_id}/clusters/{cluster_id}/dms/monitoring/performance/check-duplicate","connectTimout": 0}3、重跑FCD工步,HCSD工具中找到DWS注册url mapping工步的任务IDbash /opt/rootscripts/fcdscripts/retry_step.sh run -i 任务ID4、去页面刷新,重新添加监控视图
  • [环境搭建] Jmeter连接gaussdb报错
    【功能模块】【操作步骤&问题现象】1、Jmeter使用jdbc连接Opengauss2、报错: Cannot create PoolableConnectionFactory (Invalid or unsupported by client SCRAM mechanisms)【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [讲座&活动公告] 【直播】GaussDB for MySQL关键特性发布和技术解读
    直播时间:2022/3/22 19:00-20:30直播嘉宾:佳恩 华为云数据库高级产品经理直播链接:https://bbs.huaweicloud.com/live/cloud_live/202203221900.html 直播简介:本次直播GaussDB(for MySQL)将正式发布HTAP混合负载特性,复杂查询效率提升百倍,让企业决策更加快速,准确。
  • [其他] GaussDB(DWS)元数据不一致-分区索引异常
    【问题现象】某据点查看表定义报错:ERROR:  The local index xxx on the partition xxx not exist【原因分析】该问题主表索引无损坏,报错原因由于单个分区索引记录在系统表pg_partition中与其他系统表不一致,未找到对应分区索引信息报错,【问题复现】1、创建表带p1 p2两个分区create table a_0317(a int) partition by range(a) (partition p1 values less than (4), partition p2 values less than (8));2、创建主表与分区索引 create index a_0317_index on a_0317(a) local (partition p1_index, partition p2_inde);3、查看分区该表分区索引信息如下:1)查看主表索引信息:select oid,* from pg_class where relname ='a_0317_index';oid   |   relname    | relnamespace | reltype | reloftype | relowner | relam | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relhasindex | relisshared | relpersistence | relkind | relnatts | relchecks | relhasoids | relhaspkey | relhasrules | relhastriggers | relhassubclass | relcmprs | relhasclusterkey | relrowmovement | parttype | relfrozenxid | relacl | reloptions--------+--------------+--------------+---------+-----------+----------+-------+-------------+---------------+----------+-----------+---------------+---------------+---------------+---------------+-------------+----------------+--------------+-------------+-------------+----------------+---------+----------+-----------+------------+------------+-------------+----------------+----------------+----------+------------------+----------------+----------+--------------+--------+------------ 700647 | a_0317_index |         2200 |       0 |         0 |       10 |   403 |      700647 |             0 |        0 |         0 |             0 |         0 |             0 |             0 |           0 |              0 |            0 | f           | f           | p              | i       |1 |         0 | f          | f          | f           | f              | f              | 0        | f                | f              | p        |      0 |        |(1 row)2)根据主表索引信息查看分区索引信息:select * from pg_partition where parentid= 700647; relname  | parttype | parentid | rangenum | intervalnum | partstrategy | relfilenode | reltablespace | relpages | reltuples | relallvisible | reltoastrelid | reltoastidxid | indextblid | indisusable | reldeltarelid | reldeltaidx | relcudescrelid | relcudescidx | relfrozenxid | intspnum | partkey | intervaltablespace | interval | boundaries | transit | reloptions----------+----------+----------+----------+-------------+--------------+-------------+---------------+----------+-----------+---------------+---------------+---------------+------------+-------------+---------------+-------------+----------------+--------------+--------------+----------+---------+--------------------+----------+------------+---------+------------ p1_index | x        |   700647 |        0 |           0 | n            |      700651 |             0 |        0 |         0 |             0 |  0 |             0 |     700631 | t           |             0 |           0 |              0 |            0 |            0 |          |         |             |          |            |         | p2_inde  | x        |   700647 |        0 |           0 | n            |      700650 |             0 |        0 |         0 |             0 |  0 |             0 |     700632 | t           |             0 |           0 |              0 |            0 |            0 |          |         |             |          |            |         |(2 rows)4、连接CN开启读写事务,从pg_partition系统表删除p1分区的索引信息start transaction read write;delete from pg_partition where relname = 'p1_index';5、查看表定义报错与现场报错相同,问题复现:\d+ a_0317ERROR:  The local index 700633 on the partition 700647 not exist.CONTEXT:  referenced column: pg_get_indexdef【处理方法】注:尝试过对主表与分区索引做过reindex均无效。1、删除该表索引信息DROP INDEX a_0317_index;2、对该表索引进行重建create index a_0317_index on a_0317(a) local (partition p1_index, partition p2_inde);3、查看表定义无报错:\d+ a_0317                        Table "public.a_0317" Column |  Type   | Modifiers | Storage | Stats target | Description--------+---------+-----------+---------+--------------+------------- a      | integer |           | plain   |              |Indexes:    "a_0317_index" btree (a) LOCAL(PARTITION p1_index, PARTITION p2_inde)  TABLESPACE pg_defaultRange partition by(a)Number of partition: 2 (View pg_partition to check each partition range.)Has OIDs: noDistribute By: HASH(a)Location Nodes: ALL DATANODESOptions: orientation=row, compression=no
  • [其他] 主动预防-DWS集群gdb安装
    该工具需要在集群所有节点进行安装:HCS或HCSO的DWS中默认没有安装gstack/gdb等工具,如需安装可参考以下步骤:登录华为官方镜像网址:https://mirrors.huaweicloud.com/home 选择欧拉系统,点击对应的镜像链接,依次下载以下三个包:libbabeltrace-1.5.6-1.eulerosv2r8.aarch64.rpmgdb-headless-8.2-3.h3.eulerosv2r8.aarch64.rpmgdb-8.2-3.h3.eulerosv2r8.aarch64.rpm使用rpm -ivh按顺序依次安装三个包 线下纯软环境如果没有gdb,如需安装可参考以下步骤,选择其中一种即可:方式一(yum源安装):需提前配置好yum源或挂载好OS镜像yum install –y gdb*方式二(rpm包安装):下载安装包(以x86架构为例)http://mirror.centos.org/centos/7/os/x86_64/Packages/gdb-7.6.1-120.el7.x86_64.rpmrpm -ivh gdb-7.6.1-120.el7.x86_64.rpm其他架构安装包连接:https://mirrors.huaweicloud.com/search/os方式三(源码安装)下载源码安装包:https://ftp.gnu.org/gnu/gdb/gdb-8.2.1.tar.gz使用root用户将安装包上传服务器按照以下步骤进行安装:tar -zxvf gdb-8.2.1.tar.gzcd gdb-8.2.1/./configuremake -j32make install附报错排查:源码安装一般报错为gcc未安装,导致无法执行编译make等命令,建议先安装gcc,安装步骤参考如下:一般要必须安装这两个包(以x86架构为例):gcc-4.8.5-44.el7.x86_64.rpmgcc-c++-4.8.5-44.el7.x86_64.rpm如果出现需要依赖别的包,需要下载相对应的报缺失安装包,下载连接:https://mirrors.huaweicloud.com/search/os或者对应网站http://mirror.centos.org/centos/7/os/x86_64/Packages/下载好安装包之后:进行安装,比如:rpm -ivh gcc-4.8.5-44.el7.x86_64.rpm如果配置的yum源可以这样安装:yum install -y gcc*
  • 主动预防-DWS关键工具安装确认
    参考如下博客连接:https://bbs.huaweicloud.com/blogs/396499
总条数:2749 到第 页
上滑加载中