• [集群&DWS] GaussDB(DWS)集群通信系列二:通信报错定位思路
    GaussDB(DWS) 集群通信报错主要分为以下三类:一,pooler建连报错常见的连接报错例如:2020-01-09 16:57:17.853 5e16eab1.7933 test_1226 281467863168624 gsql 0 cn_5001 08006 72620544030096250 [BACKEND] ERROR: pooler: failed to create connections in parallel mode for thread 281467863168624, Error Message: pooler: failed to connect to dn_6009_6010:wait 172.31.17.4:45138:dn_6009_6010 timeout expired从日志中可以得到几个关键信息query_id(72620544030096250):用于查找相关query的日志,query_id全局唯一,用于检索本端和对端日志。连接的对端信息:包括对端名称(dn_6009_6010),对端IP和端口(172.31.17.4:45138),部分ERROR日志中缺失对端信息的,需通过grep query_id查找CN日志找到对端信息。errno信息(timeout expired):用于诊断具体的错误原因errno信息主要错误原因如下:timeout expired:表明连接已正常建立,但在认证握手时等待超时,一般是对端进程没有响应,需根据对端信息查看报错时间点对端进程状态。Connection timed out:建立连接超时,说明网络不通畅。如果是偶现,则说明网络丢包导致重传超时(可用gsar脚本检查,还需关注/sbin/sysctl -a|grep retries中tcp重传次数是否正确配置)。No route to host:表明IP不可达,使用ping命令检查网络连通性,检查防火墙配置。可以使用telnet/speed_test工具检查目的端口是否可以连通。Connection refused:表明IP是可达的,但监听端口不存在。确认IP/端口信息配置正确,确认对端进程存活,到对端机器通过”netstat -anop|grep 对端进程号|grep LISTEN“检查监听端口正确监听在目的IP上,检查防火墙配置。Operation now in progress:连接未完全建立好,可以参考Connection timed out处理方式。can not accept connection in standby mode:对端是备机不能接受连接,需通过query_id查找CN日志找到连接对应主机的报错进一步分析。Resource temporarily unavailable:如果是对端上报的,则看对端日志。如果是本端通信接口报错,需结合Error Message分析。Connection reset by peer:网断断开,对端有异常关闭连接或网络原因造成网络闪断。Broken pipe:网断断开,对端有异常关闭连接或网络原因造成网络闪断。二,数据收发报错数据收发常见报错如下:2020-03-12 23:03:06.252 5e6a4f2a.1014 postgres 140003346740992 gs_clean 0 cn_5001 08006 72620543991406350 [BACKEND] WARNING: receive unexpected "EOF" (Local:cn_5001 Remote: 6005_6006:26080 Oid:16387)2020-03-12 23:03:06.252 5e6a4f2a.1014 postgres 140003346740992 gs_clean 0 cn_5001 YY001 72620543991406350 [BACKEND] ERROR: Failed to read response from Datanodes, detail: Connection reset by peer 2020-02-28 21:42:09.143 5e5918a6.2736 consis 139626057762560 cn_5002 0 cn_5004 08006 74309393851616575 [BACKEND] LOG: could not send data to client [ Remote IP: linux-m63 PORT: 57917]. detail:Broken pipe2020-02-28 21:42:09.143 5e5918a6.2736 consis 139626057762560 cn_5002 0 cn_5004 08006 74309393851616575 [BACKEND] FATAL: connection to client lost依然需要从日志中可以得到几个关键信息:query_id连接的对端信息errno信息数据收发报错一般errno信息为Connection reset by peer 或Broken pipe,这个信息只能表明连接异常断开,需要根据query_id到对端日志中确认对端情况,常见的场景如:对端进程异常重启:根据ps命令确认对端进程重启时间是否与报错时间吻合,如果确认重启,则根据core/oom/cm kill三种场景进一步分析。对端日志也报Connection reset by peer 或Broken pipe,则说明网络环境问题导致连接断开,需用gsar工具查看网络压力和丢包重传情况。三,监听报错监听常见报错如下:2019-03-22 19:58:57.173 CST 5c94cdec.1 [unknown] 140689788374080 [unknown] 0 dn_6001_6002_6003 00000 0 [LIBCOMM] WARNING: (mc tcp listen) Failed to bind host:port[100.185.183.15:33013], errno[98]:Address already in use.Maybe port 33013 is used, run 'netstat -anop|grep 33013' or 'lsof -i:33013'(need root) to see who is using.2019-03-28 17:54:35.965 5c9c99d4.1 [unknown] 281473754333184 [unknown] 0 cn_5003 42809 0 [BACKEND] LOG: could not bind IPv4 socket at the 7 time: Cannot assign requested address2019-03-28 17:54:35.965 5c9c99d4.1 [unknown] 281473754333184 [unknown] 0 cn_5003 42809 0 [BACKEND] HINT: Port 25308 is used, run 'netstat -anop|grep 25308' or 'lsof -i:25308'(need root) to see who is using this port.2019-03-28 17:54:35.965 5c9c99d4.1 [unknown] 281473754333184 [unknown] 0 cn_5003 42809 0 [BACKEND] FATAL:could not create listen socket for 10.185.178.213监听报错一般errno信息为,一般为以下场景:监听端口被占用,通过netstat -anop|grep 监听端口号命令查看是否有其他进程占用监听端口号,或者是本进程配置了两个两同的端口,或者是监听端口与随机端口范围冲突(net.ipv4.ip_local_port_range)监听IP非本地IP,导致监听失败附录:gsar脚本路径:$GAUSSHOME/bin/dfx_tool/原文链接:https://bbs.huaweicloud.com/blogs/205970【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [SQL] 你应该知道的数仓安全——默认权限实现共享schema
    【摘要】 一种典型客户场景是一些用户是数据的生产方,需要在schema中创建表并写入数据;而另一些用户是数据的消费方,读取schema中的数据做分析。使用Alter default privilege语法可以实现这种共享schema的权限管理问题。通过简单示例演示了Alter default privilege语法处理这种典型场景的细节和有效性。前言最近遇到一个客户场景,涉及共享schema的权限问题。场景简单可以描述为:一些用户是数据的生产方,需要在schema中创建表并写入数据;另一些用户是数据的消费方,读取schema中的数据做分析。对于该schema权限管理的一种实现方法是数据生产方在每次创建新表后告知管理员用户使用grant select on all tables in schema语法来授予消费方权限。这种方法有一定的局限性。如果生产方在schema下面又创建了一些新表,为了授权消费方使用这些新表还需要告知管理员用户再次使用grant select on all tables in schema来授权。有没有简单的应对方案?答案是肯定的,可以使用Alter default privilege。Alter default privilege用于将来创建的对象的权限的授予或回收。语法介绍 ALTER DEFAULT PRIVILEGES      [ FOR { ROLE | USER } target_role [, ...] ]      [ IN SCHEMA schema_name [, ...] ]      abbreviated_grant_or_revoke;其中abbreviated_grant_or_revoke子句用于指定对哪些对象进行授权或回收权限。对表授权语法是: GRANT { { SELECT | INSERT | UPDATE | DELETE | TRUNCATE | REFERENCES }       [, ...] | ALL [ PRIVILEGES ] }      ON TABLES       TO { [ GROUP ] role_name | PUBLIC } [, ...]参数说明target_role已有角色的名称。如果省略FOR ROLE/USER,则缺省值为当前角色/用户。取值范围:已有角色的名称。schema_name现有模式的名称。target_role必须有schema_name的CREATE权限。取值范围:现有模式的名称。role_name被授予或者取消权限角色的名称。取值范围:已存在的角色名称。详见ALTER DEFAULT PRIVILEGES语法说明场景示例 testdb=# create user creator1 password 'Gauss_234';    CREATE USER  testdb=# create user creator2 password 'Gauss_234';    CREATE ROLE  testdb=# create user user1 password 'Gauss_234';  CREATE USER  --创建共享schema,授予creator1和creator2创建权限,授予user1使用权限  testdb=# create schema shared_schema;    CREATE SCHEMA testdb=> grant create, usage on schema shared_schema to creator1;  GRANT testdb=> grant create, usage on schema shared_schema to creator2;  GRANT  testdb=# grant usage on schema shared_schema to user1;  GRANT  --将creator1和creator2在shared_schema中创建表的select权限授予user1  testdb=# alter default privileges for user creator1, creator2 in schema shared_schema grant select on tables to user1;  ALTER DEFAULT PRIVILEGES  --切到creator1,建表  testdb=# \c testdb creator1  You are now connected to database "testdb" as user "creator1". testdb=> create table shared_schema.t1 (c1 int);  CREATE TABLE  --切到creator2,建表 testdb=> \c testdb creator2  You are now connected to database "testdb" as user "creator2". testdb=> create table shared_schema.t2 (c1 int);  CREATE TABLE  --切到user1,查询OK testdb=> \c testdb user1  You are now connected to database "testdb" as user "user1". testdb=> select * from shared_schema.t1 union select * from shared_schema.t2;   c1   ---- (0 rows)查看默认权限的授予现状查询系统表pg_default_acl可以查看当前哪些schema被授予了默认权限。从defaclacl字段可以看到creator1和creator2分别授予了user1对shared_schema中对象的select权限(r表示read)。 testdb=# select r.rolname, n.nspname, a.defaclobjtype, a.defaclacl from  testdb-#     pg_default_acl a, pg_roles r, pg_namespace n  testdb-#     where a.defaclrole=r.oid and a.defaclnamespace=n.oid;   rolname  |    nspname    | defaclobjtype |     defaclacl        ----------+---------------+---------------+--------------------   creator1 | shared_schema | r             | {user1=r/creator1}   creator2 | shared_schema | r             | {user1=r/creator2} (2 rows)一些细节所有在共享schema中创建对象的用户都应该出现在alter default privileges for user之后的列表中。否则,如果有用户creator3没有在列表中,其在共享schema中创建的对象或者说那些Owner是creator3的对象将不能被user1查询。因为共享schema中creator3用户创建的表没有授予user1默认权限。 testdb=# create user creator3 password 'Gauss_234';  CREATE USER  testdb=# grant create, usage on schema shared_schema to creator3;  GRANT  testdb=# \c testdb creator3  You are now connected to database "testdb" as user "creator3". testdb=> create table shared_schema.t3 (c1 int);  CREATE TABLE testdb=> \c testdb user1  You are now connected to database "testdb" as user "user1". testdb=> select * from shared_schema.t3;  ERROR:  permission denied for relation t3管理员可以通过alter default privileges for user将creator3放入列表中为user1授予访问creator3用户创建表的默认权限,也可以由creator3用户自己通过alter default privileges授权给user1. 前面语法参数说明中有如果省略FOR ROLE/USER,则缺省值为当前用户。 testdb=> \c testdb creator3  You are now connected to database "testdb" as user "creator3". testdb=> alter default privileges in schema shared_schema grant select on tables to user1;  ALTER DEFAULT PRIVILEGES testdb=> \c testdb user1  You are now connected to database "testdb" as user "user1". testdb=> select * from shared_schema.t3;  ERROR:  permission denied for relation t3 testdb=> \c testdb creator3 testdb=> create table shared_schema.t4 (c1 int);  CREATE TABLE testdb=> \c testdb user1  You are now connected to database "testdb" as user "user1". testdb=> select * from shared_schema.t4;   c1   ---- (0 rows)上述代码第3行为当前用户在shared_schema下面创建的表的select权限授予user1。第7行user1查询shared_schema.t3报权限不足,是因为alter default privileges只处理将来的对象。shared_schema.t3在是之前创建的。我们新建表shared_schema.t4,user1用户查询正常。如果要处理已有表的权限,使用grant语句。参见grant语法说明。 testdb=> \c testdb creator3  You are now connected to database "testdb" as user "creator3". testdb=> grant select on all tables in schema shared_schema to user1;  ERROR:  permission denied for relation t1 testdb=> grant select on table shared_schema.t3 to user1;  GRANT testdb=> \c testdb user1  You are now connected to database "testdb" as user "user1". testdb=> select * from shared_schema.t3;   c1   ---- (0 rows)代码第3行中shared_schema中包含有3个用户创建的表,而creator3只是表t3的创建者(Owner)。所以授予整个schema的权限会报错,只授予creator3是Owner的表t3之后,user1用户查询正常。总结alter default privileges只处理将来的对象,grant只处理已有的对象。进一步的,这两种语法授予权限时涉及的对象仅包括Owner是当前用户的对象。如果要为共享schema下面所有Owner的对象授予权限,需要使用管理员用户使用alter default privileges for user语法和grant语法。原文链接:https://bbs.huaweicloud.com/blogs/207326【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [存储] GaussDB(DWS)存储系列之行存表
    GaussDB(DWS)实时数仓的数据都是存储在非易失性的存储设备上,本文从行存表的存储结构出发,帮助大家更好的了解GaussDB(DWS)是怎么在物理磁盘上存储数据的。    行存表的数据文(表、索引、cudesc表等文件),被划分为多个固定大小的page页面(block),每个page页面默认大小为8K,页面编号(block number)从0开始计数。如果当前page页面已经存满,则在末尾会新增一个page,继续存储。    行存表的page页面主要由page header(页头)、空闲空间、数据heap tuple组成,下图展示了page页头各个字段的存储信息:    pd_lsn:本页面最后一次变更所写入的xlog记录对应的lsn。    pd_checksum:主要用于校验页面的完整性,避免数据由于磁盘、IO等原因导致异常。    pd_flags:表示页面状态。    pd_lower:执行line pointers末尾,也就是空闲空间的起始位置。    pd_uppder:指向最后一个tuple,也就是空闲空间的结束为止。    pd_special:用在索引页中,在索引页中它指向特殊空间的起始位置,在堆表页面中它指向页尾。    pd_pagesize_version:页面大小以及页面版本号。    pd_prune_xid:该xid主要用于页面内清理    line pointers:该指针数据指向每一个对应的tuple,也表示每个tuple在页内的偏移offset。         那么页头在存储数据过程中,有什么作用呢,下面通过tuple插入的过程,给大家展示下一些页头信息时如何更新的    (1)假设有一张表仅包含了一个tuple,那么该page header的pd_lower指向line pointers的第一个。在line pointers末尾和最后一个tuple之前的空间被称为free space。为了能够唯一确定页内的tuple,常用ctid(block number, offset)唯一确定对应的tuple。    (2)当插入第二个tuple,则生成line pointer递增,并指向第二个tuple。与此同时,pd_lower、pd_upper更新对应的指向,具体可见下图说明。   由此可见,随着数据的插入,页头信息也在不断实时更新。   总结:当然GaussDB(DWS)数据库不仅仅只有行存这一种存储格式,还有另外一种列存存储格式,后续的文章中我们会对列存页面结构跟大家进行讲解说明,对GaussDB(DWS)数据库底层数据存储有一个全面的认识。原文链接:https://bbs.huaweicloud.com/blogs/207721【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS)集群通信系列三:集群通信常用视图
    视图是检测数据库运行状态的重要工具和手段,GaussDB(DWS)集群通信常用视图主要包含pg_stat_activity、pg_comm_client、pgxc_thread_wait_status、pgxc_comm_recv_stream、pgxc_comm_send_stream、pgxc_comm_status,其在数据库通信问题定位中发挥了重要作用。1、pg_stat_activity该视图显示和当前用户查询相关的信息。主要用于查看当前用户执行查询的状态和查询对应的query_id,2、pg_comm_client_info该视图存储单个节点客户端连接信息(DN上查询该视图显示CN连接DN的信息)。3、pgxc_thread_wait_status该视图显示由执行语句产生的线程之间层次调用关系,以及各个线程的阻塞等待状态。该视图常用来定位数据库通信过程中的hang问题,主要用于定位的信息包括:Ø  query_id:查询IDØ  tlevel:线程层级,对于集群通信而言,Postgres thread线程为0级线程,其根据任务会fork其他子线程,集群通信线程间的关系具体可以参考http://3ms.huawei.com/hi/group/2191/wiki_5275953.html?for_statistic_from=all_group_wikiØ  wait_status:等待线程的当前等待状态,none表示没有等待,其他状态可参考产品文档。4、pgxc_comm_recv_stream该视图显示DN上所有的通信库接收流的状态。5、pgxc_comm_send_stream该视图显示DN上所有的通信库发送流的状态。6、pgxc_comm_status该视图显示所有DN的通信库状态。包含:节点名称、节点通信库发送/接收速率、cmailbox的buffer大小、libcomm/libpq进程通信内存大小、线程实时/最高实时使用率、当前使用的逻辑连接总数。通信视图的关联关系使用和hang问题定位示例查询单个的视图往往信息有限而作用不大,视图最大的妙用在于利用各信息的关联关系,要求使用者能够联系多方信息,进行问题定位和状态监测,这一点无疑比较困难,因此整理和介绍视图的关联关系对于视图使用者极为重要,此处仅通过hang问题的示例,和视图部分信息的关联关系使用,介绍这种运用思想和方法,通信视图完整的关联关系将在后续GaussDB(DWS) 集群通信系列中给出。可以看出,定位hang问题的一般步骤为:1、  根据pg_stat_activity视图查看当前查询的query_id。2、  根据pgxc_thread_wait_status中相应的query_id查询对应的线程状态,是等待什么导致的hang3、  根据wait_status的信息,查看对端信息,包含线程层级,节点等4、  查看对端具体的线程信息pg_thread_wait_status,如果是DN可查对应的连接流信息,可以利用netstat,线程号查看对端信息,分析对端的行为。通信hang问题典型案例:原文链接:https://bbs.huaweicloud.com/blogs/209112【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [测试] GaussDB(DWS) 扩容加节点介绍
    1      扩容加节点介绍1.1      扩容加节点基本流程一、gs_expand 开始阶段检查用户是否正确--解析命令行--检查并校验参数二、gs_expend加节点初始化日志---初始化集群信息(设置静态配置文件路径,从XML文件初始化集群信息)---  初始化SsTool---检查用户及用户组(检查GAUSSHOME/bin的属主用户与登录用户是否匹配)---检查集群信息(检查新节点数不能小于3,新节点的总DN数不能为0)---分发XML文件---检查静态配置文件(与XML文件是否匹配)---检查是否已执行了扩容前置(每个节点的GAUSSENV)Step1:记录STEP_INIT扩容前健康检查   检查集群状态(集群是否正常及是否重分布)---CN连接是否正常,集群是否被锁定---检查GUC参数comm_max_datanode---检查集群是否为只读---备份老集群的参数文件(CN与DN的postgresql.conf文件)Step2:记录STEP_INSTALL安装扩容新节点1.    检查新节点安装环境(检查老集群的GAUSSENV是否为2-----检查安装目录:目录存在且为空,剩余空间不能小于100M)2.    分发静态配置文件(用于刷新CN编号)(在新节点上创建静态配置文建目录-----scp静态配置文件至新节点的该目录)3.    安装新节点 local Install (解压bin文件-----刷新CN编号-----创建静态配置文建-----备份安装包至$GAUSSHOME/bin下-----修改安装路径权限700-----安全设置,修改ReplaceConfig.py and InitInstance.py为600-----修改GAUSSENV值为2-----修改安装路径下文件权限600)4.    分发CA证书文件(GAUSSHOME/share/sslcert/etcd下)5.    清理静态配置文件6.    同步cgroup配置文件(限制内存与CPU的使用)至新节点上($GAUSSHOME/etc/gscgroup_user.cfg)主要步骤:判断cgroup文件是否存在-----将cgroup文件拷贝到GAUSSHOME/EYC目录下-----刷新cgroup配置文件7.    同步alarmltem.conf文件到新节点($GAUSSHOME/bin下)Step3:记录STEP_CONFIG配置扩容新节点1.    配置新节点 主要步骤:检查新节点的配置local/CheckConfig(检查GAUSSLOG日志目录,创建GAUSSLOG下cm,cm_server,cm_agent等目录--检查实例配置:目录是否存在且剩余磁盘大小不小于200M)-----获取$GAUSSHOME/bin下initdb_param文件-----初始化节点实例local/initInstance-----配置新实例(CN,DN,CMAGENT),过程:旧节点上寻找相同的实例;拷贝实例配置文件至新节点目录,修改实例配置文件的所属权限;设置私有配置2.    拷贝cert文件至新节点3.    重建新节点(dump和restore操作)4.    配置新实例5.    配置新节点上GUC参数comm_control_port(SCTP通讯库使用的TCP协议监听端口),comm_sctp_port(SCTP通讯库使用的TCP协议起始监听端口)6.    安装KerberosStep4:记录STEP_START_NEWNODE启动扩容新节点      获取node ID,在利用cm_ctl start –n node ID 启动新节点Step5:记录STEP_SYNC同步整个集群配置;清理老节点上扩容步骤文件目录1.更新静态配置文件(同步老节点的静态配置文件)   配置pg_hba.conf(用来配置对数据库的访问权限)--gs_guc设置2.启动新集群3.Kill CM进程---等待集群状态正常(如果出现异常或集群状态无法变为normal,记录报错日志,返回扩容成功)4.修改静态配置文件5.解锁集群local/Local Query.py***打印扩容成功(是否成功启动新集群,不影响返回扩容成功1.2    扩容加节点前提条件1.必须在集群用户下执行2.已按照扩容的集群配置xml文件执行过前置脚本3.扩容需在正常集群状态下执行4.集群扩容要求整个集群没有被锁定,集群配置文件的配置信息正确并且和当前集群配置一致1.3      扩容执行介绍扩容前检查集群状态且集群状态正常,cm_ctl query –Cv   2.执行扩容前置,./gs_preinstall -U xxxxxx -G users -X /home/cluster/online_expend_alter1_v6/test/clusterconfig_expand.xml --alarm-type=1 --sep-env-file=/opt/temp/env   3.执行扩容gs_expand -t dilatation -X /home/cluster/online_expend_alter1_v6/test/clusterconfig_expand.xml   4.扩容日志查询路径:vi $GAUSSLOG/om/gs_expend***原文链接:https://bbs.huaweicloud.com/blogs/209154【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [存储] GaussDB(DWS) SQL On Anywhere之外表
    背景Hadoop的诞生是划时代的数据变革,但关系型数据库时代的存留也为Hadoop真正占领数据库领域埋下了许多的障碍。对SQL(尤其是PL/SQL)的支持一直是Hadoop大数据平台在替代旧数据时代亟待解决的问题。Hadoop对SQL数据库的支持度一直是企业用户最关心的诉求点之一,也是他们选择的Hadoop平台的重要标准。Hadoop开源技术具有高扩展性,实际生产环境已经可以支持部署几千个 物理节点,提供PB级数据分析能力,支持运行在通用廉价的x86 Linux服 务器上,数据存储在内置盘上,且无商业软件license费用;Hadoop通过技术能力(sql支持,MR内存计算,MPP)的演进以及众多 非传统关系型数据库厂商的支持,正在从最初的只处理低价值低密度数 据的批处理型任务,向中等价值数据的分析处理任务演进。融合大数据生态与MPPDB传统数据库的融合方案有以下两种:(1)远程查询方案,以关系型数据库作为集成节点,将查询发送给Hadoop,并接收Hadoop的计算结果,查询分析在Hadoop平台完成,采用这种方式的厂商有 Oracle,Teradata,SQL Server等;(2)查询引擎直接访问HDFS数据方案,分析由传统数据库引擎完成,代表产品有PIVOTAL HAWQ,IBM BigSQL 3.0等。出于性能考虑GaussDB(DWS)选择的是第二种方案。CN将任务分解下发至各个DN,以实现节点间并行,使得调度计算节点更靠近数据存储节点。特点支持多DN并发查询;支持和本地多表join;支持analyze收集统计信息;格式支持丰富,易扩展。使用用户通过建立外部服务器Server(外部服务器是存储HDFS集群信息、OBS服务器信息或其他同构集群信息的载体)-- 创建HDFS_Server。CREATE hdfs_server FOREIGN DATA WRAPPER HDFS_FDW OPTIONS (     address '10.10.0.100:25000,10.10.0.101:25000',     hdfscfgpath '/opt/hadoop_client/HDFS/hadoop/etc/hadoop',     type'HDFS');创建Foreign Table在GaussDB(DWS)数据库内部定义对应的HDFS/OBS数据源上结构化数据表的结构。-- 建立不包含分区列的HDFS外表,表关联的HDFS server为hdfs_server,表region对应的HDFS服务器上的文件格式为‘orc’,在HDFS文件系统上对应的文件目录为'/user/hive/warehouse/mppdb.db/region_orc11_64stripe/'。CREATE FOREIGN TABLE region(     R_REGIONKEY INT4,     R_NAME TEXT,     R_COMMENT TEXT)SERVER    hdfs_serverOPTIONS(     FORMAT 'orc',     encoding 'utf8',     FOLDERNAME '/user/hive/warehouse/mppdb.db/region_orc11_64stripe/')DISTRIBUTE BY roundrobin;查看外表-- 查看外表。SELECT * FROM pg_foreign_table WHERE ftrelid='region'::regclass;  ftrelid | ftserver | ftwriteonly |                                  ftoptions---------+----------+-------------+------------------------------------------------------------------------------   16510 |    16509 | f           | {format=orc,foldername=/user/hive/warehouse/mppdb.db/region_orc11_64stripe/}(1 row)本章简单介绍了GaussDB(DWS)通过外表访问HDFS/OBS上的文件,下一篇中将介绍SQL On Hadoop系统分类,以及业内主流的SQL On Hadoop系统,如HIve、Impala、HAWQ等。原文链接:https://bbs.huaweicloud.com/blogs/209157【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [SQL] PB级数仓GaussDB(DWS)性能黑科技之并行计算技术解密
    【摘要】 随着硬件系统的越来越好,数据库运行的CPU、磁盘、内存资源都日渐增大,SQL语句的串行执行由于不能充分利用资源,已经不能满足日益发展的需要。为此,GaussDB(DWS)开发了并行计算技术,在语句执行时可以充分利用硬件资源进行并行加速,提高执行的吞吐率。本文将详细介绍GaussDB(DWS)并行计算技术的原理,以及其在performance信息中的展示,帮助各位开发者朋友更好地分析并行的性能。随着硬件系统的越来越好,数据库运行的CPU、磁盘、内存资源都日渐增大,SQL语句的串行执行由于不能充分利用资源,已经不能满足日益发展的需要。为此,GaussDB(DWS)开发了并行计算技术,在语句执行时可以充分利用硬件资源进行并行加速,提高执行的吞吐率。本文将详细介绍GaussDB(DWS)并行计算技术的原理,以及其在performance信息中的展示,帮助各位开发者朋友更好地分析并行的性能,从而进行并行执行方面的调优。并行计算的原理很简单,将原本一个线程的工作平均分配到多个线程来完成,示意图如下图所示:图示中的关联操作,原本需要操作四份数据,通过并行度为4的并行计算后,每个子线程仅需要处理一份数据,理论上性能提升可以达到4倍。通常情况下,理论上的性能提升是达不到的,因为并行计算也有其性能损耗,包括:启动线程的代价,以及线程之间进行数据传输的代价。因此,只能性能损耗较低,大大低于并行带来的收益时,并行计算的收益才比较明显。所以,并行只有在数据量较大的场景下才能获得较高的性能收益,非常适合于分析型的AP场景。通过上述分析,我们可以看出,并行计算的难点不在于如何并行,而在于如何正确选择并行度。当数据量较小时,也许串行的性能是最好的,当数据量增大时,可以考虑进行并行。对于一个复杂的执行计划来说,可能包含多个算子,每个算子处理的数据量都不一样,如何综合考虑并行度,以及处理好各算子之间的数据收发关系,将成为并行计算技术的关键难点。GaussDB(DWS)基于代价估算,根据表的数据量信息来为计划片段生成合适的并行度,下面以TPC-DS Q48为例来看一下,GaussDB(DWS)的并行计划长什么样?select sum (ss_quantity)  from   store_sales, store, customer_demographics, customer_address, date_dim  where s_store_sk = ss_store_sk  and    ss_sold_date_sk = d_date_sk and d_year = 1998 and  (  (      cd_demo_sk = ss_cdemo_sk      and      cd_marital_status = 'M'      and      cd_education_status = '4 yr Degree'      and      ss_sales_price between 100.00 and 150.00       ) or  (     cd_demo_sk = ss_cdemo_sk      and      cd_marital_status = 'D'      and      cd_education_status = 'Primary'      and      ss_sales_price between 50.00 and 100.00     ) or   (     cd_demo_sk = ss_cdemo_sk     and      cd_marital_status = 'U'      and      cd_education_status = 'Advanced Degree'      and      ss_sales_price between 150.00 and 200.00   )  ) and (  (     ss_addr_sk = ca_address_sk     and     ca_country = 'United States'     and     ca_state in ('KY', 'GA', 'NM')     and ss_net_profit between 0 and 2000      ) or    (ss_addr_sk = ca_address_sk     and     ca_country = 'United States'     and     ca_state in ('MT', 'OR', 'IN')     and ss_net_profit between 150 and 3000   ) or    (ss_addr_sk = ca_address_sk     and     ca_country = 'United States'     and     ca_state in ('WI', 'MO', 'WV')     and ss_net_profit between 50 and 25000   )  );对应的performance信息为:通过将performance信息转变为计划树,可以得到该计划的计划树如下图所示:其中1-3号算子在CN上执行,DN上以跨线程数据传输的Stream算子进行分隔,一共会启动5个线程。GaussDB(DWS)采用pipeline的迭代执行模式,线程4和5从磁盘读取数据,其它每个Stream算子分隔的线程从子线程读取数据,进行执行,并将结果返回给上层算子,顶层DN线程将数据返回给CN处理。通过这个图,我们可以看出,线程1,4,5采用的并行度是1,而线程2,3采用的并行度是26。通过计划信息,我们可以看出,8-13号算子处理的数据量较大,刚好是线程2,3处理的范围,所以选择了较高的并行度。并行计算的Stream线程仍然沿用DN间的Stream线程进行启动和停止,但DN内部的数据传输改为内存拷贝进行,更节省网络资源,但带来一定程度的内存开销。同时,并行度的增大也使得跨DN间数据传输的数据缓冲区增大,内存开销变大。因此,大内存也是提高并行度的一个必备因素。那么线程之间是如何进行并行度的衔接呢?通过计划,我们可以看出,并行场景下,Stream线程均显示为:Streaming(type: T dop:N/M),这是在串行场景基础上的扩展,同时也可以以线程为级别看到每个线程执行时间,处理的行数和使用的内存。在串行场景下,我们支持三种类型的Stream算子,分别为redistribute, broadcast和gather,详细介绍参见《GaussDB(DWS)性能调优系列基础篇二:大道至简explain分布式计划》中第一章节介绍。并行场景是对串行场景中DN上的redistribute和broadcast类型Stream算子进行扩充,包括以下几类:1)Streaming(type: SPLIT REDISTRIBUTE):同串行场景下的Redistribute,但以线程为单位进行数据传输,每条元组发送给一个目的线程。2)Streaming(type: SPLIT BROADCAST):同串行场景下的Broadcast,但以线程为单位进行数据传输,每个线程都将收到全量数据。3)Streaming(type: LOCAL REDISTRIBUTE):作用是DN内部根据当前分布键进行数据Redistribute。通常作用于基表扫描后,因为基表扫描是按页面进行线程划分,此时线程间并不是按DN的分布键分布的,需要增加该DN内重分布操作。4)Streaming(type: LOCAL BROADCAST):作用是DN内部进行数据Broadcast,每个线程把数据发送给这个DN的所有线程,每个线程获得该DN的全量数据。5)Streaming(type: LOCAL GATHER):作用是DN内部把数据从多线程汇总到一个线程。注意:“dop:N/M”表示发送端的dop为M,接收端的dop为N,从而完成从M个线程的并行度转变为N个线程并行度的任务。在GaussDB(DWS)中,我们增加了参数query_dop,来控制语句的并行度,取值如下:1)query_dop=1,串行执行,默认值2)query_dop=[2..N],指定并行执行并行度3)query_dop=0,自适应调优,根据系统资源和语句复杂度情况自适应选择并行度由于开启并行会占用较多的内存,所以目前GaussDB(DWS)的默认并行度为1。在内存较大的环境下,可以通过手动设置query_dop达到并行加速的目的。通常情况下,我们可以考虑首先设置query_dop=0,查看语句的执行计划、performance信息和性能。在performance信息的下方Query Summary一栏,可以看到自适应dop选择的信息,例如:TPC-DS Q48 dop选择信息如下图所示,可以看出初步选定的initial dop为24,最终确定的final dop为26。dop的选择会综合考虑各种因素,其信息也在图中显示出来。由于自适应选择并行度是根据语句复杂度和系统资源利用情况来进行选择,而系统资源利用情况是获取前一段时间的资源利用情况,有可能出现不准确的情况,此时就需要人为来设置并行度了。人为设置并行度,并不是设置越大越好,dop设置过大,会导致系统中的线程数量急剧增多,导致CPU冲突进行线程切换的额外开销。要想人为设置并行度,同样需要使用单机CPU核数和语句复杂程度进行考量。我们定义单机CPU核数/单机DN数为每个DN可用的CPU核数x,然后根据串行计划中DN Stream算子的个数初步判定语句的复杂度y(例如下图TPC-H Q1计划中只有一个Stream节点,则y为1),单并发时,使用x/y的值设置query_dop。并发场景,再除以并发数p设置query_dop。由于此公式为粗略估计值,因此在设置时可以考虑扩大搜索范围,来寻找合适的并行度。在并发场景下,GaussDB(DWS)还支持max_active_statements来控制执行语句的个数,当语句的个数超过CPU核数时,可以考虑使用该参数限制并发数,然后再设置合理的query_dop进行调优。还是以刚才的示例为例,单机有96核,2个DN,则每个DN可用48核,则同时执行6个TPC-H Q1查询时,并行度可以设置为8。通过这篇文章,我们了解了GaussDB(DWS)并行计算技术的原理以及调优策略。希望广大开发者朋友们能够在实践中尝试该技术,更好地进行性能优化。原文链接:https://bbs.huaweicloud.com/blogs/203426【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [SQL] GaussDB(DWS)数据库安全系列之通信安全
    【摘要】 网络是一个开放的环境,仅仅依靠用户名和密码难以应对复杂的网络环境,针对可能存在的身份伪造的欺骗行为,以及监听通信内容的窃听行为,为了确保通信双方身份的真实性和通信内容的私密性,防止非法用户对GaussDB(DWS)系统、其他用户造成不利影响,GaussDB(DWS)建立了一套完整而严密的防护机制——连接认证机制,可以有效防止非法用户入侵。1.   简介网络是一个开放的环境,仅仅依靠用户名和密码难以应对复杂的网络环境,针对可能存在的身份伪造的欺骗行为,以及监听通信内容的窃听行为,如何保证通信双方身份的真实性和通信内容的私密性,防止非法用户对GaussDB(DWS)系统、其他用户造成不利影响,就需要一套完整而严密的防护机制。连接认证机制就是GaussDB(DWS)数据安全的一套有效防护机制,连接认证机制可以防止非法用户入侵GaussDB(DWS)系统内部。GaussDB(DWS)是基于客户端/服务器(C/S)架构的系统,通信过程是基于TPC/IP协议,为了确保用户访问的可信,建立了连接认证机制:通过安全套接字层(SSL)实现通信双方的证书校验和秘钥协商从而保护网络连接,通过服务端的认证模块确保用户名和密码合法。关于SSL,SSL(及其继任者TLS)是在应用程序级实现的,位于应用层协议(HTTP、FTP)和传输层协议(TCP)之间。如果正确地配置了SSL,则第三方观察者最多只能获得连接参数、传输频率和大概数据量,但是无法读取或更改这些信息。基于SSL的证书校验可以确保通信双方(客户端和服务端)身份的真实性、秘钥协商可以确保数据的完整性和私密性。SSL/TLS在Internet协议栈中的位置如图所示:关于认证模块,在建立的TCP/IP通道(SSL)的基础上,根据服务器配置文件pg_hba.conf中限定的合法用户名、数据库名、IP地址以及认证方式等信息,GaussDB(DWS)认证模块对用户名和密码进行校验,确保合法用户能正常连接到GaussDB(DWS)。2.   证书校验&&秘钥协商证书校验和秘钥协商在SSL的握手阶段实现,握手协议如下:1.1         准备证书在华为云CA认证中心申请到服务器、客户端的证书和密钥。(如:服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)为了安全性,私钥通常采用了密码保护,在此可以通过gs_guc encrypt工具生成私钥的两个密码保护文件(*.key.rand、*.key.cipher),命令如下:gs_guc encrypt [-M keymode] -K password -D DATADIR说明:•        -M是加密类型,服务端选择server,客户端选择client。默认值为server。•        -K是用户私钥的密码,密码需要满足要求:长度(8≤len≤16)、复杂度(需至少包含小写字母、大写字母、数字、特殊字符中的三种)•        -D生成的密码保护文件的存放地址1.2         服务器参数配置通过调用工具gs_guc实现服务器配置文件postgresql.conf有关参数设置,命令如下:gs_guc set -Z coordinator -D ${BIGDATA_DATA_HOME}/mppdb/data1/coordinator -c "ssl=on"说明:•        -Z coordinator表示实例类型为coordinator;•        -D 数据目录•        -c 指定设置postgresql.conf文件服务器需设置SSL相关参数如下:参数描述取值范围ssl表示是否启动SSL功能·       on:开启SSL功能·       off:关闭SSL功能默认值:onrequire_ssl服务器是否强制要求SSL连接,只有当参数ssl为on时才有效·       on:强制要求SSL连接·       off:不强制要求SSL连接默认值:offssl_cert_file指定服务器证书文件请以实际证书名为准。必须使用相对路径(相对于数据目录)默认值:server.crtssl_key_file指定服务器私钥文件请以实际的私钥名称为准。必须使用相对路径(相对于数据目录)默认值:server.keyssl_ca_file服务器侧CA根证书,需验证客户端证书合法性时才配置请以实际CA根证书名称为准默认值:空,表示不对客户端的合法性进行校验ssl_crl_file证书吊销列表请以实际证书吊销列表名称为准默认值:空,表示没有吊销列表ssl_ciphersSSL通讯使用的加密算法,目前已升级至TLS1.3TLS1_3_RFC_AES_128_GCM_SHA256TLS1_3_RFC_AES_256_GCM_SHA384 TLS1_3_RFC_CHACHA20_POLY1305_SHA256TLS1_3_RFC_AES_128_CCM_SHA256TLS1_3_RFC_AES_128_CCM_8_SHA256默认值:ALL,表示允许对端使用以上所有加密算法,在满足条件的算法中按照安全强度最高的匹配1.3         客户端参数配置客户端设置SSL连接参数,按照模式分为:单向认证和双向认证单向认证,仅客户端验证服务器证书的合法性,设置参数:PGSSLMODE、PGSSLROOTCERT;双向认证,客户端验证服务器证书的合法性,同时客户端向服务器发送证书,由服务器验证客户端证书的合法性,设置参数:PGSSLCERT、PGSSLKEY、PGSSLMODE、PGSSLROOTCERT; 客户端需设置SSL相关参数如下:环境变量描述取值范围PGSSLCERT指定客户端证书文件绝对路径,如:export PGSSLCERT='/home/omm/client.crt'PGSSLKEY指定客户端私钥文件必须包含文件的绝对路径,如:export PGSSLKEY='/home/omm/client.key'PGSSLMODE设置是否和服务器进行SSL连接协商,以及指定SSL连接的优先级取值及含义:·     disable:只尝试非SSL连接·     allow:首先尝试非SSL连接,如果连接失败,再尝试SSL连接·     prefer:首先尝试SSL连接,如果连接失败,将尝试非SSL连接·     require:只尝试SSL连接。如果存在CA文件,则按设置成verify-ca的方式验证·     verify-ca:只尝试SSL连接,并验证服务器是否具有由可信任证书机构签发的证书·     verify-full:只尝试SSL连接,并验证服务器是否具有由可信任的证书机构签发的证书,以及验证服务器主机名是否与证书中的一致默认值:preferPGSSLROOTCERT指定客户端侧根证书,验证服务器证书有效性必须包含文件的绝对路径,如:export PGSSLROOTCERT='/home/omm/certca.pem'PGSSLCRL指定证书吊销列表文件必须包含文件的绝对路径,如:export PGSSLCRL='/home/omm/sslcrl-file.crl'备注:假设证书,私钥和根证书都放在“/home/omm”目录。3.   用户名和密码验证用户名和密码的验证在服务器侧进行,其逻辑如下:如果某主机需要远程连接到GaussDB(DWS),必须在GaussDB(DWS)系统的配置文件中增加此主机的信息,并且进行客户端接入认证。配置文件(pg_hba.conf)存放在数据目录里。hba(host-based authentication)表示是基于主机的认证。通过调用工具gs_guc实现服务器配置文件pg_hba.conf有关参数设置,每次向配置文件中增加一条连接认证规则,命令如下:gs_guc set -Z coordinator -N all -I all -h "host all jack 10.10.0.30/32 sha256"说明:•        -Z coordinator表示实例类型为coordinator;•        -N all 表示集群的所有主机•        -I all表示主机的所有实例•        -h 表示指定需要在“pg_hba.conf”增加的语句•        all 表示允许客户端连接到任意的数据库•        jack表示允许连接数据库的用户•        10.10.0.30/32表示只允许IP地址为10.10.0.30的主机连接•        sha256表示连接时jack用户的密码使用sha256算法加密配置文件pg_hba.conf中的每条记录可以是以下四种格式之一:local DATABASE USER METHOD [OPTIONS]host DATABASE USER ADDRESS METHOD [OPTIONS]hostssl DATABASE USER ADDRESS METHOD [OPTIONS]hostnossl DATABASE USER ADDRESS METHOD [OPTIONS]说明•        local:只接受通过Unix域套接字进行的连接。•        host:既接受一个普通的TCP/IP套接字连接,也接受一个SSL加密的TCP/IP套接字连接。•        hostssl:只接受一个经过SSL加密的TCP/IP套接字连接。•        hostnossl:只接受一个普通的TCP/IP套接字连接。•        DATABASE:声明记录所匹配且允许访问的数据库:          a)          all:表示该记录匹配所有数据库;          b)         sameuser:表示如果请求访问的数据库和请求的用户同名,则匹配;          c)          samerole/ samegroup:表示请求的用户必须是与数据库同名角色中的成员;          d)         一个包含数据库名的文件或者文件中的数据库列表:文件可以通过在文件名前面加前缀@来声明;          e)          特定的数据库名称或者用逗号分隔的数据库列表;•        USER:声明记录所匹配且允许访问的数据库用户。          a)          all:表明该记录匹配所有用户;          b)         +用户角色:表示匹配任何直接或者间接属于这个角色的成员;          c)          一个包含用户名的文件或者文件中的用户列表:文件可以通过在文件名前面加前缀@来声明;          d)         特定的数据库用户名或者用逗号分隔的用户列表;•        ADDRESS:指定与记录匹配且允许访问的IP地址范围,支持IPv4和IPv6,可以使用如下两种形式来表示:          a)          IP地址/掩码长度。例如:10.10.0.0/24          b)         IP地址子网掩码。例如:10.10.0.0 255.255.255.0•        METHOD:声明连接时使用的认证方法。          a)          trust:只完全信任从服务器本机使用gsql且不指定-U参数的连接,此时不需要口令;          b)         reject:无条件地拒绝连接。常用于过滤某些主机;          c)          md5:要求客户端提供一个md5加密的口令进行认证(不推荐使用);          d)         sha256:要求客户端提供一个sha256算法加密的口令进行认证;          e)          cert:客户端证书认证模式,必须是SSL连接且客户端须提供有效的SSL证书,用户名必须与证书所有者同名;          f)          gss:使用基于gssapi的kerberos认证;          g)         ldap:ldap认证;4.   异常处理问题现象解决方法用户名或密码错误:FATAL: invalid username/password,login denied说明用户名或者密码错误,请检查输入是否有误连接的数据库不存在:FATAL: database "TESTDB" does not exist说明尝试连接的数据库不存在,请检查连接的数据库名输入是否有误未找到客户端匹配记录:FATAL: no pg_hba.conf entry for host   "10.10.0.60", user "ANDYM", database "TESTDB"说明已经连接了服务器,但服务器拒绝了连接请求,因为没有在pg_hba.conf配置文件里找到匹配的记录。请联系管理员在pg_hba.conf配置文件加入用户的信息证书校验失败:SSL error: certificate verify failed说明客户端CA校验服务器证书失败,请检查客户端CA证书配置是否有误无效CA:SSL error: tlsv1 alert unknown ca说明客户端发送的证书,服务器侧CA校验失败,请检查客户端证书配置是否有误服务器不支持SSL,但客户端要求SSL连接server does not support SSL, but SSL was required说明服务器关闭SSL建连,而客户端强制要求建连SSL连接,请联系管理员开启SSL连接(或客户端采用非SSL连接)服务器强制要求SSL连接,客户端不支持FATAL: SSL connection is required by the database system说明客户端不支持SSL建连,请检查客户端SSL建连相关参数配置是否有误服务端认证模式选择证书认证,校验失败FATAL: certificate authentication failed for user "user01"说明服务端认证模式选择证书认证,而客户端登录用户user01与证书不匹配,请检查客户端证书配置是否有误校验服务端证书失败server common name "server" does not match host name说明客户端认证模式选择verify-full,而校验的服务器主机名与服务器证书中名称不一致,请检查“/etc/hosts”中配置的服务器主机名是否有误错误的版本SSL error: wrong version number说明服务器无法读取到服务器证书,请联系管理员检查服务器证书配置是否有误原文链接:https://bbs.huaweicloud.com/blogs/203214【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [存储] GaussDB(DWS)数据同步状态查看方法
    【摘要】 GaussDB(DWS)的DN高可用架构为主、备、从备架构。通过各组件的主备的数据同步、倒换、重建等机制,保证数据库单实例遭遇Crash后,具备故障恢复及自愈的能力,这些过程有可能会时间花费较长,一旦同步过程中出现异常问题,其内部关键过程信息输出对于问题分析定位十分重要。因此,GaussDB(DWS)提供了丰富的系统函数、视图、工具等可以直观地对同步进度进行跟踪。1 背景概述:1.1DN高可用架构模型要理解或描述数据同步的过程机制,需要首先要了解GaussDB(DWS)的DN高可用架构,理解涉及数据同步的各组件的关系、数据类型、数据流向、设计原理和目的。GaussDB(DWS)的DN高可用架构为主、备、从备架构。即在分布式环境中,完整的集群数据采用分片技术分布在多个DN组上,每组DN承担一个数据分片,包括:一个主DN、一个备DN和一个从备DN。主和备各有一份完整的数据,从备上一般不存储数据,仅在备机故障时做数据的暂存。组件之间关系如图1所示:图1 DN高可用架构关系图 主、备、从备高可用架构下,主、备及主、从备之间均会建立流复制通道。流复制又分为日志复制和数据页复制。日志复制用于同步主DN由于WAL机制刷到磁盘上的XLOG,同步到备DN进行回放。数据页复制用于同步批量导入的行存数据、或列存CU文件。需要注意的一点是,从备仅用于存放XLOG和数据,回放(replay)仅发生在备DN上。1.2 数据同步涵盖范围       数据同步就是涉及集群中主、备节点以及从备节点之间的日志复制数据的传输、回放,数据页复制数据的传输、追赶,备机重建等过程。GaussDB(DWS)集群高可用实践WAL(Write Ahead Logging)思想,并通过各组件的主备的数据同步、倒换、重建等机制,保证数据库单实例遭遇Crash后,具备故障恢复及自愈的能力,保护数据库中数据的可靠性和完整性,最终实现集群对外业务连续性的过程。这些主要的过程有:1.        主备之间的正常流复制每组DN独立承担一个数据分片,因此要求各个DN主与备必须强同步。为保证DN的主备强同步,数据在主DN操作时产生日志,事务提交时将日志同步给备DN。备机对接收到的XLOG进行回放(replay),将日志转为数据。另外,列存和行存批插场景下,备机正常时,新增(变更)数据会发往备机。使用数据页同步相对于日志同步少了磁盘IO,可以提升同步效率,减小RTO。2.        备机追赶为了解决单节点故障后集群写事务可用,DN的高可用设计引入从备这个实例。一旦备DN故障,数据将发送给从备,仍然保证了数据写两份的原则,事务照样可以提交。但主机会对BCM文件里面的标记位置状态位。BCM文件中每一bit位(除预留位外)对应数据文件中每一页(8k)状态。当备机重新启动的时候,会连接主机做数据页追赶(catchup)。追赶机制分为全量和增量两种。全量catchup机制,不依赖于从备,主机递归扫描本地默认表空间和自定义表空间下的所有BCM文件,然后查看状态位来确认哪些数据文件需要发送给备机。增量catchup机制依赖于从备,主机通知从备遍历其从备上暂存的数据页,将变更的数据页列表发往主机,主机直接按照从备发来的变更列表,将变更数据发往备机。3.        主备倒换当主DN故障时,需要对备DN进行failover,failover后备DN升为主DN来接管业务。所以failover时,备DN需要连接从备DN,向从备DN请求数据,以补齐备DN比主DN缺少的数据。failover的过程是备DN独立完成的,不需要和主DN进行交互。4.        备机重建重建功能主要目的是单点故障修复,备机重建方式按照实现分为全量重建和增量重建,均和主DN进行交互。全量重建是备机清空数据目录,保留配置文件,向主机发送全量重建请求,主机将自己的数据目录除了配置文件外,全部发给备机,重建后启动备机。增量重建是一种以主DN文件为基准,按照文件块对备DN文件进行校验,如果备DN文件的某个文件块校验不一致,则主机将此文件块发给备DN,写入文件对应的文件块中。与全量重建相比较,拷贝的数据量和WAL日志量都更少,代价更小。 从以上这些数据同步过程中,我们发现表现在运维上一个明显的特点是,这些过程有可能会时间花费较长,一旦同步过程中出现异常问题,其内部关键过程信息输出对于问题分析定位十分重要。因此,GaussDB(DWS)提供了丰富的系统函数、视图、工具等可以直观地对同步进度进行跟踪,尤其是为方便定位人员使用,gs_ctl工具已集合了大部分相关系统函数的调用,可做到在任何时间,从未启动、启动、重建到运行时的关键信息显示。2 方法总结  2.1 系统视图       总结涉及数据同步的系统视图如表1所示。具体参数、返回值定义请参考相应版本的产品文档手册。分类名称用途使用范围视图类pg_replication_slots显示当前DN上所有的复制槽信息主、备DN均可上执行pg_get_senders_catchup_time显示单个DN上当前活跃的主备发送线程的追赶信息。主DN上执行pg_stat_replication用于描述日志同步状态信息,如发起端发送日志位置,接收端接收日志位置等。主DN上执行表1 系统视图表2.2 系统函数总结涉及数据同步的系统函数如表2所示。具体参数、返回值定义请参考相应版本的产品文档手册。分类名称用途使用范围函数类pgxc_get_senders_catchup_time显示所有DN上当前活跃的主备发送线程的追赶信息。CN上执行pgxc_stat_get_wal_senders显示所有DN上所有的WAL复制发送线程的统计信息。CN上执行pgxc_stat_xlog_space显示所有主DN上XLOG空间使用信息CN上执行pg_stat_xlog_space显示当前DN上XLOG空间使用信息主、备DN均可上执行pg_stat_get_stream_replications显示当前DN上所有的复制统计信息。主、备DN均可上执行pg_get_replication_slots显示当前DN上所有的复制槽信息主DN上执行pg_stat_get_wal_senders显示当前DN上所有的WAL复制发送线程的统计信息。主DN上执行pg_stat_get_data_senders显示当前DN上所有的数据页复制发送线程的统计信息。主DN上执行pg_current_xlog_location获取当前事务日志的写入位置主DN上执行pg_current_xlog_insert_location获取当前事务日志buffer的插入位置主DN上执行pg_stat_get_wal_receiver显示当前DN上所有的WAL复制接收线程的统计信息。备DN上执行pg_is_in_recovery如果恢复仍然在进行中,则返回true备DN上执行pg_last_xlog_receive_location获取最后接收事务日志的位置并通过流媒体复制同步到磁盘。备DN上执行pg_last_xlog_replay_location获取最后一个事务日志在恢复时重放的位置。备DN上执行pg_last_xact_replay_timestamp获取最后一个事务在恢复时重放的时间戳。备DN上执行pg_xlogfile_name(location text)将事务日志的位置字符串转换为文件名。备DN上执行pg_xlogfile_name_offset(location text)将事务日志的位置字符串转换为文件名并返回在文件中的字节偏移量。备DN上执行pg_xlog_location_diff(location text,   location text)计算两个事务日志位置之间在字节上的区别。备DN上执行pg_xlog_replay_completion显示当前DN XLOG redo的进度信息主、备DN均可上执行pg_data_sync_from_dummy_completion显示当前DN 数据页从dummystandby传输的进度信息备DN上执行表2 系统函数表2.3 常用工具       总结涉及数据同步的常用工具如表3所示。具体工具说明、参数定义请参考相应版本的产品文档手册中的定义。分类名称用途使用范围工具类cm_ctl操作、检查数据库集群的状态。任何节点上均可执行gs_ctl操作、检查管理节点的数据库实例状态。主、备DN上均可执行pg_xlogdump解析XLOG文件内容主、备DN上均可执行pg_controldata显示control file的所有信息主、备DN上均可执行表3 常用工具表3 应用场景3.1 查看DN实例Redo进度当DN实例crash发生时,我们可以通过回放XLOG日志中记录的数据变化还原crash前的操作。这个就是所谓的redo/recovery过程。如果需要redo的XLOG比较多,或者遇到某种特殊日志类型,对DN实例进行启动,启动过程时间就会有些长。DN实例启动过程中,如果期望查看XLOG redo的进度。最方便的是使用gs_ctl query工具对指定DN实例路径进行状态查询,结果中可以显示xlog redo的进度,如图2所示。此外,在DN实例可以接受gsql连接时(启动到最小恢复点之前是拒绝连接的),也可直接在当前DN上执行pg_xlog_replay_completion 函数来获取XLOG redo进度信息。图2 DN实例启动时XLOG Redo进度查询启动Redo进度相关信息(Xlog replay info)包括:  replay_start:Xlog Redo的起始LSN 。DN实例启动XLOG redo过程时,记录replay_start。  replay_current:Xlog Redo的当前replay的LSN。  replay_end:DN本地接收到的最大XLOG lsn。  replay_percent:Xlog Redo的当前完成的百分比。(replay_current - replay_start)*100 / (replay_end - replay_start)的计算值。依据replay_current的变化,可以看到XLOG redo的推进。依据replay_percent和启动开始时间,可以推测DN实例启动到正常状态的所需时间。3.2 查看备机Failover进度       当主机发生故障时,我们需要将备机failover成主机,此时备机需要连接从备同步XLOG和数据页文件。如果需要同步的XLOG比较多,或者遇到某种特殊日志类型,或者数据文件比较多时,对备DN实例进行failover,过程时间就会有些长。备机failover升主过程中,如果期望查看XLOG redo和数据页文件同步的进度。最方便的是使用gs_ctl query工具对指定DN实例路径进行状态查询,结果中可以显示xlog redo的进度和从备数据同步的进度,如图3所示。此外,在DN实例可以接受gsql连接时,也可直接在当前DN上执行pg_data_sync_from_dummy_completion 函数来获取从备数据文件同步的进度信息。 图3 备机Failover进度查询Failover Redo进度相关信息(Xlog replay info),字段含义同Start Redo,区别在于,备DN在处理failover请求连接从备时候获取最新的replay lsn更新了replay_start。Failover数据页文件进度相关信息(Data sync from dummy)包括:  start_index:数据页文件同步的起始编号。  current_index:数据页文件同步的当前编号。  total_index:数据页文件同步的最大编号。  sync_percent:数据页文件当前完成的百分比。(current_index - start_index) *100/ (total_index - start_index + 1) 的计算值。依据current_index的变化,可以看到数据页同步的推进。依据sync_percent和failover开始时间,可以推测DN实例failover到正常状态的所需时间。3.3 查看备机Catchup进度       当备机重新启动的时候,会连接主机做数据页追赶(catchup)。如果需要传输的数据页比较多,或者因为业务造成的锁冲突,catchup 时间就会比较长,备DN长时间不能成为Normal状态。如果期望查看数据页catchup的进度,可以在CN上执行select * from pgxc_get_senders_catchup_time()可进行当前活跃的主备发送线程的追赶信息显示,如图4所示。图4 集群上catchup进度查询也可以在相应的主DN上执行select * from pg_get_senders_catchup_time可进行当前活跃的主备发送线程的追赶信息显示。完成后,看到的是刚结束的catchup过程信息,如图5所示。图5 主DN上catchup进度查询备机Catchup进度相关信息包括:  catchup_type:"Incremental"或者"Full"。catchup方式为全量还是增量。  catchup_bcm_filename:当前主机正在处理的一个BCM文件名称。  catchup_bcm_finished:catchup已操作完成的BCM文件数量。  catchup_bcm_total:catchup总共需要操作的BCM文件数量。  catchup_percent:catchup已经操作完成的百分。catchup_bcm_finished*100 / catchup_bcm_total 的计算值。  catchup_remaining_time:依据已完成的进度,预估剩余完成时间。依据catchup_bcm_filename和catchup_bcm_finished的变化,可以看到数据页追赶的推进。依据catchup_percent和catchup_remaining_time,可以推测备DN实例追赶到正常状态的所需时间。3.4 查看DN实例XLOG空间使用状况       随着数据库的不断运行,产生的日志文件越来越多,如果因为节点故障或其它原因有可能造成日志文件不断积累而充爆磁盘。为了解此使用信息,最方便的是使用gs_ctl query工具对指定DN实例路径进行状态查询,结果中可以显示该实例的XLOG空间使用信息,截图示例请参见上面其它场景。此外,还提供系统函数 pgxc_stat_xlog_space、pg_stat_xlog_space 对数据库集群或单个实例进行查询,例如使用pgxc_stat_xlog_space可以获取到整个集群的CN、主DN的XLOG空间使用信息,如图6所示。    图6 Xlog空间使用查询XLOG空间使用信息(Xlog space info)包括:  xlog_files:pg_xlog目录下,去除backup、archive_status等子目录,所有识别为xlog文件的数目;  xlog_size:pg_xlog目录下,去除backup、archive_status等子目录,所有识别为xlog文件的大小之和,以MB单位显示;  other_size:pg_xlog目录下backup、archive_status等子目录文件的大小之和,以MB单位显示。原文链接:https://bbs.huaweicloud.com/blogs/198536【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [集群&DWS] GaussDB(DWS) 云端运维系列第二期:集群扩容
    【摘要】 DWS服务集群的扩容。 随着数据仓库容量和性能需求的变化,可以在管理控制台调整已有集群的大小,以便充分利用DWS提供的计算资源和存储资源。一、集群的扩容操作步骤1. 进入控制台页面 https://console.huaweicloud.com/dws/?region=cn-southwest-1#/dws/management/list2. 单击“集群管理”,默认显示用户所有的集群列表。 3. 在集群列表中,选择目标集群所在行单击“更多”-> “扩容”,系统将显示为扩容页面。  4. 在扩容界面中找到“扩容到”选择一个扩容后的节点数,扩容节点有以下使用原则。扩容后的节点数量,在原节点数量的基础上,须至少增加3个节点,最多可增加的节点个数为节点剩余配额的最大值。如果可使用的节点配额不足,用户可以单击“申请更多配额”以提供担的形式申请更多节点配额。如果有符合业务需求的包年包月套餐的节点,建议先使用包年包月节点,可以节约费用。如果没有,可以单击“购买包年包月套餐”进行购买。扩容增加的节点规格,默认与集群当前各节点的规格相同。扩容后的集群与原集群的虚拟私有云、子网和安全组也相同。  5. 单击“下一步:规格确认”。  6. 单击“提交”,此界面显示了产品规格、扩容后的节点数量、扩容节点数、单价和总价格。   7. 提交扩容申请集群的“任务信息”显示为“创建快照中”,扩容需要一段时间。在扩容过程中,集群会自动重启,因此会有一段时间“集群状态”显示为“不可用”,重启成功后“集群状态”会变成“可用”。当“集群状态”显示为“可用”且“任务信息”显示为“--”,才表示节点扩容成功,用户可以开始使用集群。如果集群的“任务信息”显示为“扩容失败”,表示集群扩容失败。二、集群扩容的流程1.  创建扩容实例    使用资源租户购买所需资源,例如VPC,ECS或者BMS,EVS, EPS等, 最终利用这些资源创建实例节点。2. 集群扩容检查、激活集群    在虚拟机上进行初始化配置和重分布操作。三、集群扩容对系统的影响1. 扩容前,需退出创建了临时表的客户端连接,因为在扩容过程中及扩容成功之前创建的临时表将会失效,操作临时表也会失败,但是扩容后创建的临时表不受影响。2. 在执行“扩容”操作后,集群会进行一次自动快照,快照创建成功后进行集群扩容。3. 正在扩容的集群将禁用重启集群、扩容集群、创建快照、重置创建成功后进行集群扩容。4. 扩容过程中,集群会自动重启,因此集群会有一段时间变为“不可用”状态,重启成功后集群变回“可用”状态。然后,在扩容结束阶段,系统会将集群中用户数据在全部节点重新动态分布,重分布时,集群无法写入新数据,为“只读”状态。在重分布执行过程中,用户应当避免执行超过120分钟的查询,否则可能导致重分布出现等待加锁超时失败的问题。5. 扩容后,如果集群创建新快照,将包含扩容节点上的数据。6. 如果集群扩容失败,数据库会在后台自动执行扩容回滚操作,集群会恢复到扩容前的节点个数。原文链接:https://bbs.huaweicloud.com/blogs/200913【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
  • [分享驿站] GaussDB A 审计功能简介
    数据库审计,指的是将用户对数据库的所有操作写入审计日志中,使得数据库安全管理员可以利用这些日志信息,找出非法操作的用户,时间和内容等。如何使用数据库审计,这里以审计事务功能为例:1. 设置审计配置项要使数据库能够审计到某项功能,需要打开审计的总开关(audit_operation_exec)和对应的审计项开关(audit_operation_exec),二者均支持动态加载,在数据库运行期间修改该配置项的值会立即生效,无需重启数据库。首先打开审计总开关audit_enabled(默认开启)。登录数据库,检查audit_enabled状态postgres=# show audit_enabled;  audit_enabled  ---------------  off(1 row)若为off ,则使用如下命令打开gs_guc reload -Z coordinator -Z datanode -N all -I all  -c "audit_enabled=on"然后打开具体审计事务配置项gs_guc reload -Z coordinator -Z datanode -N all -I all  -c "audit_operation_exec='transaction'"postgres=# show audit_operation_exec;  audit_operation_exec  ----------------------  transaction(1 row) audit_operation_exec 默认的配置项有login, logout, database_process, user_lock, grant_revoke, set,如果想增加审计配置项,进行追加配置即可,目前支持的配置项有all,login,logout,database_process,user_lock,grant_revoke,ddl,select,copy,userfunc,set,transaction,vacuum,analyze,explain,specialfunc,insert,insert_filter,update,delete,merge,show,checkpoint,barrier,cluster,comment,cleanconn,prepare,constraints,cursor。有两点需要注意,其一如果审计ddl操作,需要另外配置audit_system_object 来审计具体某个对象的ddl 操作;其二如果是审计事务,事务内部的操作是否审计需要结合其具体的配置项是否配置。 2. 查看审计日志。审计查询命令是pg_query_audit, 其使用方法为pg_query_audit(timestamptz startime,timestamptz endtime,audit_log)startime 和 endtime 分别表示审计记录的开始时间和结束时间,audit_log 表示所查看的审计日志新的所在的物理文件路径,当不指定audit_log 时,默认查看连接当前实例的审计日志信息。通过查询pgxc_query_audit 可以查询所有CN节点的审计日志信息:pgxc_query_audit(timestamptz startime,timestamptz endtime)除了上面审计成功的场景之外,还可以通过配置audit_operation_error 来审计失败的操作记录。默认的配置项有login,目前支持的配置项有syn_success,parse,login,user_lock,violation,grant_revoke,ddl,select,copy,userfunc,set,transaction,vacuum,analyze,explain,specialfunc,insert,update,delete,merge,show,checkpoint,barrier,cluster,comment,cleanconn,prepare,constraints,cursor,blacklist。当配置了该参数之后,其对应的失败操作也会被记录到审计日志当中,如下例postgres=# create table t1(id int);ERROR:  relation "t1" already exists postgres=#  postgres=# select * from pg_query_audit('2021-03-21','2021-03-30') order by endtime desc limit 1;-[ RECORD 1 ]---+--------------------------------begintime       | 2021-03-21 11:49:41.643+08endtime         | 2021-03-21 11:49:41.652+08operation_type  | ddl audit_type      | ddl_table result          | failed username        | perfadm database        | postgres client_conninfo | gsql@[local]object_name     | t1 command_text    | create table t1(id int);detail_info     | relation "t1" already exists transaction_xid | 0query_id        | 1062177node_name       | cn_5001 thread_id       | 139916885260032@669613657906735local_port      | 6000remote_port     |
  • [开发应用] 【GaussDB A 8.1.0】【SQL占用cpu】统计sql占用的cpu
    【功能模块】【操作步骤&问题现象】客户要统计vacuum full对cpu的占用,我在pgxc_wlm_session_info中找不到vacuum full对应的记录,是怎么回事,需要什么设置么?【截图信息】【日志信息】(可选,上传日志内容或者附件)
  • [Sql迁移] GaussDB(DWS)在建表中分区键varchar字段怎么实现自动分区
    【操作步骤&问题现象】GaussDB(DWS)在建表中分区键varchar字段怎么实现自动分区?如果分区字段为时间或者intiger就能利用这种start...end...模式实现自动分区,但是如果是varchar类型(不能修改字段类型),怎么实现自动分区?
  • [实践系列] GaussDB(DWS) 【对接数据可视化工具Grafana】
    GaussDB (DWS)时序数仓对接Grafana 方案【摘要】 本方案指导用户配置Grafana,实时展示GaussDB(DWS)实时数仓中的数据,方案中采用存储过程构造模拟数据,真实场景下请接入真实数据。一、Grafana 软件部署(windows版)Grafana下载地址:https://grafana.com/grafana/download?platform=windows下载完成后,在windows路径下解压文件grafana-7.4.3.windows-amd64.rar:进入bin目录双击grafana-server启动服务Grafana登录地址:http://localhost:3000 默认用户名及密码:admin/admin,第一次登陆会提示修改密码,登陆后页面如下:二、GaussDB(DWS)对接Grafana,展示实时数据       1.Data Studio登录GaussDB(DWS)集群,创建用户、数据库及测试表--创建用户create user <USER> password '********';--创建数据库create database <DATABASE> owner <USER> encoding='utf-8' TEMPLATE template0;--赋予用户<USER> 模式public权限GRANT ALL PRIVILEGES ON SCHEMA public TO <USER>;备注:命令中用户、数据库等信息根据真实场景替换2.创建测试表,构造时序数据1)创建测试表Data Studio上使用新建的<USER>用户登录<DATABASE>数据库创建测试表,并构造时序数据创建测试表:drop table if exists public.test;create  table if not exists public.test(,tag_column      text  TSTag,Field_column    double precision  TSField,time        timestamp without time zone  TSTime)with (TTL='7 days', PERIOD = '1 day', orientation=TIMESERIES);语法介绍:TSTag:维度属性字段TSField:指标属性字段TSTime:时间属性字段TTL:数据生命周期,此表数据生命周期为7天PERIOD:自动创建分区间隔,此表分区按照1天间隔创建Orientation:表属性,TIMESERIES说明是时间序列表 1)创建造数程序创建存储过程insert_data(),模拟时序数据入库CREATE OR REPLACE PROCEDURE insert_data(v_number bigint)ASDECLARE  v_insert_test_string VARCHAR2(4000);  var_count               bigint;BEGIN  var_count               :=   0;  v_insert_test_string :=             'insert into public.test(                                            ,tag_column                                            ,Field_column                                            ,time                                          )                                            values(                                          ,''fioawhefawief''                                            ,random()                                            ,clock_timestamp()                                          );';  while var_count <   v_number loop    EXECUTE IMMEDIATE   v_insert_test_string;    var_count :=   var_count+1;    pg_sleep(5);    commit;  end loop;END;/执行存储过程,执行数据插入1000次,每5s插入一次call insert_data(1000);  2.Grafana配置Grafana中配置DWS数据源àData Sources点击 Add data source选择PostgreSQL数据源配置DWS集群信息Save&Test保存Database Connection OK 说明连通性测试成功3)         配置时序图标展示数据点击+Add new panel配置数据源,选择$DWS配置区配置要展示的时序数据,如下图:可切换为SQL模式配置完成后点击apply应用此配置页面可以选择时序数据展示的时间区间及刷新频率 
  • [集群&DWS] GaussDB(DWS) 集群通信系列一:pooler连接池
    【摘要】 pooler连接池介绍。一、pooler连接池是什么?pooler连接池是GaussDB CN进程内保存与其他GaussDB进程数据连接的数据结构,主要作用是连接复用,节省建连、认证、对端线程启动初始化开销。如上图所示,CN的pooler连接池中会保存与其他CN/DN的连接,每一个连接在对端会对应一个postgres工作线程。postgres工作线程是带状态属性的,如database,所以可以认为pooler连接池中的连接也是带属性的。不同属性间的连接是不能复用的,如上图所示,按不同属性切分为pool A/B/C等连接池。每个连接池中会存有连接往不同节点的空闲连接的数组,提供接口给外部使用或放入连接。CN上的postgres工作线程在需要连接其他节点时,会创建一个本地agent,尝试从pooler连接池取跟本线程相同属性的空闲连接,pooler如果没有空闲连接,就会新建一个连接。连接交给agent后,可以视为线程私有。在线程退出时,agent才会将连接还给pooler。注意:enable_stateless_pooler_reuse为on时,连接只按database区分连接池;enable_stateless_pooler_reuse为off时,连接按database+user+option区分连接池。二、怎么查看pooler连接池可以连接CN后通过pg_pooler_status查看,如下图:一般pooler连接池中的连接会非常多,可以按不同字段group by查看某个db pool池中的连接情况,或连往某个node的连接情况,如:select database,user_name,node_name,in_use,count(*) from pg_pooler_status group by 1, 2, 3 ,4 order by 5 desc limit 50;三、pooler连接池相关问题定位1,空闲连接太多导致DN线程超过max_connectionsDN上报错误信息:FATAL :dn_6011_6012 :[FATAL] Already too many clients. active/non-active: 998/1069/3 表明DN上2000个线程用满了,但有1069个空闲线程,此时可以通过在各个CN上查询pooler视图,统计连接此DN的空闲连接,确认问题。并通过手动clean connection清理空闲连接。CLEAN CONNECTION TO ALL FORCE FOR DATABASE postgres;GaussDB内核8.0.0版本已支持自动清理空闲连接功能。2,查询性能慢,查看CN pg_thread_wait_status视图显示大量建连状态"pooler create conn"大量pooler建连状态,说明空闲连接不够用。需要先确认当前的空闲连接状态:select in_use,count(*) from pg_pooler_status group by 1 order by 2 desc where database='XXX' and node_name='XXX';如果空闲连接和非空闲连接都很少,说明连接用完即销毁了。需要确认pooler连接池开关参数cache_connection=on,并确认CN日志没有报错。如果非空闲连接很多,空闲连接很少,说明并发太大,连接都在使用中,需要降低并发,或调大max_pool_size。原文链接:https://bbs.huaweicloud.com/blogs/200909【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中)  HOT  【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
总条数:2746 到第 页
上滑加载中