• [其他] 【HCS 8.1.1】HCS场景升级到811版本后打开ServiceOM界面报错规避方法
    现象描述          HCS场景下,登录当前环境ServiceOM界面,打开DWS服务插件,报错Failed: Internal Server Error可能原因当前浏览器namespace变量被设置成mrs或其他参数。定位思路        切换进入 【Service OM Management】界面,查看当前【Current Namespace】配置。处理步骤切换进入【Service OM Management】界面,查看当前【Current Namespace】配置,配置的值是否是dws   2. 如果Current Namespace】配置的值不是dws,点击【Swith Namespace】,切换为dws。   3.切换namespace完成后,在查看首页是否恢复正常。
  • [技术干货] 数据平台模型分层架构之DWR Data Warehouse Report
    主题库,又叫数据仓库的数据中间层。对上支撑DM层多维分析需求和明细查询需求,对下不影响DWI层多源的变化,并将三范式模型转为维度模型。DWR层内又可分为DWD层和DWS层。DWD是数据明细层,DWS是数据汇总层。DWS是基于DWD的轻度汇总,例如按日、月、年进行预统计。DWR层有几个特点按主题进行分类,主题依据业务进行划分。围绕业务原始行为建模,记录业务过程,不针对特定业务需求设计。维度建模,星型模型。保存最完整的、最明细的原子事实数据。记录和体现业务历史变化。模型稳定可靠,不影响DWI层变化。DWR层表设计原则DWR之DWD层数据来自DWI层,但是车辆、环境信息直接来自子系统。维度建模,事实表和维度表组合构成星型模型。明细层事实表需要保留最完整、最细粒度的数据。明细层表数据需要记录事实数据的历史变化过程。设计丰富详细的维度数据,满足业务多种统计需求。明细层不针对特定的业务需求设计。明细层不进行数据汇总。明细层添加审计字段。DWR之DWS层数据来自DWD层或者DWI层。是对数据的轻度汇总,提供通用的、常用的、稳定的基础统计数据。非定制化的、个性化的。为了查询性能,可退化维度,将维度冗余进表中,表现为宽表化。汇总层添加审计字段。当前园区业务分为9个主题,如表1。表1 主题表中文描述Domain资产资产信息,标签信息等asset事件事件类型、等级等event设备设备基本信息,点位信息,设备位置信息facility工单设备维修等服务单信息order组织组织结构关系,集团、部门关系等org人员人员基本信息,人员分类信息等person资源水、电表等资源信息res时空建筑信息,园区位置,天气信息,城市、国家信息,特殊集团区域划分等space车辆车辆基本信息,车辆与人员绑定关系等vehicle其中,维度的表是放在各个主题中的,但是所有模块的公共方法是放在dwr_dim模块下。表2 公共方法中文描述Domain公共方法所有模块的公共方法是放在dwr_dim中的dim
  • [应用案例] 2022年数据仓库安全优秀实践
    数据仓库(data warehouse)的安全性对于在一个位置收集所有关键数据的企业来说至关重要。未经授权进入数据仓库可能会导致重大和毁灭性的业务后果,包括泄露客户信息、暴露高级商业机密或知识产权等。在本文中,我们将探讨可以帮助企业组织保持信息和软件安全的数据仓库安全最佳实践。什么是数据仓库安全性?数据仓库从各种来源提取数据,并由许多移动组件组成。每次数据从一个位置移动到另一个位置时,都有可能出现安全问题。数据仓库安全性要求主动保护信息,以便授权人员可以使用,但其他人无法使用这些数据。数据仓库面临的安全挑战数据仓库操作所涉及的范围和规模极广,并且如前所述,它由多个移动部分组成。反过来,这在保护信息时也提出了操作挑战。在考虑数据仓库安全性时,管理者应该考虑:如何平衡“保护数据”的需求和“为仓库内特定数据(用于分析、商业智能或数据挖掘目的的数据)用户提供不受限制的访问”的需求;在安排数据访问时对用户进行分类的最佳方法。例如,您的组织应该采取分层方法,还是采用基于角色的访问方法?如何保护网络。组织必须考虑数据加密并加大投资高度安全的网络硬件;数据仓库管理者还需要考虑必要的安全特性如何影响数据仓库的性能;此外,管理人员还必须考虑如何安全地从源事务系统中提取数据以供仓库使用。数据仓库安全最佳实践1、 加密数据组织应该加密存储在源事务数据库中的数据。此外,还应考虑数据仓库内的加密操作。专家推荐使用FIP 140-2认证软件进行数据加密,因为FIPS 140-2是加密模块的政府计算机安全标准。也就是说,这确保了最高程度的安全性。但是,加密会降低数据仓库的性能。在某些情况下,组织可能会权衡此类性能下降与网络攻击的可能性。尽管如此,考虑到网络犯罪分子的老练娴熟,在数据仓库中使用加密可能是最好的方法。2、 数据分类一种有效的仓库安全策略包括对存储在数据仓库中的数据进行适当分类。如果您的组织以“最小敏感性”存储数据,那么该数据应用安全措施的用途可能有限。3、 基于角色的控制基于角色的用户访问控制是一项备受赞誉的网络安全措施,因为它基于“需要知道”和“最小权限”的原则限制访问。这些原则可以确保仓库的用户只能访问工作绩效所需的数据。可以说,内部威胁对组织的危害与外部威胁一样。心怀不满的员工可能会访问或下载敏感数据,以便与竞争对手共享以换取经济利益。根据定义的角色设置权限代表了传统数据仓库和基于云的数据仓库服务中的一个选项。设置基于角色的权限时,请确保它们与先前定义的数据分类一致。这将使所有仓库用户能够访问必要的数据,而不会对数据安全造成不必要的风险。4、 保护移动数据任何数据仓库都由不断移动的元素组成。组织通常会向仓库提供实时数据,以帮助进行最新的报告和分析。如果您的组织不断在各种位置间传输数据,请确保始终使用SSL或TSL协议。使用基于云的数据仓库意味着虚拟专用网络可以提供强大的安全性,因为它们隔离了本地数据库和基于云的数据仓库之间的通信。5、 分区数据组织可以通过将数据划分为单独的表格来对数据进行分区,将表格划分为敏感元素和非敏感元素,可以针对高度敏感的信息进行安全优化,进而提高数据仓库的安全性。上述策略有助于提高数据仓库的安全性。同时,组织必须选择具有成本意识的安全措施。当数据泄露造成的预估损失为500万美元时,很少有组织能够从实施成本为1亿美元的数据安全策略中受益。在构建数据安全性时,组织应考虑每个安全措施对数据仓库性能的影响。数据仓库安全的首要目标包括利用具有成本效益的机制,根据不同类别的数据所需的保护程度来保护它们。结语数据仓库安全最佳实践可以帮助组织确保数据的持续安全。由于数据仓库不断从各种位置提取信息,因此必须实施明智、有效且成本优化的数据保护安全措施,这包括智能用户访问控制、正确的信息分类、高度安全的加密技术(如FIPS 140-2)以及所有移动部件的安全性。本文翻译自:https://www.cybertalk.org/2022/03/10/data-warehouse-security-best-practices-2022/如若转载,请注明原文地址。
  • [迁移系列] TD与GaussDB(DWS)的差异点
    1、Teredata业务改写注意事项业务改写包括以下几个方面,包括环境参数设置、兼容语法修改、性能优化和错误处理。1.1 环境参数设置在脚本开始位置,添加打开SQL执行时间显示设置。\timing on\timing on可以添加到~/.psqlrc里面,启动gsql会自动执行~/.psqlrc脚本。在脚本结尾位置添加作业主表的analyze语句。例如,ANALYZE EDISUM.E01_CUST_BELONG_INFO;1.2 兼容语法修改TD作业日志中所有的日期常量在GaussDB(DWS)脚本中都要替换成见名知义的变量,以便用gsql调度作业时可以动态传入这些变量,适应按日期跑批地要求。日期变量可以用文本工具批量替换,即把出现在TD日志中的同一日期常量替换成变量形式,gsql命令长度本身没有限制,它只依赖linux系统对命令参数长度的限制。单个参数长度上限可参考/usr/include/linux/limits.h中的ARG_MAX定义(默认131072字节),参数总长度不能超过1/4 stack size(ulimit -s),默认值2048字节。1.3 性能优化Delete语句对分区表的分区键做delete的语句和直接delete全表的语句需要改写成truncate,例如Delete from table1;=>truncate table1;delete分区表Delete from e01_cust_belong_info where work_dt=’***’; (work_dt是分区键)=>alter table table1 truncate partition e01_cust_belong_info_P:TX_DATE;临时表TD的临时表是session级的,每个作业由不同的session调度,各个session之间可以使用同名临时表。在GaussDB(DWS)脚本中临时表是全局性的,原则上不能同名,以免调度或空跑时冲突。针对每个作业,临时表名都要调整为‘作业名_temp_数字’的格式,调整时注意避免混淆。GaussDB(DWS)表名长度限制为64字节。统计信息收集统计信息收集是获取好的执行计划的基本保证。EDI系统中有以下几类表,分别列出其统计信息收集的时机:%2. 基础表(EDIODS模式表):存储存量数据,在由GDS导入到数据库后做analyze;每天追批导入新的增量数据后做analyze%2. 作业主表(EDISUM/EDI*MART):在相关作业的最后做analyze%2. 临时表:在最后一次INSERT数据之后或使用其作为SQL输入表之前做analyze%2. 另外,由于各种原因手工重建以上表时需同时做analyze补充:做analyze的目的是让优化器可以准确的估算代价,产生好的执行计划,因此analyze的原则是在查询该表前最后一次更新该表数据时增加analyze语句。临时表分布列选择对于脚本内部出现的临时表,GaussDB(DWS)需要仔细选择分布列,在CREATE UNLOGGED TABLE结尾显式标明分布列,例如:Create unloggedtable t1 (Col1,Col2,Col3,…)Distribute by hash(col1);选择的原则如下:%2. 选择长度大的字段,一般选择长度15字节以上的字段%2. 选择号码类的字段,比如CINO,CARDNO等%2. 如1)和2)仍然不能确定分布列,可以实际各列的distinct值数目来定%2. 无需使用seq_num,实在找不出就选择一个字段复制表参与大型查询的小表(如参数表)可以改成复制表,以消除其对数据重分布的影响。改复制表在临时表中比较常见,比如cst_cust_stru_a作业中的cst_cust_stru_a_tmp_cust_type临时表,它只存储了32种客户类型组合,即32条记录,如果该表导致执行计划中产生多余的重分布streaming算子就可以把它改成复制表。不同数据量和并发度的系统复制表的选择标准不同,视具体场景而定。一般同时符合以下条件的表可以做成复制表%7. 宽度小于1024字节%7. 记录数小于10000NOT INEDI所有的表列属性都已设置为NOT NULL,因此NOT IN可以全部修改为NOT EXISTS,以选择hash-anti-join执行计划。例如Select * from T1 where T1.C1 not in (select T2.C2 from T2);=>Select * from T1 where not exists (select * from T1,T2 where T1.C1=T2.C2);1.4 错误处理脚本改写完成后需要在测试环境带数运行,以排除脚本和数据之间不能匹配造成的错误。作业脚本改写完成后,需要处理以下几类错误:• 修改INSERT数据超长错误。Teradata的CHAR/VARCHAR类型字段对于INSERT超长数据的默认行为是自动靠左截断,FusionInsight GaussDB(DWS)如果遇到超长数据INSERT则会报错。这在脚本带数运行时是常见的错误,大部分情况在INSERT数据时按照目标字段长度用SUBSTR函数截断即可,但是不能完全排除Teradata导出数据错误,需要进一步和业务人员确认。典型的错误如下:ERROR: value too long for type character(num)典型的SQL如下:INSERT INTO table1 Col1, Col2, Select C1, #修改为SUBSTR(C1,1,length) C2, from T1;修改时需要检查INSERT目标列(Col1)的长度,在select列上面增加按此长度截断的SUBSTR函数。• 修改日期越界错误。在实际作业中有少量日期越界错误,原因是Teradata导出的数据和作业逻辑不相符。典型的日期错误如下:ERROR: date/time field value of out range: "31090000"该错误原因是INSERT日期字段的输入数据是在某个字符型字段中截取的部分数据。为了让作业跑通,可以暂时删除无效数据,之后和业务相关人员确认处理措施。• 处理非空约束。在实际业务中,存量表字段都加上了非空约束,带数运行时如果数据产生空值就会报错,可以在INSERT字段时增加COALESCE函数规避,空值产生的原因需要和业务相关人员确认。典型的非空约束错误如下:ERROR: null value in column "prod_id" violates not-null constraint典型的SQL如下:INSERT INTO table1 Col1, Col2, Select C1, #修改为 COALESCE(C1,'') C2, from T1;修改时检查报错INSERT字段的属性,如果该字段属性是NOT NULL,则在该字段加上COALESCE函数,在数据为NULL时转换成空串''。2、 GaussDB(DWS)与TD语法差异(易犯错部分)1.%2 DDL语法差异1.%2.%3 普通表的差异Teradata语法GaussDB(DWS)语法表名13.10之前最长32位;14.10之后最长120位;注意:TD中可能存在着以$开头的表名最长63位;长度不超过63个字符,以字母或下划线开头,中间字符可以是字母、数字、下划线、$、#。数据分布方式1PI 主索引分布键数据分布方式2支持no pi表必须指定分布键,不支持无分布键的表。表存储方式支持行存表,列存表;日常主要使用的是行存表支持行存表,列存表;日常推荐使用列存表表类型1hash表,复制表;小表推荐使用复制表Hash表,复制表;小表推荐使用复制表表类型2Set,multiset只有multiset表字段类型参见字段类型差异参见字段类型差异字段属性1支持指定字段内容是否大小写敏感不支持指定,默认大小写敏感字段属性2支持format不支持format字段属性3支持title不支持title字段属性4支持指定字符集,例:col2 varchar(20) set Unicode casespecific不支持分区方式支持多种分区的方式;且分区可以自动创建;只支持range分区方式;分区需要手工提前创建。列压缩支持不支持表压缩行存表,列存表都支持压缩列存表支持压缩单行记录数据大小65535字节1GB表索引个数待总结无限制单索引可以包含的列数待总结32单表约束个数待总结无限制分区表的分区个数待总结32768分区表的单个分区大小待总结1PB分区表的单个分区记录数待总结2的55次方1.1.%3.%4 临时表差异Teradata表对象涉及可选项GaussDB等效替代语法Create volatile Table…Create Local Temporary Table…Create Volatile Multiset Table…Create Local Temporary Table…字段属性支持指定字符集Create volatile multiset table tab1(Col1 integer not null,col2 varchar(100) not null CHARACTER SET UNICODE CASESPECIFIC);不支持指定字段字符集,删除对应SET子句Create local temporary Table tab1(Col1 integer not null,col2 varchar(100) not null);字段属性支持titleCreate table tab1(C1 number(2) title ‘This is a very long title’)字段属性不支持titleCreate table tab1(C1 Number(2))字段属性支持compressCreate table tab1(C1 Varchar(6) compress(0,1))字段属性不支持compressCreate table tab1(C1 varchar(6))压缩:GaussDB(DWS)不支持字段属性上添加compress,但凡遇到类似情况,去掉compress即可。其他未尽事项,请参照DDL差异和字段类型差异适当改造。2.%2.%3 数据类型差异:1.%2.%3.%4 字段类型差异Teradata数据类型GaussDB替换数据类型数值类型BIGINTBIGINTBYTEINTSMALLINTDECIMAL [(n[,m])]DECIMAL [(n[,m])]DOUBLE PRECISIONDOUBLE PRECISIONFLOATDOUBLE PRECISIONINT / INTEGERINTEGERNUMBER / NUMERICNUMERICNUMBER(n[,m])NUMERIC (n[,m])REALREALSMALLINTSMALLINT字符类型CHAR[(n)] / CHARACTER [(n)]CHAR(n)CLOBCLOBLONG VARCHARTEXTVARCHAR(n) / CHAR VARYING(n) / CHARACTER VARYING(n)VARCHAR(n)时间类型DATEDATETIME [(n)]TIME [(n)]TIME [(n)] WITH TIME ZONETIME [(n)] WITH TIME ZONETIMESTAMP [(n)]TIMESTAMP [(n)]TIMESTAMP [(n)] WITH TIME ZONETIMESTAMP [(n)] WITH TIME ZONEPeriod类型PERIOD(DATE)daterangePERIOD(TIME [(n)])tsrange [(n)]PERIOD(TIME WITH TIME ZONE)tstzrangePERIOD(TIMESTAMP [(n)])tsrange [(n)]PERIOD(TIMESTAMP WITH TIME ZONE)tstzrangeBinary类型BLOB[(n)]blobBYTE[(n)]byteaCHAR类型:a. Format转换方法:Format案例:1 1.1 1.2 1.3 1.3.1 2.%2.%3.%4 date类型1. GaussDB(DWS) DATE类型,没有FORMAT关键字,且默认日期格式为YYYY-MM-DD。TD默认日期格式为8位。2. 对于形如2016-001的日期,GaussDB(DWS)认为合法,TD认为不合法综合以上两点,容易产生这类问题:例如,获取当月1号的日期,TD原始语法:select cast( substr( trim( cast('20160501' as date format 'YYYYMMDD') ) ,1,6 )||'05' as date format 'YYYYMMDD');TD中得到日期型:2016-05-05翻译GaussDB(DWS)后,直接去除format 'YYYYMMDD'关键字,得到:GaussDB(DWS)中得到日期型:2016-01-05由于2016-001在GaussDB(DWS)中意为:从2016年开始算的第1天。在GaussDB(DWS)中cast('20160501' as date)得到日期型2016-05-01,trim(cast('20160501' as date)) 之后,得到2016-0(由于日期型默认是10位格式,而GaussDB(DWS)无法使用日期FORMAT),substr(trim(cast('20160501' as date)),1,6 )||'05'之后,得到2016-005,最后cast(substr(trim(cast('20160501' as date)),1,6 )||'05' as date),得到2016年的第5天,即日期型2016-01-05。3.%2.%3.%4 varchar类型对于空白字符串与空字符串的比较,GaussDB(DWS)认为不相等,TD认为相等。因此如果遇到字段中有空白,翻译到GaussDB(DWS)之后,要加上TRIM才可以做到与TD保持一致。例如:select case when ''=' ' then 1 else 0 end;TD返回1GaussDB(DWS)返回0对于右边带空格的VARCHAR类型比较,TD会去除空格之后再比较,GaussDB(DWS)不会。select case when '2' < '2 ' then 1 else 0 end;TD返回0GaussDB(DWS)返回14.%2 函数与值差异1.3.2 4.2.%3 函数迁移对照关系自定义函数统一建立到所属数据库的public模式中,用户可以直接访问无需模式名称。现有TD自定义函数,保持功能不变迁移到新平台,列表如下:a. TD与GaussDB无差异函数函数列表(持续完善)TeradataGaussDB(DWS)AbsAbsavgavgcastcastCharsCharsCoalesceCoalesceCountCountCurrent_timestampCurrent_timestampDecodeDecodeLengthLengthMaxMaxMinMinNvlNvlSubstrSubstrsumsumTimeTimeTimestampTimestampTo_charTo_charTo_dateTo_dateTrimTrimupperupper数据库名称UDF名SYSLIBu_FU_ADJSYSLIBu_dec_2_dateSYSLIBudf_w936to16SYSLIBu_char8_2_dateSYSLIBu_conv_adhoc_distSYSLIBu_char_2_tsSYSLIBu_char19_2_tsSYSLIBudf_16tow936SYSLIBu_dec_2_timeSYSLIBu_FU_BSYSLIBu_char_2_dateSYSLIBu_char10_2_dateRKDM_DATACALRATIORKDM_DATAU_DIVb. TD支持但GaussDB不支持,且存量脚本使用的函数,保持功能不变迁移到新平台。函数列表(持续完善)TeradataGaussDBCharCharDaynumber_of_yearDaynumber_of_yearEscinsertEscinsertEscrepeatEscrepeatEscrightEscrightExpand_charExpand_charFunckang_get_dirty_tuplesFunckang_get_dirty_tuplesIndexIndexMonths_betweenMonths_betweenOadd_monthsOadd_monthsU_dec_2_dateU_dec_2_datec. TD支持但GaussDB有同样函数,改造过程中通过脚本转换工具统一替换。函数对照表(持续完善)TeradataGaussDBanyLike any() 转换为 like any(array())4.3.%3 NULL值由于语法差异:null与字符串拼接,GaussDB(DWS)得到字符串,TD得到null造成在脚本中使用coallesce判空时,容易造成差异,例如:脚本中会在coallesce中使用两个值拼接,一个为null,一个为字符串coallesce(null||’abc’,’1’),在GaussDB(DWS)与TD得到结果不同:GaussDB(DWS):abcTD:1修改方法:COALESCE('IC'||T8.Comp_Org_Num,'')改为 COALESCE(decode(T8.Comp_Org_Num,NULL,NULL,'IC'||T8.Comp_Org_Num),'') 4.4.%3 coallesce变量类型coallesce后的变量,GaussDB(DWS)中需要变量类型相同,TD中变量类型可以不同。但目前版本(Gauss200 OLAP V100R005C10 build 5562)现状为:如果coalesce后的2个参数都为常量,第一个参数为常量,就可以做隐式转换,不报错。mppedi=> select coalesce('1',1) from dual;coalesce----------1(1 row)mppedi=> select coalesce('1',b) from test_v;coalesce----------111(3 rows)如果coalesce后的2个参数,如果第一个参数为变量,则后面的参数类型必须与第一个一致,否则报错。mppedi=> \d test_vTable "public.test_v"Column | Type | Modifiers--------+----------------------+-----------a | character varying(1) |b | numeric(1,0) |mppedi=> select coalesce(a,1) from test_v;ERROR: COALESCE types character varying and integer cannot be matchedmppedi=> select coalesce(a,b) from test_v;ERROR: COALESCE types character varying and numeric cannot be matchedLINE 1: select coalesce(a,b) from test_v;^CONTEXT: referenced column: coalesce4.5.%3 窗口函数差异Rank 在GaussDB(DWS)里默认升序,在TD默认降序。4.6.%3 数值计算精度差异select case when ( cast('2100001' as decimal(17,0)) /100.00 - cast('2000000' as decimal(17,0)) /100.00) / (cast('2000000' as decimal(17,0)) /100.00)<=0.05 then 'a' else 'b' end;GaussDB(DWS) 为 b,TD为 a4.7.%3 LIKE ANY差异GaussDB(DWS)没有like any语法,直接使用TD语法会报中断,目前翻译工具无法翻译改语法,需手工修改。4.8.%3 Like any常量值的修改方法:TD原文:where A.memo LIKE ANY (‘%水费%’,’%电费%’,’%煤气费%’)GaussDB(DWS)需修改为:where A.memo LIKE ‘%水费%’OR A.memo LIKE ’%电费%’OR A.memo LIKE ’%煤气费%’4.9.%3 like any集合的写法:TD原文:(CASE WHEN T31.Chrem_Prod_Cd is not null THEN SUBSTR(Prod1,2) else Prod1 end) LIKE ANY (select DISTINCT T1.Chrem_Fund_Id||'%' --理财:取前n位判断FROM ${EDIODSVIEWDB}.ED3_DAS_PBK_CASH_MGMT_1 T1WHERE T1.Prod_Sort = '1' --现金管理类产品AND T1.In_Ind = '1' --in判断)改写方法:select * from jobs e join jobs j on e.job_title similar to j.job_title||'%';由于该写法不能下推,因此只能适用于数据量不大的表5.%2 分区差异GaussDB(DWS)与TD在分区定义及使用上差异较大,TD可以定义区间,灵活指定分区间隔,而GaussDB(DWS)必须显示指定每一个分区的区间。定义:TD:CREATE MULTISET TABLE……PRIMARY INDEX ( Agt_Num )PARTITION BY ( RANGE_N(Data_Dt BETWEEN DATE '2007-01-01' AND '2014-12-31' EACH INTERVAL '1' YEAR , DATE '2015-01-01' AND DATE '2016-12-31' EACH INTERVAL '1' DAY , NO RANGE OR UNKNOWN));GaussDB(DWS):5.2.%3 建表分区定义CREATE TABLE IF NOT EXISTS ediods.ifs_othcpdtl……PARTITION BY RANGE (pt_dt)(PARTITION ediods_ifs_othcpdtl_p20170101 VALUES LESS THAN ('2017-01-02'),PARTITION ediods_ifs_othcpdtl_p20170102 VALUES LESS THAN ('2017-01-03'),……PARTITION ediods_ifs_othcpdtl_p20171231 VALUES LESS THAN ('2018-01-01'),PARTITION ediods_ifs_othcpdtl_p99991231 VALUES LESS THAN (MAXVALUE))5.3.%3 修改增加分区行存表ALTER TABLE ediods.ifs_othcpdtl SPLIT PARTITION ediods_ifs_othcpdtl_p99991231 INTO (PARTITION ediods_ifs_othcpdtl_p20180101 VALUES LESS THAN ('2018-01-02'),PARTITION ediods_ifs_othcpdtl_p20180102 VALUES LESS THAN ('2018-01-03'),……PARTITION ediods_ifs_othcpdtl_p20191229 VALUES LESS THAN ('2019-12-30'),PARTITION ediods_ifs_othcpdtl_p20191230 VALUES LESS THAN ('2019-12-31'),PARTITION ediods_ifs_othcpdtl_p99991231_NEW VALUES LESS THAN (MAXVALUE) );ALTER TABLE ediods.ifs_othcpdtl RENAME PARTITION ediods_ifs_othcpdtl_p99991231_NEW TO ediods_ifs_othcpdtl_p99991231;列存表(高压缩比)ALTER TABLE ediods.nae_nthwjnl1 DROP PARTITION ediods_nae_nthwjnl1_p20171231;ALTER TABLE ediods.nae_nthwjnl1 SPLIT PARTITION ediods_nae_nthwjnl1_p99991231 INTO (PARTITION ediods_nae_nthwjnl1_p20171231 VALUES LESS THAN ('2018-01-01'),PARTITION ediods_nae_nthwjnl1_p20180101 VALUES LESS THAN ('2018-01-02'),……PARTITION ediods_nae_nthwjnl1_p20201229 VALUES LESS THAN ('2020-12-30'),PARTITION ediods_nae_nthwjnl1_p20201230 VALUES LESS THAN ('2020-12-31'),PARTITION ediods_nae_nthwjnl1_p99991231_NEW VALUES LESS THAN (MAXVALUE) );ALTER TABLE ediods.nae_nthwjnl1 RENAME PARTITION ediods_nae_nthwjnl1_p99991231_NEW TO ediods_nae_nthwjnl1_p99991231;5.4.%3 删除分区(清理数据使用)alter table EDISUM:SUFFIX.E03_INDV_TIME_DPSIT_ACCT truncate partition EDISum_E03_INDV_TIME_DPSIT_ACCT_P:TX_DATE;语法是可以使用直接alter table具体值的方法以删除分区的。但因为出过较多生产问题,因此请开发人员勿使用直接删除分区日期的写法,而应采用上述蓝色字体写法来删除分区。5.5.%3 隐式转换运算差异select 字符*数字这个是隐式转换了,字符默认转为数字。如果字符不是数字,GaussDB(DWS)会报错,TD会转为0继续做运算。例:select '-'*7TD:0GaussDB(DWS): 报错select TRIM('-')*7TD:0GaussDB(DWS): 报错select '.'*7TD: 报错GaussDB(DWS): 报错select TRIM('.')*7TD: 0GaussDB(DWS): 报错select 'h'*7TD: 报错GaussDB(DWS): 报错select TRIM('h')*7TD: 报错GaussDB(DWS): 报错
  • [迁移系列] 数据仓库迁移方案
    第1章. 项目背景和目的首先,了解项目的背景和目的,才能设计出满足客户需求的迁移方案。1.1. 项目背景比如:XX银行基于Teradata一体机构建的数据仓库,存在成本高、可替换性差、在线升级能力弱等问题,希望引入扩展性更强、具有成本竞争力、在线升级能力强的产品替代。1.2. 项目目标比如项目总体目标:替换的数据仓库产品能力要不低于现网Teradata的整体能力,而且要满足数仓上下游生态工具的对接,做到对应用的改动量最小化。第2章. 数仓迁移方案设计2.1. 需求分析与规划设计 2.1.1. 数仓迁移总体规划数仓迁移是一个系统的复杂的过程,涉及数据迁移、加工逻辑迁移及应用改造。在掌握通用迁移方法论的基础上,还需要结合源数据库和目标数据库的数据库特性进行迁移方案的优化,不然就有可能导致迁移项目失败,浪费人力和财力。比如:分为两个大的阶段进行,第一阶段从xx日期到xx日期完成主仓迁移,第二阶段从xx日期到xx日期完成集市层迁移等。2.1.2. 需求分析及调研评估2.1.2.1 需求调研分析信息收集会贯穿整个数仓迁移项目的生命周期,通常需要多次多种方式的收集动作。在不同阶段使用的信息收集方法也不相同。• 数仓信息收集1) 数据库环境信息调研表比如:源数据版本,并发数,字符集,函数等2) 源数据搬迁调研表比如:源数据库的数据架构、数据量等。3) 第三方软件调研比如:ETL的调度工具,对接的分析工具等。4) 用户权限调研比如:总共有多少个用户、多少个应用,用户与应用的权限关系等。5) 特定源数据库技术(以下为示例)如有,请描述。2.1.2.2. 系统架构系统架构主要表述了契合一个环境的系统的基本元素及元素之间的关系构成的结构集,在环境中体现出来的基本属性,以及设计与演进的原则。通过系统架构,我们通常可以粗略了解该系统的一个全貌,包括该系统由哪些组件构成,他们的关系是什么,以及与其有关联的上下文系统的关系。比如常见的金融数仓系统架构主要由数据仓库系统、作业调度系统、文件或数据传输系统、上游业务系统、下游应用系统等构成,他们直接通过一定的关系有机地组成了一个数据仓库的整体。比如2.1.2.3. 数据架构数据架构,可以帮助我们熟悉数据的源头以及数据在整个系统中的一个流转过程。比如,下图是一个常见的金融系统的数据架构。2.1.2.4. 调研评估迁移评估调研是整个数仓迁移工作的基础,为数仓迁移方案规划和实施提供信息基础。并对迁移技术可行性、实施难度、风险、资源需求进行整体分析和评估。迁移评估调研主要包括以下内容:1) 信息调研:通过上述信息调研和原厂以往经验,认为可以从当前环境中将数据迁移到GaussDB数据库。2) 业务关联性分析和评估:根据上述基本信息调研,评估是否可以对接其关联的系统。3) 迁移风险分析和评估:可能存在极少数兼容性的问题或者数值型精度的问题,评估风险可控。2.2. 环境准备 四套环境:原数仓的比对环境、新数仓的单元测试环境、集成测试环境和生产环境。2.2.1. 环境部署方案GaussDB(DWS)系统的网络划分为2个平面,即业务平面和管理平面,两个平面之间采用物理隔离的方式进行部署,保证业务、管理各自网络的安全性。主备管理节点还支持设置外部管理网络的IP地址,用户可以通过外部管理网络进行集群管理。采用双平面组网时,集群中每个节点分别接入管理平面和业务平面,每个节点需要准备一个管理IP地址和一个业务IP地址,每个IP地址用两个网络接口配置Bond,分别接入两个接入交换机。各节点的业务平面建议采用25GE带宽,业务平面接入交换机与汇聚交换机之间建议采用25GE带宽,业务平面汇聚交换机的堆叠带宽建议设置为40GE。2.2.2. 数据库设计数据库设计需要考虑的问题:1、 创建数据库时,使用什么字符集?比如使用UTF8 or latin字符集2、 目标数据库与原数据库的特性差异及对应关系比如:Teradata是按照”库,子库”这样的方式进行的单元组织;GaussDB(DWS)是按照“库,Schema”这样的方式进行的单元组织。两者转换后的对应关系如下:原Teradata的根库DBC转换到GaussDB以后为一个schema;(之所以仍然保留DBC是因为我们脚本中使用了很多原dbc的系统表,为了减小业务脚本的改动量,我们保留该Schema)。3、 用户及权限管理用户的权限设计应该与原设计基本相同,数据库的用户权限管理与原Teradata的权限管理的形式基本一致。原Teradata库中的权限设计中将每个库的权限拆成四类权限组:表和视图的查询访问权限(查询)表和视图的增删改访问权限(IDU)创建对象、清空表、修改对象的约束等权限(Tab)函数执行、序列访问等其他权限(其他)4、作业调度方案作业调度通常可以采用与原来一致的调度方式即可。5、迁移工具迁移工具通常分两类:一类考虑如何将数据从源数据库中搬迁到目标数据库中;比如DSC工具。一类考虑如何根据目标数据库生成业务脚本:比如XX银行的IDE工具2.3.4. 迁移策略2.3.4.1. 迁移策略分析常见的三种迁移策略:2.3.4.2. 迁移策略的选择根据信息调研以及业务的不同、目标和计划的不同,综合评估后选择上述其中之一即可;比如zx客户选择了“渐进式迁移”,而hg客户选择了“重新设计迁移”。2.3.5. 迁移实施计划通常根据客户的目标和总体计划倒排计划,不详述。2.3.6. 迁移流程从异构数据库迁移到GaussDB(DWS)数据库,一般要经过需求调研与评估→环境准备→分析设计→开发→测试→切换六个阶段,期间涉及数据库厂商、应用开发商、业务部门、科技部门等多个部门和组织的协同配合,为了保证迁移项目成功,每一个环节都要仔细分析并加以充分验证。2.3.6.1. 迁移对象分类数仓迁移是一个系统的复杂的过程,涉及数据迁移、加工逻辑迁移及应用改造。为了将整个工程变得简单化,通常情况会将迁移对象分为以下几大类,包括元数据迁移,业务数据迁移,业务脚本迁移,调度系统迁移等。在这几大类的基础上,通常还会结合客户的实际情况分阶段,分层次等手段进一步拆解任务。2.3.6.2. 元数据迁移2.3.6.2.1. 元数据迁移方案元数据迁移包括源数据库的库,表,视图,函数,用户及权限等;首先从源库中读取建表的DDL等信息;通过人工创建或者DSC语法迁移工具自动化实现语法的转译和改写后,在目标库中执行创建,并进行测试和验证;语法迁移工具将显示迁移过程状态,并用日志记录操作过程中发生的错误。2.3.6.2.2. 各模块元数据迁移方案缓冲层元数据迁移数据缓冲层包括接收的核心系统、个贷系统等业务系统的数据。数据以增量或全量形式进入数据仓库,表数量、脚本程序数量较大,缓冲层表是根据DDL每日根据数据加载程序自动生成“表名+数据日期”的数据表。主要工作包括:统计需要完成多少DDL、视图,函数,用户及权限的迁移等。主题层元数据迁移主题加工层是数据仓库的核心部分,采用三范式设计。当前银行数仓主要采用FS-LDM主题模型设计。主要工作包括:统计需要完成多少DDL、视图,函数,用户及权限的迁移等。汇总层元数据迁移汇总层又叫共性加工层,通常分为明细加工层、汇总加工层;是对主题模型的轻度汇总。主要工作包括:统计需要完成多少DDL、视图,函数,用户及权限的迁移等。集市元数据迁移集市主要是根据不同的业务进行划分的应用;比如监管报送、1104报表等。 主要工作包括:统计需要完成多少DDL、视图,函数,用户及权限的迁移等。2.3.6.3. 作业脚本迁移2.3.6.3.1. 作业迁移方案业务迁移,主要是将作业脚本中Teradata的SQL语法等信息通过语法迁移工具自动化实现转换为GaussDB(DWS)语法,实现作业一对一的迁移, 作业转换后需要测试功能及性能调优;语法迁移工具将显示迁移过程状态,并用日志记录操作过程中发生的错误。各个模块的迁移方法同“元数据迁移”类似,需要根据不同的模块分别调研并统计需要迁移的作业等,不再赘述。2.3.6.4. 业务数据迁移在数仓迁移项目中,现有存量数据迁移占据着非常重要的位置,通常在数据库元数据迁移完成之后进行,主要包括历史数据迁移和实时数据迁移,可使用迁移工具将数据从源数据库迁移到目标数据库。2.3.6.4.1. 各模块数据迁移方案根据数据架构,调研每个模块需要迁移的数据,方法类似“元数据迁移”,不再赘述。 2.3.6.5. 数据核验方案2.3.6.5.1. 数据核验目标数据检核的目标主要有:据核验的目标是比对新平台的业务数据与原平台的业务数据一致。为了达到以上目标,需要考虑以下几个方面:• 表级记录数一致• 表级记录sum值一致• 表级按照维度分类一致• 记录级的MD5值一致2.3.6.5.2. 各模块数据核验方案各模块的验证方案需要根据数据架构进行调研并参照“元数据迁移”的方法进行验证。2.3.6.6. 并行期策略方案2.3.6.6.1. 作业追批方案对于业务数据迁移,一般采用首次全量导出导入,之后通过增量文件追批的方式进行。在保证调度系统一致,首次全量验证通过以后,可以开始追批。不同的环境,追批的标准不同,开发测试环境可以进行多轮追批,集成测试环境一般设置2~3轮的追批,而生产环境一般是两轮的的追批方式。2.3.6.7. 应用切换方案2.3.6.7.1. 应用切换原则应用切换的原则主要有:1) 应用切换要确保原来的数据及任务平稳从原来的源环境过渡到目标环境。2) 数据迁移的上线,要稳抓稳打,逐步推进。或分层、或分应用,分阶段、分步骤逐步上线。3) 确保切换前后数据的完整性;也就是转换过程中不能丢失数据。4) 确保切换前后加工任务的工作效率,达到项目要求的效率。
  • [生态空间] MRS数据连通GaussDB(DWS)问题
    请问一下啊,根据操作手册,MRS中Hive的数据需要导入或者被DWS查询。需要建立外部服务器-->创建hdfs的外表CREATE SERVER hdfs_server_hds_dev FOREIGN DATA WRAPPER HDFS_FDW OPTIONS ( address '192.168.1.245:25000,192.168.1.218:25000', hdfscfgpath '/MRS/hds_dev', type 'hdfs' );请问示例中hdfscfgpath说的集群配置文件到底是啥?当全部操作完后,用dws查询外表,提示/MRS/hds_dev不存在。随后,我在hdfs上创建了这个目录(/MRS/hds_dev),里面放了core-xml hdfs-xml等配置文件,重新创建外部服务器和外表,依然提示/MRS/hds_dev不存在。请问大神,到底是啥问题。
  • [知识分享] 详解GaussDB(DWS)的CPU资源隔离管控能力
    >摘要:GaussDB使用cgroup实现了两种cpu管控能力,基于cpu.shares的共享配额管控和基于cpuset的专属限额管控。 本文分享自华为云社区《[GaussDB(DWS)的CPU资源隔离管控能力【这次高斯不是数学家】](https://bbs.huaweicloud.com/blogs/355346?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=other&utm_content=content)》,作者:门前一棵葡萄树。 # 一、cgroup概述 cgroup全称control group,是linux内核提供的用于对进程/线程使用的资源进行隔离、管控以及记录的组件。 相关概念: 1. 任务(task):对应系统中的一个进程/线程; 2. 控制组(control group):进行资源限制隔离的基本单位,一个任务加入到控制组任务列表(tasks)后即受控制组资源控制,支持在线将一个任务从一个控制组迁移到另外一个控制组。 3. 层级(hierarchy):控制组是一种树形结构,一个父控制组可以有多个子控制组,一个子控制组只能属于一个父控制组。同属一个父控制组的子控制组间按照资源配置进行资源争抢、隔离,子控制组继承父控制组的资源配置。 4. 子系统(subsytem):一个子系统对应一种资源的资源控制器,比如CPU子系统是控制CPU时间分配的控制器,CPUSET子系统是控制CPU核分配的控制器。 cgroup主要子系统介绍: 1. cpu子系统:限制任务的cpu使用率; 2. cpuacct 子系统:统计cgroup中所有任务使用cpu的累积信息,单位ns; 3. cpuset子系统:限制任务能够使用的cpu核; 4. memory子系统:限制任务的memory使用; 5. blkio子系统:限制任务磁盘IO; 这里我们着重介绍GaussDB应用到的cgroup子系统,涉及的子系统包括:cpu子系统、cpuacct 子系统以及cpuset子系统。 ## 1.1 cgroup文件系统 VFS (Virtual File System) 虚拟文件系统是系统内核非常强大的一个功能,它把文件系统的具体实现细节隐藏起来,给用户态进程提供一个统一的文件系统API接口。cgroup的接口操作也是基于VFS实现的,可以通过mount命令查看cgroup挂载信息,每个目录对应cgroup的一个子系统。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654131634793159558.png) ### 1.1.1 cpu & cpuacct 子系统 cpu子系统和cpuacct子系统相辅相成,cpu子系统限制cgroup使用的cpu时间,cpuacct统计cgroup使用的cpu时间,同时cpu子系统与cpuacct子系统挂载路径一致,因此可以把这两个子系统放在一起讨论: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654131651878345103.png) **tasks** tasks记录着关联到该cgroup的任务(进程/线程)pid,只有加入tasks的任务才受cgroup控制。 cpu子系统用于控制cgroup中所有任务可以使用的cpu时间,主要包含以下几个接口: **cpu.cfs_period_us & cpu.cfs_quota_us** cfs_period_us 与cfs_quota_us 需要组合使用,cfs_period_us用来配置进行cpu限制的单位时间周期,cfs_quota_us用来配置在设置的时间周期内所能使用的CPU时间。二者单位都是微秒(us),cfs_period_us的取值范围为1毫秒(ms)到1秒(s),cfs_quota_us的取值大于1ms即可,如果cfs_quota_us的值为-1(默认值),表示不受cpu周期的限制。举例说明: ``` 1. 限制只能使用1个CPU(每100ms能使用100ms的CPU时间,即可以使用一个cpu) # echo 100000 > cpu.cfs_quota_us /* quota = 100ms */ # echo 100000 > cpu.cfs_period_us /* period = 100ms */ 2. 限制使用3个CPU(内核)(每100ms能使用300ms的CPU时间,即可以使用两个cpu) # echo 300000 > cpu.cfs_quota_us /* quota = 300ms */ # echo 100000 > cpu.cfs_period_us /* period = 100ms */ 3. 限制使用1个CPU的30%(每100ms能使用30ms的CPU时间,即可以使用30%的cpu) # echo 30000 > cpu.cfs_quota_us /* quota = 30ms */ # echo 100000 > cpu.cfs_period_us /* period = 100ms */ ``` **cpu.shares** shares用来设置cgroup中任务CPU可用时间的相对比例,针对所有可用cpu,默认值是1024,在cpu出现满负载争抢时,各控制组按照shares设置的相对比例争抢cpu。假如系统中有两个cgroup,分别是A和B,A的shares值是10000,B的shares值是20000,那么A和B出现cpu争抢时A将获得10000/(10000+20000)=33.3%的CPU资源,而B将获得66.7%的CPU资源。shares作为一种共享配额的cpu管控方式,具备以下几个特点: - cpu空闲情况下,shares不起作用,只有在cpu出现满负载争抢时,各控制组任务才按照shares配置比例争抢cpu - 空闲cpu其他控制组可以使用,如果A没有使用到33.3%的cpu时间,那么剩余的cpu时间将会被分配给B,即B的CPU使用率可以超过66.7% - 如果添加了一个新的控制组C,且它的shares值是10000,那么A的配额比例变成10000/(10000+20000+10000)=25%,B的cpu配额比例变成50% - 由于shares是一个权重值,需要和其它控制组的权重值进行对比才能得到自己的配额比例,在一个负载多变的环境上,cgroup数量和权重可能是多变的,这样给cgroup配置的配额比例,可能因为增加cgroup或修改其他cgroup权重导致该cgroup配额比例发生变化,无法精确控制cpu使用率。 **cpu.stat** stat包含以下三项统计结果 - nr_periods: 表示经历了多少个cpu.cfs_period_us里面配置的时间周期 - nr_throttled: 在上面的这些周期中,有多少次cpu受到了限制(即cgroup中的进程在指定的时间周期中用光了它的配额) - throttled_time: cgroup中的进程被限制使用CPU持续了多长时间(纳秒) **cpu.rt_runtime_us & cpu.rt_period_us** rt_runtime_us与rt_period_us组合使用可以对cgroup中的实时调度任务进行cpu时间限制,只可用于实时调度任务。rt_period_us用来配置进行cpu限制的单位时间周期,设置每隔多久cgroup对cpu资源的存取进行重新分配,rt_runtime_us用来配置在设置的时间周期内任务对cpu资源的最长连续访问时间,二者单位都是微秒(us)。 cpuacct(cpu accounting)子系统用于统计cgroup中任务所使用的cpu时间,主要包含以下接口: **cpuacct.usage** 统计cgroup中所有任务使用的cpu时间,单位ns,可以通过写入0值重置统计信息 **cpuacct.usage_percpu** 统计cgroup中所有任务在每个cpu核上使用的cpu时间,单位ns **cpuacct.stat** 统计cgroup中所有任务使用的用户态和系统态cpu时间,单位USER_HZ,格式如下: - user:cgroup中所有任务使用的用户态cpu时间 - system:cgroup中所有任务使用的内核态cpu时间 ### 1.1.2 cpuset 子系统 cpuset子系统可以为cgroup分配专属的cpu核和内存节点,cgroup中所有任务只能运行在分配的cpu和内存节点上。GaussDB仅应用了cpuset子系统的cpu控制能力,因此我们这里仅介绍cpu相关控制接口。 **cpuset.cpus** 设置cgroup中任务可以使用的cpu,使用小横线‘-’设置连续cpu,不连续cpu之间使用逗号‘,’分隔。例如:0-1,11-12,17 表示cgroup可以使用cpu 0、1、11、12、17。 **cpuset.cpu_exclusive** 包含标签0和1,可以控制其他cpuset及其父子cpuset是否可以共享该cpuset的cpu,默认值为0,cpu不会专门分配给某个cpuset。 **cpuset.sched_load_balance** 包含标签0和1,设定内核是否可以在该cpuset的cpu上进行负载均衡,默认值1,表示内核可以将超载cpu上的任务移动至低负载cpu上以平衡负载。 注意:如果父cgroup启用了负载均衡,则其所有子cgroup默认开启负载均衡,因此如果要禁用cgroup的负载均衡,则其所有上层cgroup都需要关闭负载均衡,同时需要考虑其他同层cgroup是否能够关闭负载均衡。 **cpuset.sched_relax_domain_level** 表示内核进行负载均衡的策略,如果禁用负载均衡则该值无意义。不同系统框架下,该值意义可能不同,以下为常用值的含义: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654131802077636581.png) # 二、GaussDB的cpu管控 GaussDB支持两种cpu管控能力,基于cpu.shares的共享配额管控和基于cpuset的专属限额管控。在介绍GaussDB的cpu管控之前,我们首先介绍GaussDB中的cgroup结构。 ## 2.1 GaussDB的cgroup层级模型 GaussDB的cpu管控需要考虑其他进程与GaussDB之间的cpu管控,GaussDB内核后台线程与用户线程之间的cpu管控,用户之间的cpu管控。为了应对不同层级的cpu隔离管控需求,GaussDB设计了基于cgroup层级特点的cpu分层隔离管控,GaussDB的cgroup层级模型如下图所示: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20226/2/1654131821960352686.png) 以上cgroup均适配了cpu子系统和cpuset子系统,每一个cgroup都包含两个值:cpu.shares和cpuset.cpus。GaussDB借助cgroup提供了三个维度的cpu隔离管控能力: 1. GaussDB与其他进程之间的隔离管控 2. 数据库常驻后台线程与作业线程的隔离管控 3. 数据库用户之间的隔离管控 **GaussDB与其他进程之间的隔离管控** 数据库集群的每个节点在cgroup的cpu子系统和cpuset子系统内均包含一个专属目录:“GaussDB:gaussdba”,作为GaussDB的主cgroup节点(目录),用于限制和记录GaussDB内所有线程使用的cpu,GaussDB进程内所有线程均直接或间接的受到该cgroup的限制。通过限制GaussDB内核使用的cpu,可防止数据库系统对其他应用程序造成影响。 **数据库常驻后台线程与作业线程的隔离管控** GaussDB主cgroup节点之下包含两个cgroup:Backend控制组和Class控制组。Backend控制组用于GaussDB常驻后台线程的cpu隔离管控,Class控制组用于作业线程的cpu隔离管控。大部分后台常驻线程cpu资源占用较少,但AutoVacuum线程cpu资源占用可能较多,因此在Backend控制组单独提供Vacuum控制组用于AutoVaccum线程的cpu资源限制,而除AutoVacuum之外的其他后台常驻线程均受到DefaultBackend控制组的cpu资源限制。 **数据库用户之间的隔离管控** 通常情况下数据库系统会同时运行多种类型的作业,不同类型作业之间可能出现cpu资源争抢。GaussDB资源管理为用户提供了双层的cgroup层级结构用于cpu隔离管控,用户可按需创建和修改cgroup配置实现不同类型作业之间的cpu资源限制。用户双层cgroup包含以下控制组: - UserClass控制组:用户创建的父控制组,主要实现cpu资源的初步划分,如:不同的父控制组可以属于不同的部门/分公司 - RemainWD控制组:包含UserClass控制组创建UserWD控制组后剩余的cpu资源 - Timeshare控制组:创建UserClass控制组时默认创建的优先级控制组,包含四个优先级的控制组:Rush:High:Medium:Low,资源配比为:8:4:2:1 - UserWD控制组:用户创建的子控制组,在父控制组基础上实现cpu资源的细粒度划分,如:不同的子控制组可以属于同一部门下的不同类型作业 ## 2.2 GaussDB作业的cpu管控 数据库系统中运行多种类型作业出现cpu争取时,不同用户可能有不同的诉求,主要诉求如下: 1. 实现cpu资源的充分利用,不在意单一类型作业的性能,主要关注cpu整体吞吐量 2. 允许一定程度的cpu资源争抢和性能损耗,在cpu空闲情况下实现cpu资源充分利用,在cpu满负载情况下希望各类型按比例使用cpu 3. 部分作业对性能敏感,不在意cpu资源的浪费 对于第一种诉求,不建议进行用户之间的cpu隔离管控,不管控哪一种的cpu管控都或多或少的对cpu整体使用率产生影响;对于第二种诉求可以采用基于cpu.shares的共享配额管控方式,实现满负载cpu隔离管控前提下尽量提高cpu整体使用率;对于第三种诉求可以采用基于cpuset.cpus的专属限额管控方式,实现不同类型作业之间的cpu绝对隔离。下面对这两种作业cpu管控方式进行简要介绍,具体细节和使用中的疑问,我们后面文章再详细介绍,用兴趣的朋友也可以自己动手实验。 ### 2.2.1 CPU的共享配额管控 共享配额有两层含义: 共享:cpu是所有控制组共享的,空闲的cpu资源其他控制组能够使用 配额:业务繁忙cpu满负载情况下,控制组之间按照配额比例进行cpu抢占 共享配额基于cpu.shares实现,通过上面cgroup的介绍我们可知这种管控方式只有在cpu满负载情况下生效,因此在cpu空闲情况下并不能保证控制组能够抢占到配额比例的cpu资源。cpu空闲是不是可以理解为没有cpu资源争抢,控制组内任务可以任意使用cpu,因此不会有性能影响呢?答案是错误的,虽然cpu平均使用率可能不高,但是某个特定时刻还是可能存在cpu资源争抢的。示例: 10个cpu上运行10个作业,每个cpu上运行一个作业,这种情况下各作业在任意时刻请求cpu都可以瞬间得到响应,作业之间没有任何cpu资源的争抢;但是假如10个cpu上运行20个作业,因为作业不会一直占用cpu,在某些时间可能等待IO、网络等,因此cpu使用率可能并不高,此时cpu资源看似空闲,但是在某个时刻可能出现2~N作业同时请求一个cpu的情况出现,此时即会导致cpu资源争抢,影响作业性能。 通过测试验证,在cpu满负载情况下,控制组之间基本可以按照配额比例占用cpu,实现cpu资源的配额管控。 ### 2.2.2 CPU的专属限额管控 专属限额有两层含义: 专属:cpu是某个控制组专属的,空闲的cpu资源其他控制组不能使用 限额:只能使用限额配置的cpu资源,其他控制组空闲的cpu资源,也不能抢占 专属限额基于cpuset.cpus实现,通过合理的限额设置可以实现控制组之间cpu资源的绝对隔离,各控制组间任务互不影响。但是因为cpu的绝对隔离,因此在控制组空闲时就会导致cpu资源的极大浪费,因此限额设置不能太大。那从作业性能来看是不是限额越大越好呢?答案是不完全正确,示例: 假设10个作业运行在10个cpu上,cpu平均使用率5%左右;10个作业运行在5个cpu上,cpu平均使用率10%左右。通过上面共享配额的性能分析我们可知:虽然10个作业运行在5个cpu上cpu使用率很低,看似空闲,但是相对10个作业运行在10个cpu上还是存在某种程度的cpu资源争抢的,因此10个作业运行在10个cpu上性能要好于运行在5个cpu上。那是不是越多越好呢?10个作业运行在20个cpu上,在任意一个时刻,总会至少10个cpu是空闲的,因此理论上10个作业运行在20个cpu上并不会比运行在10个cpu上性能更好。 因此我们可以得知,对于并发为N的控制组,分配cpus小于N的情况下,cpu越多作业性能越好;但是当分配cpus大于N的情况下,性能就不会有任何提升了。 ### 2.2.3 共享配额与专属限额对比 cpu共享配额和专属限额的管控方式各有优劣,共享配额能够实现CPU资源的充分利用,但是各控制组之间资源隔离不彻底,可能影响查询性能;专属限额的管控方式可以实现cpu资源的绝对隔离,但是在cpu资源空闲时会造成cpu资源的浪费。相对专属限额来说,共享配额拥有更高的cpu使用率和更高的整体作业吞吐量;相对共享配额来说,专属限额cpu隔离彻底,更满足性能敏感用户的使用诉求。 从上面GaussDB的cgroup层级结构我们得知,用户cgroup是包含父子两层控制的,那可不可以父控制组一层使用专属限额,而子控制组一层使用共享配额呢?答案是肯定的,另外同一层控制组也可以同时有使用专属限额和共享配额的控制存在。具体使用本文不做介绍,有兴趣的可以自己试验。
  • [生态空间] GaussDB A 线下800版本,对表的压缩方式及单表列数量有什么建议?
    【操作步骤&问题现象】GaussDB A 线下800版本,对表的压缩方式及单表列数量有什么建议?如 那种场景采用那种数据压缩格式、单表列数量最好不要超过1000等
  • [生态空间] 论《快速入门数据仓库服务GaussDB(DWS)》 实验100%完成
    实验链接:沙箱实验室_在线实验_上云实践_云计算实验_AI实验_华为云官方实验平台-华为云 (huaweicloud.com)该实验经回炉重造后,1. DWS购买模块已经可以正常检测,所购买的规格以需求文字为准,忽略末尾截图2. 可以再开一个Te窗口,然后vim进去,粘贴所需要的的命令,i 之后进行修改OBS,AK,SK等,然后复制粘贴到连接Gauss DB  DWS处运行3. 在填写SK的时候,注意user不需要复制4. 剩余的问题就是,现在的需求是让,下载的压缩包cp至/home目录下,原来是/opt没有,会提示没有权限,其实他是个user用户。/home也一样提示没有权限解决方案如上图,直接cd至下载目录,然后直接输入解压命令即可,再往下,即可搞定实验
  • [云实验室] 论《快速入门数据仓库服务GaussDB(DWS)》 实验100%完成
    实验链接:沙箱实验室_在线实验_上云实践_云计算实验_AI实验_华为云官方实验平台-华为云 (huaweicloud.com)该实验经回炉重造后,1. DWS购买模块已经可以正常检测,所购买的规格以需求文字为准,忽略末尾截图2. 可以再开一个Te窗口,然后vim进去,粘贴所需要的的命令,i 之后进行修改OBS,AK,SK等,然后复制粘贴到连接Gauss DB  DWS处运行3. 在填写SK的时候,注意user不需要复制4. 剩余的问题就是,现在的需求是让,下载的压缩包cp至/home目录下,原来是/opt没有,会提示没有权限,其实他是个user用户。/home也一样提示没有权限解决方案如上图,直接cd至下载目录,然后直接输入解压命令即可,再往下,即可搞定实验
  • [知识分享] 深入解读SQL的聚集函数
    本文分享自华为云社区《[GaussDB(DWS) SQL进阶之SQL操作之聚集函数](https://bbs.huaweicloud.com/blogs/293963?utm_source=csdn&utm_medium=bbs-ex&utm_campaign=other&utm_content=content)》,作者:两杯咖啡。 聚集操作是SQL语言中除扫描、投影、连接外的另一个常用基本操作,主要用于对海量数据进行分组,然后在组内进行统计计算的场景。在AP场景下,经常面临海量数据处理的场景,而最终用户希望通过海量数据获取汇总信息,聚集操作的使用将更加广泛。本文从基本聚集操作入手,介绍常用的SQL语法,以及一些扩展的聚集功能,同时会讲到在GaussDB(DWS)里聚集相关的一些优化思路。 # 一.典型语法 SQL的聚集操作的典型语法是: ``` SELECT , , Agg_func() FROM t GROUP BY 1, 2 HAVING ; ``` 其中基本元素及概念如下: - 聚集操作子句 在SQL中,聚集操作子句通过GROUP BY实现,后面紧接聚集分组列,可以是列名,或者本层输出列的顺序号,从1开始。 - 聚集分组列 聚集分组列表明本聚集操作是以哪些列的值进行分组的,聚集分组列值均相等的元组会被划分到同一组。聚集分组列可以是一个,也可以是多个。 - 聚集函数 聚集函数即进行分组后,每组进行统计计算的函数,分为简单的和复杂的聚集函数。其中常用简单聚集函数包括以下五种: - COUNT():用于进行分组内的计数。对于COUNT (column),计数不包含column为NULL值的元组;对于COUNT (*),计数包含所有元组。 - SUM():用于计算分组内列或表达式的和,计算不包含列为NULL值的元组。 - AVG():用于计算分组内列或表达式的平均值,AVG(col)等价于SUM(col)/ COUNT(col)(分组内存在元组)。 - MIN():用于计算分组内列或表达式的最小值。 - MAX():用于计算分组内列或表达式的最大值。 注: 1. 如果缺少GROUP BY且包含聚集函数,则所有元组视为一个分组。 2. 聚集函数不能嵌套。 - 聚集分组过滤条件 该条件为进行完聚集操作后,以分组为单位进行过滤的条件。聚集分组过滤条件是HAVING条件,在聚集后进行过滤,而我们通常使用的WHERE条件,需要在分组前进行过滤。 语法要求: 由于聚集操作是对聚集列进行去重分组,并进行聚集函数的分组计算,因为聚集操作的输出列和过滤条件中只能包含聚集列、聚集函数和常量,以及由它们组成的表达式。当出现非聚集列时,查询会报错。 特殊地,GaussDB(DWS)支持在主键列或唯一约束列上进行聚集的操作(尽管该操作为冗余操作),此时可以在输出列和过滤条件中包含任何列。 以TPC-H测试集的lineitem表举例说明,该表记录订单里的每种类型的零件,所属的订单号,零件所属的供应商,在订单中的序号以及价格、发货等信息。 表定义如下: ``` CREATE TABLE LINEITEM ( L_ORDERKEY BIGINT NOT NULL , L_PARTKEY BIGINT NOT NULL , L_SUPPKEY BIGINT NOT NULL , L_LINENUMBER BIGINT NOT NULL , L_QUANTITY DECIMAL(15,2) NOT NULL , L_EXTENDEDPRICE DECIMAL(15,2) NOT NULL , L_DISCOUNT DECIMAL(15,2) NOT NULL , L_TAX DECIMAL(15,2) NOT NULL , L_RETURNFLAG CHAR(1) NOT NULL , L_LINESTATUS CHAR(1) NOT NULL , L_SHIPDATE DATE NOT NULL , L_COMMITDATE DATE NOT NULL , L_RECEIPTDATE DATE NOT NULL , L_SHIPINSTRUCT CHAR(25) NOT NULL , L_SHIPMODE CHAR(10) NOT NULL , L_COMMENT VARCHAR(44) NOT NULL ) with (orientation = column) distribute by hash(L_ORDERKEY); ``` ``` SELECT MAX(l_receiptdate) FROM lineitem; -- 正确,获得所有零件的最后收货时间 SELECT SUM(l_quantity) FROM lineitem where l_orderkey=100000; -- 正确,获得订单号为100000的零件总数 SELECT l_orderkey, MAX(l_shipdate), MIN(l_shipdate) FROM lineitem GROUP BY l_orderkey; -- 正确,求每个订单的最早发货日期和最晚发货日期 SELECT l_orderkey, MAX(l_shipdate), MIN(l_shipdate) FROM lineitem GROUP BY 1; -- 正确,等价于上一条语句 SELECT l_orderkey, MAX(l_shipdate), MIN(l_shipdate) FROM lineitem GROUP BY 1 HAVING MIN(l_shipdate) ‘1999-01-01’; -- 正确,求零件最早发货日期在1999-01-01之前的,每个订单的最早和最晚的发货日期(每个零件可能单独发货) SELECT l_orderkey || ‘_’ || SUM(l_quantity), SUM(L_EXTENDEDPRICE) FROM lineitem GROUP BY l_orderkey; -- 正确,求每个订单的组合标识(订单号+零件个数),以及总价格 SELECT l_orderkey, l_partkey, AVG(l_discount) FROM lineitem GROUP BY 1; -- 错误,l_partkey不是聚集列,但出现在输出列中 ``` # 二.GaussDB(DWS)聚集执行及调优 在GaussDB(DWS)中,由于是分布式系统,数据计算应该尽量在各个DN上并行计算以得到最优的性能。因此,支持以下聚集操作计算方式: - 如果分布键是GROUP BY列的子集,此时在各个DN上分别计算,结果汇总即可。 例如:lineitem表以l_orderkey作为分布键,则聚集列包含l_orderkey的均可以在各DN执行后汇总。 - 对于不满足(1)的场景,各DN分别执行后,DN间仍然可能存在聚集列相等的数据,需要二次聚集,此时GaussDB(DWS)支持三种计算方式。 示例语句(TPC-H Q1,输出列部分省略): ``` select l_returnflag, l_linestatus, sum(l_quantity) as sum_qty from lineitem where l_shipdate = date '1998-12-01' - interval '90' day (3) group by l_returnflag, l_linestatus order by l_returnflag, l_linestatus; ``` 1> 各DN上进行一次聚集,将结果汇总到CN上进行二次聚集。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/27/1653616710068446381.png) lineitem总共行数为59亿行。该方法中,经过DN一次聚集后,各DN输出4行数据(全局96行),这些数据汇总到CN上,由CN进行96行数据的二次聚集,最终输出6行数据。(数据信息均为估算值) 2> 选择聚集列的子集列进行重分布,回退到(1)的情况后,各DN分别聚集后进行结果汇总。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/27/1653616720012379098.png) 该方法中,首先按聚集的两列进行重分布,重分布数据量为59亿,然后各DN完成聚集,并将结果返回CN。 3> 各DN上进行一次聚集,然后选择聚集列的子集列进行重分布,各DN上进行二次聚集后结果汇总。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/27/1653616728839115660.png) 该方法中,各DN进行一次聚集,行数由59亿减少到4行,然后按聚集的两列进行重分布,各DN进行二次聚集。 可以看出,该查询适合用1>和3>的方式进行执行,因为聚集后的行数比较少,在CN上执行或重分布的数据量都不大,所以开销较小。而2>的方式要对59亿行数据进行网络重分布,网络占用较大。可以总结出三种方法的适用场景: 1> 该方法适合于一次聚集后行数较少且DN数较少的场景,这样汇聚到CN的行数较少,不会导致CN成为计算的瓶颈。 2> 相较于3>方法,该方法适合于DN一次聚集后行数缩减不明显的场景,这时可以以所有数据重分布的代价,省略DN的一次聚集操作。 3> 与2>相反,该方法适合于DN一次聚集后行数缩减明显的场景,例如上面的示例。 在GaussDB(DWS)中,以上三种方法的选择是根据代价来自动选择的,也可以通过参数best_agg_plan来强制控制选择某种方法进行执行。best_agg_plan=1, 2, 3分别对应于上述三种方法,0为默认值,表示由产品自动选择最优计划。 在单DN上执行时,GaussDB(DWS)支持以下三种算法: 1> Plain Agg:最终仅输出一行数据,适合于无聚集列的场景。 2> HashAgg:使用Hash表来进行元组的去重,首先计算聚集列的hash值,hash值相同的再进行列值的比较,避免与所有数据比较后进行去重。去重时进行聚集函数的计算。适合于聚集后行数缩减较多的场景。 3> Sort + GroupAgg:首先对数据按照聚集列进行排序,这样聚集列相等的元组均相邻,通过遍历一遍排序后的数据,即可完成元组的去重和聚集函数的计算。相较于2>,适合于聚集后行数缩减较少的场景。 以上2>和3>的方法可以通过参数enable_sort和enable_hashagg来控制(默认均为on)。当enable_hashagg=on且enable_sort=off时,优先选择2>;当enable_sort=on且enable_hashagg=off时,优先选择3>。大数据量场景,通常HashAgg可以获得较好的性能,所以GaussDB(DWS)对HashAgg进行了较深入的优化。对于个别场景选择3>的方法导致性能问题,可以通过关闭enable_sort来进行调优。 # 三.DISTINCT表达式 聚集函数中,均可以通过关键字DISTINCT对聚集列进行去重后进行计算,例如:COUNT(DISTINCT col)表示分组内col值不同的值的个数。 ``` SELECT COUNT(DISTINCT(l_partkey)) FROM lineitem GROUP BY l_returnflag, l_linestatus; -- 计算每种发货状态下的不同零件数量 ``` 在分布式环境下,为了避免l_partkey相同的值在不同的DN上导致无法去重,GaussDB(DWS)对DISTINCT类操作进行了转换,上面语句等价于: ``` SELECT COUNT(l_partkey) FROM (select l_returnflag, l_linestatus, l_partkey FROM lineitem GROUP BY l_returnflag, l_linestatus, l_partkey) GROUP BY l_returnflag, l_linestatus; ``` 这样,在GaussDB(DWS)中实际上使用两次Agg来计算DISTINCT表达式的值,计划如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/27/1653616772928584967.png) 通过计划可以看出,第8-9层为lineitem基表扫描,上面有两次Agg处理COUNT(DISTINCT)算子。第6-7行为第一次Agg,聚集列为:l_returnflag, l_linestatus, l_partkey,选择Hashagg的方法二;第3-5行为第二次Agg,聚集列为:l_returnflag, l_linestatus,选择Hashagg的方法三。 注:目前SQL标准仅支持聚集函数中出现一列,对于要求多列的COUNT(DISTINCT),例如:COUNT(DISTINCT l_partkey, l_suppkey),实际可以通过手动使用上述改写方式进行求解: ``` SELECT COUNT(1) FROM (select l_returnflag, l_linestatus, l_partkey, l_suppkey FROM lineitem GROUP BY l_returnflag, l_linestatus, l_partkey, l_suppkey) GROUP BY l_returnflag, l_linestatus; ``` # 四.聚集扩展功能 在SQL 1999标准中,对聚集函数进行了扩展,新增了OLAP函数ROLLUP(), CUBE(), GROUPING SETS(),用于更灵活的多维数据分组统计功能。其实,这三个函数都可以使用简单的GROUP BY的集合合并操作(UNION ALL)来实现,本文中使用UNION ALL(GROUP BY x)来替代,例如: GROUP BY a UNION ALL GROUP BY b的表达式中,x包括:(a), (b)。本文下面的讨论着重针对x进行。 - ROLLUP()是聚集列前缀的聚集结果的合并实现的,例如: ROLLUP(a, b, c)中,x包括:(a,b,c), (a,b), (a), ()。(其中GROUP BY()表示所有行聚集到一组的无GROUP BY语义),对于n个聚集列,x中包含n+1个聚集组合。 ROLLUP()中的元素可以是列的集合,例如: ROLLUP((a, b), (b, c)),x包括:(a,b,b,c)(等价于(a,b,c)), (a,b), ()。 - CUBE()是聚集列组合的枚举的聚集结果合并实现的,例如: CUBE(a, b, c)中,x包括:(a,b,c), (a,b), (a,c), (b,c), (a), (b), (c), (),对于n个聚集列,x中包含2^n个聚集组合。 - GROUPING SETS()是聚集列的枚举的聚集结果合并实现的,例如: GROUPING SETS(a, b, c, d)中,x包括:(a), (b), (c), (d),对于n个聚集列,x中包含n个聚集组合。 由于OLAP函数中,并不是聚集列均出现在每一个聚集结果中,所以增加GROUPING函数来标识参数列是否参与每一行聚集结果的运算,例如:对于CUBE(a, b, c),其中x包括:(a,b,c), (a,b), (a,c), (b,c), (a), (b), (c), ()时,对于x为(a,b,c), (a,b), (a,c), (a)的聚集结果行,GROUPING(a)的值为0,其它为1。 对于包含OLAP函数的如下语句: ``` select l_returnflag, l_linestatus, l_shipmode, sum(l_extendedprice), grouping(l_returnflag) from lineitem group by cube(1,2,3) order by 1,2,3; ``` GaussDB(DWS)的计划如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/27/1653616842376550370.png) 目前GaussDB(DWS)中使用Sort+GroupAgg来实现OLAP函数,后续版本会支持HashAgg进行执行,提高性能。 # 五.总结 聚集操作是SQL语言中的基本操作,只有深入了解聚集操作的语法、语义和支持的功能范围,才能更灵活地驾驭灵活的SQL语言进行开发,为学习更高阶的SQL语言打下良好的基础。
  • [技术干货] 华为云GaussDB荣获2022数博会领先科技成果奖“新产品”
    5月26日,以“抢数字新机 享数字价值”为主题的2022中国国际大数据产业博览会(简称数博会)以云会议形式在线上顺利召开。其中,在数博发布活动专场,华为云GaussDB(for openGauss)分布式数据库凭卓越的技术实力拿下数博会最高奖项!数博会是全球首个以大数据为主题的国家级博览会,自2015年创办至今,已发展成为展示最新成果、引领行业发展的国际性盛会和交流发展思想、创造合作机遇的世界级平台。而 “数博发布”特色活动,则是大会上众人高度关注的高亮时刻,活动上会集中展示全球的大数据新产品、新技术、新模式,涌现一大批全球大数据领先科技成果奖项以及企业成果,已经成为了引领行业发展的风向标。 在今年的“数博发布”活动中,华为云GaussDB(for openGauss)分布式数据库以领先科技成果奖“新产品”获奖者精彩亮相。GaussDB是华为基于对客户业务高可靠、高性能诉求的理解,结合云原生的技术倾力打造的数据库,涵盖了关系型与非关系型的全场景业务。GaussDB(for openGauss)是主打政企核心业务负载的金融级分布式数据库旗舰产品,它具备应对海量并发事务处理与复杂查询混合负载的能力,通过全并行架构创新,性能大幅领先,具备出色的金融级高可用商用能力。 业界领先金融级分布式架构 实力锻造产品核心竞争力 华为云GaussDB(for openGauss)基于华为主导的开放生态openGauss而打造,采用Share-Nothing的先进分布式数据库架构,具有较好的SQL兼容性和完整的开发、迁移工具,能够支持应用快速迁移。该架构是由众多拥有独立且互不共享CPU、内存、存储等系统资源的逻辑节点组成,业务数据能被分散存储在多个计算节点上,数据查询任务被推送到数据所在位置就近执行,通过协调节点的协调,并行完成大规模的数据处理工作,实现对数据处理的快速响应。 五大核心黑科技全方位加持 成就金融政企客户坚实数据底座作为金融政企数字化转型的首选,GaussDB(for openGauss)在技术的创新性和先进性方面都展示出了明显的优势,拥有高性能、高可用、混合负载、高安全以及AI自治运维等诸多能力,能够满足客户高可靠、高性能、高扩展等多方面需求。 高性能:在充分利用硬件能力基础上,如鲲鹏处理的多线程、原子指令、智能网卡的计算下推等,在软件技术领域通过动态编译、向量化引擎、SQL By Pass等能力,实现极致数据处理能力。高可用:具备同城AZ内高可用、跨AZ高可用、异地跨Region的两地三中心容灾方案,保障了同城AZ内单点故障能够快速切换,满足互联网大型企业核心业务高可用要求。混合负载:基于业界领先的分布式优化器和全并行分布式执行框架,提供极致的吞吐量性能。高安全:作为业界首款纯软全密态数据库,不止实现了数据的传输与存储加密,还实现了内存中数据的运算态加密,从而实现数据全生命周期内的安全保护。AI自治:通过将AI能力引入数据库系统,实现参数自调优和智能索引推荐等,大幅度提升管理和运维能力。百炼成钢 磨砺以须 深入千行百业做企业上云信赖之选 当前,华为云GaussDB已在2000+大客户中规模商用,遍布金融、政府、电信、能源、交通、物流、电商等诸多行业,并已在工商银行、建设银行、邮政储蓄银行、农业银行、交通银行五家国有金融大行、多家股份制银行和保险证券公司中都积累了非常成功的实践经验。在工商银行核心交易系统分布式改造过程中,华为云GaussDB为工商银行提供了一整套完备的一站式数据迁移解决方案,并带来了高可用、性能线性扩展、弹性部署三大重要核心价值,助力客户数据库选型安心,迁移放心,管理省心,经改造后的核心交易系统可靠性得到了大幅度提升,并能够满足未来长期的业务发展需求。在永安保险的业务云化改造过程中,华为云GaussDB成功助力永安保险重构金融云平台,并将意外险和健康险两套业务系统顺利迁移上云,实现RPO=0,RTO秒级,新的金融云平台不仅满足了金融监管要求,而且整体资源投入节省了25%。 持续深耕 砥砺奋进 聚焦技术创新共促产业生态繁荣 华为云GaussDB已连续两年入选Gartner云数据库管理系统魔力象限特定领域者,在IDC《2020年下半年中国关系型数据库软件市场数据跟踪报告》中,GaussDB拥有中国关系型数据库本地部署市场国产数据库份额NO.1、公有云市场数据库份额增速第一的优异成绩。 此次奖项的获得是对GaussDB技术创新实力的高度认可。未来,华为云GaussDB的技术创新之路将永不停歇,持续聚焦数据库根技术,打造更多业界领先的数据库技术与产品,助力企业加速数字化,共促产业生态繁荣!
  • [活动公告] 【有奖征文 第12期】这次高斯不是数学家
    作为世界上最伟大的数学家之一,高斯有着“数学王子”的美誉,以他名字“高斯”命名的成果就达110个,在数学家界独树一帜。但,这次我们谈论的不是数学家高斯。而是华为云的一款明星产品——高斯数据库。华为云GaussDB自发布以来广受关注,该产品现已应用于全球60多个国家和地区,客户包括工行/招行/国网/一汽/梦饷/兴盛优选等,覆盖全行业场景。为了让更多开发者了解高斯数据库、能够更方便地使用高斯数据库,特举办《这次高斯不是数学家》征文活动。本次征文奖品丰厚,HUAWEI WATCH GT 3、雷柏V700合金版黑轴机械键盘、华为手环等你拿,只要写在社区博客发表与高斯数据库技术相关的文章就有机会获得。有点心动?看看详细规则吧:高斯产品/沙箱 免费体验入口点我,之后选择个人开发者点我,之后选择数据库(写与高斯数据库有关的一切皆可,包括产品体验、沙箱体验)我们需要哪些主题的稿件?原则上,我们欢迎所有能帮助学习GaussDB相关的文章!如基于自己的实际使用经验,分享对GaussDB的技术分析、使用感受及在项目实战中的经验等。如果你还不知道该怎么写,请你务必仔细阅读下面1-3篇文章,可以让你更快上手:GaussDB(DWS) GUC参数修改、查看GaussDB(DWS)数据类型之自定义数据类型(复合类型)GaussDB(DWS)集群管理系列:CM异常检测插件介绍之HANG检测插件安装openGauss极简版一主一备节点环境什么是GaussDB(for Redis)?你将获得什么?获得一、二、三等奖的8名的选手还将获得GaussDB(DWS)开发者认证免费考试劵,并有机会成为专栏作家,参与论坛答疑、专家面对面交流等。我们会把收到的优质内容汇编成册,并注明原作者,积累行业口碑,开放给圈内开发者下载查阅,提供实践参考。对于贡献优质内容的作者,我们还将送出各项大礼!同时,在华为云站内外10+个技术社区醒目位置进行推荐,给与百万级流量资源。优质作者更可获得长期约稿和更多内容合作机会。评奖规则说明华为云开发者社区、华为云数仓GaussDB(DWS)将联合评审此次征文。专家评分依据 :文章篇幅、技术含金量、排版美观度、阅读量、点赞、收藏等指标综合评分。其他说明 :1、一二三等奖不能叠加。2、一二三等奖可与创作小能手奖叠加。3、征文投稿数量不计入月度激励活动文章数量。在哪里投稿?文章需要发表在社区博客; 是时候展现真正的技术了, 点击前往发布标题以 【这次高斯不是数学家】结尾,例如:GaussDB(DWS)数据类型之自定义数据类型【这次高斯不是数学家】。文章末尾需加上活动名称及链接地址:【这次高斯不是数学家】有奖征文火热进行中:https://bbs.huaweicloud.com/blogs/345260文章标签打上【GaussDB数据库】,如果文章跟华为云产品相关,需要同时加上【云端实践】标签如果大家在征文中遇到有关华为云产品体验方面的问题建议,请到【云声平台】提出您的宝贵建议,标题以【云驻计划】开头,还有机会赢取额外奖励。有哪些需要注意的:1、文章内容需体现技术看点,图文并茂,建议字数在500字以上;2、文章要求为投稿人原创,凡转载或抄袭一经发现将取消参赛资格;3、文章须在华为云社区为首发,如华为云平台已有文章内容则视为稿件无效;4、稿件投稿后,华为云拥有该稿件的使用权、修改权等;5、因库存等原因,奖品可能会替换为等值礼品。快来华为云社区博客,一起遨游在技术的海洋中吧! 点击立即体验如果有任何问题,可扫描下方二维码咨询。添加微信时请备注:报名活动时使用的华为云昵称!扫码添加小助手:
  • [其他] Failed to send dynamic workload params to CCN
    【问题现象】业务报错:Failed to send dynamic workload params to CCN或Failed to receive queue info from CCN【问题原因】资源管理模块在CN节点在和CCN节点进行通信的过程中,CN向CCN发送消息报错,该报错是因为CN与CCN之间的连接断开,这个时候CN再想和ccn通信的时候会从pooler连接池拿到一个已经在ccn端关闭了连接的handler,就会报Failed to send dynamic workload params to CCN。出现该场景的常见原因如下:(1)有定时任务或手动pg_terminate_backend杀掉了CN与CCN的连接(2)CN与CCN间网络不稳定【解决方法】(1)避免pg_terminate_backend时避免对内部ip的线程查杀(2)检查CN与CCN间的网络,或重要业务直连CCN避免报错
  • [知识分享] 一文详述DMS资源池队列阻塞告警及原理
    本文分享自华为云社区《DMS资源池队列阻塞告警及原理介绍》,作者: codefulture。 # 一、概述 资源池队列阻塞告警旨在通过一定的检测机制,提前对资源池队列阻塞的情况告知用户,避免影响正常业务。然而如何得知资源池队列阻塞就需要了解其背后的运行原理,本文所述仅仅是一种检测方式,并非唯一绝对的,也可以通过其他方式检测资源池队列阻塞。 # 二、资源管理/负载管理概述 数据库系统的负载管理和资源管理,在整个系统中起着很重要的作用。 ## 1. 负载管理简介:双层排队机制 DWS的负载管理分为两层,第一层为CN的全局并发控制,第二层为资源池级别的并发控制。在通过第一层控制的时候,会继续向前走到第二层资源池控制,根据资源池当前的负载资源情况决定作业继续执行或者排队。 DWS并发控制逻辑示意图如下: ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/20/1653013287562450429.png) ## 2. 资源管理简介 影响一个集群的资源包括内存、CPU、磁盘I/O和存储空间等。GaussDB(DWS)提供了一系列资源负载管理手段,通过对资源的集中管控,可以有效避免作业占用资源的冲突,高优先级作业优先执行,以及用户间的资源隔离。其中: - CPU、I/O等计算资源是通过资源池进行管理。 - 内存管理通过数据库系统参数、GUC参数,和资源池等进行控制。 - 数据存储空间是通过创建用户指定。 # 3. 总结 通过上面的介绍可以总结出:负载管理是为了解决排队的问题,将任务能够平均到不同的cn或资源池上;然而在实际应用中,作业是否排队与资源池的资源有着直接关系;资源管理通过一定手段提高资源的利用率。 资源池是GaussDB(DWS)进行负载管理的基本单元,负责管理业务运行所需的系统资源(包括CPU、I/O和内存),并提供SQL的并发控制功能。 # 三、基于资源池的负载管理 GaussDB(DWS)资源负载管理的核心是资源池,资源池提供多种属性可以控制内存、IO和CPU资源的控制,基于优先级调度机制实现资源管理和分配,对用户业务提供资源负载管理服务。基于资源池的资源负载管理的范围包括:并发管理、优先级调度。 ## 1. 控制组(Controller Group) 在介绍资源池之前需要先了解控制组的相关概念。cgroups是Linux内核提供的一种可以限制进程所使用资源的机制,全称是control groups,cgroups为每种可以控制的资源定义了一个子系统。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/20/1653013335625878629.png) 图中是控制组的一个挂载树,从最上层开始,就分为了两部分,一部分是属于Gaussdb的资源,一部分是留给系统其他进程使用的资源,我们使用的资源如图所示,都是挂载到Gaussdb:gaussdba的,其中第一层又分为两个控制组,Backend用来预留资源给数据库常驻的各个工作线程,Class控制组的资源用来分配给各个用户进行作业执行。 ## 2. 资源池(Resource Pools) 资源负载管理的工作原理如图所示。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/20/1653013355189561204.png) 资源池通过绑定控制组进行实现资源的分配,作业的优先级和其关联的资源池的资源数量有关。一般情况下,我们认为作业关联到的资源池拥有的资源数量越多,则其优先级越高,因为该作业能够拥有更多的资源去执行。如果一个资源池拥有的资源比例发生了变化,则其对应的优先级也会发生变化,可以通过调整资源池中属性来修改优先级。 在开启资源负载管理功能之后,default_pool是由系统自动创建,当一个会话或者用户没有指定关联的资源池时,都会被默认关联到default_pool,并且default_pool默认绑定到DefaultClass:Medium控制组,并且不限制所关联的业务并发数,而且一个控制组可以绑定多个资源池。 ## 3. 关联作业 在使用资源池对系统资源进行分配后,需要将作业关联到某个资源池上,才能实现对业务的负载管理。把资源池与用户进行关联后,该用户下执行的所有作业都会自动关联到该资源池下。如果该用户没有绑定资源池,则任务进入默认资源池default_pool的等待队列。 # 四、query band 负载识别 当一个控制组关联的资源池有多个的时候,用户下发的作业应该使用哪个资源池来执行任务呢?如果用户已经下发了很多作业,但是某个新作业又非常紧急怎么办?类似的问题可能还有很多,那么如何解决上述的问题呢,这时候我们就要借助一个手段:query band。 GaussDB(DWS)实现基于query band的负载识别和队列内优先级控制,一方面提供了更为灵活的负载识别手段,可根据作业类型、应用名称、脚本名称等识别负载队列,使用户根据业务场景可灵活配置query band识别队列;另一方面实现了队列内作业下发优先级控制。管理员用户可根据业务场景及作业类别配置query_band所关联队列及估算内存限制等实现更为灵活的负载控制与资源管控。 query band目前支持行为有:关联资源池(respool)、队列内优先级(priority)。 ## 1. query band关联队列内优先级 query_band支持关联作业优先级,支持高中低(High/Medium/Low)三个优先级,同时提供Rush作为特殊优先级,默认优先级为Medium。 队列内排队优先级三种情况: - 静态负载管理场景下,CN并发不足时,触发CN全局队列排队,CN全局队列为优先级队列。 - 动态负载管理场景下,DN内存不足时,触发CCN全局排队,CCN全局队列为优先级队列。 - 资源池并发或内存不足时,触发资源池排队,资源池队列为优先级队列。 如果业务未配置query band或用户未将query band关联行为时,作业会默认使用用户关联队列和队列内优先级。 从上述的介绍可以理解为,query band可以设置任务在资源池中的执行顺序,优先级高的任务优先执行;如果出现资源不足等不能立刻执行任务的情况,则会触发排队优先级,优先级高的优先在队列中排队。 ## 2. query band关联资源池 作业执行时,若query_band指定了队列,则使用query_band关联的队列,否则使用用户关联的队列。 # 五、原理梳理 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/20/1653013406588796961.png) # 六、资源池队列阻塞告警在DMS中的实现 ## 1. 资源池队列阻塞的判定 通过上述的介绍,我们已经了解了资源负载管理的基本原理,那么如何判定资源池队列阻塞呢?影响作业在资源池运行的要素有并发数、CPU和内存等资源限制,也可能是由于集群状态异常导致的,下面我们将从以下两种情况进行分析。 第一种情况,如果并发或CPU等资源不够用,会出现资源池队列排队,但并非阻塞的状态,因为作业结束后,处于队首的作业会开始运行,那么资源池队列中的作业是动态变化的。 第二种情况,如果用户下发的作业就是特别的复杂,运行时间可能有几十分钟,那么在默认情况下,资源池队列中的作业始终不变,但是如果用户在调整作业优先级之后,作业能够正常运行,也不能说明资源池是阻塞的。 结合以上两种情况,我们结合资源池队列中作业的状态,以及不同优先级作业在资源池的运行情况判断资源池是否阻塞。首先我们将范围限定在默认资源池中,因为默认资源池是开启资源管理功能后又系统创建,代表系统的状态;其次资源池执行任务异常,必定引起资源池队列出现排队现象,且处于队首的任务始终不变,排队时间增加;并且运行在资源池上所有优先级的作业都不能正常下发。 总结下来就是,在一定时间内,集群默认资源池队列中处于各个优先级的作业不变即可判定为资源池队列发生阻塞。 ## 2. 资源池队列阻塞告警的实现 资源池队列阻塞告警是基于DMS原有告警功能进行实现,实现流程依旧是分为数据上报与采集—>告警判断—>上报告警。信息采集线程会将资源池中任务的状态实时上报,形成原始指标落盘,然而我们需要判断不同优先级的任务排队情况,直接用原始数据进行处理会比较繁琐,所以我们借助一个定时任务,定时采集原始指标数据,并进行整合、转置,最后我们用整合后的数据,判断是否发生了资源池阻塞。 ![image.png](https://bbs-img.huaweicloud.com/data/forums/attachment/forum/20225/20/1653013432371228942.png) 图片中的20分钟为默认时间,用户可以根据在自定义配置判断的时长。 ## 3. 资源池队列阻塞的原因 - 资源池并发数 如果用户设置的资源池并发数过小,会出现资源池队列排队,此时应当调大资源池并发数量。 - 资源不足 重新分配资源池的各项资源,包括CPU、内存、磁盘等。 还有其他的场景和解决方式,可以参考下方的博客。 # 参考文章 [GaussDB(DWS) 数据库智能监控系统告警框架上线啦!](https://bbs.huaweicloud.com/blogs/304824) [GaussDB(DWS) 负载管理简单介绍以及作业排队处理方法](https://bbs.huaweicloud.com/blogs/222017) [玩转GaussDB(DWS)资源负载管理系列 — DWS资源负载管理的原理](https://bbs.huaweicloud.com/blogs/175191)
总条数:2746 到第 页
上滑加载中