-
前提:已有同一VPC下MRS、DWS集群1、创建好MRS数据源后,进入MRS数据源详情页面,可以看到节点信息,2、 点击Master1,设置安全组(在安全组中设置any规则);绑定弹性IP3.1 从Master1绑定的EIP,远程登录到Master1节点或者可以用MobaXterm工具连接MRS绑定的EIP:常见错误 :Eip能ping通,但是ssh linux@EIP登录失败 可以采用私有秘钥登录登录到节点上后,依次执行:切换root:sudo -s;cd /opt/client;source bigdata_env;kinit admin查看是否是安全模式:进入MRS数据源详情页面查看Kerberos认证状态,若是关闭则为普通模式,否则是安全模式。3.2 进入hive数据库 创建表并写入数据beelineeg:create table lxn01 (id int,name char(10))stored as orc;MRS数据存储格式:orcinsert into lxn01 values(1,'dwejfwe'); 3.3 退出数据库(!q或者ctr+Z),执行命令hdfs dfs -ls /user/hive/warehouse/lxn01,查看该路径下是否有所创建的表,后面创建外表时会用到该路径(/user/hive/warehouse/lxn01)显示数据,数据文件00000 4 登录到DWS的数据库上(创建ECS)可以在前台页面上直接下载客户端redHat,然后将下载的压缩包拖至工具上,在sftp tab上,然后进入相应的目录下,执行tar –xvf dws_client_redhat_x64.tar.gz 解压缩客户端。 source gsql_env.sh (<---进入到解压后的客户端路径下执行)gsql -d postgres -h 集群内网访问地址 -U 管理员用户 -p 数据仓库端口 _W 集群密码192.168.1.23gsql -d postgres -h 192.168.1.23 -U dbadmin -p 8000 -W Bigdata_2014此处的集群内网地址可以在前台页面查看创建MRS数据源的集群的内网地址及端口, 查看已创建的MRS数据源连接:select srvname,srvoptions from pg_foreign_server; 创建外表:create foreign table TABLE_NAME(COLUMN_NAME1 COLUMN_TYPE1 ,COLUMN_NAME2 COLUMN_TYPE2 ) server FOREIGN_SERVER_NAMEOPTIONS (format 'orc', foldername 'FILE_PATH') distribute by roundrobin;create foreign table lxn04 (id int,name char(10)) server hdfs_server_b1809755_b17b_49ba_bc46_d1f789055949 OPTIONS (format 'orc', foldername '/user/hive/warehouse/lxn01') distribute by roundrobin; 如果执行select srvname,srvoptions from pg_foreign_server; 没有hdfs_server_****** ,则该集群没有创建MRS数据源。FOREIGN_SERVER_NAME :'FILE_PATH' :步骤7中的路径Select * from 外表 ------ 可以从外表查询数据再新建DWS自己的表:create table lxn06(id int,name char(10));将MRS数据导入到DWS:insert into lxn06(DWS数据库上建的表) select * from lxn_foreign(DWS数据库上建的外表); insert into lxn06 select * from lxn04;原文链接:https://bbs.huaweicloud.com/blogs/215105【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
本文接 [数据仓库]双集群系统方案探讨 展开讨论一下GaussDB(DWS)的容灾应该如何设计。对于方案探讨中涉及到几种形态,从数仓内核的角度去分析一下各个方案的问题: 日志同步技术: 列存数据不记日志无法通过日志来同步支持列存xlog后会导致导入性能劣化,xlog数据量大,同时会影响日志同步效率 备份增量同步技术:无法达到 RPO = 0备集群只能读,无法支持写操作 逻辑数据同步技术:列存数据需要支持逻辑解码,需要从列存XLog的方向进行演进分布式事务,DDL等处理难度较大 备份/恢复不能马上提供服务,RTO时间较长需要较大空间保存备份集GaussDB(DWS) 当前在备份增量同步和备份/恢复两个方向进行演进,他们都是基于备份/恢复工具Roach(详情参见Roach备份恢复GaussDB(DWS))备份/恢复备份/恢复的原理图如下,在各个结点将实例备份到相应的介质上,并从介质上恢复到新集群或老集群中。详细的功能不在此处展开描述,大家可以参考(详情参见Roach备份恢复GaussDB(DWS)) 来了解细节。对于实现容灾要求,需要解决的问题大体分三类:快速的备份恢复高性能备份、恢复操作保证在较短的时间内将数据迁移到另一个集群,对于RPO/RTO要求不大的系统来说实现和使用非常简单。备份恢复在集群可用的情况下即可进行,不受单点故障的影响备份恢复在集群可用的情况下就可以进行,集群只需要保证有可用副本就可以持续的进行备份,并且可以正常恢复。备份集的可靠性备份集需要存储在可靠的存储上,类似 OBS/NBU, 由于磁盘故障率相对比较高,类似备份集保存在磁盘上是非可靠的方案。双集群备份增量同步技术当前GaussDB(DWS)使用在备份/恢复的双集群架构来实现容灾,将生产集群的数据使用增量的方式同步到容灾的集群。在这种架构下需要解决如下问题: 减少RPO备份恢复无法达到与流式的同步方式的RPO, 做不到RPO=0的程度。 备集群的可用性问题备集群支持持续读/写备集群是物理恢复的方式,无法支持写的操作的;但是在恢复过程中是可以支持持续读的,当前在恢复过程中需要停集群后将备份集中文件覆盖。备集群集群恢复失败可回退到一致性状态在恢复过程中会出结点故障,备份集损坏等等问题,会造成当前的恢复过程无法执行过去,此时需要回退到恢复前的状态,保证备集群的可用性。备集群恢复不受单点故障影响对于备集群来说,也会出现各种单点故障的情况,实例故障,结点故障,CN剔除等情况下,仍然可以把集群恢复成可用的状态。备集群支持备份备集群可以支持备份,用于扩展一些其它功能,实现类似多AZ,异地的容灾。 3. 备份集管理 1. 备份集生命周期管理 容灾是实现数据同步的功能,并非一个备份恢复场景,并不需要保存大量备份集以及周期的去做全量备份,因此需要有一个机制实现备份集及时清理,保证占用资源可按。 2. 备份集的可靠性 在容灾过程中,同样考虑备份集的可靠性,防止备份集损坏情况,可以通过可靠的介质来保存备份集,又能保证可靠的读写性能。 3. 持续增量数据同步 保持持续的增量备份,类似升级前后,扩容前后,都要保持增量备份来保证同步的性能。这里隐含着一个显而易见的原因,如果全量备份的话,备份时间长,并且恢复进会将集群清空,此时容灾集群不可用,这个严重影响可用性。可以说避免全量备份是基于Roach的双集群容灾一个重要工作。 4. 双集群切换及Failover 1. 快速切换 双集群的应用场景中,类似滚动升级,故障演练,此时需要切换两个集群,切换时要保证快速将两边数据拉平,尽快提供服务并保证可用性。 2. Failover及之后的加回操作 由于RPO != 0,所以在生产集群无法提供服务时,容灾集群在Failover操作后会提供读写服务,此时会有一部分数据丢失,并在两个集群的数据产生了“分叉”,那么在生产集群恢复后,加回之后中要将“分叉”的数据进行回退,以保证两边数据一致。 5. 异构的支持 此处异构是指逻辑结构DN数量一致,而CN数、结点数可以不相同的情况,众所周知是由于当前方案是物理备份方式,因此如果DN数量发生变化,无法从物理层进行重分布操作。以上说明的几点都是基于可靠性的角度来分析,还有一个重要的因素是基于数仓的数据量和集群规模,不论备份/恢复方案还是在此基础上的双集群备份增量同步的方案,对于网络带宽,介质的读写性能有较高的要求,因此需要根据集群规模和数据增量来选择合适的组网方式和介质。原文链接:https://bbs.huaweicloud.com/blogs/213157【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 路径生成是表关联方式确定的主要阶段,本文介绍了几个影响路径生成的要素:cost_param, scan方式,join方式,stream方式,并从原理上分析如何干预路径的生成。从另外一个角度看,即路径生成,是从这些底层的选择开始,从行数的估算、到scan的选择、再到join方式以及stream的选择,构成一条简单路径,然后多条路径根据代价选择,再逐层关联更多的表,最终形成一个完整的执行路径。一、cost模型选择顾名思义,cost_param是控制cost相关的一个参数。在了解cost_param之前,先回顾一下选择率的概念,GaussDB优化器中的选择率是指,当一个表有一个过滤或关联条件时,通过该条件能被选中的行数占总行数的比例,是介于0~1之间的一个实数。选择率在优化器中是一个重要的概念,主要应用于行数和distinct值的估算,行数和distinct值是计划生成中的基本要素。首先,我们来看带有过滤条件的基表行数如何估算。如果一个表只有一个过滤条件,那么以选择率乘以表的行数,即可得到过滤完的行数;如果有多个过滤条件,那么就需要算出一个综合的选择率,如何计算?方式有二:一是通过多列统计信息直接计算,二是通过组合单列的选择率。那么组合的方式就由参数cost_param决定了,具体地,取值描述适用场景cost_param = 0选择率按乘积方式组合完全不相关场景cost_param & 2 != 0取最小的选择率作为综合选择率完全相关场景举一个例子,TPC-H 1x的part表,过滤条件是:p_brand = 'Brand#45' and p_container = 'WRAP CASE',查看不同cost_param下的过滤后行数。(1)cost_param=0(2)cost_param=2从估算出的行数(E-rows)和实际的行数(A-rows)对比可以看出,cost_param=0的不相关模型适合part表的p_brand和p_container列。其次,Join的行数怎么估算的呢?原理跟过滤条件的行数估算是类似的,如果没有多列统计信息可以使用,则也需要单独计算每个条件的选择率,然后计算出综合选择率,得出行数。例如 TPC-H 1x lineitem和orders关联,关联条件是:l_orderkey = o_orderkey and o_custkey = l_suppkey,不同cost_param的执行情况如下:(1)cost_param=0(2)cost_param=2此例中,Join的列之间也适合完全相关模型,这与l_orderkey和l_suppkey的分布是吻合的。由于TPC-H的模型接近完全不相关模型,因此cost_param=0模型可以较好的描述场景,实际应用中,用户可以根据具体业务场景来调整模型,行数估算的准确性是计划生成的重要保证,在调优中检查估算的最直接的地方。GaussDB会在后续版本中新增更多的模型供业务需求选择。二、Scan方式的选择GaussDB中扫描方式主要分顺序扫描和索引扫描,每种扫描方式都对应若干扫描算子,顺序扫描在行列存中对应的扫描算子分别是Seq Scan和CStore Scan算子(下面我们讨论中不加区分)。这些扫描算子大部分都可以通过开关来进行调控,例如Seq Scan,如果设置enable_seqscan=off,则表示不会优先选择Seq Scan,而不是一定不会选。扫描方式的选择,很大程度上决定了获取基表数据的路径。我们以如下的例子来说明:select l_orderkey, o_custkey from lineitem, orders where l_orderkey = o_orderkey;lineitem分布键是l_orderkey,并且在l_orderkey上有index,orders分布键是o_orderkey。默认情况下,Scan的方式如下:两个表都是顺序扫描的路径,关联方式选择了Hash Join。如果把Seq Scan关掉(enable_seqscan=off),计划如下:lineitem的扫描变成了Index Only Scan(因为l_orderkey的类型是int),而在orders表上仍然选择Seq Scan(因为没有其他路径),同时关联方式也变为了Nest Loop,因为Hash Join需要全表扫描数据(lineitem的Seq Scan已经被关掉了)。优化器的选择方式我们从代价(E-costs)一栏中也可以看出。再把Index Only Scan关掉,看看计划如何变化:扫描路径都变为了Seq Scan,而且Seq Scan的代价都很大。此时既然都走了Seq Scan,为什么不选Hash Join呢,把Nest Loop关掉,看看Hash Join计划的代价:从代价上看出Hash Join的总代价比Nest Loop的小,但优化器没有选择Hash Join,这是因为优化器比较路径代价时,会比较Startup和Total代价,即启动代价和总代价,综合考虑,E-costs栏中显示的是总代价。把explain_perf_mode设置为normal,查看原Nest Loop的启动代价:红框中的两个cost,分别是启动代价和总代价,在看Hash Join的cost,明显Hash Join的启动代价比Nest Loop的大很多(启动代价代表了输出第一条数据的代价),优化器在比较路径时,综合了这两个代价,最终推荐了Nest Loop的路径。从上面的例子可以看出,扫描路径的调控,可以改变路径生成,合理的搭配是生成最优计划的前提,默认情况下,GaussDB优化器可以根据现有的路径选择(如上面的lineitem有两条扫描路径,orders只有一条扫描路径),最后确定出最优的一条。两条路径代价比较时,总代价不是唯一要素,但总代价越小,一般也会越容易被选中。三、关联方式的选择GaussDB优化器中表关联的主要方式有:Nest Loop,Hash Join和Merge Join,分别可以通过enable_nestloop、enable_hashjoin、enable_mergejoin进行控制,这种控制也不是绝对的,可以理解为是否优先选择。大部分场景下,三种路径的代价关系:Hash Join < Merge Join < Nest Loop。我们以一个简单的关联示例说明,store_returns和store_sales是TPC-DS 1x中两个表,SQL如下:select count(*) from store_returns, store_sales where sr_customer_sk = ss_customer_sk;默认情况下,优化器推荐Hash Join路径,计划如下:如果把Hash Join关掉,则优化器选择了Merge Join路径:如果再把Merge Join路径关掉,可能就会选择Nest Loop路径。关联方式的控制开关一般用于调优或规避问题,但具体是否能够起作用要看具体的语句,除了当前关联方式,还有没有其他方式。实际场景中,一个语句中关联的算子较多,一般很难用参数enable_hashjoin或enable_nestloop或enable_mergejoin来控制某两个表的Join方式,GaussDB中更细致的语句级别的调优手段是Plan Hint,感兴趣的读者可以参考产品手册。四、Stream方式的选择Stream算子是GaussDB分布式执行的关键算子之一,主要起到网络传输的作用,概要介绍可以参考:GaussDB(DWS)性能调优系列实战篇一:十八般武艺之总体调优策略。Stream算子由参数enable_stream_operator控制,如果关掉Stream算子,则可能导致生成不下推的计划,例如:因为lineitem表关联的键l_partkey不是lineitem的分布键,需要添加Stream算子,但Stream功能被禁,于是只能生成不下推计划。GaussDB计划中常见的主要Stream算子包括Redistribute、Broadcast和Gather。Gather一般是分布式计划中,CN用于收集DN的数据进行最后的处理,除非最后收集的行数非常多,这个算子涉及性能问题一般较少。Redistribute和Broadcast一是对“互补”的算子,前者用于重分布,后者用于广播,生成计划时,优化器会根据代价大小来选择。当Join Key没有包含表的分布键的时候,一般会添加Redistribute路径,能选择Redistribute路径理论上也可选择Broadcast路径,最终选择哪条路径要看优化器估算的代价是多少。这两个算子可以通过参数enable_redistribute和enable_broadcast进行控制。在SMP开启的情况下,当并行度(dop)大于1时,一般还会有Local Redistribute、Split Redistribute、Local Broadcast和Split Broadcast;当倾斜优化开启时,还有PART REDISTRIBUTE PART ROUNDROBIN、PART_REDISTRIBUTE_PART_BROADCAST、PART_REDISTERIBUTE_PART_LOCAL等等,这些也是Stream算子,主要就是重分布、广播、RoundRobin的一些扩展形式,这里我们不一一介绍了,感兴趣的读者可以参考GaussDB DWS 产品手册。我们考虑两个表的简单关联,store_sales和sr_tbl,它们的分布键分别是ss_item_sk 和sr_returned_date_sk,Join 条件是store_sales.ss_customer_sk =sr_tbl. sr_customer_sk,执行结果如下:由于两个表的分布键都不是Join Key,因此走Hash Join路径的话需要有一个表做Broadcast或者两个表都做Redistribute,但是store_sales表比较大(E-rows显示28.7亿行),而sr_tbl表行数估算比较少(E-rows显示100行),优化器认为适合做Broadcast。于是最终选择了一边Broadcast的计划。对于这个计划,由于sr_tbl表统计信息不准确(如果是中间结果集,则表示中间结果集估算不准),一种调优的方法是,将sr_tbl的表统计信息重新收集准确一些(如果sr_tbl是中间结果集,则无法收集),另一种方法是让sr_tbl走Redistribute路径,而后者我们又有两种方式来实现,一是用Plan Hint,即在生成计划时,告诉优化器走Redistribute路径,二是把Broadcast关掉。禁用Broadcast后,执行计划如下:本列中,开启了SMP自适应,即优化器会根据系统资源和当前Active SQL数量来自行决定并行度(dop),如果Redistribute和Broadcast选择不当,则可能导致(1)Broadcast计划会出现下盘(2)两个计划的并行度不一样,最终执行时间可能会差异比较大。对于Stream方式的控制,一般的调优方式有Plan Hint、GUC参数、改善统计信息或估算信息。Plan Hint的详细介绍可以参考产品手册或者:GaussDB(DWS)性能调优系列实战篇六:十八般武艺Plan hint运用。五、结束语本文介绍的cost_param属于cost底层参数,建议对数据特征和使用场景比较熟悉的DBA慎重使用。Scan、Join、Stream调控的基本依据也是代价,代价一般体现在执行耗时上,调优时可从Performance中识别出性能的瓶颈点,分析选择的算子是否与代价匹配。另外,除了本文介绍的Session级别的控制参数外,还有基表、中间结果的行数,也可以通过Plan Hint进行语句级别的调控,感兴趣读者可通过GaussDB DWS产品文档进一步了解。原文链接:https://bbs.huaweicloud.com/blogs/212459【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
为了方便您配置数据库参数,GaussDB(DWS) 提供了参数模板的功能,参数模板中包含了一些常用的数据库参数。您可以直接在GaussDB(DWS) 管理控制台上管理参数模板,将参数模板应用到集群后,可以直接在集群的“参数修改”页面中修改参数。一、参数模板概述 参数模板是一组适用于数据仓库的参数,模板中的参数都设置了默认值,这些参数包括会话超时时间、日期和时间格式等。通过调整参数值,可以使数据库更好地适配实际业务。在创建集群时,您可以为集群指定一个参数模板,模板中的参数将被应用于该GaussDB(DWS) 集群中的所有数据库,如果您未指定参数模板,系统将为集群应用默认的参数模板。当集群创建成功后,您可以在集群“参数修改”页面修改参数,也可以在参数模板管理页面,选择其他参数模板或者创建新的参数模板重新应用到对应的集群。 GaussDB(DWS) 为每个版本的数据仓库预置了一个默认参数模板,默认参数模板不支持删除和修改。如果用户想要修改参数模板中的参数值,可以创建一个自定义参数模板,自定义参数模板中的参数值允许被修改。自定义参数模板被应用到集群后,它与集群并无关联关系,之后,如果您修改了该自定义模板中的参数值,其修改并不会同步到集群,您需要重新将该参数模板应用到集群,才能使修改后的参数值应用到集群。同样的,如果您在集群详情页面修改参数,其修改也不会同步到参数模板。参数说明 参数配置如图所示: 其中,各个参数的具体含义及配置方法如下表所示: 参数名称参数描述默认值session_timeoutSession闲置超时时间,单位为秒,0表示关闭超时限制。取值范围:0 ~ 86400。600datestyle设置日期和时间值的显示格式。ISO,MDYfailed_login_attempts输入密码错误的次数达到该参数所设置的值时,帐户将会被自动锁定。配置为0时表示不限制密码输入错误的次数。取值范围:0 ~ 1000。10timezone设置显示和解释时间类型数值时使用的时区。UTClog_timezone设置服务器写日志文件时使用的时区。UTCenable_resource_record设置是否开启资源记录功能。当SQL语句实际执行时间大于resource_track_duration参数值(默认为60s,可自行设置)时,监控信息将会归档。此功能开启后会引起存储空间膨胀及轻微性能影响,不用时请关闭。说明:归档:监控信息保存在history视图,归档在info表。归档时间为三分钟,归档后history视图中的记录会被清除。history视图GS_WLM_SESSION_HISTORY,对应存入info表GS_WLM_SESSION_INFO。history视图GS_WLM_OPERATOR_HISTORY,对应存入info表GS_WLM_OPERATOR_INFO。offresource_track_cost设置对语句进行资源监控的最小执行代价。值为-1或者执行语句代价小于10时,不进行资源监控。值大于等于0时,执行语句的代价大于等于10并且超过这个参数的设定值就会进行资源监控。SQL语句的预估执行代价可通过执行SQL命令Explain进行查询。此参数在集群版本1.5.0或以上有效。100000resource_track_duration设置当前会话资源监控实时视图中记录的语句执行结束后进行归档的最小执行时间。值为0时,资源监控实时视图中记录的所有语句都会进行历史信息归档。值大于0时,资源监控实时视图中记录的语句的执行时间超过设定值就会进行历史信息归档。60password_effect_time设置帐户密码的有效时间,临近或超过有效期系统会提示用户修改密码。取值范围为0 ~999,单位为天。设置为0表示不开启有效期限制功能。此参数在集群版本1.5.0或以上有效。90update_lockwait_timeout该参数控制并发更新同一行时单个锁的最长等待时间。当申请的锁等待时间超过设定值时,系统会报错。0表示不等待,有锁时直接报错。默认值120000,单位为毫秒。此参数在集群版本1.5.0或以上有效。120000二、创建参数模板 如果默认参数模板中的参数值无法满足业务,用户可以创建自定义参数模板,并修改其中的参数值,从而更好地适配业务。 创建参数模板操作步骤如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“参数模板管理”。单击“创建参数模板”,然后设置以下参数。· “数据库引擎”:选择一个数据库引擎。· “数据库版本”:选择一个数据库版本。· “参数模板名”:填写新参数模板的名称。 参数模板名称长度为4~64个字符,必须以字母开头,不区分大小写,可以包含字母、数字、中划线或者下划线,不能包含其他的特殊字符。· “描述”:填写新参数模板的描述信息。此参数为可选参数。三、应用参数模板到集群 集群创建成功后,用户可以为集群应用一个新的参数模板,将参数模板中所有参数的值应用到对应的集群中。 应用参数模板的操作步骤如下:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“参数模板管理”。选择一个目标参数模板,在“操作”列中单击“应用”。在“参数模板应用”对话框,选择目标集群。单击“确定”。 如果重新应用的参数模板与集群原来的参数取值不同,系统会弹窗显示两组参数值的对比。四、删除参数模板 对于多余或者不再使用的参数模板,用户可以将其删除,但是不支持删除默认参数模板。成功删除的参数模板无法恢复,请用户谨慎操作。登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“参数模板管理”。在待删除的参数模板右侧操作列,单击“删除”。在弹出的对话框,单击“是”。原文链接:https://bbs.huaweicloud.com/blogs/212712【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】某些场景下,客户可能会需要将GaussDB(DWS)集群的运维功能集成到自己的平台上方便进行统一运维管理,此时客户可以通过GaussDB(DWS)提供的标准REST API进行和GaussDB(DWS)的管理平台对接。1. 使用场景 一般情况下,客户可以在GaussDB(DWS)的管理平台对集群进行运维管理,如创建、删除、扩容、重启集群等操作,同时这些运维接口已标准REST协议对外开放,客户如果有自己的统一运维管理平台,如有需要可以将这些运维操作对接到自己的统一管理平台。2. 对接流程 首先客户需要使用登录GaussDB(DWS)管理平台的用户名密码从IAM服务获取token,然后在请求中携带获取的token调用GaussDB(DWS)提供的REST API接口,如下图 3. 示例 接下来,我们以Spring框架中的RestTemplate作为REST客户端,以HCS 8.0.2环境为例进行接口调用的详细步骤演示。 1). 从HCS的lld配置中获取IAM服务的endpoint,如:iam-cache-proxy.hcs.com:26336,根据《华为云Stack8.0.2数据仓库服务用户指南》5.6.6章节中的方式获取dws服务的endpoint,如:dws.cn-global-1.hcs.com; 2). 构造获取token的请求体并发送请求获取token String body = String.format("{\"auth\":{\"identity\":{\"methods\":[\"password\"],\"password\":{\"user\":{\"name\":\"%s\",\"password\":\"%s\",\"domain\":{\"name\":\"%s\"}}}},\"scope\":{\"project\":{\"name\":\"%s\"}}}}", appProperties.getMo_user_name(), appProperties.getMo_user_pass(), appProperties.getMo_user_domain_name(), appProperties.getMo_user_project_name()); ResponseEntity<String> responseEntity = restTemplate.exchange("https://iam-cache-proxy.eihcs.com:26335/v3/auth/tokens", HttpMethod.POST, httpEntity, String.class); String token=responseEntity.getHeaders().getFirst("X-Subject-Token"); 3). 通过GaussDB(DWS)的REST运维接口查询集群列表 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.APPLICATION_JSON); headers.set("X-Auth-Token", token); HttpEntity<String> httpEntity = new HttpEntity<>(headers); ResponseEntity<String> responseEntity = restTemplate.exchange("https://dws.cn-global-1.eihcs.com/v1.0/${project_id}/clusters", HttpMethod.GET, httpEntity, String.class); String clusters=responseEntity.getBody(); GaussDB(DWS)当前已支持的开放API以及API的详细说明请参考《华为云Stack8.0.2数据仓库服务用户指南》第5章节“接口参考”。原文链接:https://bbs.huaweicloud.com/blogs/210852【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
数据仓库服务与华为云监控服务(Cloud Eye)无缝集成。用户可以平台实时查看集群和实例的各项指标。通过监控集群和实例运行时的各项指标,用户可以识别出数据库集群状态异常的时间段,然后在数据库日志中,分析可能存在问题的活动,从而优化数据库性能。查看集群监控信息 1.登录DWS数据库服务,在左侧导航栏中选择“集群管理”。 2.单击待监控集群名称,进入查看监控指标,打开云监控管理控制台。 3.云监控支持查看数据仓库服务中数据仓库集群的监控信息,支持查看集群中各个节点各项监控信息。用户可以根据需要,选择指定的监控指标名称以及时间范围,从而显示监控指标的性能曲线。 查看实例监控信息 1.登录云监控服务,在左侧导航栏中选择“云服务监控>数据仓库服务”。 2.在选择数据仓库节点,单击待监控实例名称,进入查看监控指标。多节点间的监控指标对比 1. 在云监控管理控制台的左侧导航栏中,单击“总览 > 监控面板”。 2. 在“监控面板”页面,单击“创建监控面板”,在弹出对话框中,输入“名称”后,单击“确定”。 3. 在“监控面板”页面,单击右上角的“添加监控视图”。 4. 在弹出的“添加监控视图”窗口中,配置标题和监控项。 配置数据存储 云监控各监控指标数据的保留期限为两天,超过保留周期后数据将被删除。如果需要永久存储,需要您开通对象存储服务(OBS),将监控指标数据数据可以同步保存至OBS。创建告警规则 通过设置GaussDB(DWS) 的告警规则,用户可以自定义监控目标和通知策略,及时了解GaussDB(DWS) 运行状态,从而起到预警作用。设置GaussDB(DWS) 的告警规则包括设置告警规则名称、监控对象、监控指标、告警阈值、监控周期和是否发送通知等参数。 1. 登录GaussDB(DWS) 管理控制台。 2. 在左侧导航栏中选择“集群管理”。 3. 在指定集群所在行的“操作”列中,单击“查看监控指标”,进入云监控管理控制台,查看数据仓库服务监控信息。 确认待查看“监控信息”的集群状态必须为“可用”,否则不能进行创建告警操作。 4. 在云监控管理控制台的左侧导航树上,选择“告警 > 告警规则”。 5. 在“告警规则”界面,单击右上方“创建告警规则”。 6. 在“创建告警规则”界面,根据界面提示配置参数。 a. 配置规则名称和描述。 b. 配置告警内容,根据界面提示配置参数。 原文链接:https://bbs.huaweicloud.com/blogs/204386【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
SSL连接GaussDB(DWS) 支持SSL认证方式的连接,以加密GaussDB(DWS) 客户端与数据库之间传输的数据。SSL连接方式的安全性高于普通模式,集群默认开启SSL功能允许来自客户端的SSL连接或非SSL连接,从安全性考虑,建议用户在客户端使用SSL连接方式。如果要强制使用SSL连接,需要为集群开启“服务器端是否强制使用SSL连接”。DWS支持SSL通道加密和证书认证两种方式进行客户端与服务器端的通信。您可以通过服务器端是否强制使用SSL连接进行设置。开关打开,即只能通过SSL方式连接。开关关闭,即两种方式均可。默认关闭。在集群的“安全设置”页面可以设置是否开启“服务器端是否强制使用SSL连接”。【说明】 修改安全配置参数并保存生效可能需要重启集群,将导致集群暂时不可用。实时数仓暂不支持SSL连接。 实时数仓暂不支持MRS数据源连接。 修改集群安全配置必须同时满足以下两个条件:集群状态为“可用”或“低性能”。任务信息不能处于“创建快照中”、“节点扩容”、“配置中”或“重启中”。设置SSL连接登录GaussDB(DWS) 管理控制台。在左侧导航树中,单击“集群管理”。在集群列表中,单击指定集群的名称,然后单击“安全设置”。默认显示“配置状态”为“已同步”,表示页面显示的是数据库当前最新结果。在“SSL连接”区域中,单击“服务器端是否强制使用SSL连接”的设置开关进行设置,建议开启。:开启,表示服务器端强制要求SSL连接。:关闭,表示服务器端对是否通过SSL连接不作强制要求,默认为关闭。 说明: 如果使用GaussDB(DWS) 提供的gsql客户端或ODBC驱动,GaussDB(DWS) 支持的SSL协议为TLSv1.2。 如果使用GaussDB(DWS) 提供的JDBC驱动,支持的SSL协议有SSLv3、TLSv1、TLSv1.1、TLSv1.2。客户端与数据库之间实际使用何种SSL协议,依赖客户端使用的JDK(Java Development Kit)版本,一般JDK支持多个SSL协议。5. 单击“应用”。系统将自动应用保存SSL连接设置,在“安全设置”页面,“配置状态”显示“应用中”。当“配置状态”显示为“已同步”,表示配置已保存生效。客户端和服务端SSL连接参数组合情况 客户端最终是否使用SSL加密连接方式、是否验证服务器证书,取决于客户端参数sslmode与服务器端(即GaussDB(DWS) 集群侧)参数ssl、require_ssl。参数说明如下:ssl(服务器)ssl参数表示是否开启SSL功能。on表示开启,off表示关闭。对于集群版本高于1.3.1(包括1.3.1)的集群,默认为on,不支持在GaussDB(DWS) 管理控制台上设置。对于集群版本低于1.3.1的集群,默认为on。ssl参数可通过GaussDB(DWS) 管理控制台上集群的“安全设置”页面中的“SSL连接”进行设置。require_ssl(服务器) require_ssl参数是设置服务器端是否强制要求SSL连接,该参数只有当ssl为on时才有效。on表示服务器端强制要求SSL连接。off表示服务器端对是否通过SSL连接不作强制要求。对于集群版本高于1.3.1(包括1.3.1)的集群,默认为off。require_ssl参数可通过GaussDB(DWS) 管理控制台上集群的“安全设置”页面中的“服务器端是否强制使用SSL连接”进行设置。对于集群版本低于1.3.1的集群,默认为off,不支持在GaussDB(DWS) 管理控制台上设置。 sslmode(客户端)可在SQL客户端工具中进行设置。在gsql命令行客户端中,为“PGSSLMODE”参数。在Data Studio客户端中,为“SSL模式”参数。客户端参数sslmode与服务器端参数ssl、require_ssl配置组合结果如下:表1 客户端与服务器端SSL参数组合结果ssl(服务器)sslmode(客户端)require_ssl(服务器)结果ondisableon由于服务器端要求使用 SSL,但客户端针对该连接禁用了 SSL,因此无法建立连接。disableoff连接未加密。allowon连接经过加密。allowoff连接未加密。preferon连接经过加密。preferoff连接经过加密。requireon连接经过加密。requireoff连接经过加密。verify-caon连接经过加密,且验证了服务器证书。verify-caoff连接经过加密,且验证了服务器证书。offdisableon连接未加密。disableoff连接未加密。allowon连接未加密。allowoff连接未加密。preferon连接未加密。preferoff连接未加密。requireon由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。requireoff由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。verify-caon由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。verify-caoff由于客户端要求使用 SSL,但服务器端禁用了 SSL,因此无法建立连接。下载SSL证书GaussDB(DWS) 支持SSL标准协议(TLS 1.2),SSL协议是安全性更高的协议标准,它们加入了数字签名和数字证书来实现客户端和服务器的双向身份验证,保证了通信双方更加安全的数据传输。为支持SSL连接方式,GaussDB(DWS) 已经从CA认证中心申请到正式的服务器、客户端的证书和密钥(假设服务器的私钥为server.key,证书为server.crt,客户端的私钥为client.key,证书为client.crt,CA根证书名称为cacert.pem。)。GaussDB(DWS) 集群(即服务器端)默认已开启SSL功能允许来自客户端的SSL连接或非SSL连接,并且,GaussDB(DWS) 服务器端的证书、私钥以及根证书已经默认配置完成。如果客户端或JDBC/ODBC应用程序要使用SSL连接方式,用户必须在客户端或应用程序代码中配置相关的SSL连接参数。GaussDB(DWS) 管理控制台提供了客户端所需的SSL证书,该SSL证书包含了客户端所需的默认证书、私钥、根证书以及私钥密码加密文件。请将该SSL证书下载到客户端所在的主机上,然后在客户端中指定证书所在的路径。说明:使用默认的证书可能存在安全风险,为了提高系统安全性,强烈建议用户定期更换证书以避免被破解的风险。如果需要更换证书,请联系客服。步骤:登录GaussDB(DWS) 管理控制台。在左侧导航栏中,单击“连接管理”。 在“下载驱动程序”区域,单击“这里”下载SSL证书文件。三权分立介绍为了保护用户的数据安全,DWS支持使用不同类型的用户分别控制不同权限的三权分立模式。开启此模式后,用户划分为:系统管理员、安全管理员、审计管理员和普通用户,其中三类管理员用户权限彼此分离。默认权限机制和系统管理员两节的描述基于的是集群创建之初的默认情况。从前面的介绍可以看出,默认情况下拥有SYSADMIN属性的系统管理员,具备系统最高权限。在实际业务管理中,为了避免系统管理员拥有过度集中的权利带来高风险,可以设置三权分立,将系统管理员的权限分立给安全管理员和审计管理员。三权分立后,系统管理员将不再具有CREATEROLE属性(安全管理员)和AUDITADMIN属性(审计管理员)能力。即不再拥有创建角色和用户的权限,并不再拥有查看和维护数据库审计日志的权限。关于CREATEROLE属性和AUDITADMIN属性的更多信息请参考CREATE ROLE。三权分立后,系统管理员只会对自己作为所有者的对象有权限。三权分立的设置办法请参考设置三权分立部分。三权分立前的权限详情及三权分立后的权限变化,请分别参见表1和表2。表1 默认的用户权限对象名称系统管理员安全管理员审计管理员普通用户表空间对表空间有创建、修改、删除、访问、分配操作的权限。不具有对表空间进行创建、修改、删除、分配的权限,访问需要被赋权。表对所有表有所有的权限。仅对自己的表有所有的权限,对其他用户的表无权限。索引可以在所有的表上建立索引。仅可以在自己的表上建立索引。模式对所有模式有所有的权限。仅对自己的模式有所有的权限,对其他用户的模式无权限。函数对所有的函数有所有的权限。仅对自己的函数有所有的权限,对其他用户放在public这个公共模式下的函数有调用的权限,对其他用户放在其他模式下的函数无权限。自定义视图对所有的视图有所有的权限。仅对自己的视图有所有的权限,对其他用户的视图无权限。系统表和系统视图可以查看所有系统表和视图。只可以查看部分系统表和视图。详细请参见系统表和系统视图。 表2 三权分立较非三权分立权限变化说明对象名称系统管理员安全管理员审计管理员普通用户表空间无变化无变化。表权限缩小。只对自己的表有所有权限,对其他用户放在属于各自模式下的表无权限。无变化。索引权限缩小。只可以在自己的表上建立索引。无变化。模式权限缩小。只对自己的模式有所有的权限,对其他用户的模式无权限。无变化。函数权限缩小。只对自己的函数有所有的权限,对其他用户放在属于各自模式下的函数无权限。无变化。自定义视图权限缩小。只对自己的视图及其他用户放在public模式下的视图有所有的权限,对其他用户放在属于各自模式下的视图无权限。无变化。系统表和系统视图无变化。无变化。无变化。无权查看任何系统表和视图。设置三权分立操作场景 默认情况下,创建GaussDB(DWS) 集群时指定的管理员用户属于数据库的系统管理员,能够创建其他用户和查看数据库的审计日志,即权限不分立,三权分立模式为关闭。 为了保护集群数据的安全,GaussDB(DWS) 支持对集群设置三权分立,使用不同类型的用户分别控制不同权限的模式。 默认的权限模型和开启三权分立后的权限模型,请参见《数据仓库服务数据库开发指南》的三权分立章节。对系统影响修改安全配置参数并保存生效可能需要重启集群,将导致集群暂时不可用。前提条件:修改集群安全配置必须同时满足以下两个条件:集群状态为“可用”或“低性能”。任务信息不能处于“创建快照中”、“节点扩容”、“配置中”或“重启中”。操作步骤1. 登录GaussDB(DWS) 管理控制台。2. 在左侧导航树中,单击“集群管理”。3. 在集群列表中,单击指定集群的名称,然后单击“安全设置”。4. 默认显示“配置状态”为“已同步”,表示页面显示的是数据库当前最新结果。5. 在“安全设置”页面,设置三权分立 表示开启三权分立模式。开启“三权分立”后,分别设置“安全管理员”和“审计管理员”的用户名和密码,系统将会创建这两个用户。使用这两个用户可以连接数据库并执行数据库的相关操作 表示关闭三权分立模式。默认为关闭状态。图1 安全配置表1 安全配置参数说明参数名参数解释样例值安全管理员用户命名要求如下:l 只能由小写字母、数字或下划线组成。l 必须以小写字母或下划线开头。l 长度为6~64个字符。l 用户名不能为GaussDB(DWS) 数据库的关键字。GaussDB(DWS) 数据库的关键字,具体请参见《数据仓库服务数据库开发指南》中关键字章节。security_admin密码密码复杂度要求如下:l 密码长度为8~32个字符。l 不能与用户名或倒序的用户名相同。l 密码至少包含大写字母、小写字母、数字和特殊字符四类中的三类,其中可输入的特殊字符为:~!@#%^&*()-_=+|[{}];:,<.>/?l 弱口令检查。Dws_2018!确认密码再次输入安全管理员密码。-审计管理员用户命名要求如下:l 只能由小写字母、数字或下划线组成。l 必须以小写字母或下划线开头。l 长度为6~64个字符。l 用户名不能为GaussDB(DWS) 数据库的关键字。GaussDB(DWS) 数据库的关键字,具体请参见《数据仓库服务数据库开发指南》中关键字章节。audit_admin密码密码复杂度要求如下:l 密码长度为8~32个字符。l 不能与用户名或倒序的用户名相同。l 密码至少包含大写字母、小写字母、数字和特殊字符四类中的三类,其中可输入的特殊字符为:~!@#%^&*()-_=+|[{}];:,<.>/?l 弱口令检查。Dws_2018!确认密码再次输入审计管理员密码。-6. 单击“应用”。7. 在弹出的“保存配置”窗口中,选择是否勾选“立即重启集群”,然后单击“是”。如果勾选“立即重启集群”,系统将保存“安全设置”页面的配置并立即重启集群,集群重启成功后安全设置将立即生效。如果不勾选“立即重启集群”,系统将只保存“安全设置”页面的配置。稍后,用户需要手动重启集群才能使安全设置生效。安全设置完成后,在“安全设置”页面,“配置状态”有如下3种状态:“应用中”:表示系统正在保存配置。“已同步”:表示配置已保存生效。“需重启生效”:表示配置已保存但还未生效。如需生效,需重启集群。原文链接:https://bbs.huaweicloud.com/blogs/205961【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(DWS)黑科技直播汇总,欢迎大家交流学习(持续更新中)【培训视频汇总】GaussDB(DWS) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 简要描述GaussDB(DWS)自定义函数中多结果集返回的使用方法以及部分案例。在使用GaussDB(DWS)过程中经常会创建自定义函数,总结了多结果集返回的使用方法。1. 建表postgres=> create table test_tb_01(id integer,name varchar);NOTICE: The 'DISTRIBUTE BY' clause is not specified. Using 'id' as the distribution column by default.HINT: Please use 'DISTRIBUTE BY' clause to specify suitable data distribution column.CREATE TABLEpostgres=> insert into test_tb_01 values(generate_series(1,5),'aa');INSERT 0 5 2. 返回单列多行· 使用return next variable:create or replace function test_func_01()return setof varcharasout_name varchar;begin for out_name in select name from test_tb_01 loop return next out_name; end loop;end;/ postgres=> select test_func_01(); test_func_01-------------- aa aa aa aa aa(5 rows)· 指定out参数,使用return next:create or replace function test_func_02(out out_name varchar)return setof varcharasv_rec RECORD;begin for v_rec in select * from test_tb_01 loop out_name := v_rec.name; return next; end loop;end;/ postgres=> select test_func_02(); test_func_02-------------- aa aa aa aa aa(5 rows)· 使用return query:create or replace function test_func_03()return setof varcharasbegin return query(select name from test_tb_01);end;/ postgres=> select test_func_03(); test_func_03-------------- aa aa aa aa aa(5 rows)3. 返回多列的多行· 使用return next variable:create or replace function test_func_04()RETURN SETOF RECORD asdeclare v_rec record;begin for v_rec in select * from test_tb_01 loop return next v_rec; end loop;end;/自定义函数test_func_04的调用,需要注意如下问题:postgres=> select test_func_04();ERROR: Set-valued function called in context that cannot accept a set when init tuple store for RETURN NEXT/RETURN QUERY.CONTEXT: PL/pgSQL function test_func_04() line 6 at RETURN NEXTreferenced column: test_func_04postgres=> select * from test_func_04();ERROR: a column definition list is required for functions returning "record"LINE 1: select * from test_func_04();需要使用as子句来处理结果集postgres=> select * from test_func_04() as t(id integer,name varchar); id | name----+------ 1 | aa 2 | aa 3 | aa 4 | aa 5 | aa(5 rows)指定out参数就不会有问题,如下test_func_05所示:· 指定out参数,使用return next:create or replace function test_func_05(out out_id integer,out out_name varchar)return setof record asdeclare v_rec record;begin for v_rec in select * from test_tb_01 loop out_id := v_rec.id; out_name := v_rec.name; return next; end loop;end;/ postgres=> select * from test_func_05(); id | name----+------ 1 | aa 2 | aa 3 | aa 4 | aa 5 | aa(5 rows)· 使用return query:create or replace function test_func_06()return setof record asbegin return query(select id,name from test_tb_01);end;/ postgres=> select * from test_func_06() as t(id integer,name varchar); id | name----+------ 1 | aa 2 | aa 3 | aa 4 | aa 5 | aa(5 rows)原文链接:https://bbs.huaweicloud.com/blogs/205964【推荐阅读】【最新活动汇总】DWS活动火热进行中,互动好礼送不停(持续更新中) HOT 【博文汇总】GaussDB(DWS)博文汇总1,欢迎大家交流探讨~(持续更新中)【维护宝典汇总】GaussDB(DWS)维护宝典汇总贴1,欢迎大家交流探讨(持续更新中)【项目实践汇总】GaussDB(DWS)项目实践汇总贴,欢迎大家交流探讨(持续更新中)【DevRun直播汇总】GaussDB(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) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 一种典型客户场景是一些用户是数据的生产方,需要在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)是怎么在物理磁盘上存储数据的。 行存表的数据文(表、索引、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) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
视图是检测数据库运行状态的重要工具和手段,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) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
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) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
背景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) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
-
【摘要】 随着硬件系统的越来越好,数据库运行的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) 培训视频汇总,欢迎大家交流学习(持续更新中)扫码关注我哦,我在这里↓↓↓
推荐直播
-
华为云码道-玩转OpenClaw,在线养虾2026/03/11 周三 19:00-21:00
刘昱,华为云高级工程师/谈心,华为云技术专家/李海仑,上海圭卓智能科技有限公司CEO
OpenClaw 火爆开发者圈,华为云码道最新推出 Skill ——开发者只需输入一句口令,即可部署一个功能完整的「小龙虾」智能体。直播带你玩转华为云码道,玩转OpenClaw
回顾中 -
华为云码道-AI时代应用开发利器2026/03/18 周三 19:00-20:00
童得力,华为云开发者生态运营总监/姚圣伟,华为云HCDE开发者专家
本次直播由华为专家带你实战应用开发,看华为云码道(CodeArts)代码智能体如何在AI时代让你的创意应用快速落地。更有华为云HCDE开发者专家带你用码道玩转JiuwenClaw,让小艺成为你的AI助理。
回顾中 -
Skill 构建 × 智能创作:基于华为云码道的 AI 内容生产提效方案2026/03/25 周三 19:00-20:00
余伟,华为云软件研发工程师/万邵业(万少),华为云HCDE开发者专家
本次直播带来两大实战:华为云码道 Skill-Creator 手把手搭建专属知识库 Skill;如何用码道提效 OpenClaw 小说文本,打造从大纲到成稿的 AI 原创小说全链路。技术干货 + OPC创作思路,一次讲透!
回顾中
热门标签