• [其他] 集群非均衡
    【问题描述】:集群非均衡【排查过程】:非均衡时间点,内存占满,无法分配内存Out of memory:size=xxxx查看集群规格,此内存比较小total=15,used=5,free=1,shared_buffers和cstore_buffers设置的很大都为5G1. OS 操作系统内存16G,OS运行需要占用内存,DWS节点总共7个,其中3个节点含有协调CN节点、计算DN节点,其余节点为DN节点2. DN 内存设置为5G,CN节点为5G,这样操作系统看来最大内存超过10G,如果此时有其他DN发生Failover切换到这个节点时,内存比较吃紧3. DN里shared_buffers和cstore_buffers各为2G,那么DN就只剩1G跑业务;4. 如果发生切换之后OS会触发oom机制,投票值将最高内存的进程终止;【问题根因】:现场集群规格内存太小,内存参数设置不合理使得内存不足,无法分配内存,一直做主备切换,导致非均衡【解决办法】:通过业务确认行存和列存的数量级多少(确认方法已发送客户),将shared_buffers和cstore_buffers做调整(cn和dn都要调整),或者考虑扩容查询后1. 列存:0,行存:7632. shared_buffers设置为1G,cstore_buffers设置为256M3. 执行如下命令修改:(以下为cn,dn修改相同)gs_guc set -N all -I all -Z datanode -c "shared_buffers=1GB"gs_guc set -N all -I all -Z datanode -c "cstore_buffers=256MB"4. 修改此参数需要重启数据库生效,执行以下命令重启数据库,重启后配置生效,建议晚上没业务时重启gs_om -t stop && gs_om -t start
  • [其他问题] 如何使用java解析GaussDws的语法结构
    使用Druid SQL Parser解析GaussDWS的SQL时,使用gaussdb或者postgresql都会出现语法不支持的错误。因此想问下有什么方式可以完整的解析GaussDWS的SQL获取语法树List statementList = SQLUtils.parseStatements(sql, "gaussdb"); List statementList = SQLUtils.parseStatements(sql, "postgresql");public class TestParse { public static void main(String[] args) { String sql="create table public.cust_info\n" + "with(orientation = column)\n" + " distribute by hash(\n" + " CUST_ID\n" + " )\n" + "as\n" + "select\n" + " CUST_ID as CUST_ID -- 客户编号 \n" + " ,CERT_TYPE_CD as CERT_TYPE_CD -- 证件类型代码 \n" + " ,CERT_NUM as CERT_NUM -- 证件号码 \n" + " ,FINAL_MATN_WORK_DT as FINAL_MATN_WORK_DT -- 最后维护工作日期 \n" + " ,row_number() OVER (PARTITION BY CUST_ID ORDER BY ORD_NUM DESC) AS vl as vl -- 序号、客户编号 \n" + "FROM public.t_cust_info \n" + "where id_mark <> 'D'\n" + "\tAND etl_dt = to_date('${batch_date}', 'yyyymmdd')"; //List statementList = SQLUtils.parseStatements(sql, "gaussdb"); List statementList2 = SQLUtils.parseStatements(sql, "postgresql"); System.out.println("aa"); }}
  • [其他问题] DWS如何查看数据库用户的创建时间
    DWS如何查看数据库用户的创建时间
  • [其他问题] dws如何查询表创建时间呢
    dws如何查询表创建时间呢
  • [问题求助] dws如何查看表及索引大小
    如何查看表及索引大小
  • [问题求助] GaussDB(DWS)不支持GLOBAL TEMPORARY TABLE吗
    如题,GaussDB(DWS)不支持GLOBAL TEMPORARY TABLE吗
  • GaussDB (DWS)集群参数配置建议
    1 参数设置1.1 内存参数设置DWS集群在安装完成后,需要设置相关的内存、连接参数,以保证在相应物理规格下,达到最好的性能。在DWS 8.1.1版本后,这些参数都由系统默认进行了设置,不需要在安装、发放完集群后手动设置。但在8.1.1以下版本,仍需要在安装、发放集群后单独设置。注意:以下参数设置都按照4DN规格计算,如果DN规格为2DN,参数max_process_memory参数乘1.67倍即可。例如,内存为256G,4DN时,max_process_memory为36GB,则2DN时,max_processmemory设置为36*1.67=60GB,其他参数按乘2倍计算即可。例如,内存为256G,4DN时,DN work_mem参数基线为512MB,而2DN时,DN work_mem建议设置为1GB。shared_buffers和cstore_buffers分别为行存表缓存和列存表缓存,在实际设置时建议按照客户主要使用行存表还是列存表来设置不同的值。以内存为256GB,4DN为例,)如果客户在使用DWS时如果行存和列存都有使用,比较平均,建议把DN的shared_buffers和cstore_buffers平均分配,都设置为4GB;)对于行存为主的集群,建议DN的shared_buffers设置为8GB,cstore_buffers设置为256MB;)对于列存为主的集群,建议DN的shared_buffers设置为256MB,cstore_buffers设置为8GB。)shared_buffers和cstore_buffers一般不建议设置大于8GB。因为bufferlist遍历时会加排它锁,如果buffer设置过大,加锁时间会相应加长。如需要设置到大于8GB,需要研发评审。1.1.2 如果数据节点内存为256G则按照如下参数配置#CN#设置CN参数gs_guc set -N all -I all -Z coordinator -c "shared_buffers=4GB" -c "work_mem=1GB" "maintenance_work_mem=1GB" -c "effective_cache_size=16GB" -c "wal_buffers=32MB"#设置DN参数gs_guc set -N all -I all -Z datanode "max_process_memory=36GB" -c "shared_buffers=4GB"  -c "cstore_buffers=4GB" -c "work_mem=512MB" -c "maintenance_work_mem=512MB" -c "effective_cache_size=16GB"  -c "max_process_memory=36GB" -c "wal_buffers=32MB" -c "data_replicate_buffer_size=512MB" -c "comm_max_stream=2048"--shared_buffers 主要使用行存则设置成8GB,主要使用列存则设置为256MB,平均使用则设置为4GB--cstore_buffers 主要使用行存则设置为256MB,主要使用列存则设置为8GB,平均使用则设置为4GB设置完成后需要重启数据库。1.1.3 如果数据节点内存为512G则按照如下参数配置#设置CN参数gs_guc set -N all -I all -Z coordinator -c "shared_buffers=4GB" -c "work_mem=2GB" "maintenance_work_mem=2GB" -c "effective_cache_size=16GB" -c "wal_buffers=32MB"#设置DN参数gs_guc set -N all -I all -Z datanode "max_process_memory=72GB" -c "shared_buffers=8GB"  -c "cstore_buffers=8GB" -c "work_mem=1GB" -c "maintenance_work_mem=1GB" -c "effective_cache_size=32GB"  -c "max_process_memory=72GB" -c "wal_buffers=32MB" -c "data_replicate_buffer_size=512MB" -c "comm_max_stream=2048"--shared_buffers 主要使用行存则设置成8GB,主要使用列存则设置为256MB,平均使用则设置为4GB--cstore_buffers 主要使用行存则设置为256MB,主要使用列存则设置为8GB,平均使用则设置为4GB设置完成后需要重启数据库。设置完成后需要重启数据库。1.1.4 如果数据节点内存为1TB则按照如下参数配置#CN#设置CN参数gs_guc set -N all -I all -Z coordinator -c "shared_buffers=8GB" -c "work_mem=4GB" "maintenance_work_mem=4GB" -c "effective_cache_size=64GB" -c "wal_buffers=256MB"#设置DN参数gs_guc set -N all -I all -Z datanode "max_process_memory=144GB" -c "shared_buffers=8GB"  -c "cstore_buffers=8GB" -c "work_mem=2GB" -c "maintenance_work_mem=2GB" -c "effective_cache_size=64GB"  -c "max_process_memory=144GB" -c "wal_buffers=256MB" -c "data_replicate_buffer_size=2GB" -c "comm_max_stream=2048"--shared_buffers 主要使用行存则设置成8GB,主要使用列存则设置为256MB,平均使用则设置为4GB--cstore_buffers 主要使用行存则设置为256MB,主要使用列存则设置为8GB,平均使用则设置为4GB设置完成后需要重启数据库。设置完成后需要重启数据库。1.2 开启sql监控(topsql)gs_guc set -N all -I all -Z coordinator -Z datanode -c "enable_resource_track=on" -c "resource_track_level=operator" -c "enable_resource_record=on" -c "resource_track_duration=10s" -c "enable_track_record_subsql=on" -c "resource_track_cost=0"-- resource_track_duration 语句执行时间大于等于该值时,才会将作业信息存到历史视图。值客户业务需求设置,单位为S设置完成后需要重启数据库。1.3 开启审计功能gs_guc reload -Z coordinator -c "audit_enabled=on"gs_guc reload -Z coordinator -c "audit_operation_exec='select,insert'"表1为audit_operation_exec的配置审计项,客户按业务需求在audit_operation_exec参数后追加配置选项值。表1 audit_operation_exec的配置审计项配置项描述none表示未配置审计项,如果同时配置了其他任何审计项,则none失效。all表示对所有操作成功的场景进行审计。如果同时配置了其他任何审计项,则覆盖所有其他审计项的配置。需要注意,即使配置为all,也不表示对所有的DDL操作进行审计,仍然需要结合audit_system_object,对DDL操作的对象级别进行控制。login表示对用户登录成功的场景进行审计,默认配置。logout表示对用户退出进行审计,默认配置。database_process表示对数据库启动、停止、切换、恢复操作进行审计,默认配置。user_lock表示对用户锁定和解锁成功的场景进行审计,默认配置。grant_revoke表示对用户权限授予和回收成功的场景进行审计,默认配置。ddl表示对DDL操作成功的场景进行审计,因为DDL操作由会根据操作对象进行更细粒度控制,仍然沿用审计开关audit_system_object,即由audit_system_object控制对哪些对象的DDL操作进行审计(此处不配置ddl,只要配置了audit_system_object,审计也会生效)。select表示对select操作成功的场景进行审计。copy表示对copy操作成功的场景进行审计。userfunc表示对用户自定义函数、存储过程、匿名块操作成功的场景进行审计。set表示对set操作成功的场景进行审计,默认配置。transaction表示对事务操作成功的场景进行审计。vacuum表示对vacuum操作成功的场景进行审计。analyze表示对analyze操作成功的场景进行审计。explain表示对explain操作成功的场景进行审计。specialfunc表示对特殊函数调用操作成功的场景进行审计。特殊函数包括:pg_terminate_backend、pg_cancel_backend。insert表示对insert操作成功的场景进行审计。update表示对update操作成功的场景进行审计。delete表示对delete操作成功的场景进行审计。merge表示对merge操作成功的场景进行审计。show表示对show操作成功的场景进行审计。checkpoint表示对checkpoint操作成功的场景进行审计。barrier表示对barrier操作成功的场景进行审计。cluster表示对cluster操作成功的场景进行审计。comment表示对comment操作成功的场景进行审计。cleanconn表示对clean connection操作成功的场景进行审计。prepare表示对PREPARE、EXECUTE、DEALLOCATE操作成功的场景进行审计。constraints表示对constraints操作成功的场景进行审计。cursor表示对游标操作成功的场景进行审计。2 部分参数详解2.1 内存参数2.1.1 max_process_memory用途:设置一个CN/DN节点可用的最大物理内存。设置建议:max_process_memory=物理内存*0.665/(1+主DN个数)。CN上该数值内存可设置与DN数值一样。取值范围:整型,2*1024*1024~INT_MAX/2,单位为KB。默认值:12GB2.1.2 shared_buffers     用途:设置GaussDB A使用的共享内存大小。增加此参数的值会使GaussDB A比系统默认设置需要更多的System V共享内存。     设置建议:建议设置shared_buffers值为内存的40%以内。行存列存分开对待。行存设大,列存设小。列存:(单服务器内存/单服务器DN个数)*0.4*0.25。取值范围:整型,128KB~操作系统支持的最大值,单位为KB。改变BLCKSZ的值会改变最小值。默认值:512MB,如果操作系统支持的共享内存小于32MB,则在初始化数据存储区时会自动调整为操作系统支持的最大值。2.1.3 cstore_buffers     用途:设置列存和HDFS所使用的共享缓冲区的大小。设置建议:列存表使用cstore_buffers设置的共享缓冲区,几乎不用shared_buffers。因此在列存表为主的场景中,应减少shared_buffers,增加cstore_buffers。取值范围:整型,16MB~操作系统支持的最大值,单位为MB。默认值:32MB2.1.4 work_mem    用途:设置内部排序操作和Hash表在开始写入临时磁盘文件之前使用的内存大小。ORDER BY,DISTINCT和merge joins都要用到排序操作。Hash表在散列连接、散列为基础的聚集、散列为基础的IN子查询处理中都要用到。设置建议:work_mem = 0.5 * max_process_memory / 业务平均并发数 / 查询平均物化算子数取值范围:整型,单位为KB。默认值:64MB2.1.5 maintenance_work_mem。    用途:设置在维护性操作(比如VACUUM、CREATE INDEX、ALTER TABLE ADD FOREIGN KEY等)中可使用的最大的内存。该参数的设置会影响VACUUM、VACUUM FULL、CLUSTER、CREATE INDEX的执行效率。    设置建议: 建议设置此参数的值大于work_mem,可以改进清理和恢复数据库转储的速度。因为在一个数据库会话里,任意时刻只有一个维护性操作可以执行,并且在执行维护性操作时不会有太多的会话。当自动清理进程运行时,autovacuum_max_workers倍数的内存将会被分配,所以此时设置maintenance_work_mem的值应该不小于work_mem。如果进行大数据量的cluster等,可以在session中调大该值。            取值范围:整型,单位为KB。默认值:128MB2.2 数据倾斜、数据页复制、FIM日志大小参数2.2.1 数据倾斜table_skewness_warning_rows     用途:设置用于表倾斜告警的行数。当超过该行数,触发报警。设置建议:10000取值范围:整型,0~INT_MAX默认值:100000table_skewness_warning_threshold    用途: 设置用于表倾斜告警的阈值。设置建议: 0.1  取值范围:浮点型,0~1默认值:12.2.2 数据页复制enable_data_replicate    用途:当数据库在数据导入行存表时,主机与备机的数据同步方式可以进行选择。设置建议:建议设置为on 。on表示导入数据行存表时主备数据采用数据页的方式进行同步。当replication_type参数为1时,不允许设置为on。取值范围:布尔型on表示导入数据行存表时主备数据采用数据页的方式进行同步。当replication_type参数为1时,不允许设置为on。 off表示导入数据行存表时主备数据采用日志(Xlog)方式进行同步。默认值:on2.2.3 FIM日志大小参数Log.total.size      用途: FIM保留管控面和数据库日志大小,超过此大小会自动老化。设置建议: 建议设置为50G。设置方法:登录FIM页面,选择“集群 > 待操作集群的名称 > 服务”。单击服务列表中的某个服务,切换到“配置”页签。选择“全部配置”,左边菜单栏中展开角色实例的菜单,单击所需修改的角色所对应的“日志”。日志文件大小需填写单位“MB”。2.3 TOPSQL监控(根据需要开启,需定期清理历史监控数据):2.3.1 enable_resource_track用途:设置是否开启资源实时监控功能。此参数需在CN和DN同时应用。取值范围:布尔型on表示打开资源监控。 off表示关闭资源监控。默认值:on2.3.2 resource_track_level用途:设置当前会话的资源监控的等级。该参数只有当参数enable_resource_track为on时才有效。取值范围:枚举型none,不开启资源监控功能。 query,开启query级别资源监控功能。 operator,开启query级别和算子级别资源监控功能。默认值:query2.3.3 resource_track_cost用途:设置对当前会话的语句进行资源监控的最小执行代价。该参数只有当参数enable_resource_track为on时才有效。            取值范围:整型,-1 ~ INT_MAX值为-1时,不进行资源监控。 值大于或等于0时,值大于或等于0且小于等于9时,对执行代价大于等于10的语句进行资源监控。 值大于或等于10时,对执行代价超过该参数值的语句进行资源监控。默认值:1000002.3.4 enable_resource_record用途:设置是否开启资源监控记录归档功能。取值范围:布尔型on表示开启资源监控记录归档功能。 off表示关闭资源监控记录归档功能。默认值:off2.3.5 resource_track_duration用途:设置资源监控实时视图中记录的语句执行结束后进行历史信息转存的最小执行时间。当执行完成的作业,其执行时间不小于此参数值时,作业信息会从实时视图(以statistics为后缀的视图)转存到相应的历史视图(以history为后缀的视图)中。该参数只有当enable_resource_track为on时才有效。取值范围:整型,0 ~ INT_MAX,单位为秒。值为0时,资源监控实时视图(表1)中记录的所有语句都进行历史信息归档。 值大于0时,资源监控实时视图(表1)中记录的语句的执行时间超过这个值就会进行历史信息归档。默认值:1min2.3.6 enable_track_record_subsql参数说明:设置是否开启子语句记录归档功能。开启时,存储过程、匿名块内部的子语句会被纪录归档到相应的INFO表(GS_WLM_SESSION_INFO)。此参数为会话级参数,可在与CN的连接会话中设置生效,仅影响该会话连接中的语句;也可在CN和DN上同时设置,能全局生效。参数类型:USERSET取值范围:布尔型on表示开启子语句资源监控记录归档功能。off表示关闭子语句资源监控记录归档功能。默认值:off2.4 审计功能(根据需要开启)2.4.1 audit_enabled控制审计进程的开启和关闭。审计进程开启后,将从管道读取后台进程写入的审计信息,并写入审计文件。            取值范围:布尔型on表示启动审计功能。 off表示关闭审计功能。默认值:on2.4.2 audit_login_logout这个参数决定是否审计GaussDB A用户的登录(包括登录成功和登录失败)、注销。            取值范围:整型,0~7。0表示关闭用户登录、注销审计功能。 1表示只审计用户登录成功。 2表示只审计用户登录失败。 3表示只审计用户登录成功和失败。 4表示只审计用户注销。 5表示只审计用户注销和登录成功。 6表示只审计用户注销和登录失败。 7表示审计用户登录成功、失败和注销。默认值:72.4.3 audit_database_process该参数决定是否对GaussDB A的启动、停止、切换和恢复进行审计。取值范围:整型,0、1。0表示关闭GaussDB 200启动、停止、恢复和切换审计功能。 1表示开启GaussDB 200启动、停止、恢复和切换审计功能。默认值:12.4.4 audit_user_locked该参数决定是否审计GaussDB A用户的锁定和解锁。取值范围:整型,0、1。0表示关闭用户锁定和解锁审计功能。 1表示开启审计用户锁定和解锁功能。默认值:12.4.5 audit_user_violation该参数决定是否审计用户的越权访问操作。取值范围:整型,0、1。0表示关闭用户越权操作审计功能。 1表示开启用户越权操作审计功能。默认值:02.4.6 audit_grant_revoke该参数决定是否审计GaussDB A用户权限授予和回收的操作。取值范围:整型,0、1。0表示关闭审计用户权限授予和回收功能。 1表示开启审计用户权限授予和回收功能。默认值:12.4.7 audit_system_object该参数决定是否对GaussDB A数据库对象的CREATE、DROP、ALTER操作进行审计。GaussDB A数据库对象包括DATABASE、USER、schema、TABLE等。默认值:12295取值范围:请参考产品文档2.4.8 audit_dml_state这个参数决定是否对具体表的INSERT、UPDATE、DELETE操作进行审计。取值范围:整型,0、1。0表示关闭具体表的DML操作(SELECT除外)审计功能。 1表示开启具体表的DML操作(SELECT除外)审计功能。默认值:02.4.9 audit_dml_state_select这个参数决定是否对SELECT操作进行审计。取值范围:整型,0、1。0表示关闭SELECT操作审计功能。 1表示开启SELECT审计操作功能。默认值:02.4.10 audit_copy_exec这个参数决定是否对COPY操作进行审计。取值范围:整型,0、1。0表示关闭COPY审计功能。 1表示开启COPY审计功能。默认值:02.4.11 audit_function_exec这个参数决定在执行存储过程、匿名块或自定义函数(不包括系统自带函数)时是否记录审计信息。取值范围:整型,0、1。0表示关闭过程或函数执行的审计功能。 1表示开启过程或函数执行的审计功能。默认值:02.4.12 audit_set_parameter    这个参数决定是否对SET操作进行审计。取值范围:整型,0、1。0表示关闭SET审计功能。 1表示开启SET审计功能。默认值:1
  • [实践系列] GaussDB (DWS)配置负载均衡
    1、 独立软件部署-LVS1.1 软件安装说明安装负载均衡的注意事项如下:负载均衡目前支持的操作系统平台如下:通用x86:SUSE Linux Enterprise Server 11 SP4 X86_64、SUSE Linux Enterprise Server 12 SP3/SP5 x86_64和Red Hat Enterprise Linux Server release 7.5 x86_64和CentOS 7.5/7.6 x86_64、Euleros 2.0 SP5 x86_64TaiShan服务器:CentOS 7.5/7.6 aarch64、EulerOS 2.8 aarch64和中标麒麟NeoKylin-7.5-aarch64(仅适配华为鲲鹏916处理器)/NeoKylin-7.6-aarch64。V100R002C80SPC800及以上版本,LVS可部署在集群内任意节点上。在x86平台下,当GaussDB(DWS)集群使用混合操作系统时,请为LVS主、备选择操作系统一致的服务器。如果操作系统版本号无法完全一致,则请至少保证大版本相同。例如均为Redhat7系列,即Redhat7.0-7.4。负载均衡目前支持使用DR模式,rr算法,并且要求客户端和服务器需要在同一个网段。如果集群中使用虚拟机时,虚拟机网络如果无法使用虚拟IP,则无法使用负载均衡。LVS主备机需要绑定的网卡上不能绑定其他虚拟IP。使用负载均衡时各个CN在各个物理机上需要配置相同的端口号,一台物理机只能配置一个CN。使用负载均衡进行连接时,暂不支持gsql客户端parallel on场景下,使用临时表。不使用负载均衡,则无此限制。LVS服务器工作在内核态,keepalived软件使用API调用LVS内核接口,因此与LVS+Keepalived的设置均需要在root权限下执行。LVS服务器当主机故障时(keepalived软件异常退出、主机宕机、掉电等),备机会自动接管浮动IP,但是当前所有与主机相连的连接会断开,再次发起时可以重新连接。不能在LVS的主备节点上通过gsql客户端或JDBC/ODBC接口去访问LVS配置的虚拟IP,下发数据库操作。同一网段中如果有多个集群安装了LVS,修改各集群中主备上/etc/keepalived/keepalived.conf文件中的virtual_router_id(同一集群的主备需要保持一致)为不同值,取值范围为0~255。1.2 安装LVS1.2.2 软件安装与配置1.2.2.1 安装负载均衡LVS软件安装就是将ipvs模块加载到内核中。通常RHEL系统内核中都带有ipvs模块。在x86平台下,SUSE 11 SP4和SUSE 12 SP3/SP5内核中是不带ipvs模块的。注意事项现在大多数网卡都具有LRO(Large Receive Offload)和GRO(Generic Receive Offload)功能。即网卡收包时将同一流的小包合并成大包交给内核协议栈来提升接收性能。合并后的大包通常大于最大传输单元MTU(Maximum Transmission Unit)。而LVS内核模块在双网卡bond场景下处理>MTU的数据包时,会丢弃。此时,使用LVS来传输大文件,很容易出现丢包,传输速度慢。因此,当LVS使用的网卡是双网卡bond时,需要关闭客户端、LVS主备节点以及CN的bond网卡和物理网卡的lro、gro 、gso 、tso参数,具体如下所示(假设bond网卡名称为bond0,被bond的两个物理网卡是eth1和eth2):查看bond网卡使用的物理网卡:ifconfig|grep `ifconfig|grep "bond0"|awk '{print $NF}'`|awk '{print $1}'关闭网卡参数命令如下:ethtool -K bond0 lro off gro off gso off tso offethtool -K eth1 gro off lro off gso off tso offethtool -K eth2 gro off lro off gso off tso off使用下面命令查看是否关闭:ethtool -k bond0ethtool -k eth1ethtool -k eth2显示如下信息表示lro、gro 、gso 和tso已关闭。tcp-segmentation-offload:offgeneric-segmentation-offload:offgeneric-receive-offload: offlarge-receive-offload: off操作步骤在plat1上执行步骤2到步骤3安装负载均衡主节点,然后在plat2上执行步骤2到步骤3安装负载均衡备节点。然后分别在集群内有CN的主机上执行步骤2到步骤3将LVS虚拟IP地址绑定到各CN主机的lo网卡上。以root用户身份登录服务器,执行source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile命令启动环境变量。执行gs_loadbalance安装LVS软件。gs_loadbalance -t install -U omm -X ${BIGDATA_HOME}/FusionInsight_MPPDB_8.1.3.1/*_*_MPPDBServer/etc/mppdb-install-config.xml --master=plat1 --standby=plat2 --lvs-addr=10.146.156.101命令中各参数说明如下:-U:运行集群的操作系统用户名。必选。-X:集群配置文件。必选。--master:安装主LVS的主机名。必选。--standby:安装备LVS的主机名。可选。--lvs-addr:后续供客户端连接的LVS IP地址。必选。需指定为一个未被使用的虚拟IP地址,且此虚拟IP地址必须与业务IP在同一网段。对于有公网和私网双层网络的集群,推荐优先使用公网IP,如示例中的10.10.0.100。当然,对于不支持公网的集群,此虚拟IP也可以使用私网IP,例如10.146.156.101。安装LVS时,主LVS上会自动虚拟出该IP。主LVS损坏时,keepalived会自动将IP配置到备LVS上。在GaussDB(DWS)集群各含有CN的主机上执行时,该虚拟IP地址会自动绑定到lo网卡上。检查安装过程是否成功。在主备LVS上分别执行如下命令:ipvsadm -Ln执行上述命令后,如果出现如下屏显信息,则安装成功。IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnFWM  1 rr  -> 10.146.156.142:0          Route   1      0          0            如果只安装主LVS,不指定备的话,执行如下命令:ipvsadm -Ln执行上述命令后,如果出现如下屏显信息,则安装成功。IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnTCP  10.146.156.101:8120 rr  -> 10.146.156.142:8120          Route   1      0          0输入命令,查看加载是否成功。lsmod | grep ip_vs 显示如下信息,则ipvs模块加载成功,LVS软件安装完毕。ip_vs_wrr              12697  0 ip_vs_wlc              12519  0 ip_vs_sh               12688  0 ip_vs_sed              12519  0 ip_vs_rr               12600  2 ip_vs_pe_sip           12650  0 ip_vs_nq               12516  0 ip_vs_lc               12516  0 ip_vs_lblcr            12929  0 ip_vs_lblc             12819  0 ip_vs_ftp              13079  0 ip_vs_dh               12688  0 ip_vs                 140944  27 ip_vs_dh,ip_vs_lc,ip_vs_nq,ip_vs_rr,ip_vs_sh,ip_vs_ftp,ip_vs_sed,ip_vs_wlc,ip_vs_wrr,ip_vs_pe_sip,ip_vs_lblcr,ip_vs_lblcnf_conntrack_sip       33860  1 ip_vs_pe_sipnf_nat                 26146  1 ip_vs_ftpnf_conntrack          105745  3 ip_vs,nf_nat,nf_conntrack_siplibcrc32c              12644  3 xfs,sctp,ip_vs1.2.2.2 增加开机启动项iptables集群环境在下电上电或者Reboot之后,打开如下文件:SUSE操作系统vi /etc/init.d/boot.localRedHat(CentOS)操作系统vi /etc/rc.d/rc.local将iptables写入开机启动项:在LVS主节点的文件末尾添加:iptables  -t mangle -I PREROUTING -p tcp -m tcp -d $VIP --dport $VPORT -m mac ! --mac-source $MAC_Director_B -j MARK --set-mark 0x1在LVS备节点的文件末尾添加:iptables  -t mangle -I PREROUTING -p tcp -m tcp -d $VIP --dport $VPORT -m mac ! --mac-source $MAC_Director_A -j MARK --set-mark 0x1参数说明:$VIP:LVS指定的虚拟IP。$VPORT:CN的端口号。$MAC_Director_B:表示LVS备机网卡的mac地址。$MAC_Director_A:表示LVS主机网卡的mac地址。RedHat(CentOS)操作系统(SUSE操作系统不需要执行该步骤)添加完成后,修改权限:chmod +x /etc/rc.d/rc.local说明:查看LVS主备上网卡名是否一致,如果不一致:手动执行如下命令清除iptables规则。iptables -t mangle -F手动在LVS主备节点执行各自对应操作系统的iptables命令。1.2.2.3 配置负载均衡软件配置集群的访问白名单使用负载均衡时,客户端是远程连接数据库的,因此,需要在GaussDB(DWS)集群中配置允许这些客户端远程连接。具体办法如下:以omm用户身份登录安装有MPPDB服务的任一服务器。执行如下命令启动环境变量。source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile执行如下命令在所有CN的pg_hba.conf配置文件中增加一条客户端接入认证规则。假设客户端IP地址为10.10.0.35,即通过LVS远程连接数据库的机器IP地址。gs_guc set -Z coordinator -N all -I all -h "host all jack 10.10.0.35/32 sha256"说明-Z coordinator表示修改CN的pg_hba.conf。-N all表示集群中的所有主机。-I all表示主机中的所有实例。-h表示指定需要在“pg_hba.conf”增加的语句。all表示允许客户端连接到任意的数据库。jack表示连接数据库的用户。10.10.0.35/32表示只允许IP地址为10.10.0.35的主机连接。在使用过程中,请根据用户的网络进行配置修改。sha256表示连接时jack用户的密码使用sha256算法加密。配置keepalived主机网络故障监控该方法适用于网络隔离,一主多备环境, LVS主备部署在两个AZ上。假设LVS主在AZ2上,LVS备在AZ1上,做AZ1和AZ2的网络隔离,AZ2自杀,需要通过如下步骤进行配置。以root用户登录主LVS服务器。在主LVS服务器的“/opt”目录下新建脚本restartlvs.sh。脚本restartlvs.sh示例如下,加粗的IP(10.146.156.101)是LVS备的主机ip,请根据实际情况进行修改:#!/bin/bashfile=/tmp/tagfileexport PATH=/sbin:$PATHif [ ! -f $file ]; then    echo 0 > $filefi# 判断是否需要停止keepalived服务flag=`cat $file`ping 10.146.156.101 -c 1if [ $flag -eq 0 -a $? -eq 0 ];then    echo okelse    flag=1    echo 1 > $file    /etc/init.d/gs_keepalived stopfi# 判断是否需要重启keepalived服务ping 10.146.156.101 -c 1if [ $flag -eq 1 -a $? -eq 0 ];then    /etc/init.d/gs_keepalived restart    echo 0 > $filefi执行如下命令确保root用户对restartlvs.sh具有可执行权限。chmod +x restartlvs.sh将restartlvs.sh设为操作系统定时任务。执行crontab –e命令。crontab –e在打开的crontab配置文件中,添加如下内容。*/1 * * * * sh /opt/restartlvs.sh  >> /dev/null 2>&11.2.2.4 安装效果验证LVS使用效果验证在LVS安装和配置完成后,可以按照如下方法快速验证LVS是否可以客户端连接均衡分发到各CN。完成配置负载均衡软件的配置后,以root用户分别登录各CN所在主机,输入以下命令,确认CN的监听列表是否已包含了LVS的虚拟IP。假设CN所在服务器的监听端口为25308,则命令如下:netstat -an | grep 25308  tcp    0    0 10.10.0.100:25308    0.0.0.0.:*     LISTENtcp    0    0 10.10.0.13:25308    0.0.0.0.:*     LISTENtcp    0    0 127.0.0.1:25308         0.0.0.0.:*     LISTENtcp    0    0 :1:25308                :::*     LISTENUNIX 2    [ACC]    STREAM    LISTENING    399955141/TMP/PGSQL/.S.PGSQL.25308如上所示,LVS的虚拟IP“10.10.0.100”在监听列表中,因此监听正常。如监听列表中没有虚拟IP,则需重新安装负载均衡。查看虚拟IP(10.10.0.100)是否绑定到主LVS上,命令如下:ip addr6:eth0: <BROADCAST,MULTICAST,UP,LOWER_UP>mtu 1500qdisc mp state UP qlen 1000    link/ether 4c:1f:cc:45:4b:89 brd ff:ff:ff:ff:ff:ff    inet 10.10.0.101/24 brd 10.10.0.255 scope global eth0    inet 10.10.0.100/32 scope global eth0    inet6 fe80::4elf:ccff:fe45:4b89/64 scope link        valid_lft forever preferred_lft forever如果停止主机上的keepalived软件,则该IP将立刻绑定到备LVS。在客户端反复执行如下命令。执行次数至少为CN总数的2倍。gsql -d postgres -h 10.10.0.100 -p 25308 -U jack -W Gauss_234 -c "select pgxc_node_str();"其中,postgres为需要连接的数据库名称,10.10.0.100为LVS使用的虚拟IP地址,25308为CN的端口号,jack为数据库用户,Gauss_234为用户jack连接数据库的密码。请根据实际替换。观察各次执行所返回的CN nodename。如果nodename在不停变化,则表示LVS功能可用。也就是LVS既能成功将对应的连接分发到各CN,又能成功将执行结果返回给客户端。例如下面的示例中,返回结果在cn_5001、cn_5003、cn_5002间不停变化。# gsql -d postgres -p 6000 -h 10.10.0.100 -U jack -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5001 (1 row)# gsql -d postgres -p 6000 -h 10.10.0.100 -U jim -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5003 (1 row)# gsql -d postgres -p 6000 -h 10.10.0.100 -U jim -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5002 (1 row)# gsql -d postgres -p 6000 -h 10.10.0.100 -U jim -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5001 (1 row)# gsql -d postgres -p 6000 -h 10.10.0.100 -U jim -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5003 (1 row)# gsql -d postgres -p 6000 -h 10.10.0.100 -U jim -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5002 (1 row)# gsql -d postgres -p 6000 -h 10.10.0.100 -U jim -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5001 (1 row)# gsql -d postgres -p 6000 -h 10.10.0.100 -U jim -W Gauss_234 -c "select pgxc_node_str();" pgxc_node_str --------------- cn_5003 (1 row)1.3 更新LVS当集群进行扩容、节点替换(包含CN)、实例修复(包含CN)、增删CN操作后,集群内的CN发生变化时,需要更新负载均衡配置。操作步骤分别在集群内LVS主备节点和CN发生变化的节点上(如果该CN被删除则无须执行)执行步骤2到步骤3更新负载均衡。以root用户身份登录服务器,执行source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile命令启动环境变量。执行gs_loadbalance更新负载均衡配置。gs_loadbalance -t reload -U omm -X  ${BIGDATA_HOME}/FusionInsight_MPPDB_8.1.3.1/*_*_MPPDBServer/etc/mppdb-install-config.xml   --lvs-addr=10.146.156.101命令中各参数说明如下:-U:运行集群的操作系统用户名。必选。-X:集群配置文件。必选。--lvs-addr:后续供客户端连接的LVS IP地址。必选。需指定为一个未被使用的虚拟IP地址,且此虚拟IP地址必须与业务IP在同一网段。对于有公网和私网双层网络的集群,推荐优先使用公网IP,如示例中的10.10.0.100。当然,对于不支持公网的集群,此虚拟IP也可以使用私网IP,例如10.146.156.101。安装LVS时,主LVS上会自动虚拟出该IP。主LVS损坏时,keepalived会自动将IP配置到备LVS上。GaussDB(DWS)集群各含有CN的主机上,该虚拟IP地址会自动绑定到lo网卡上。检查负载均衡是否更新成功,需要在LVS主备上都去做检查。ipvsadm -Ln执行上述命令后,如果出现如下屏显信息,则更新成功。IP Virtual Server version 1.2.1 (size=4096)Prot LocalAddress:Port Scheduler Flags  -> RemoteAddress:Port           Forward Weight ActiveConn InActConnFWM  1 rr  -> 10.146.156.142:0          Route   1      0          0     1.4 卸载LVS当用户需要卸载负载均衡软件时或者卸载集群时,需要先执行卸载负载均衡工具的脚本。操作步骤分别在集群内每台服务器上执行步骤2到步骤3卸载负载均衡。以root用户身份登录服务器,执行source ${BIGDATA_HOME}/mppdb/.mppdbgs_profile命令启动环境变量。执行gs_loadbalance卸载LVS软件。gs_loadbalance -t uninstall -U omm -X ${BIGDATA_HOME}/FusionInsight_MPPDB_8.1.3.1/*_*_MPPDBServer/etc/mppdb-install-config.xml 命令中各参数说明如下:-U:运行集群的操作系统用户名。必选。-X:集群配置文件。必选。2、HCS部署-ELB用户使用客户端连接DWS集群时,如果用户仅连接一个CN节点地址,通过该CN节点内网IP或弹性公网IP连接时,只能连接到固定的CN节点上,存在CN单点问题。如果通过内网域名连接时,利用域名解析的轮询特点,可以解决此问题。但内网域名仅限内网使用,使用公网域名访问时,还是存在CN单点问题,同时当前也不能在CN故障时进行请求转发,因此引入了弹性负载均衡服务(Elastic Load Balance,下称ELB),解决集群访问的单点问题。弹性负载均衡(ELB)是将访问流量根据转发策略分发到后端多台弹性云服务器的流量分发控制服务,可以通过流量分发扩展应用系统对外的服务能力,提高应用程序的容错能力。了解更多,请参见《弹性负载均衡用户指南》。利用ELB健康检查机制可将集群的CN请求快速转发到正常工作的CN节点上,当有CN故障节点时,也能第一时间切换流量到健康节点上,最大化降低集群访问故障。说明:该特性仅8.1.1及以上集群版本支持。为保证集群负载均衡和高可用,避免CN单点故障问题,客户生产业务下,要求集群创建后进行ELB绑定。约束与限制创建ELB时,ELB规格需要用户按本身业务访问流量评估,GaussDB(DWS)侧仅是绑定关联ELB,并不改变ELB规格。创建ELB时,仅需创建ELB,无需创建ELB服务的监听器与后端服务器组,GaussDB(DWS)会自动创建所需要的ELB监听器与后端服务器组。创建ELB时,不能存在与数据库相同端口的监听器,否则会导致ELB绑定失败。进行绑定ELB操作时,需创建TCP型且有内网IP的ELB进行绑定。绑定ELB时,GaussDB(DWS)侧默认为ELB服务配置“ROUND_ROBIN”转发策略,并设置10秒的健康检查间隔,50秒超时时间以及3次重试次数。用户如果需要修改此ELB默认参数时,请充分评估影响。解绑ELB时,GaussDB(DWS)侧会清除ELB中集群相关信息,但并不会删除用户ELB,请注意ELB本身的计费影响,防止不必要的成本支出。如需要公网IP或者域名访问ELB集群时,请通过ELB服务管理页面进行EIP绑定或者域名操作。2.1 绑定ELB登录GaussDB(DWS) 管理控制台。单击“集群管理”。默认显示用户所有的集群列表。在集群列表中,单击指定集群名称进入“基本信息”页面。单击“绑定弹性负载均衡”,选择需要绑定到此集群的ELB,若不存在ELB,则可在ELB服务页面创建完成后,在DWS侧刷新进行重新绑定即可。5.绑定命令下发成功后,返回集群管理页面,集群列表将显示“弹性负载均衡服务绑定中”任务信息,绑定需要一定时间,请耐心等待。6.进入负载均衡服务控制台,单击绑定的ELB名称,切换到“后端服务器”页签,检查集群CN节点是否被正确绑定到ELB中。ELB后端节点健康检查结果为已删除时可忽略,仅为ELB服务显示问题。7.绑定成功后,进入集群的“基本信息”页面,可以查看ELB对外服务提供的IP地址,后续连接DWS集群使用此地址。2.2 解绑ELB登录GaussDB(DWS) 管理控制台。单击“集群管理”。默认显示用户所有的集群列表。在集群列表中,单击指定集群名称进入“基本信息”页面。单击“解绑弹性负载均衡”,进行ELB解绑操作。5.解绑命令下发成功后,返回集群管理页面,集群列表显示“弹性负载均衡服务解绑中”任务信息,解绑需要一定时间,请耐心等待。6.进入负载均衡服务控制台,单击解绑的ELB名称,切换到“后端服务器”页签,检查集群CN节点是否已被删除。
  • [实践系列] DWS熔断配置方案
    1 自动查杀超时语句1.1基础信息创建1.1.1 连接数据库使用omm用户登陆postgres库操作。gsql -d postgres -p 25308 -r1.1.2 创建schemacreate schema user_defined_alarm;1.1.3 创建活跃会话超时配置表create table if not exists user_defined_alarm.user_session_config( typename varchar(128),username varchar(32),threshold varchar(32),primary key(typename,username)) distribute by replication;1.1.4 定义会话查杀阈值(查杀分钟以上级别的会话)其中test1、test2、test3为用户名,10min、30min、1hour为查杀超时时间(超时时间和用户根据实际情况修改)。insert into user_defined_alarm.user_session_config(typename,username,threshold) values ('ActiveSessionKiller','test1','10min');insert into user_defined_alarm.user_session_config(typename,username,threshold) values ('ActiveSessionKiller','test2','30min');insert into user_defined_alarm.user_session_config(typename,username,threshold) values ('ActiveSessionKiller','test3','1hour');1.1.5 查询查杀阈值信息select * from user_defined_alarm.user_session_config where typename='ActiveSessionKiller';1.1.6 创建会话查杀历史信息表create table if not exists user_defined_alarm.user_session_killer_info (uuid varchar(36) default sys_guid(),flagdate date,datname varchar(20),usename varchar(20),coorname varchar(10),starttime date,runtime interval(0),threshold interval(0),backend boolean,pid bigint,query_id bigint,state varchar(30),waiting boolean,enqueue varchar(30),query text);1.1.7 创建会话查杀存储过程CREATE OR REPLACE FUNCTION user_defined_alarm.fun_active_session_killer()RETURNS textLANGUAGE 'plpgsql'AS $$DECLAREquery_str text;row_data record;result text;BEGINFOR row_data in SELECT now()::date as flagdate,ps.datname,ps.usename,ps.coorname,ps.query_start::date as starttime,(now() - ps.query_start)::interval(0) AS runtime,ac.threshold::interval as threshold, ps.pid,ps.query_id,ps.state,ps.waiting,ps.enqueue,regexp_replace(replace(replace(replace(ps.query, chr(10),' '),chr(13),''),chr(9),' '),E'\\s{2,}',' ','g') AS query FROM pgxc_stat_activity ps,user_defined_alarm.user_session_config ac WHERE ac.typename = 'ActiveSessionKiller' and ps.usename = ac.username and ps.state <> 'idle' and ps.query_start < now() - ac.threshold::intervalLOOPquery_str = 'EXECUTE DIRECT ON ('||row_data.coorname||') '' SELECT pg_cancel_backend('||row_data.pid||')'';'; EXECUTE query_str into result;EXECUTE IMMEDIATE 'insert into user_defined_alarm.user_session_killer_info(flagdate,datname,usename,coorname,starttime,runtime,threshold,backend,pid,query_id,state,waiting,enqueue,query) values('''||row_data.flagdate||''','''||row_data.datname||''','''||row_data.usename||''','''||row_data.coorname||''','''||row_data.starttime||''','''||row_data.runtime||''','''||row_data.threshold||''','''||result||''','''||row_data.pid||''','''||row_data.query_id||''','''||row_data.state||''','''||row_data.waiting||''','''||row_data.enqueue||''','''||replace(row_data.query,chr(39),chr(39)||chr(39))||''')';END LOOP;return result;END $$;1.1.8 通过job定时任务生成数据,查询定时任务select * from pg_jobs;1.1.9 生成定时任务每隔1分钟检查一次,检查时间点对应username运行时长超过threshold的会话会被kill。call dbms_job.submit('select user_defined_alarm.fun_active_session_killer()', sysdate, 'interval ''1min''', :a);1.1.10 查询定时任务select * from pg_jobs;1.1.11 手动测试。返回空后者true说明正常。select user_defined_alarm.fun_active_session_killer();1.1.12 查询历史查杀活跃会话信息select flagdate,datname,usename,coorname,starttime,runtime,threshold,backend,pid,query_id,state,waiting,enqueue,query from user_defined_alarm.user_session_killer_info order by flagdate desc limit 10;1.2定时任务维护方法1.2.1 查询定时任务select * from pg_jobs;1.2.2 修改定时任务执行间隔,其中1为job_idCALL dbms_job.interval(1, 'interval ''10sec''');1.2.3 停止定时任务 call dbms_job.broken(1,true);1.2.4 启动定时任务call dbms_job.broken(1,false);1.2.5 删除定时任务,其中1为job_idcall dbms_job.remove(1);1.2.6 定期清理历史信息表随时间推移,历史信息表user_defined_alarm.user_session_killer_info会膨胀,需要定期清理,防止膨胀占用大量磁盘空间。1.3SQL和脚本一、活跃会话自动查杀监控配置使用Ruby用户登陆postgres库操作。gsql postgres://:8000/postgres?application_name='OM' -ar1、创建监控schemacreate schema user_defined_alarm;2、创建查杀阈值配置表create table if not exists user_defined_alarm.user_session_config( typename varchar(128),username varchar(32),threshold varchar(32),primary key(typename,username)) distribute by replication;3、定义会话查杀阈值(查杀分钟以上级别的会话)insert into user_defined_alarm.user_session_config(typename,username,threshold) values('ActiveSessionKiller','ops','10min');insert into user_defined_alarm.user_session_config(typename,username,threshold) values('ActiveSessionKiller','detl','30min');insert into user_defined_alarm.user_session_config(typename,username,threshold) values('ActiveSessionKiller','obdes','1hour');4、查询查杀阈值信息select * from user_defined_alarm.user_session_config where typename='ActiveSessionKiller';5、创建会话查杀历史信息表create table if not exists user_defined_alarm.user_session_killer_info (uuid varchar(36) default sys_guid(),flagdate date,datname varchar(20),usename varchar(20),coorname varchar(10),starttime date,runtime interval(0),threshold interval(0),backend boolean,pid bigint,query_id bigint,state varchar(30),waiting boolean,enqueue varchar(30),query text);6、创建会话查杀存储过程CREATE OR REPLACE FUNCTION user_defined_alarm.fun_active_session_killer()RETURNS textLANGUAGE 'plpgsql'AS $$DECLAREquery_str text;row_data record;result text;BEGINFOR row_data in SELECT now()::date as flagdate,ps.datname,ps.usename,ps.coorname,ps.query_start::date as starttime,(now() - ps.query_start)::interval(0) AS runtime,ac.threshold::interval as threshold, ps.pid,ps.query_id,ps.state,ps.waiting,ps.enqueue,regexp_replace(replace(replace(replace(ps.query, chr(10),' '),chr(13),''),chr(9),' '),E'\\s{2,}',' ','g') AS query FROM pgxc_stat_activity ps,user_defined_alarm.user_session_config ac WHERE ac.typename = 'ActiveSessionKiller' and ps.usename = ac.username and ps.state <> 'idle' and ps.query_start < now() - ac.threshold::intervalLOOPquery_str = 'EXECUTE DIRECT ON ('||row_data.coorname||') '' SELECT pg_cancel_backend('||row_data.pid||')'';';EXECUTE query_str into result;EXECUTE IMMEDIATE 'insert into user_defined_alarm.user_session_killer_info(flagdate,datname,usename,coorname,starttime,runtime,threshold,backend,pid,query_id,state,waiting,enqueue,query) values('''||row_data.flagdate||''','''||row_data.datname||''','''||row_data.usename||''','''||row_data.coorname||''','''||row_data.starttime||''','''||row_data.runtime||''','''||row_data.threshold||''','''||result||''','''||row_data.pid||''','''||row_data.query_id||''','''||row_data.state||''','''||row_data.waiting||''','''||row_data.enqueue||''','''||replace(row_data.query,chr(39),chr(39)||chr(39))||''')';END LOOP;return result;END $$;7、生成定时任务,每1分钟检查一次,检查时间点对应username运行时长超过threshold的会话会被kill掉。call dbms_job.submit('select user_defined_alarm.fun_active_session_killer()', sysdate, 'interval ''1min''', :a);8、查询定时任务select * from pg_jobs;9、手动测试,返回 空 或者 true 说明正常。select user_defined_alarm.fun_active_session_killer();10、查询历史查杀活跃会话信息select flagdate,datname,usename,coorname,starttime,runtime,threshold,backend,pid,query_id,state,waiting,enqueue,query from user_defined_alarm.user_session_killer_info order by flagdate desc limit 10;2 配置下盘上限2.1 参数说明参数名称:temp_file_limit参数说明:限制一个会话中,触发落盘操作时,单个落盘文件的空间大小。例如一次会话中,排序和哈希表使用的临时文件,或者游标占用的临时文件。SQL查询执行时使用的临时表空间不在此限制。取值范围:整型,单位为KB。其中-1表示没有限制。默认值:-12.2 配置方法gs_guc reload -Z coordinator -Z datanode -N all -I all -c " temp_file_limit =value"其中value为下盘上限,需要根据实际情况配置,该参数不需要重启集群。
  • [实践系列] 检查是否已开启CN故障自动剔除功能
    1 打开DWS集群的CN自动剔除1.1 开启cn自动剔除步骤一:cn剔除需要cn节点数量大于等于3,登录DWS集群的cn-1-1实例,切换到Ruby用户下,进入沙箱,执行以下命令:gs_guc set -Z cm -N all -I all -c "coordinator_heartbeat_timeout=600"gs_ssh -c "ps ux |grep cm_server |grep -v grep |awk '{print \$2}' |xargs -r kill -9"备注信息:cn一旦被剔除,会影响巡检,出现巡检项检查报错的问题,需要修复cn解决。
  • [其他] GaussDB(DWS) Java自定义函数常见问题
    1、问题现象 用户使用Java编写了自定义的函数,函数在调用时返回结果为空,或者执行时报错。 2、问题定位过程 自定义函数UDF的日志路径在$GAUSSLOG/cm/cm_agent/pg_log,通过查看日志可以找到报错信息。(1)执行函数时报错,报错信息为security operation is not allowed 。 FATAL:  java.lang.ExceptionInInitializerError                 at sun.security.jca.GetInstance.getInstance(GetInstance.java:156)                 at java.security.Security.getImpl(Security.java:695)                 at java.security.MessageDigest.getInstance(MessageDigest.java:170)                 at String2Sha1.stringToSHA1(String2Sha1.java:14)         Caused by : security operation is not allowed.                 at org.postgresql.pljava.internal.Backend$2.assertPermission(Backend.java:359)                 at org.postgresql.pljava.internal.Backend$PLJavaSecurityManager.nonRecursiveCheck(Backend.java:135)                 at org.postgresql.pljava.internal.Backend$PLJavaSecurityManager.checkPermission(Backend.java:111)                 at java.security.Security.getProperty(Security.java:760)                 at sun.security.jca.ProviderList.(ProviderList.java:166)                 at sun.security.jca.ProviderList.(ProviderList.java:56)                 at sun.security.jca.ProviderList$2.run(ProviderList.java:86)                 at sun.security.jca.ProviderList$2.run(ProviderList.java:84)                 at java.security.AccessController.doPrivileged(Native Method)                 at sun.security.jca.ProviderList.fromSecurityProperties(ProviderList.java:83)                 at sun.security.jca.Providers.(Providers.java:54)                 at sun.security.jca.GetInstance.getInstance(GetInstance.java:156)                 at java.security.Security.getImpl(Security.java:695)                 at java.security.MessageDigest.getInstance(MessageDigest.java:170)                 at String2Sha1.stringToSHA1(String2Sha1.java:14)  如果出现上述报错,表示javaudf函数执行过程中禁止Security配置修改(SecurityPermission权限)。  (2)执行函数时报错,异常信息为reflection is not allowed postgres=# select SM4EncDefault('DWS'); ERROR:  UDF Error:java.lang.InternalError: cannot create instance of org.bouncycastle.jcajce.provider.digest.GOST3411$Mappings : java.lang.SecurityException: reflection is not allowed.         at org.bouncycastle.jce.provider.BouncyCastleProvider.loadServiceClass(Unknown Source)         at org.bouncycastle.jce.provider.BouncyCastleProvider.loadAlgorithms(Unknown Source)         at org.bouncycastle.jce.provider.BouncyCastleProvider.setup(Unknown Source)         at org.bouncycastle.jce.provider.BouncyCastleProvider.access$000(Unknown Source)         at org.bouncycastle.jce.provider.BouncyCastleProvider$1.run(Unknown Source)         at java.security.AccessController.doPrivileged(Native Method)         at org.bouncycastle.jce.provider.BouncyCastleProvider.(Unknown Source)         at com.wxtool.ChinaCipherSM4Base.(ChinaCipherSM4Base.java:28)         at com.wxtool.ChinaCipher.SM4Enc(ChinaCipher.java:188)         at com.wxtool.ChinaCipher.SM4EncDefault(ChinaCipher.java:218)         at encrypt.SM4EncDefault.evaluate(SM4EncDefault.java:24) CONTEXT:  referenced column: sm4encdefault  如果出现上述报错,表示javaudf函数执行过程中禁用了反射(ReflectPermission权限)。  (3)执行函数时报错NoSuchAlgorithmException  java.security.NoSuchAlgorithmException: SHA-1 MessageDigest not available         at sun.security.jca.GetInstance.getInstance(GetInstance.java:159)         at java.security.Security.getImpl(Security.java:695)         at java.security.MessageDigest.getInstance(MessageDigest.java:170)  SHA-1算法在Java代码中是通过反射方式获取的,因此这是因为javaudf函数执行过程中禁用了反射(ReflectPermission权限)造成的。  (4)执行函数时报错信息为java.security.InvalidKeyException: No installed provider supports this key,这是因为Java中类的加载是由classloader完成的,  javaudf函数执行过程中禁止自定义classLoder(createClassLoader权限)引起了报错。  3、问题解决方案  以上为 Java自定义函数常见的问题,解决方法是设置javaudf_disable_feature参数,去掉其中的security, reflection,classloader  设置方法为:  gs_guc reload -Z coordinator -Z datanode -N all -I all -c "javaudf_disable_feature='extdir, hadoop, loadlibrary, net, socket, access_declared_members'"  ​ 
  • [互动交流] 如何设置帐号有效期呢
    如题,我想重新设定下帐号的有效操作期,该怎么设置呢?
  • DWS全文检索(GIN)优化模糊查询(LIKE)案例
    1. 测试场景:SELECT "u"."userId","u"."nickname","u"."realName","u"."mobile","u"."vipType","u"."isManualVip","u"."withdrawedMoney","u"."consumedMoney","u"."refereeUserId","u"."realName","u"."fromChannel","u"."remark","u"."headimgurl","u"."reNickname","u"."reMobile","u"."reVipType" AS "pVipType","u"."reUserId" AS "puserId",IF(u."isFriend"=0OR ubl."userId" is NOT null, 0, 1) AS "isFriend",CASEWHEN ubl.type is NOT nullAND ubl.type=1 THEN 1WHEN (ubl.type is NOT nullAND ubl.type=2 OR u."isFriend"=0) THEN 2ELSE 0END AS "userBlackType", DATE_FORMAT(u."createdAt", '%Y-%m-%d %H:%i:%S') AS "createdAt"FROM "users_union" AS "u"LEFT JOIN "userBlackList" AS "ubl"ON "u"."userId" = "ubl"."userId" AND "ubl"."status" = '1'WHERE ("u"."companyId" = '1001879')AND ("u"."reNickname" LIKE '%谢政霖%' OR "u"."realName" LIKE '%谢政霖%')ORDER BY "u"."userId" DESC limit 11 offset 0 ;该SQL在ADB毫秒级返回,DWS执行9秒;需要优化2. 慢SQL原因分析:经过拆解分析发现,性能耗时在大表users_union (9000w)的顺序扫描上。由于此表存在DRS实时同步任务,故只能采用行存表。而LIKE模糊查询会走全表顺序扫描,故耗时较长。3. 实验室环境模拟造数造数6000W导入测试表4. 执行LIKE查询测试性能explain performanceselect distinct nickname from users_union WHERE nickname like '%王强%';由执行计划可知性能损失在顺序扫描上,故采用全文检索优化此场景。5. 全文检索性能优化5.1 使用中文分词器建立全文检索进行优化建立索引语句如下:create index index_nickname_zh on users_union using gin(to_tsvector('zhparser',nickname));改写语句执行全文检索查询:explain performanceselect distinct nickname from users_union WHERE to_tsvector('zhparser',nickname) @@ to_tsquery('zhparser','王强');性能已经优化到29ms5.2 中文分词器匹配空格报错问题在客户实际场景测试发现,当检索的值中间存在空格时,中文分词器分词的全文检索会报错,如下所示:select distinct nickname from users_union WHERE to_tsvector('zhparser',nickname) @@ to_tsquery('zhparser','王 强');以上错误采用对匹配字符前后多加单引号(3个)的方式规避报错,原理如下:多加了单引号后,查询结果将空格前后的中文会分别作模糊匹配,将空格作模糊匹配explain performanceselect distinct nickname from users_union WHERE to_tsvector('zhparser',nickname) @@ to_tsquery('zhparser','''王 强''');5.3 中文分词器检索匹配结果和LIKE结果不一致客户在实际测试发现,DWS全文检索和LIKE模糊查询结果集存在差异,实测如下:(1)LIKE模糊查询结果如下:(2)中文分词器全文检索结果如下:对比发现:DWS全文检索结果集缺失包含特殊符号的结果: A.众成青青 王 强🏅DWS全文检索结果集多出了结果: 强 王 哈以上问题分析结论如下:对于特殊符号,DWS现有分词器基本都做不到准确分词,需要新建分词器;全文检索是分词后按字符匹配,多出结果集 “强 王 哈” 是正常结果,可以在全文检索的结果集上新增LIKE实现精确过滤5.4 新建分词器(1)建立新的分·如下:-- PARSER:选择分词器-- WITH:分词器配置-- gram_size:一个字符是一个词,会略微影响性能-- grapsymbol_ignore:是否忽略图形字符-- punctuation_ignore:是否忽略标点符号CREATE TEXT SEARCH CONFIGURATION ngram_str (PARSER = ngram) WITH (gram_size = 1, grapsymbol_ignore = false, punctuation_ignore = false);-- zh_words:中文字符-- en_word:英文字符-- numeric:数字-- alnum:数字或者字符-- grapsymbol,multisymbol:标点符号或者图形化字符ALTER text search configuration ngram_str ADD MAPPING FOR zh_words, en_word, numeric, alnum, grapsymbol, multisymbol WITH simple;(2)使用新的分词器建立全文索引CREATE INDEX idx_nickname_ngram_str ON users_union USING gin (to_tsvector('ngram_str', nickname));(3)查出精确匹配结果需要全文检索和LIKE配合使用select distinct nickname from users_union where to_tsvector('ngram_str',nickname) @@ to_tsquery('ngram_str','''王 强''') and nickname like '%王 强%';全文检索查询结果集如下,与LIKE模糊查询一致:性能如下,相较于LIKE直接模糊查询,优化效果明显(实验室环境1.5S->300ms)注意约束:(1)此方案在匹配值为null时会报错,由于此种场景是无意义的分词场景,要在业务侧查询传参时避免此种情况,测试报错如下:​2)此方案在匹配值为纯空格时没有返回值,由于此种场景是无意义的分词场景,要在业务侧查询传参时避免此种情况,测试如下: 3)避免在匹配值里传入单引号,查询会报错,业务侧查询传参时需要规避(类似SQL注入)测试如下:当传入的匹配值为:  '王 强 时
  • [POC&交付] DWS集群和脚本性能调优总结
     0. 统计信息 -- 统计信息是动态调优的核心信息输入,统计信息准确与否,至关重要 0.1 低效算子 -- NEST LOOP 0.2 不下推分析 优化器在分布式框架下有三种执行计划优化策略 * 下推语句执行计划:CN发送查询语句到DN直接执行,执行结果返回给CN。(DN间无需数据交换场景)执行计划中包含__REMOTE_FQS_QUERY__,   表明语句走了FQS(Fast Query Shipping),代表这种场景下,直接下发语句到Datanode执行,而不是在Coordinator上生成执行计划,这种表示该语句无需Datanode间数据交互  特征:Data Node Scan on *_REMOTE_FQS_QUERY_* 例如: create table t1(a int,b int) distribute by (a); create table t2(a int,b int) distribute by (a); explain verbose select t1.* from t1  join t2 on t1.a = t2.a; -- t1和t2 都是分布表,t1.a 和 t2.a都是其分布列,join能匹配到的数据都在同一个DN上,因此DN间不需要数据交换,原语句直接下发到DN上执行即可。 -- 此种语句在CH上打印的执行计划信息较少,可直接在DN上打印详细执行信息  * 分布式计划:CN生成计划树,发送计划树给DN执行;DN执行完成后,将结果返回给CN。  特征:Streaming (type:GATHER)  broadcast : 全表广播。全表数据量的数据向所有DN传输  redistribute : 重分布。不多于全表数据量的数据向所有DN传输。性能优于 broadcast  gather :聚合流。聚合流将数据从多个查询片段聚合到一个。 * 不下推执行计划:CN承担大量计算任务,导致性能劣化。优化器将部分查询(多为基表扫描语句,DN只扫描、不计算,不过滤)下推到DN执行,将获取到的中间结果返回给CN,CN再执行计划剩余的部分。  特征:Data Node Scan + _REMOTE_XXX   0.3   --优化思路和手段 1.扫描慢 1.1 建立单字段分区或多字段分区 -- 逻辑上的一张表根据某种方案分成几张物理块进行存储,这张逻辑上的表称之为分区表,物理块称之为分区。分区表是一张逻辑表,不存储数据,数据实际是存储在分区上的。 -- 目前行存表、列存表仅支持范围分区和列表分区。(8.1.3) -- 有限地支持唯一约束和主键约束,即唯一约束和主键约束的约束键必须包含所有分区键。 -- VACUUM和ANALYZE只会对主表起作用,要想分析分区表,需要分别分析每个分区表。 -- 数据迁移到分区表后建议禁用主表,如果主表未执行vacuum操作,那么执行计划会全表扫描主表,非常耗时。 •查看分区表信息,可使用系统表dba_tab_partitions。 select * from dba_tab_partitions where table_name='tpcds.customer_address'  select table_name,partition_name from dba_tab_partitions where table_name = 'web_returns_p1';   --单子段分区 partition by range(followup_create_time)(     partition p1 START('2022-01-01') END ('2022-06-30') EVERY (INTERVAL '1 day')   )   partition by range(order_date)(     partition p1 START('2022-01-01'::TIMESATMP(0)) END ('2022-06-30'::TIMESTAMP(0)) EVERY (INTERVAL '3 months')) )    -- 多字段分区(多字段分区不能使用START END 来指定分区)  WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false)  DISTRIBUTE BY HASH(imsi)  PARTITION BY RANGE (idperiodo, idcalendario)  (           PARTITION p_20201231 VALUES LESS THAN (202101, 20210101) TABLESPACE pg_default,           PARTITION p_20210101 VALUES LESS THAN (202101, 20210102) TABLESPACE pg_default )  -- 查询分区表指定分区 select * from table_name partition('partition_name');  1.1 行存表:建立btree保序索引  -- 涉及排序场景建立btree索引,目前行存btree索引保持排序,列存不保存排序结果。但是建立索引后,因为要排序,所以表在插入、更新时会有一定的性能影响。 CREATE INDEX dws_tt_flink_eos_wide_01 ON dws_tt_flink_eos_wide USING btree(followup_create_time) local;  1.2 列存表建立PCK(Partial Cluster Key(局部聚簇));局部聚簇存储,列存表导入数据时按照指定的列(单列或多列),进行局部排序。 -- 一个表只能建立一个PCK -- 一个PCK可以包含多列,但是不建议超过两列 -- 建议在查询中的简单表达式的过滤条件上建立PCK;如column >,=,< 常量。 -- 在满足上面条件的情况下,选择distinct值比较少的列建立PCK CREATE TABLE tpcds.warehouse_t21 (     W_WAREHOUSE_SK            INTEGER         NOT NULL,     PRIMARY KEY (column_name1,column_name2),     PARTIAL CLUSTER KEY(column_name1,column_name2) ) WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false)  DISTRIBUTE BY REPLICATION;     2.表结构 orientation不支持修改。行列存储方式一旦建立,不能修改 行存表: -- 点查询场景(大基表单表过滤查询,返回结果少,基于索引的简单查询,比如btree排序索引) -- 增删改较多的场景,并发增删改;实时数据接入等 -- 行存表压缩功能暂未商用,如需使用请联系技术支持工程师。 列存表: -- 多表关联的统计分析类场景 -- 即席查询(查询条件列不确定,行存无法确定索引) -- 多表关联查询、聚合、分组查询等,访问大量行,少数列的场景。  数据类型: -- 数据类型合理 变长可以变为定长的一律改为定长;变长在方便的同时,肯定会影响性能。 -- 多个表间存在逻辑关系时,表示同一含义字段使用相同类型。字符串字段尽量使用变长数据类型。不建议使用定长数据类型。 text,carchar  --> char(8) numeric(12,0) --> bigint  2.1分布键选择合理 (不同DN间相差5%以上即可认为倾斜,10%以上必须调整分布列) -- ◾当指定DISTRIBUTE BY HASH (column_name)参数时,创建主键和唯一索引必须包含分布键。 -- 查询数据分布: select table_skewness('table_name'); -- 不指定分布方式时,默认第一个字段为分布键,进行hash分布 -- 通常选取表的主键作为分布列 -- 选择查询中关联条件作为分布列,以便Join任务可以下推到DN执行,且减少DN间的通信数据量。 -- 复杂查询场景下,尽量不要选取存在常量等值过滤的列,避免剪枝后扫描集中在部分DN上。 -- 点查询场景下,则应该尽量选取WHERE条件中的等值过滤条件列作为分布列。  --修改表的分布键:原理是系统新建一个表进行替换 alter table schema_name.table_name distribute by hash(new_column);  -- 参数:default_distribution_mode -- 参数说明:用于设置表的默认分布方式。该参数仅8.1.2及以上版本支持。 -- 参数类型:USERSET -- 取值范围:枚举类型 -- •roundrobin,创建表不指定分布方式时,按如下规则选取默认分布方式:1.若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。若建表时不包含主键/唯一约束,则选取ROUNDROBIN分布。 -- •hash,创建表不指定分布方式时,按如下规则选取默认分布方式: --    1.若建表时包含主键/唯一约束,则选取HASH分布,分布列为主键/唯一约束对应的列。 --    2.若建表时不包含主键/唯一约束,但存在数据类型支持作分布列的列,则选取HASH分布,分布列为第一个数据类型支持作分布列的列。 --    3.若建表时不包含主键/唯一约束,也不存在数据类型支持作分布列的列,选取ROUNDROBIN分布。 默认值:roundrobin 新建8.1.2集群版本默认值为roundrobin,升级到8.1.2集群版本场景该参数的默认值为hash。  2.2 维度小表建立复制表  ,列存(数据量10万以下) CREATE TABLE tpcds.warehouse_t21 (     W_WAREHOUSE_SK            INTEGER               NOT NULL ) WITH (orientation=column, compression=low, colversion=2.0, enable_delta=false)  DISTRIBUTE BY REPLICATION;  2.3 列存表涉及更新,开启delta,不过在实时更新频繁时,还是搞不定,比如RDS服务实时导入数据的表,只能为行存表。 CREATE TABLE tpcds.warehouse_t21 (     W_WAREHOUSE_SK            INTEGER               NOT NULL ) WITH (orientation=column, compression=low, colversion=2.0, enable_delta=on)  DISTRIBUTE BY REPLICATION;  2.4 行存表强制打开向量化(GUC控制台参数),执行计划走列存向量 set enable_force_vector_engine=on;  -- 干预执行计划:best_agg_plan -- Stream执行框架分为如下三种计划形态: -- hashagg+gather(redistribute)+hashagg -- redistribute+hashagg(+gather) -- hashagg+redistribute+hashagg(+gather) -- GaussDB(DWS)提供了guc参数best_agg_plan来干预执行计划,强制其生成上述对应的执行计划,此参数取值范围为0,1,2,3 -- •取值为1时,强制生成第一种计划。 -- •取值为2时,如果group by列可以重分布,强制生成第二种计划,否则生成第一种计划。 -- •取值为3时,如果group by列可以重分布,强制生成第三种计划,否则生成第一种计划。 -- •取值为0时,优化器会根据以上三种计划的估算代价选择最优的一种计划生成。  3.模糊匹配 -- 建立全文索引 create index index_name on table_name using gin(to_tsvector(col_name)); select * from table_name where to_tsvector(col_name) @@ plainto_tsquery('某公司') ---- where             to_tsvector('zhparser',ef.remark ) @@ to_tsquery('%hiphi%')            --  ef.remark  like '%hiphi%'  -- 列值多值列 -- 列存多值列效率方面比行存全文搜索快很多,特别是列越多搜索效率越高。10列值的比3列值的效率高很多,3列值比单列值的效率要高。  4.查询数据库大小(已用空间) select datname,pg_size_pretty(pg_database_size(datname)) from pg_database;  10.查询指定表占用的磁盘存储空间 select pg_size_pretty(pg_relation_size('schema_name.table_name'));  •pg_table_size(regclass) -- 描述:指定的表使用的磁盘空间,不计索引(但是包含TOAST,自由空间映射和可见性映射)。 返回值类型:bigint  •pg_total_relation_size(regclass) -- 描述:指定的表使用的总磁盘空间,包括所有的索引和TOAST数据。 返回值类型:bigint  •pg_relation_size(text) -- 描述:指定名称的表或者索引使用的磁盘空间。表名字可以用模式名修饰。 返回值类型:bigint   5.改写SQL 5.1 not in -——> not exists   6.query_dop:多线程并行算法,实现核心算子并行计算; Initial DOP: 7   -- 初始DOP   Avail(CPU/IO)/Max core: (7.92/8.00)/8.00        -- 语句可用CPU/IO/最大核数 CPU/IO/Task util: 1.00/0.00/0                   -- 当前最大CPU/IO/DN作业个数 Running/Active/Max statement: 160/0/21474836     --当前DN正在运行作业数/进入CN作业数/允许最大作业数(ma) Final Max DOP: 6   -- 最终DOP  7.数据库float数据类型,小数点前面的0不显示 oracle兼容的不显示小数点前的0,mysql兼容的显示; -- 创建兼容ORA格式的数据库: CREATE DATABASE ora_compatible_db DBCOMPATIBILITY 'ORA'; -- DBCOMPATIBILITY [ = ] compatibilty_type;指定兼容的数据库的类型。取值范围:ORA、TD、MySQL。分别表示兼容Oracle、Teradata和MySQL数据库。若不指定该参数,默认为ORA。  8.清空表: 推荐使用truncate  操作,因为truncate操作会物理的清空数据表,并将其占用的空间归还给操作系统。  replace into: Insert or overwrite:主键存在,则删除原纪录插入新的记录;主键不存在,则插入记录  9. 查询指定用户当前后台正在执行的语句: select query_id,query from pgxc_stat_activity where usename='dbadmin' and state='active';  11.查询指定表的建表语句、存储倾斜率 select pg_get_tabledef('schema_name.table_name'); select table_skewness('schema_name.table_name');  12.内网域名可以走负载均衡,公网域名不可以(内网域名dns解析是会自带负载均衡的)  13.多IP配置实现负载均衡     (1)支持多ip端口配置形式,jdbc自动实现了负载均衡,多ip端口配置形式是采取随机访问+failover的方式,这个过程系统会自动忽略不可达IP,以","隔开,例如jdbc:postgresql://10.10.0.13:8000,10.10.0.14:8000/database     详情参见 https://support.huaweicloud.com/devg-813-dws/dws_04_0093.html     (2)开源JDBC配置:配置多ip时必须要配置loadBalanceHosts=true&targetServerType=any     (3)DWS的JDBC配置了多IP之后是强制负载均衡的,无需配置,配置了也不会报错  14.行存表不走bitmap索引,走顺序索引。默认值ON enable_bitmapscan=off  15.查询DN参数设置 EXECUTE DIRECT ON(dn_6001_6002) 'select name,setting from pg_settings where name=''comm_max_datanode''; '; EXECUTE DIRECT ON(dn_6001_6002) 'select name,setting from pg_settings where name=''comm_max_stream''; ';  16.控制选择重分布列的策略。 agg_redistribute_enhancement 参数说明:当进行Agg操作时,如果包含多个group by列且均不为分布列,进行重分布时会选择某一group by列进行重分布。本参数控制选择重分布列的策略。 取值范围:布尔型 •on表示会选择估算distinct值最多的一个可重分布列作为重分布列。 •off表示会选择第一个可重分布列为重分布列。 默认值:off  17.关于快照 (1)手动打的快照,删除集群后,快照会保留 (2)集群自动备份的快照,集群删除后,快照也会删除  18.数据库兼容行为配置项 (1)behavior_compat_options 参数说明:数据库兼容性行为配置项,该参数的值由若干个配置项用逗号隔开构成。 -- MYSQL 修改表分布键之前加这个:MySQL兼容模式下,控制CREATE TABLE ... LIKE语法是否为INCLUDING_ALL模式。 disable_including_all_mysql; -- ORACLE 兼容模式是否显示浮点数的 0 display_leading_zero; -- MySQL兼容模式下,设置此参数,控制locate,strpos,instr字符串函数入参大小写不敏感。 case_insensitive -- MySQL兼容模式下,除数为0时,控制除法或取余操作是否报错。(该配置项仅8.1.3.2及以上集群版本支持。) -- 设置此选项时,除法或取余操作中除数为0时,返回NULL。 enable_division_by_zero_mysql  19.开集群时存储大小计划: (1)集群总的实际存储容量大于客户实际需要的60%,要有40%的空余留给系统(安装集群、存储日志、元数据信息等)  20.列存表压缩级别的压缩比例 (1)以往测试经验:(低:1:3)、(中:1:5~1:6)、(高:1:8~1:9)  21.复制表 (1)不仅仅是小表,最好是不经常修改记录,不新增记录的维度表、静态表。  22•设置所处的时区。 SET  TIMEZONE = 'Asia/Beijing' ; -- 查看支持的所有时区 select * from PG_TIMEZONE_NAMES Asia/Beijing                     | CST    | 08:00:00   | f --查询数据库当前时区 show timezone; --设置时区 SET  TIMEZONE = 'Asia/Beijing'; --时间字段 时间字段格式最好选择 timestamp without zone;  23.购买集群注意集群版本  24.创建数据库兼容模式 create database yd_test1 with encoding 'utf-8' dbcompatibility 'MYSQL' template template0; (1)sql server:推荐TD数据库兼容模式,时间格式一致,区分空和null  25.转义反斜杠,测试这个目前只能如此转义。参数 standard_conforming_strings DWS好像没生效 (1)现在的postgresql基本上都是postgresql9之后的版本,反斜杠已经变成了普通字符.当然,如果你需要使用反斜杠转义可以在需要转义的字符串前面加上E(E就是Escape)  postgres=# select E'\'a\'';  ?column? ----------  'a' (1 row)  postgres=# show standard_conforming_strings;  standard_conforming_strings -----------------------------  on   26.集群资源实时监控 resource_track_cost 、 resource_track_duration 两个参数一起控制,一般resource_track_cost用默认值,然后resource_track_duration设置时长就可以了~ 具体的你也可以看看参数的详细描述  show enable_resource_track;      -- on show enable_resource_record;     -- on show resource_track_level;       -- query show resource_track_cost;        -- 0 show resource_track_duration;    -- 10  27.查询表存储倾斜率 select table_skewness('public.cpu1');  28.查询集群DN和CN节点 SELECT node_name,node_host FROM pgxc_node WHERE node_type='D'; SELECT node_name,node_host FROM pgxc_node WHERE node_type='C';  29.到执行后台进程的CN节点取消后台进程 SELECT pgxc_terminate_query(query_id);  30.查询分区表指定分区的记录数 --验证分区数据 SELECT count(*) FROM CPU1 PARTITION (default_part_1);  SELECT count(*) FROM CPU1 PARTITION (default_part_2);   31.查询后台进程 select coorname,query_id,query from pgxc_stat_activity where usename='dbadmin' and state='active';  32.指定表join顺序:  /*+ leading(("u" "uw" "ue" "ubl" "up")) */  33.指定表走的扫描索引:索引一次只能指定一个,但是可以多次指定 /*+ indexscan("u" "companyId") indexscan("ue" userextras_userid_index) */  34.join 的列上建立索引  35. 生成执行计划时间较长 set join_collapse_limit=4 
  • [集群&DWS] GaussDB(DWS) 创建dws集群失败,RdsCreatePortTask 创建端口失败
    【问题现象】集群创建在50%失败登录后台rms库,查看任务流,RdsCreatePortTask任务FAIL查看后台日志:Failed to get user agency token ; Get mo token by agency failed :场景一code :500 nova异常信息  :场景二getMOtokenByAgency httpCode:400 :场景三:DWSAccessVPC”【失败原因】   场景一:      管控面安装好,发放集群后,用户修改了租户信息,导致管控面数据库rms存储的租户信息和实际不一致   场景二:      规格配置时“可添加业务网络数量”配置不合理,应按指导设置为8 场景三:    没有创建委托“DWSAccessVPC”【修复措施】  场景一:查询租户id:select tenantId from rds_instance where name like '%集群名称%'根据租户id查询租户信息(realDomainName)和实际的租户进行对比:select * from rds_resttenant where readDomainId =#id# 查看租户名根据租户id更新realDomainName:update rds_restTenant set realDomainName='xxxx' where readDomainId='yy';  场景二:     在serviceOM修改规格,"可添加业务网络数量",按指导设置为8,重新下发集群 场景三:    首页--》系统--》委托管理--》删除委托“DWSAccessVPC”,如果删除失败,需要IAM协助处理    如果页面上无DWSAccessVPC”,则联系manageone侧1. 登录MO后台数据库,删除指定domainId下边的DWSAccessVPC委托。2. 点击一个已经创建好的集群名称,进入集群详情页面。3. 点击创建弹性公网IP,待页面弹出创建委托时,点击确认就好,不需要继续绑定弹性IP。4. 重新创建集群。
总条数:2746 到第 页
上滑加载中