• [问题求助] 小白求助:为什么在CN目录下面也会有数据文件?
    以下是我在三节点分布式gaussdb上面查询到的结果:### cn里面也有数据文件 [root@gauss-dis-134 cn]# du -sh base 123M base [root@gauss-dis-134 cn]# du -sh global 514M global ### dn的大小 [root@gauss-dis-134 dn_6002]# du -sh base 255M base [root@gauss-dis-134 dn_6002]# du -sh global 514M global我的问题是:这是在同一个机器上面,为什么在cn目录下面也有base、global这些文件(里面是数据文件) 官方文档的描述里面不是说,由datanode负责数据的存储,cn只负责协调吗?如果同一台机器,cn和dn都存一样的数据,不会浪费空间吗?
  • [数据库使用] 小数点前0不显示问题
    小数点前0不显示postgres=# select 0.1 as result; result -------- .1(1 row)小数点前0会省略,是因为数据库中存在一个隐形类型转换,在拼接的过程中小数自动转成字符类型,相当于调用了to_char函数,所以丢失小数点前面的0解决方法:使用to_char进行转换-- 数字转字符串格式select to_char(a, 'FM9990.00')"FM9990D00", to_char(a, '99.90')"99D90", to_char(a, 'FM90D99')"FM90D99", rtrim(to_char(a, 'FM999990D99'), to_char(0, 'D'))"FM999990D99" from ( select 50 a from dual union all select 50.57 from dual union all select 5.57 from dual union all select 0.35 from dual union all select 0.4 from dual) FM9990D00 | 99D90 | FM90D99 | FM999990D99 -----------+--------+---------+------------- 50.00 | 50.00 | 50. | 50 50.57 | 50.57 | 50.57 | 50.57 5.57 | 5.57 | 5.57 | 5.57 0.35 | .35 | 0.35 | 0.35 0.40 | .40 | 0.4 | 0.4【FM9990.00】格式,皆满足;代码更简洁;与【rtrim(to_char(a, 'FM999990D99'), to_char(0, 'D'))"FM999990D99"】的区别整数是否保留小数。 【99D90】格式,问题:小数位小于1,0则不显示。 【FM90D99】格式,问题:小数位为0,则不显示。 【rtrim(to_char(a, 'FM999990D99'), to_char(0, 'D'))"FM999990D99"】格式,缺点:代码过于复杂化。 【9】在小数位,则表示转换为对应字符,如果没有则以0表示;在整数位,没有对应则不填充字符。to_char(123,'999D99')=123.00;to_char(123,'99999D9')=123.0;注意事项:对于0和9而言,如果格式的位数不如数字的位数多,会返回'#'。譬如to_char(12345,'9999')='#####' 。 【0】代表如果存在数字则显示数字,不存在则显示0,即占位符;to_char(0.34,'0D00')=​'0.34';to_char(1234,'9999D00')='1234.00';注意事项:这是一个强制的符号,对应位没有,则以'0'填充,这是9很大不同地方。【D】(ISO 小数位符号) '999D99' 这是"点号"的国际版本(ISO),作用等同于点号,也是只能出现一次,也可以直接用'.'。【FM】代表删除如果是因9带来的空格,则删除,小数点后的9。
  • [问题求助] gaussdb不支持insert into select file_fdw
    GaussDB在使用外部表file_fdw时,无法使用insert into select file_fdw语法提示un-support feature,修改什么属性才可以支持这种语法?
  • [问题求助] 小小白求助:win10系统,psycopg2连接GaussDB报错:none of the server's SASL authentication mechanisms are supported
    小小白,测试人员刚刚接触Gaussdb,新人求助、求指导。【系统配置】win10系统pycharmpython3.8已安装第三方库psycopg2-binary 2.9.3(手动下载whl并安装的)GaussDB: 有集中式和分布式的,不同的IP而已opengauss:使用psycopg2可以正常连接opengauss数据库使用Navicat16版本可以正常连接opengauss、GaussDB分布式/集中式【问题描述】使用psycopg2可以正常连接opengauss数据库。目前想要连接云数据库GaussDB,但不能连接成功。导入psycopg2驱动后,连接数据库,连接不成功,报错。【报错信息】报错信息如下: connection to server at "10.XX.XX.XX", port 30000 failed: none of the server's SASL authentication mechanisms are supported【相关截图】之前也有找官方文档,但里面的都是基于linux环境的,且下载驱动仅支持欧拉和银河麒麟系统。没有windows的
  • [运维管理] sql在查询时写关联,select xx from a left join b on a.i=b.i left join c on a.i=c.i left join d on a.i=d.i...这种写法有什么问题不?
    sql在查询时写关联,select xx from a left join b on a.i=b.i left join c on a.i=c.i left join d on a.i=d.i...这种写法有什么问题不?a 表数据是否会随着关联数据翻倍?
  • [技术解读] GaussDB开发规范
    数据库连接使用DDS时,可能会遇到因为Mongod/dds mongos的连接数满了,导致客户端无法连接的问题。在Mongod/dds mongos的服务端,收到一个新的连接由一个单独的线程来处理,每个线程配置了1MB的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。客户端连接数据库的时候,要计算业务一共有多少个客户端,每个客户端配置的连接池大小是多少,总的连接数不要超过当前实例能承受的最大连接数的80%。客户端与数据库的连接应尽量保持相对稳定的状态,每秒新增连接数建议保持在10以下。建议客户端的连接超时时间至少设置为最大业务执行时长的3倍。对于副本集实例,客户端需要同时配置主备节点的IP地址;对于集群实例,至少配置两个dds mongos的IP地址。DDS默认提供rwuser用户,使用rwuser用户登录时认证库必须是admin。可靠性write concern设置规则:对于关键业务,write concern设置为{w:n},n>0,数字越大,一致性实现更好,但性能较差。w:1表示实际写入主节点完成返回。w:1,journal:true表示写主节点和日志后返回。w:majority表示大多数备节点写入后返回。说明:如果没有以w:majority写入数据,则发生主备倒换时,未同步到备机的数据有丢失风险。对于可靠性有较高要求的,建议采用3AZ部署的集群。性能相关规范业务程序禁止执行全表扫描的查询。执行查询时,只选择需要返回的字段,不需要的字段不要返回。从而减少网络和进程处理的负载,修改数据时,只修改变化需要修改的字段,不要整个对象直接存储全部修改。避免使用$not。DDS并不会对缺失的数据进行索引,因此$not的查询条件将会要求在一个结果集中扫描所有记录。如果$not是唯一的查询条件,会对集合执行全表扫描。用$and时把匹配最少结果的条件放在最前面,用$or时把匹配最多结果的条件放在最前面。单个实例中,数据库的总的个数不要超过200个,总的集合个数不要超过500个。集合数量过多会导致内存压力变高,并且集合数量多会导致重启以及主备倒换性能变差,影响紧急情况下的高可用性能。业务上线前,一定要对数据库进行性能压测,评估业务峰值场景下,对数据库的负载情况。禁止同时执行大量并发事务,且长时间不提交。业务正式上线前, 所有的查询类别,都应该先执行查询计划检查查询性能。建议每个连接在后台都是由一个单独线程处理,每个线程会分配1MB的栈内存。所以连接数不宜过多,否则会占用过多的内存。使用连接池,避免频繁的建立连接和断开连接,否则会导致CPU过高。减少磁盘读写:避免使用不必要的upsert命令,避免查询不必要的数据。优化数据分布:对数据进行分片,同时分散热点数据,均衡地使用实例资源。如何进行数据分片,请参见设置数据分片。减少锁冲突:避免对同一个Key过于频繁地操作。减少锁等待:避免前台创建索引。注意开发过程中对集合的每一个操作都要通过执行explain()检查其执行计划,如:db.T_DeviceData.find({"deviceId":"ae4b5769-896f"}).explain();db.T_DeviceData.find({"deviceId":"77557c2-31b4"}).explain("executionStats");对于查询而言,因为覆盖查询不需要读取文档,而是直接从索引中返回结果,这样的查询性能好,所以尽可能使用索引覆盖查询。如果explain()的输出显示indexOnly字段为真,则说明这个查询就被一个索引覆盖。执行计划解析:看执行时间:executionStats.executionStages.executionTimeMillisEstimate和executionStats.executionStages.inputStage. executionTimeMillisEstimate时间越短越好。executionStats.executionTimeMillis表示执行计划选择和执行的所有时间。executionStats.executionStages.executionTimeMillisEstimate表示执行计划的执行完成时间。executionStats.executionStages.inputStage. executionTimeMillisEstimate表示执行计划下的子阶段执行完成时间。看扫描条数:三个条目数相同为最佳。executionStats. nReturned表示匹配查询条件的文档数。executionStats .totalKeysExamined表示索引扫描条目数。executionStats .totalDocsExamined表示文档扫描条目数。看Stage状态,性能较好的Stage状态组合如下。Fetch+IDHACKFetch+ixscanLimit+(Fetch+ixscan)PROJECTION+ixscanCursor使用规则如果cursor不使用了要立即关闭。由于cursor在10分钟内不活动,就会关闭,立即手动关闭会节省资源。4.2版本分布式事务使用规则Spring Data MongoDB不支持事务报错后重试机制,如果客户端使用Spring Data Mongo作为连接MongoDB的客户端,需要依照Spring Data Mongo的参考文档,使用Spring Retry进行事务的重试操作。分布式事务操作数据的大小不能超过16MB。备份相关注意事项备份期间应避免进行DDL操作,规避备份失败的风险。
  • [技术解读] GaussDB设计规范
    命名规范数据库对象(库名、表名、字段名、索引名)命名建议全部使用小写字母开头,后面跟字母或者数字,数据库对象(库名、表名、字段名、索引名)名字长度建议都不要大于32字节。数据库名称不能使用特殊字符("",.,$,\,/,*,?,~,#,:,|")和空字符\0,数据库名称不能使用admin,local,config。数据库集合名称建议使用字母和下划线组合,不能以system为前缀,<数据库名>.<集合名称> 总长度不超过120字符。索引设计规范索引创建,可以避免全表扫描,有效地提高查询命令的执行效率。索引字段的长度不能超过512字节,索引名称长度不能超过64字符,单个复合索引所包含字段数最多不能超过16个。<数据库名>.<集合名>.$<索引名>的总长度不能超过128字符。在高选择性字段上的创建索引。在低选择性字段上查询会返回较大的结果集。尽量避免返回较大的结果集。对集合的写操作同时会操作集合上的索引,从而触发更多的IO操作,集合上的索引数量不要超过32。不要创建不会被使用到的索引,因为DDS会加载索引到内存,无用索引加载到内存会浪费内存空间因业务逻辑变化而产生的无用索引也要及时清理。索引创建必须使用后台创建索引,禁止前台创建索引。业务中查询,排序条件的key一定要创建索引,如果建立的是复合索引,索引的字段顺序要和这些关键字后面的字段顺序一致,否则索引不会被使用。不要基于复合索引的靠前字段再创建索引。复合索引可以被用于一个索引中主要字段的查询。例如,对于复合索引(firstname,lastname)可以用于在firstname上的查询,再创建一个单独firstname的索引是不必要的。创建索引会消耗较多的IO与计算资源,建议在业务低谷期进行索引创建,禁止同时并发创建超过5条索引。如果需要对同一集合创建多个索引,建议使用createIndexes命令一次性下发多条索引,可以减少性能损耗。分片设计规范对于使用DDS分片集群,建议尽可能的使用分片集合以充分利用性能,详情请参见设置数据分片以充分利用分片性能。分片集合使用上建议如下:对于大数据量(数据量过百万),并有较高读写请求的业务场景,数据量随着业务量增大而增大的,建议采用分片。对于采用hash分片的集合,需要根据业务后面实际数据量大小,采用预分片,提前预置chunk数量,减少自动均衡和分裂对业务运行造成影响。对于非空集合开启分片,应将均衡器的开启时间窗放在业务空闲时,避免分片间均衡数据与业务冲突影响性能。设置时间窗口的API接口详情请参见设置集群均衡活动时间窗。需要基于分片键排序查询且增加数据时可以分布均匀建议使用范围分片,其他使用哈希分片。合理设计shard key,防止出现大量的数据使用相同shard key,导致出现jumbo chunk。使用分片集群,执行dropDatabase后,一定要执行flushRouterConfig命令,详情请参见如何规避dds mongos路由缓存缺陷。业务的update请求需要注意与片键相适配。在使用分片表时,如果出现如下场景则update请求会报错,并返回“An upsert on a sharded collection must contain the shard key and have the simple collation”。update请求的filter中未携带片键字段且选项multi:falseset中未携带片键字段且选项upsert:true
  • [技术干货] 通过命令创建GaussDB数据库账户
    创建文档数据库实例时,系统会同步创建默认账户rwuser。您可以根据业务需要,通过默认账户rwuser创建其他数据库账户,之后您可以使用默认账户rwuser或已创建的其他账户对数据库中的数据如库、表、索引等进行操作。使用须知为目标实例创建数据库账户时,建议您开启SSL通道,提高数据的安全性。对于已有的3.2版本的文档数据库实例,不支持创建数据库账户,仅可更改管理员账户rwuser的密码。在创建数据库账户时,要指定命令参数passwordDigestor:"server",具体操作请参见官方文档。前提条件成功连接文档数据库实例,请参见《文档数据库服务快速入门》各实例类型下,通过内网和公网连接实例的内容。账户说明为了给文档数据库实例提供管理服务,您在创建数据库实例时,文档数据库服务会自动为实例创建根账户root(或admin)、监控账户monitor和备份账户backup,这些账户属于华为云实例管理平台,您不能操作或者使用。如果试图删掉、重命名、修改这些账户的密码和权限,会导致出错。对于数据库管理员账户rwuser,以及您所创建的账户,允许修改账户的密码。默认账户rwuser以及通过rwuser创建的账户,对系统库admin和config权限受限,无法进行正常操作。对自身创建的库表,具有充分的操作权限。MongoDB的User一般是在某个固定的认证库下创建的。连接数据库时,需要通过参数--authenticationDatabase来明确指定对应的认证库。DDS实例中,默认的rwuser用户的认证库,是admin。账户密码连续5次输入错误,账户会被锁定10s。账户密码等级设置文档数据库服务在控制台侧管理员密码的安全策略:密码长度为8~32个字符。密码必须为英文大小写字母、数字、特殊字符~!@#%^*-_=+?()$的组合。文档数据库对在客户端新创的数据库用户,设置了密码安全策略:密码长度为8~32个字符。密码为英文大小写字母、数字、特殊字符~@#%-_!*+=^?的组合。创建实例数据库以及设置密码时,安全起见,为用户提供了密码复杂度校验,如果不满足要求,请根据提示信息调整密码复杂度。创建账户选择admin数据库。use admin以user1账户为例,创建数据库账户。db.createUser({user: "user1", pwd: "****", passwordDigestor:"server", roles:[{role: "root", db: "admin"}]})“server”是指在服务端加密密码,为固定值,无需修改。“****”是新密码,长度8~32位,且必须为英文大小写字母、数字以及特殊字符~@#%-_!*+=^?的组合。“roles”限制了该账户所具有的权限。若指定一个空数组,表示该账户不具有任何权限。查看创建结果。显示如下信息,说明创建成功。Successfully added user: { "user" : "user1", "passwordDigestor" : "server", "roles" : [ { "role" : "root", "db" : "admin" } ]}更改账户的密码选择admin数据库。use admin以user1账户为例,修改账户的密码。db.updateUser("user1", {passwordDigestor:"server",pwd:"newPasswd12#"})“server”是指在服务端加密密码,为固定值,无需修改。“newPasswd12#”是新密码,长度8~32位,且必须为英文大小写字母、数字以及特殊字符~@#%-_!*+=^?的组合。如果密码用在mongodb url中且密码包含@ / % ? # , 则需要进行URL特殊字符转义,替换为对应的十六进制的URL编码(ASCII码)。查看修改结果。显示如下信息,说明修改成功。mongos>
  • [技术干货] GaussDB参数调优
    数据库参数是数据库系统运行的关键配置信息,设置不合适的参数值可能会影响业务。本文列举了一些重要参数说明。如需通过控制台界面修改参数值,请参见修改DDS实例参数。enableMajorityReadConcern该参数表示读取数据时,是否需要从大多数节点获取一致的数据后才返回结果。默认值为“false”,表示读取数据时,不需要从大多数节点获取一致数据后返回结果,即从单个节点上读取数据就可以返回结果。该参数设为true的时候,表示读取数据时,需要从大多数节点获取一致数据后才返回结果。该操作会导致LAS文件过大,进而造成CPU过高和磁盘占用大。在DDS中,不支持设置majority级别的readConcern。对于需要majorityReadConcern的场景,可以将WriteConcern设置为majority,表示数据写入到大多数节点了,这样也就保证了大多数节点的数据一致了。然后通过读取单个节点的数据,就能保证用户读到的数据已经写入到大多数节点,而这样的数据不会发生回滚,避免了脏读的问题。说明:MongoDB可以通过writeConcern来定制写策略,通过readConcern来定制读策略。当指定readConcern级别为majority时,能保证用户读到的数据已经写入到大多数节点,而这样的数据不会发生回滚,避免了脏读的问题。failIndexKeyTooLong默认值为“true”。该参数不支持修改,避免过长索引Key。net.maxIncomingConnections该参数表示dds mongos或mongod可接受的最大同时连接数量。该参数依赖于实例的规格,实例规格不同对应其默认值也不同。因此,此参数在用户未设置前显示为“default”,表示该参数随内存规格变化。security.javascriptEnabled默认值为“false”。该参数表示是否允许mongod上执行JavaScript脚本。为了安全考虑,默认值为“false”,表示不允许mongod上执行JavaScript脚本,mapreduce、group等命令也将无法使用。disableJavaScriptJIT默认值为“true”。该参数表示是否禁用JavaScriptJIT编译技术。JavaScriptJIT编译技术实现了即时 (JIT) 编译以提高运行脚本时的性能。“disableJavaScriptJIT”默认值为“true”,表示禁用JavaScriptJIT编译技术。如果需要启用JavaScriptJIT编译技术,可以将“disableJavaScriptJIT”的值设置为“false”。operationProfiling.mode默认值为“slowOp”。该参数表示数据库分析器的级别。该参数支持如下取值:默认值为“slowOp”,表示对于耗时超过慢查询阈值的操作,采集器采集数据。取值为“off”,表示分析器关闭,不收集任何数据。取值为“all”,表示采集器采集所有操作的数据。operationProfiling.slowOpThresholdMs默认值为“500”,单位为ms。该参数表示慢查询的时间阈值,单位为毫秒,超过该阈值的操作将被认为是慢操作。如无特殊需求,建议使用默认值500ms。maxTransactionLockRequestTimeoutMillis默认值“5”,取值范围为5~100,单位为ms。该参数表示事务等待获取锁的时间,超过该时间则事务回滚。
  • [技术干货] GaussDB——华为云秉承“将公司对网络和业务安全性保障的责任置于公司的商业利益之上”
    GaussDB——华为云秉承“将公司对网络和业务安全性保障的责任置于公司的商业利益之上”。针对层出不穷的云安全挑战和无孔不入的云安全威胁与攻击,华为云在遵从法律法规业界标准的基础上,以安全生态圈为护城河,依托华为独有的软硬件优势,构建面向不同区域和行业的完善云服务安全保障体系。安全性是华为云与您的共同责任,如图1所示。华为云:负责云服务自身的安全,提供安全的云。华为云的安全责任在于保障其所提供的 IaaS、PaaS 和 SaaS 类云服务自身的安全,涵盖华为云数据中心的物理环境设施和运行其上的基础服务、平台服务、应用服务等。这不仅包括华为云基础设施和各项云服务技术的安全功能和性能本身,也包括运维运营安全,以及更广义的安全合规遵从。租户:负责云服务内部的安全,安全地使用云。 华为云租户的安全责任在于对使用的 IaaS、PaaS 和 SaaS 类云服务内部的安全以及对租户定制配置进行安全有效的管理,包括但不限于虚拟网络、虚拟主机和访客虚拟机的操作系统,虚拟防火墙、API 网关和高级安全服务,各项云服务,租户数据,以及身份账号和密钥管理等方面的安全配置。《华为云安全白皮书》详细介绍华为云安全性的构建思路与措施,包括云安全战略、责任共担模型、合规与隐私、安全组织与人员、基础设施安全、租户服务与租户安全、工程安全、运维运营安全、生态安全。
  • [技术干货] GaussDB常用概念
    实例实例是DDS服务的基本管理单元,一个DDS实例可以建一个或多个数据库,每个数据库中可以建一个或多个集合。用户可以通过管理控制台创建及管理各种类型和版本的实例,实例的类型、版本、规格等信息请参见实例说明。每个DDS实例之间资源相互隔离,例如CPU、内存、IO等都是相互独立的。集群DDS集群由dds mongos、config、shard组成,节点架构示意图如下:图1 分片集群示意图dds mongosdds mongos负责查询与数据写入的路由,是实例访问的统一入口。每个实例有2~32个dds mongos,数量由用户自定义。用户可直接连接dds mongos,dds mongos从config读取配置信息,将读写请求分发到shard。configconfig负责存储实例的配置信息,由1个副本集组成。用户不能直接连接config。shard集群实例的shard,负责存储用户的数据。每个社区版集群实例有2~32个shard,数量由用户自定义。每个shard由1个副本集组成,副本集为每个shard的数据提供了冗余和高可靠性。用户不能直接连接shard。数据库参数模板数据库参数模板是所有用户可见配置参数和参数对应取值的集合,同一个参数模板可以被多个实例共享。目前,仅DDS社区版实例支持参数模板功能,包括参数模板的创建、编辑、比较、复制、重置、删除等操作。
  • [技术干货] 华为云GaussDB,新一代分布式数据库
    华为云GaussDB,新一代分布式数据库,具备“五高两易”,高可用、高安全、高性能、高弹性、高智能、易部署、易迁移的技术竞争力,给世界一个更优选择。华为云数据库,以全场景数据融合服务,面向企业提供实时高效、安全稳定、极简体验的全域数据生产和事务处理服务,目前已经规模应用在金融、电商、游戏、社交文娱、汽车、制造能源等各行业。产品优势GaussDB,新一代分布式数据库,真正做到软硬协同,具备“五高两易”,高可用、高安全、高性能、高弹性、高智能、易部署、易迁移的技术竞争力,给世界一个更优选择。高性能国内首个全自研Ustore存储引擎,海量数据高并发场景下高性能无抖动高可用同城双集群RPO=0,软硬件故障完全隔离,7*24小时服务在线高安全国内首个获得国际CC EAL4+源码级认证,业界首个纯软全密态数据库高弹性1000+超大分布式集群的能力,云原生弹性伸缩,极大提升资源利用率高智能全球首个AI-Native数据库,从应用开发到管理运维全流程智能化体验易部署支持华为云/华为云Stack/轻量化多种部署形态,支持多租户以及数据压缩,实现存储成本下降50%,整体资源利用率提升4倍以上易迁移Oracle、MySQL数据库常用语法99%兼容,DRS+UGO一站式迁移解决方案,让不确定变确定
  • [问题求助] ccdis 使用pgsql 驱动连接高斯数据库,连接被拒绝
    问题来源】【必填】    南方航空公司【问题简要】【必填】  在项目开发过程中,我们需要连接ccdis 的高斯数据库,从数据库中拉取原始数据进行二次加工,通过高斯官方文档中的gsjdbc4和gsjdbc200.jar驱动进行连接高斯数据的时候报错【问题类别】【必填】高斯、ccdis【AICC解决方案版本】【必填】AICC:24.200UAP:UAP9600_V300R001C02SPC109CTI:ICD_V300R008C25SPC200【期望解决时间】【选填】2024年11月1日【问题现象描述】【必填】      在项目开发过程中,我们需要连接ccdis 的高斯数据库,从数据库中拉取原始数据进行二次加工,通过高斯官方文档中的gsjdbc4 驱动进行连接高斯数据的时候报错相关如下:
  • [运维管理] gauss on hdfs 外表和gauss 内表做联邦查询的时候,hdfs外表创建的方式是roundrobin的方式,他们根据哪个字段做的轮询,是逐条轮询分布到dn,还是按batch去轮询?
    gauss on hdfs 外表和gauss 内表做联邦查询的时候,hdfs外表创建的方式是roundrobin的方式,他们根据哪个字段做的轮询,是逐条轮询分布到dn,还是按batch去轮询?
  • [技术解读] 数据库技术解读之细粒度资源管控
     背景 对数据库集群内资源管控与资源隔离一直是企业客户长久以来的诉求。华为云GaussDB作为一款企业级分布式数据库,一直致力于满足企业对大型数据库集群的管理需要。  数据库可以管理的资源有计算资源与存储资源,计算资源包括CPU、内存、IO与网络,存储资源包括数据存储空间、日志存储空间与临时文件等。  从用户角度来看,资源管控通过设定阈值或者优先级限定程序对资源的使用,保证承诺服务等级协议的同时,又满足不同用户间资源隔离,达成多个租户共享数据库资源的目的。  从系统的角度来看,引入资源监控与控制的手段,可以实现资源在可控情况下被合理利用的目的,避免资源耗尽,防止系统停止响应、崩溃等情况的发生。作业优先级,可以保证作业平稳运行,避免某个作业占用资源过高时影响其他作业,并在资源富裕时,实现资源利用的最大化。除此以外,还能满足外部的期望,保证系统资源使用最大化。通过对作业控制,可以保证作业是平稳的,避免作业执行过程中出现不可控的行为。  为了解决上述目标,华为云GaussDB数据库提供了一种对数据库集群内资源进行细粒度管控的方案——细粒度资源管控。该方案在不同的管控粒度(如用户级、会话级与语句级)和不同的管控维度(CPU、内存与IO)都提供了对应的管控能力。用户可以根据自己业务需求采取合适的管控维度与管控粒度来达成资源管控与资源隔离的目标,满足不同场景的资源控制的需要。  技术架构 我们先来看下细粒度资源管控的技术架构和运行原理:  从上图中可以看到,GaussDB提供资源池模块来完成CPU、内存与IO的管控逻辑。用户可以创建一个资源池并指定其可以使用的CPU、内存与IO的份额,并把资源池与用户绑定。之后该用户发起的作业在数据库内核优化解析、执行引擎以及存储引擎模块运行的过程中都会受到实时资源管控,确保其CPU、内存与IO都在对应资源池的范围内。  假设A公司部署了一套GaussDB实例,其同时存在三个不同的应用来访问该实例,如OLTP业务、报表业务、其他低优先级业务。A公司希望对三个业务做资源的合理管控,在保证资源使用最大化的情况下,系统平稳运行。我们可以使用系统管理员执行如下命令来为三个业务的用户设置,其资源份额比例为50:30:10,剩余的10%为系统预留。  这里仅做简单的使用示例,每一个参数的具体含义会在后面的章节进行详细说明。  create resource pool respool_tp with(control_group=“cgroup_tp”, max_dynamic_memory=“5GB”, max_shared_memory=“5GB”, io_limits=50, io_priority=“High”); alter role tp_user RESOURCE POOL ‘respool_tp’;  create resource pool respool_report with(control_group=“cgroup_report”, max_dynamic_memory=“3GB”, max_shared_memory=“3GB”, io_limits=30, io_priority=“Medium”); alter role report_user RESOURCE POOL ‘respool_report’;  create resource pool respool_other with(control_group=“cgroup_other”, max_dynamic_memory=“1GB”, max_shared_memory=“1GB”, io_limits=10, io_priority=“Low”); alter role other_user RESOURCE POOL ‘respool_other’; 如上操作后,OLTP业务、报表业务与其他低优先级业务分别使用tp_user、report_user与other_user连入GaussDB执行作业时,这三个业务则会受到对应的资源池respool_tp、respool_report与respool_other的管控,在资源发生争抢的时候保证三个业务分别可以使用GaussDB集群50%、30%以及10%的资源。  关键能力 在了解了细粒度资源管控的整体架构和使用方法之后,我们再来看看它具备哪些关键能力,这些能力可以为客户带来什么样的业务价值。  CPU管控 GaussDB的CPU管控是以资源池粒度来做用户资源管控的,每一个资源池绑定一个控制组,通过控制组(Control Group,CGroup)来实现CPU的管控。CGroup是Linux内核提供的一种限制、记录、隔离进程组所使用的物理资源(如CPU、Memory、IO等)的机制。  考虑到数据库系统、用户、作业不同维度的隔离性和可配置性,GaussDB使用控制组的层级特性构造符合数据库场景的模型(见下图),其满足客户SLA的关键特性,并支持三个维度的层次隔离和控制:数据库程序与非数据库程序隔离、数据库常驻后备线程与执行作业线程隔离以及数据库多用户之间的隔离。  GaussDB控制组可以设置CPU的百分比以及核数的上限,其中根节点负责管控GaussDB进程可用的CPU份额;Backend控制组负责管控数据库常驻后台线程的CPU份额(Vacuum、DefaultBackend);Class控制组负责管控用户的作业线程的CPU份额(UserClass1,UserClass2,…UserClassN);Class控制组内还可以创建Workload控制组(TopWD,RemainWD…)进行更细粒度的管控。  接上面的示例,我们用GaussDB提供的CGroup工具来为A公司的OLTP业务、报表业务以及其他低优先级业务分别创建控制组,CPU分配比例为50%、30%与10%。  gs_cgroup -c -S cgroup_tp -s 50; gs_cgroup -c -S cgroup_report -s 30; gs_cgroup -c -S cgroup_other -s 10; 执行如上命令就代表我们成功创建了3个控制组,之后可以在创建资源池时指定该控制组名称。绑定资源池的用户所发起的作业就会收到控制组对应CPU份额的管控。  CGroup管控CPU有两个问题需要注意:  一是,如果线程的CPU需要受CGroup管控,那么需要执行CGroup的系统API来为线程绑定对应的CGroup,该操作较为耗时;  二是,CGroup的CPU管控效果,在线程数与CPU成比例的情况下,管控效果最佳。  基于这些问题GaussDB提出了线程组的概念,每一个资源池对应一个线程组,线程组里的线程都绑定了该资源池所对应的CGroup。同时,GaussDB会将每一个线程组的线程数量调整到与对应CGroup的CPU份额一致。具体可见下图:  每一个用户发起的作业都会被分发到对应的线程组里的线程来执行,由于线程已经绑定了对应的Cgroup节点,所以操作系统会在线程调度时完成CPU管控。  GaussDB提供两层用户机制,绑定Class控制组的资源池称之为组资源池,对应的用户为组用户,绑定Workload控制组的资源池称之为业务资源池,对应的用户为业务用户。组用户一般对应一个部门,而业务用户对应这个部门的不同的业务。业务资源池的各个资源维度的资源份额会不会超过所属组资源池的份额,从而达到两级资源管控的目标。  CPU管控也提供名称为session_respool的GUC来限制单个会话的CPU不超过对应资源池的CPU上限。  内存管控 GaussDB提供动态内存与共享缓存的管控,创建资源池时可以指定max_dynamic_memory与max_shared_memory来分别完成动态内存与共享缓存的阈值设置。  动态内存管控并没有更改其原有的内存资源分配机制,仅在分配内存之前增加一个逻辑判断层,对多分配出的内存进行记账,通过检查该记账值是否达到允许使用的内存上限来完成内存的管控。当动态内存超过上限时,作业申请内存会失败。作业退出时,该作业已申请的内存会进行释放来保证其他作业可以正常执行。同理,当作业使用的共享缓存超过资源池的管控上限时,再次申请共享缓存,需要先释放自己已经占用的共享缓存,比如BufferPool,作业申请页面时,会对自己已经占用的页面进行淘汰,淘汰之后空余出来的页面供自己继续使用。  GaussDB除了用户粒度的内存管控外,也提供session_max_dynamic_memory与query_max_mem两个GUC参数来完成会话级与语句级动态内存的管控,当一个会话或者语句所使用的动态内存达到GUC的阈值时,作业申请内存失败。  IO管控 GaussDB的磁盘读写IO都由后台线程完成,该线程无法区分页面属主,只是按照时间顺序依次落盘,无法针对不同用户管控不同的IO使用。基于此,考虑IO管控功能采用逻辑IO统计方式,对用户或者会话的读写IO进行管控限制,在工作线程和共享缓存之间增加了逻辑IO计数,对于行存表来说每6000(可通过io_control_unit GUC进行修改)行算做一次IO,当一秒产生的读写IO请求数超过资源池设置的阈值时,则将该IO请求加入到后台线程的一个等待队列里,后台线程将对等待队列里的这些IO请求进行监控,当其等待时间符合条件时,将这些IO请求从等待队列中唤醒。  GaussDB支持两种模式的IO资源管控,上线数值模式是通过设置固定的触发IO次数的数值,进行IO资源控制;优先级模式是指在当前磁盘长时间使用率达到95%以上,所有作业都无法达到上线数值模式时,用户可通过该模式进行IO控制,控制该作业原本触发IO的优先级比例,优先级包含三挡:High、Medium与Low。  接上面的示例,我们为A公司的OLTP业务、报表业务以及其他低优先级业务分别创建资源池,IO权重分别设置的为High、Medium与Low。那么,OLTP业务能使用50%的IO请求向BufferPool中读取或写入数据,少量的IO请求会进入等待队列等待;报表业务能使用20%的IO请求向BufferPool中读取或写入数据,较多的IO请求会进入等待队列等待;其他低优先级业务能使用10%的IO请求向BufferPool中读取或写入数据,较多的IO请求会进入等待队列等待;后台监控线程会周期性的遍历IO等待队列,唤醒等待时间符合要求的IO请求从BufferPool读取或写入数据。  GaussDB除了支持用户粒度的IO管控外,也支持通过设置会话级GUC参数io_limits与io_priority,来完成指定会话上允许作业的IO管控。  连接数与并发管控 GaussDB提供基于资源池的连接数管控与并发管控,创建资源池时可以指定max_connections与max_concurrency来分别完成连接数与并发数的设置,可以使用如下SQL,为前面示例A公司的三个业务对应的资源池完成连接数与并发数管控:  alter resource pool respool_tp with(max_connections=-1, max_concurrency = -1); alter resource pool respool_report with(max_connections=200, max_concurrency = 100); alter resource pool respool_other with(max_connections=100, max_concurrency = 50); 如上SQL执行成功后,实时生效。A公司OLTP业务的连接数与并发数不受限制,只有集群有资源它都可以使用到;报表业务的最大连接数为200,其他低优先级业务的最大连接数为100,当这两个业务建立的连接数超过该值时,GaussDB内核会自动拦截,报当前连接数不足,链接失败;报表业务的最大并发数为100,其他低优先级业务的最大并发数为50,当这两个业务同时发起的作业数超过该值时,超出的作业将会进入等待队列,直到已有的作业完成之后GaussDB才会将其唤醒继续执行作业。  存储空间管控 存储空间管控,用于限定不同用户可以使用的空间配额,防止单用户存储空间使用过大导致整个数据库业务受阻。GaussDB通过在创建用户时指定存储空间的大小来实现对存储资源的管控。  存储空间资源分为三种类型:永久表空间(Perm Space)、临时表空间(Temp Space)与算子下盘空间(Spill Space)。  可以使用如下SQL,为前面示例A公司的三个业务对应的用户完成磁盘空间额管控。  alter user tp_user PERM SPACE ‘200G’ TEMP SPACE ‘20G’ SPILL SPACE ‘20G’; alter user report_user PERM SPACE ‘100G’ TEMP SPACE ‘10G’ SPILL SPACE ‘10G’; alter user other_user PERM SPACE ‘100G’ TEMP SPACE ‘10G’ SPILL SPACE ‘10G’; 存储空间管理支持对组用户和业务用户的存储空间管理。当业务用户对应的组用户存在空间限制时,业务用户的空间也受到该组用户的空间限制。指定存储空间的大小后,该用户在DN上所有的写操作会增加用户已用空间,删除操作减少用户已用空间,CN会周期性的从DN获取一次已用空间总和,并对用户已用空间进行判断,超过最大值后cancel掉写作业(insert/create table as/copy),后面写作业报错退出。  特性演示 特性演示这里我们就简单的为大家演示一下CPU的管控效果,因为对业务影响最大的就是CPU。  创建两个资源池分别设置20%与60%的CPU,然后使用两个绑定了该资源池的用户开始跑业务。观测CPU的实际使用情况。  创建控制组: gs_cgroup -c -S class1 -s 20; gs_cgroup -c -S class2 -s 60; 创建资源池: CREATE RESOURCE POOL xuuer_pool with(control_group = “class1”); CREATE RESOURCE POOL xyuser1_pool with(control_group = “class2”); 创建用户绑定资源池: create role user1 RESOURCE POOL ‘xuuer_pool’; create role user2 RESOURCE POOL ‘xyuser1_pool’; 通过Top观察系统CPU状态,同时细粒度资源管控提供gs_wlm_respool_cpu_info函数来观察各个资源池的CPU实时情况。 如上图,可知初期系统CPU是空闲状态,资源池的CPU监控视图也显示CPU使用为0。让user1开始跑业务,观测可知系统CPU有一定业务占用,查询资源池的CPU监控视图显示,user1可以使用80%的CPU。此时,让user2也开始跑业务,观测可知系统CPU进入繁忙状态,查询资源池的CPU资源监控的系统函数可知user1的CPU使用率开始下降,user2的CPU使用率开始上升。  整理两个用户的CPU使用率并绘制曲线图如下图,可看出user1与user2的CPU使用率最终会平衡到3比1的状态,符合资源池对应的CGroup控制组里设置的20%与60%的比例,达到了CPU管控的效果。  总结 细粒度资源管控特性目前支持集中式与分布式。分布式下的计算资源管控是各个节点独立管控自己节点的资源,存储资源管控是以集群维度来整体管控的。  细粒度资源管控作为多租户的资源隔离的底座,实现资源的精准划分与控制,并解决高负载场景下资源不足而导致集群不可服务的问题。该特性适用于数据隔离不敏感,但对不同业务有资源隔离需求的场景,如果客户对资源隔离和数据隔离都有需求的话,可以关注一下我们后面即将分享的多租数据库特性哦!