-
设置GUC参数temp_file_limit可以限制每个线程的临时文件落盘数据量限制。temp_file_limit属于SUSET类型参数,取值范围:整型,单位为KB。其中-1表示没有限制。默认值:-1。1、如何设置temp_file_limit参数 可通过gs_guc工具进行全局设置,如下:gs_guc reload -Z coordinator -Z datanode -N all -I all -c "temp_file_limit = 1024"2、temp_file_limit取值计算公式可以用下面的公式粗略的计算一个temp_file_limit的取值:temp_file_limit = 预计的总下盘量/同时下盘线程数总下盘量一般可设置为可用空间的20%,这个百分比可根据用户的可接受程度进行调节。同时下盘线程数是业务运行中,通常情况下并发的query中产生中间临时数据下盘的线程数。随着数据库中存储的数据量增加,temp_file_limit的值要适时调整。注意:此参数是限制每个线程的临时文件落盘数据量,如果一个query有多个线程,单个线程落盘数据量超过此参数限制,query会报错退出。如果每个线程都没超过限制,但多个线程下盘数据量累计超过此参数限制,并不会报错退出。3、示例以TPC-DS 1x数据中的customer_demographics表为例。SQL查询不下推,中间结果集仅在CN上落盘
-
第一步:在备集群CN和DN实例目录下创建文件夹roachbackup,主集群根据config.ini创建备集群的media目录下的目录链接: 比如/data1/roach3/mediadata/roach/20210129_181026/ecs-env-2998/dn_6001_6002为一个符号链接,此符号链接可以指向备集群roachbackup目录/data1/ha_install_3/data1/roachbackup/20210129_091422/master1目录。其中,master1子目录为archive/data/data_colstore,分别代表着日志/行存数据/列存数据。 第二步: 备集群恢复前clean集群时,跳过各实例目录的roachbackup文件夹。 第三步:在备份目录和实例目录不同的backupkey文件夹下,有不同的节点目录,在节点目录下有cn和dn目录,将备份目录下的cn和dn软连接到实例目录。 第四步:只有全量备份和全量恢复时必须这样做,增量备份恢复可选。按照现在的设计逻辑,全量和增量备份都建立了软链接。 第五步:恢复完成后,备集群删除创建的符号链接、各实例目录下的roachbackup文件夹,即恢复即删。对于主集群roachbackup目录,边传输数据,边删除数据,即传输即删。 对于cn和dn目录,都通过软连接方式连接到了roachbackup对应的data_cn,master1,dummy1。通过软连接方式,roach在scp时,以为是传输到了一个磁盘上,但实际上写到了软连接对应的其他盘上,这样的话,数据也就实现了存放在不同磁盘上的目的。
-
双集群容灾场景下,需要将主集群中的数据备份到备集群。然而,随着主集群数据量的增大,备集群不存在一个单独的大容量磁盘用于存放主集群发来的备份集,或存放备份集的盘符空间不足以存储主集群发来的所有备份文件。但是,容灾场景中仍然要能支持双集群的备份恢复。因此,为了解决磁盘存储空间限制的问题,提出分盘存储手段,从而实现备集群备份文件分散存储的目的。在双集群容灾设计中,主集群的角色是只做备份,备集群的角色是只做恢复。为了实现主备数据的同步,需要将备份集以.rch的格式进行数据拷贝。如上图所示,在优化前,主集群会将压缩在roachbackup中的数据全部scp到备集群的roachbackup中,这样的存储方式,会对备集群磁盘空间造成非常大的负担。在优化后,主集群会将压缩数据scp到备集群实例目录中的roachbackup文件夹,然后通过软链接的方式,备份目录中不同的DN和CN链接到了roachbackup文件夹。由于CN和DN分布在不同的磁盘上,同时软连接使得roach看到的路径和以前一样,这样就实现了数据分盘存放的目的。
-
列存的存储单元 列存的存储结构并没有像orc或parquet的结构方式,采用了一种真正的以列存储的结构方式。主要的特性如下:列存的存储单元为CU(CStore Unit)CU的大小为8k对齐适合大批量导入的场景同一列的CU存在一个新文件中,大于1GB时,切换到新文件中。列存用一个CUDesc的行存表描述CU的相关信息,可以理解成为一个Toast表。列存的读取和行存一样,也是设计了缓存,这样在重复查询的时候可以显著减少IO开销,提高性能。读取过程:根据where条件,做MIN/MAX过滤的谓词条件加载CUDescMIN/MAX过滤读取CU到CU Cache中解析并填充CacheMgr: 用来缓存CU到内存中,可以提高重复查询的性能。CU的物理文件:CStore_1.0: 当前基本不怎么实用CStore_2.0: 重整了CU的文件结构,避免列数过多导致文件结构复杂。列存的插入要分两种情况,少量的插入和大量的插入,列存主要是对大批量数据设计的,因此为了弥补小量插入的打包CU性能开销,设计了一个delta行存表,用来记录插入结果,可以减少膨胀和提升性能,最后定期的整理。列存的删除比较简单,如果是delta表,先从delta表中删除满足谓词条件的记录,然后在CUDesc表中更新待删除CU的delete_bitmap。
-
行存无论在读取还是写入上,都采用了大量的缓存用来减少IO开销。在外存方面,针对数据库的特点,也单独设计了外存管理器。 主要是将共享内存的内容落盘,WalWriter一般是在事务提交时就需要落盘,但是有时候可以放弃一定的事务一致性原则,从而让WalWriter异步落盘加快速度。BgWriter负责将shared_buffer中的内容落盘。 读取的过程相对简单,就是从物理文件先装到shared_buffer中,然后从shared_buffers返回相关的结果。shared_buffers中就是以Page为单位进行存储的,因为每个Page的大小是固定的,所以shared_buffers能存放的page个数也就是确定的。这里面就需要考虑一个问题,因为这个资源是共享的,如果一个线程读取了大量的文件,这样势必会使得其他线程的缓存命中率下降。GaussDB在这里引入了Ringbuffer的机制,可以限制一个线程所使用的shared_buffers的大小,从而解决掉这个问题。GaussDB行存在写入时,将元组信息先写入到shared_buffers,然后用bgwriter刷入磁盘,这样在事务提交时就可以避免磁盘的IO开销,提升性能,为了保证一致性和恢复,使用wal日志和checkpoints可以实现日志先落盘(也可以异步)和redo等操作。
-
数据库的IO结构一直是影响性能的关键部分,数据库的操作最终还是要体现在最后的物理文件上。我们平常总是听到各种缓存,这都是为了减小IO开销而设计的。 对于数据库来说,因为要保证一致性的问题,那么IO模型的设计就更为复杂,既要保证减少IO的读写,又要保证突然断电时,已提交事务的内容不能丢失等意外情况。此外,采用不同的索引结构设计的IO开销也不一样,理解IO模型对数据库的调优也有一定的指导作用。行存IO基本框架存储结构:在了解行存的整个IO框架之前,首先需要对行存的文件结构有一定的了解。那么我们平常操作的表都是怎么样存储在我们的文件系统中呢?就跟我们平常用的身份证号一样,在GaussDB(DWS)中,也有对应的ID号来标识各个对象:OID(Object identifiers):对象的唯一标识。每个表存在对应数据库的文件夹中,用relfilenode标识。通过各种ID,我们就可以查看每个表对应的文件了。对于行存来说,我们常有的印象是以行为单位进行读取和写入的,但是这个对于IO开销就过于严重了,因此GaussDB(DWS)采用和操作系统的思路,以页为基本单位进行读取和写入。
-
安全审计日志:用户可配置细粒度安全审计功能。通过安全审计实现安全事件回溯追责、检测、告警响应,同时起到安全震慑的作用。用户数据保护:数据脱敏,通过创建脱敏策略来避免敏感信息泄露风险。加密集群自动加密用户静态数据,防止用户数据泄露。细粒度权限管理,用户执行所有操作前需通过权限检查。私有用户的对象,数据库管理员在未经其授权前,无权进行增删查改等操作。身份认证和鉴权:支持基于IAM和用户名口令的身份认证。默认权限最小化,支持基于角色的权限管理,防止越权访问安全管理:可以管理安全属性、安全功能,以及不同的角色。可以设置用户安全策略,设置密码重用时间、指定允许登录失败的次数、密码有效期、密码复杂度;配置网络访问控制,包括用户权限管理、IP权限管理、SSL连接;数据库、模式、数据库对象不同级别的权限管理。安全功能自保护:对安全功能本身和安全功能数据具有自保护能力,通过安全功能自保护,防止安全功能被破坏或绕过。通过执行群集的全量备份/全量恢复,增量备份/增量恢复实现安全功能自保护。客户端访问:客户端对GaussDB(DWS)访问、操作时,首先需要建立用户会话,通过此会话完成与GaussDB(DWS)的交互。可以针对用户会话做出不同维度的控制,包括用户口令有效期、并发会话数、会话的建立/锁定/解锁/终止、IP权限管理、特定用户特定IP访问等。
-
为失效消息写入过程。有以下几个关键点: 写入失效消息过程,需要调用清理共享消息队列接口,以保证有足够多的空位写入失效消息。 在写入失效消息过程中,会更新maxMsgNum。 写入失效消息完毕以后,需要将其他线程的hasMessage标记为True。 写入失效消息过程,需要持排他写锁,阻塞其他线程写操作,但不阻塞读。 NOTE:写入失效消息过程实际上是推进maxMsgNum的过程,同时告知其他线程有新的失效消息需要读取。清理共享消息队列过程中,有以下几个关键点:清理共享消息队列需要持有排他读锁和排他写锁,阻塞读过程。其主要原因是,清理共享消息队列会推进minMsgNum,若不持读锁,可能导致nextMsgNum读取过期数据。清理共享消息队列会推进minMsgNum。清理共享消息队列过程,会将所有没有及时追增失效消息的线程执行全失效。在清理共享消息队列最后步骤,会对距离minMsgNum最近的线程,发送追增信号,以确保不会频繁发生全失效。该步骤主要考虑的情况是,若线程长时间处于idle状态,需要外部信号触发其及时追增消息。NOTE:清理共享消息队列过程,实际上是推进minMsgNum的过程,同时对所有没有及时追增失效消息的线程执行全失效。根据以上共享消息队列接口可知,读取共享消息队列主要负责推进各个线程自身的nextMsgNum;写入失效消息主要负责推进maxMsgNum;清理共享消息队列主要负责推进minMsgNum。通过共享消息队列,可有效实现各个线程之间的数据同步。
-
共享消息队列本质上对于外部接口只需要提供三个功能:读取共享消息队列中消息、向共享消息队列中写入消息、清理共享消息队列。主要包括两部分,下面部分为ThreadLocal结构,主要记录的是每个线程内部的数据,线程间数据是独立的,无法互相访问,上面部分为共享消息队列中的数据,共享消息队列存在于共享内存中,可同时被多个线程访问,共享消息队列的访问场景是典型的一写多读场景。在共享消息队列中,核心变量有三个,nextMsgNum、minMsgNum、MaxMsgNum,其中nextMsgNum记录了每个线程消息读取到的位置,minMsgNum记录了共享消息队列中最早消息的位置,maxMsgNum记录了共享消息队列中最新消息的位置,对于每个线程而言,需要定期(在表加锁/事务开始/收到信号时触发)从共享消息队列中读取失效消息,利用失效消息(共享消息队列中的每个消息)更新线程内部数据,同时,若线程内部产生失效消息(通常DDL语句在事务提交时产生大量失效消息),则需要向共享消息队列中插入失效数据,供其他线程读取。另外,还有两个参数,hasMessages、resetState,其中hasMessages用于标记对应线程是否存在未读取的失效消息,resetState用于标记对应线程是否需要失效全部消息。
-
背景:b集群使用互联互通能力从a集群获取数据,可通过gds服务进行可将gds起在b集群的dn6001上,通路是b集群通过dn6001上的gds访问a集群;设b集群是三节点集群,且节点网段处于165.101.102.0范围内,启动的gds使用的端口为50010。 1、 在b集群上启动gds云上集群在dn6001上沙箱内启动查询b集群对外ip,沙箱内ifconfig查询结果含多个,设查询到的对外ip为165.210.210.210,则gds可以启动为gds –p 165.210.210.210:50010 –H 0.0.0.0/0 –d /DWS/data1/gds/50010 –D –t 100 –l /DWS/data1/gds/50010/50010.log --pip-size 1M --pipe-timeout 300s查询进程,该节点gds进程启动完成后,需按此方法启动其他集群节点。补充,1个节点就可以正常提供服务,如果只使用1个gds,后续添加网段只需考虑1个即可,本文在3个节点上都启动了gds服务,故考虑到3节点的网络连通情况。 2、 打开a集群的入方向安全组,如图从b集群访问a集群,需打开a集群入方向的安全组,在集群的console界面,首页选中网络-> 网络ACL,在网络控制台中选中 访问控制->安全组选中对应集群的安全组,添加对应规则即可,规则必须包含b集群的所有节点网段选中对应安全组后->入方向规则->添加规则,按需求添加即可。举例,本文为b集群三节点网段为165.210.210.0,a集群启动的gds使用的端口为50010;则添加类型:ipv4,协议:tcp,端口范围:50010,远端:165.210.210.0/24,描述:用于gds点击确定即可 3、 添加b集群的路由b集群的三个节点的对外ip,添加到a集群的路由表中(route -n)到a集群的节点沙箱外查看route –n,查看是否添加b集群的路由(165.210.210.0)没有就添加上,本文为route add –net 165.210.210.0/24 dev bond0.1010 gw 165.210.210.1a集群所有节点都需要加上 4、 添加a集群的防火墙规则查询a集群的对外ip,进入节点,使用ifconfig查看,获取到对应的ip,假设是节点dn6001为165.110.110.110;在b集群的节点上,需要用最高权限用户(云上环境的话用户为root),添加a集群对应的防火墙规则,如以下命令Iptables –I INPUT –s 165.110.110.0/24 –p tcp –dport 50010 –j ACCEPTb集群的所有节点都需要添加,添加的内容必须为a集群的所有节点的网段,无效可尝试重启防火墙systemctl stop/start iptables,因没有持久化有些重启会规则会失效,请注意。 5、 检查添加完毕后可在a集群上尝试对b集群发起链接,观察通路是否正常。本文使用curl命令进行观察,在a集群节点上curl b集群的节点,看通路是否正常在a集群的沙箱外curl –vv http://ip:端口链接不正常有2中情况,其一是命令长时间未结束,这是因为命令未得到b集群的回应故未及时返回,其二是报错,信息为有:No route to host如果没有该报错,且出现when not allowed就表示通路已打开
-
【问题现象】 场景一、页面点击重启集群后一直处于重启中状态场景二、serviceOM集群详情-任务信息处于修复失败【常见版本】全版本 【定位思路】 1、此案例适用于后台查看集群状态已经重启成功,但前台页面处于重启中。或者集群后台状态正常,仅serviceOM页面有修复失败。2、登录RMS库,select task.* from taskmgr_task as task left outer join taskmgr_job as job on job.job_id = task.job_id where job.request like '%集群名称%' order by job_id, task_index asc;2.1、使用查询失败的job_id去搜索dws-controller日志报错;2.2、常见报错由于网络闪断或偶现域名解析失败导致异常,其他报错具体问题具体分析。3、规避办法,登录RMS库,清理rds_action表(直接delete对应集群的失败记录),等待集群再次上报正常状态即可。
-
【问题现象】 资源池监控-》资源池-》用户名称【常见版本】HCS8.2.1 或者HCS8.3.0 【定位思路】 1、首先按照问题现象点击页面,可以观察到用户名称数量与实际资源池绑定用户数量不一致2、无需定位,直接参考如下两步规避,规避前置条件是资源池必须无其他异常(能正常使用,绑定用户正常)2.1、登录DMS数据库执行SQL :update dms_meta_collection_config set extra_settings= '{'max_collect_rate': -1}';2.2、登录serviceOM上重启dms-agent即可(手动重启需要清理agent配置文件)3、等待片刻,刷新页面即可
-
【问题版本】 HCS821(其他版本也适用)【问题描述】ServiceOM更新软件包报错DWS.9999【问题影响】 无【问题根因】 包未上传Swift桶里【定位过程】1、seriveOM界面更新软件包后点确认报错DWS.9999,但是点取消后,刷新界面实际已经修改成功;2、界面F12发现是insert-version接口报错报417;3、拿traceID搜日志报错请求Swift后返回404;...Request failed, Response code: 404; Request ID: xxxxxxxxxxxxxx-xxxxxxxx; Request path: https://dws-instance-{region名}.object-store.{region名}{swift域名}/8.1.3.110-GauestAgent -xxxxxxxx -xxxxxxx-2022xxxxxxxxxx.tar.gz.sha256 sun.reflect.GeneratedMethodAccess0r7421.invoke(null:-1)......Failedto save soft info. |com.huawei.hwclouds.dbs.api.platformapi.servcie.impl.ConfigManagerservicermpl.insertVersion(ConfigManagerServiceImpl.java:513)com.obs.services exception.Obsexception: Error messagu:Request Error.OBS servcie Error Message.4、在controller容器curl -kv Swift地址,发现能通;5、怀疑是桶里没包,求助Swift查询桶里是否有包,查询后确认没有包,让现场后期补全;Swift桶内包查询方法:cid:link_0上传包卡参考:cid:link_1 注:其中要获取DWS的账户和密码如下:(秘文都需要解密) 方式一、可通过select * from rds_obs_info;语句查询rms库,其中账号是op_svc_dws(不是查出来的用户,要去掉_readonly) 账号:obsUser、密码(密文):obsUserPwd 方式二、也可COP界面CDK查询dwscontroller容器的参数: 账号:access.dns.domainName、密码(密文):access.dns.pwd 方式三、登EICommon-Region-Master-01节点,进容器/webapps/rds/WEB-INF/classes目录下查询参数: 执行:grep "access.dns" system-parameter.properties命令查询出如下: access.dns.domainName=账号 access.dns.pwd=密码密文6、补全包后界面不在报错;【规避措施】 上传Swift的包不全,重新把缺失的包上传Swift
-
企业部署的Gaussdb(DWS)如何配置MRS数据源,找不到关于Manage界面找不到配置数据源的信息。
-
说说你对DeepSeek大模型的看法