华为云用户手册

  • v1.25版本 除EulerOS 2.5操作系统外,CCE v1.25集群的节点均默认采用Containerd容器引擎。 表4 v1.25补丁版本发布说明 CCE集群补丁版本号 Kubernetes社区版本 特性更新 优化增强 安全漏洞修复 v1.25.8-r0 v1.25.16 支持使用通用性SSD v2、极速SSD v2类型的云硬盘。 ELB Ingress支持配置灰度发布。 ELB Ingress支持配置URL重定向、Rewrite重写、HTTP重定向到HTTPS能力。 开放高频使用的集群参数、节点池参数配置。 修复部分安全问题。 v1.25.8-r0 v1.25.10 负载均衡类型的Service和ELB Ingress能力新增: 支持配置SNI。 支持开启HTTP/2。 支持配置空闲超时时间、请求超时时间、响应超时时间。 支持从HTTP报文的请求头中获取监听器端口号、客户端请求端口号、重写X-Forwarded-Host。 - 修复部分安全问题。 v1.25.7-r0 v1.25.10 创建Service或Ingress支持设置ELB黑/白名单访问控制。 CCE的节点镜像支持安全加固(满足等保三级基线要求)。 - 修复部分安全问题。 v1.25.6-r4 v1.25.10 - - 修复CVE-2024-21626安全漏洞。 v1.25.6-r2 v1.25.10 - 修复Ingress配置SNI证书并同时开启HTTP/2的场景下偶现配置冲突的问题。 - v1.25.6-r0 v1.25.10 节点池支持节点的自定义前缀和后缀命名 CCE Turbo集群中,支持创建工作负载类型的容器网络配置,可指定Pod子网,详情请参见容器网络配置(NetworkAttachmentDefinition)。 ELB Ingress支持GRPC协议,详情请参见ELB Ingress对接GRPC协议的后端服务。 负载均衡类型的服务在通过YAML创建时支持指定ELB私有IP,详情请参见通过kubectl命令行创建-自动创建ELB。 优化CCE Turbo集群中大批量创建安全容器的启动速度。 提升CCE Turbo集群中反复创建删除安全容器时的稳定性。 修复kubelet在特定场景下偶现启动卡死的问题。 优化autoscaler扩容节点池时的事件上报逻辑,去除规格售罄的重复事件。 修复特定场景下kubelet重启,出现Succeed状态的Pod变为Failed的问题。 修复部分安全问题。 v1.25.5-r20 v1.25.5 - 优化接口调用逻辑,避免业务大规模调用场景下出现接口流控。 启用chrony配置清理修正,避免数据堆积。 修复部分安全问题。 v1.25.5-r10 v1.25.5 - 优化节点删除时的事件信息。 修复部分安全问题。 v1.25.5-r0 v1.25.5 Volcano支持节点池亲和调度。详情请参见节点池亲和性调度。 Volcano支持负载重调度能力。详情请参见重调度(Descheduler)。 - 修复部分安全问题。 v1.25.4-r10 v1.25.5 - 优化节点池伸缩时的事件信息。 修复部分安全问题。 v1.25.4-r0 v1.25.5 节点池配置管理支持软驱逐和硬驱逐的设置。 支持为自动创建的EVS块存储添加TMS资源标签,以便于成本管理。 - 修复部分安全问题。 v1.25.3-r10 v1.25.5 CCE集群支持对接使用弹性规格的独享型ELB。 负载均衡支持设置超时时间。详情请参见负载均衡类型的服务设置超时时间和ELB Ingress设置超时时间。 kube-apiserver高频参数支持配置。 修复部分安全问题。 v1.25.3-r0 v1.25.5 Service和Ingress支持关联G-EIP的独享型ELB。 CCE Turbo容器网卡支持固定IP。详情请参见为Pod配置固定IP。 CCE Turbo容器网卡支持自动创建和自动绑定EIP。详情请参见为Pod配置固定EIP。 CCE Turbo集群在离线混部增强:支持Pod网络优先级限制。详情请参见出口网络带宽保障。 CCE Turbo集群支持命名空间关联容器网段。详情请参见网络配置(NetworkAttachmentDefinition)。 集群支持CPU Burst特性,避免CPU限流影响时延敏感型容器业务。详情请参见CPU Burst弹性限流。 增强CCE Turbo集群在规格变更场景时网络的稳定性。 修复部分安全问题。 v1.25.1-r0 v1.25.5 首次发布CCE v1.25集群,有关更多信息请参见Kubernetes 1.25版本说明。 - -
  • v1.27版本 Kubernetes在1.24版本中移除了Dockershim,并从此不再默认支持Docker容器引擎,建议您使用Containerd容器引擎。如果您需要将Docker节点迁移至Containerd节点,详情请参见将节点容器引擎从Docker迁移到Containerd。 表3 v1.27补丁版本发布说明 CCE集群补丁版本号 Kubernetes社区版本 特性更新 优化增强 安全漏洞修复 v1.27.6-r0 v1.27.9 创建节点支持选择Docker容器引擎。 支持使用通用性SSD v2、极速SSD v2类型的云硬盘。 ELB Ingress支持配置灰度发布。 ELB Ingress支持配置URL重定向、Rewrite重写、HTTP重定向到HTTPS能力。 开放高频使用的集群参数、节点池参数配置。 修复部分安全问题。 v1.27.5-r0 v1.27.4 负载均衡类型的Service和ELB Ingress能力新增: 支持配置SNI。 支持开启HTTP/2。 支持配置空闲超时时间、请求超时时间、响应超时时间。 支持从HTTP报文的请求头中获取监听器端口号、客户端请求端口号、重写X-Forwarded-Host。 - 修复部分安全问题。 v1.27.4-r0 v1.27.4 创建Service或Ingress支持设置ELB黑/白名单访问控制。 CCE的节点镜像支持安全加固(满足等保三级基线要求)。 - 修复部分安全问题。 v1.27.3-r4 v1.27.4 - - 修复CVE-2024-21626安全漏洞。 v1.27.3-r2 v1.27.4 - 修复Ingress配置SNI证书并同时开启HTTP/2的场景下偶现配置冲突的问题。 - v1.27.3-r0 v1.27.4 节点池支持节点的自定义前缀和后缀命名 CCE Turbo集群中,支持创建工作负载类型的容器网络配置,可指定Pod子网,详情请参见容器网络配置(NetworkAttachmentDefinition)。 ELB Ingress支持GRPC协议,详情请参见ELB Ingress对接GRPC协议的后端服务。 负载均衡类型的服务在通过YAML创建时支持指定ELB私有IP,详情请参见通过kubectl命令行创建-自动创建ELB。 优化CCE Turbo集群中大批量创建安全容器的启动速度。 提升CCE Turbo集群中反复创建删除安全容器时的稳定性。 创建Ingress对象时增加配置证书校验,避免对ELB侧已存在的Ingress证书进行覆盖。 优化autoscaler扩容节点池时的事件上报逻辑,去除规格售罄的重复事件。 增加Service与Ingress端口占用的相互校验逻辑;增加同集群下Ingress的路径冲突的的校验逻辑。 修复部分安全问题。 v1.27.2-r20 v1.27.2 - 修复VPC网络模型集群在短时间内创建删除大量Pod时容器网卡偶现残留的问题。 优化Ingress Controller查询证书逻辑,降低触发流控风险。 修复部分安全问题。 v1.27.2-r10 v1.27.2 - 优化节点删除时的事件信息。 修复部分安全问题。 v1.27.2-r0 v1.27.2 Volcano支持节点池亲和调度。详情请参见节点池亲和性调度。 Volcano支持负载重调度能力。详情请参见重调度(Descheduler)。 - 修复部分安全问题。 v1.27.1-r10 v1.27.2 - 优化节点池伸缩时的事件信息。 修复部分安全问题。 v1.27.1-r0 v1.27.2 首次发布CCE v1.27集群,有关更多信息请参见Kubernetes 1.27版本说明。 节点池配置管理支持软驱逐和硬驱逐的设置。 支持为自动创建的EVS块存储添加TMS资源标签,以便于成本管理。 由于社区安全加固,v1.27及以上版本的集群中ClusterIP地址无法ping通。 -
  • v1.28版本 表2 v1.28补丁版本发布说明 CCE集群补丁版本号 Kubernetes社区版本 特性更新 优化增强 安全漏洞修复 v1.28.4-r0 v1.28.5 创建节点支持选择Docker容器引擎。 支持使用通用性SSD v2、极速SSD v2类型的云硬盘。 ELB Ingress支持配置灰度发布。 ELB Ingress支持配置URL重定向、Rewrite重写、HTTP重定向到HTTPS能力。 开放高频使用的集群参数、节点池参数配置。 修复部分安全问题。 v1.28.3-r0 v1.28.3 负载均衡类型的Service和ELB Ingress能力新增: 支持配置SNI。 支持开启HTTP/2。 支持配置空闲超时时间、请求超时时间、响应超时时间。 支持从HTTP报文的请求头中获取监听器端口号、客户端请求端口号、重写X-Forwarded-Host。 - 修复部分安全问题。 v1.28.2-r0 v1.28.3 创建Service或Ingress支持设置ELB黑/白名单访问控制。 CCE的节点镜像支持安全加固(满足等保三级基线要求)。 - 修复部分安全问题。 v1.28.1-r4 v1.28.3 - - 修复CVE-2024-21626安全漏洞。 v1.28.1-r2 v1.28.3 - 修复Ingress配置SNI证书并同时开启HTTP/2的场景下偶现配置冲突的问题。 - v1.28.1-r0 v1.28.3 首次发布CCE v1.28集群,有关更多信息请参见Kubernetes 1.28版本说明。 节点池支持节点的自定义前缀和后缀命名 CCE Turbo集群中,支持创建工作负载类型的容器网络配置,可指定Pod子网,详情请参见容器网络配置(NetworkAttachmentDefinition)。 ELB Ingress支持GRPC协议,详情请参见ELB Ingress对接GRPC协议的后端服务。 负载均衡类型的服务在通过YAML创建时支持指定ELB私有IP,详情请参见通过kubectl命令行创建-自动创建ELB。 优化CCE Turbo集群中大批量创建安全容器的启动速度。 提升CCE Turbo集群中反复创建删除安全容器时的稳定性。 -
  • 资源变更与弃用 社区1.21 ReleaseNotes CronJob现在已达到稳定状态,版本号变为batch/v1。 不可变的Secret和ConfigMap现在已升级到稳定状态。向这些对象添加了一个新的不可变字段,以拒绝更改。此拒绝可保护集群免受可能无意中中断应用程序的更新。因为这些资源是不可变的,kubelet不会监视或轮询更改。这减少了kube-apiserver的负载,提高了可扩展性和性能。更多信息,请参见Immutable ConfigMaps。 优雅节点关闭现在已升级到测试状态。通过此更新,kubelet可以感知节点关闭,并可以优雅地终止该节点的Pod。在此更新之前,当节点关闭时,其Pod没有遵循预期的终止生命周期,这导致了工作负载问题。现在kubelet可以通过systemd检测即将关闭的系统,并通知正在运行的Pod,使它们优雅地终止。 具有多个容器的Pod现在可以使用kubectl.kubernetes.io/默认容器注释为kubectl命令预选容器。 PodSecurityPolicy废弃,详情请参见https://kubernetes.io/blog/2021/04/06/podsecuritypolicy-deprecation-past-present-and-future/。 BoundServiceAccountTokenVolume特性进入Beta,该特性能够提升服务账号(ServiceAccount)Token的安全性,改变了Pod挂载Token的方式,Kubernetes 1.21及以上版本的集群中会默认开启。 社区1.20 ReleaseNotes API优先级和公平性已达到测试状态,默认启用。这允许kube-apiserver按优先级对传入请求进行分类。更多信息,请参见API Priority and Fairness。 修复 exec probe timeouts不生效的BUG,在此修复之前,exec 探测器不考虑 timeoutSeconds 字段。相反,探测将无限期运行,甚至超过其配置的截止日期,直到返回结果。 通过此更改,如果未指定值,将使用默认值,默认值为1秒。如果探测时间超过一秒,可能会导致应用健康检查失败。请再升级时确定使用该特性的应用更新timeoutSeconds字段。新引入的 ExecProbeTimeout 特性门控所提供的修复使集群操作员能够恢复到以前的行为,但这种行为将在后续版本中锁定并删除。 RuntimeClass已达到稳定状态。RuntimeClass资源提供了一种机制,用于支持集群中的多个运行时,并将有关该容器运行时的信息公开到控制平面。 kubectl调试已达到测试状态。kubectl调试直接从kubectl提供对常见调试工作流的支持。 Dockershim在1.20被标记为废弃,目前您可以继续在集群中使用Docker。该变动与集群所使用的容器镜像(Image)无关。您依然可以使用Docker构建您的镜像。更多信息,请参见Dockershim Deprecation FAQ。
  • 简介 Nginx Ingress:基于社区的Nginx Ingress Controller进行了优化,为精选开源插件,提供丰富的Ingress配置,如果您对网关定制有强烈的需求,可以选择Nginx Ingress。 ELB Ingress:基于华为弹性负载均衡ELB(Elastic Load Balance),全托管,免运维,支持千万级并发链接,百万级新建连接。支持对接共享型负载均衡、独享性负载均衡实例。
  • 功能对比 比较项 Nginx Ingress ELB Ingress 产品定位 七层流量治理,提供丰富的高级路由功能。 七层流量治理,提供丰富的高级路由功能。与云原生深度集成,提供高可用、高性能、超安全、多协议的全托管免运维负载均衡服务。 具备弹性能力,流量突发时支持扩展计算资源。 同时支持千万级并发连接,百万级新建连接。 基础路由 基于内容、源IP的路由。 支持HTTP标头改写、重定向、重写、限速、跨域、会话保持等。 支持请求方向转发规则和响应方向转发规则,其中响应方向转发规则可以通过扩展Snippet配置实现。 转发规则按照最长路径匹配,匹配到多条路径时,转发路径最长的优先匹配。 基于内容、源IP的路由。 支持HTTP标头改写、重定向、重写、限速、会话保持等。 支持请求方向转发规则和响应方向转发规则。 转发规则按照优先级从高到低开始匹配,匹配到多条路径时,转发规则编号的数值越小优先级越高。 支持协议 支持HTTP和HTTPS协议。 支持WebSocket、WSS和gRPC协议。 支持HTTP和HTTPS协议。 支持gRPC协议。 配置变更 非后端端点变更需要Reload进程,对长连接有损。 端点变更使用Lua实现热更新。 Lua插件变更需要Reload进程。 申明式API,变更后由云服务之间的OpenAPI能力将配置加载到ELB负载均衡,实现动态加载。 认证鉴权 支持Basic Auth认证方式。 支持oAuth协议。 支持TLS身份认证。 性能 性能依赖手动调优,需要进行系统参数调优和Nginx参数调优。 需要配置合理的副本数和资源限制。更多信息,请参见通过控制台创建Nginx Ingress。 支持千万级并发连接,百万级新建连接。 可观测能力 支持通过Access Log采集日志。 支持通过Prometheus进行监控和告警配置。 支持云服务访问日志(对接LTS)。 支持审计关键操作。 支持使用Metrics输出监控指标(对接云监控)。 支持告警规则配置(对接云监控)。 运维能力 自行维护组件,定期同步社区新版本。 通过配置HPA进行扩缩容。 需要主动配置规格进行调优。 全托管、免运维。 自动弹性,免配置支持超大容量。 处理能力随业务峰值自动伸缩。 安全 支持HTTPS协议。 支持黑白名单功能。 HTTPS(集成SSL)支持全链路HTTPS、SNI多证书、RSA、ECC双证、TLS 1.3协议和TLS算法套件选择。 支持WAF防护墙防护。 支持DDos防护。 支持黑白名单功能。 支持自定义安全策略。 服务治理 服务发现支持K8s。 服务灰度支持金丝雀发布。 服务高可用支持限流。 服务发现支持K8s。 服务灰度支持金丝雀发布。 服务高可用支持限流。 云原生集成 自行运维组件,与华为云CCE、CCI Serverless、UCS等容器服务结合使用。更多信息,请参见路由概述。 全托管自动运维,与华为云CCE、CCI Serverless、UCS等容器服务结合使用。
  • 解决方案 先升级对应的ASM网格版本,再进行集群升级,ASM网格版本与集群版本适配规则如下表。 表1 ASM网格版本与集群版本适配规则 ASM网格版本 集群版本 1.3 v1.13、v1.15、v1.17、v1.19 1.6 v1.15、v1.17 1.8 v1.15、v1.17、v1.19、v1.21 1.13 v1.21、v1.23 1.15 v1.21、v1.23、v1.25、v1.27 1.18 v1.25、v1.27、v1.28 若不需要使用ASM网格,可删除ASM网格后再进行升级,升级后集群不能绑定与表中不匹配的ASM网格版本。例如,使用v1.21版本集群与1.8版本ASM网格,若要升级至v1.25版本集群时,请先升级ASM网格至1.15版本后再进行v1.25版本集群升级。
  • 扩展 除上述场景会出现存在多个collation造成冲突,以下两种场景也会出现多个collation,报错不同但解决方法相同。 场景一 SELECT语句中比较表达式a=b存在多个collation造成冲突,执行报错could not determine which collation to use for string comparison。 1 2 3 SELECT a=b FROM t; ERROR: dn_6001_6002: could not determine which collation to use for string comparison HINT: Use the COLLATE clause to set the collation explicitly. 执行SELECT时,指定表达式a=b的排序规则为case_insensitive。 1 2 3 4 5 SELECT a=b COLLATE case_insensitive FROM t; ?column? ---------- f (1 row) 场景二 SELECT语句中表达式 instr(a,b)存在多个collation造成冲突,执行报错could not determine which collation to use for string searching。 1 2 3 SELECT instr(a,b) FROM t; ERROR: dn_6005_6006: could not determine which collation to use for string searching HINT: Use the COLLATE clause to set the collation explicitly. 执行SELECT时,指定字段a的排序规则为case_insensitive或者指定字段b的排序规则为C来保证字段排序规则的统一。 1 2 3 4 5 6 7 8 9 10 11 SELECT instr(a collate case_insensitive,b) FROM t; instr ------- 0 (1 row) SELECT instr(a,b collate "C") FROM t; instr ------- 0 (1 row)
  • 问题现象 执行SELECT查询时报错could not determine which collation to use for string hashing。 1 2 3 4 5 6 CREATE TABLE t(a text collate "C", b text collate case_insensitive); INSERT INTO t VALUES('Hello','world'); ——计算ifnull(a,b)的值的哈希值 SELECT hashtext(ifnull(a,b)) FROM t; ERROR: dn_6005_6006: could not determine which collation to use for string hashing. HINT: Use the COLLATE clause to set the collation explicitly. hashtext函数用于计算适当数据类型的值的哈希值。此处仅用作示例说明出现collate冲突时应该如何解决。
  • 处理方法 当字符串表达式中collation有多个时,可手动指定COLLATE collation_name。 执行SELECT时,指定表达式ifnull(a,b)的排序规则为C或者case_insensitive。 1 2 3 4 5 6 7 8 9 10 11 SELECT hashtext(ifnull(a,b) collate "C") FROM t; hashtext ----------- 820977155 (1 row) SELECT hashtext(ifnull(a,b) collate case_insensitive) FROM t; hashtext ----------- 238052143 (1 row)
  • 处理方法 建议开启列存表的delta表功能。 1 ALTER TABLE table_name SET (ENABLE_DELTA = ON); 开启列存表的delta表功能,在导入单条或者小规模数据进入表中时,能够防止小CU的产生,所以开启delta表能够带来显著的性能提升,例如在3CN、6DN的集群上操作,每次导入100条数据,导入时间能减少25%,存储空间减少97%,所以在需要多次插入小批量数据前应该先开启delta表,等到确定接下来没有小批量数据导入了再关闭。 delta表就是列存表附带的行存表,那么将数据插入delta表后将失去列存表的高压缩比等优势,正常情况下使用列存表的场景都是大批量数据导入,所以默认关闭delta表,如果开启delta表做大批量数据导入,反而会额外消耗更多时间和空间,同样在3CN、6DN的集群上操作,每次导入10000条数据时,开启delta表会比不开启时慢4倍,额外消耗10倍以上的空间。所以开启delta表需谨慎,根据实际业务需要来选择开启和关闭。
  • 处理方法 使用GRANT语法对表/schema进行赋权,示例: 假设当前有两个用户tom和jerry,如果想要用户jerry能够对当前tom创建的所有表以及将来创建的表都有查询权限,如何处理: 将用户tom下的同名schema权限赋给jerry 1 GRANT USAGE ON SCHEMA tom TO jerry; 将用户tom已经创建的表的select权限赋给jerry 1 GRANT SELECT ON ALL TABLES IN SCHEMA tom TO jerry; 将用户tom未来在同名schema下创建的表的select权限赋给jerry 1 ALTER DEFAULT PRIVILEGES FOR USER tom IN SCHEMA tom GRANT SELECT ON TABLES TO jerry;
  • 原因分析 GDS进程崩溃。执行命令检查GDS进程是否崩溃: ps ux|grep gds 如果返回结果如下,则说明GDS进程启动成功: GDS启动参数-H配置不正确。 -H address_string:允许哪些主机连接和使用GDS服务。参数需为CIDR格式。此参数配置的目的是允许GaussDB(DWS)集群可以访问GDS服务进行数据导入,请保证所配置的网段包含GaussDB(DWS)集群各主机。
  • 处理方法 审视用户自定义函数的provolatile属性是否定义正确。如果定义不正确,要修改对应的属性,使它能够下推执行。 具体判断方法可以参考如下说明: 函数相关的所有属性都在pg_proc系统表中可以查到,与函数能否下推相关的两个属性是provolatile和 proshippable: 如果函数的provolatile属性为i,则无论proshippable的值是否为t,则函数始终可以下推。 如果函数的provolatile属性为s或v,则仅当proshippable的值为t时,函数可以下推。 provolatile的本质含义是描述函数的易变属性,取值为i/s/v,i代表IMMUTABLE,s代表STABLE,v代表VOLATILE。 举例如下: 如果一个函数对于同样的输入,一定有相同的输出,那么这类函数就是IMMUTABLE的,例如绝大部分的字符串处理函数,这类函数始终可以下推。 如果一个函数的返回结果在一个SQL语句的调用过程中,结果是相同的,那么它就是STABLE的。例如时间相关的处理函数,它的最终显示结果可能与具体的GUC参数相关(例如控制时间显示格式的参数),这类函数都是STABLE的,此类函数仅当其属性是SHIPPABLE的时候,才能下推。 如果一个函数的返回结果可能随着每一次的调用而返回不同的结果。例如nextval,random这种函数,每次调用结果都是不可预期的,这类函数就是VOLATILE的,此类函数仅当其属性是SHIPPABLE的时候,才能下推。 proshippable字段表示函数是否可以下推到DN上执行,默认值是false,取值范围为t/f/NULL。
  • 处理方法 方法一:更改某个GaussDB(DWS) 集群的数据库默认时区。 登录GaussDB(DWS) 管理控制台。 在左侧导航栏中,单击“集群管理”。 在集群列表中找到所需要的集群,单击集群名称,进入集群“基本信息”页面。 单击“参数修改”页签,修改参数“timezone”,修改为您所在的时区,然后单击“保存”。 在“修改预览”窗口,确认修改无误后,单击“保存”。 用户可根据界面中参数“timezone”所在行的“是否重启”列,判断修改参数后无需进行重启操作。 修改“timezone”参数后无需重启集群操作 ,则修改后立即生效。 方法二:通过后台命令查询和更改数据库时区。 查询客户端时区和当前时间。其中客户端时区为UTC时区,now()函数返回当前时间。 1 2 3 4 5 6 7 8 9 10 11 show time zone; TimeZone ---------- UTC (1 row) select now(); now ------------------------------- 2022-05-16 06:05:58.711454+00 (1 row) 创建数据表,其中timestamp,timestamptz是常用的时间类型。timestamp不保存时区,timestamptz保存时区。 1 2 3 4 5 6 7 8 9 CREATE TABLE timezone_test (id int, t1 timestamp, t2 timestamptz) DISTRIBUTE BY HASH (id); \d timezone_test Table "public.timezone_test" Column | Type | Modifiers --------+-----------------------------+----------- id | integer | t1 | timestamp without time zone | t2 | timestamp with time zone | 向timezone_test表插入当前时间并查询当前表。 1 2 3 4 5 6 7 8 9 10 11 insert into timezone_test values (1, now(), now() ); show time zone; TimeZone ---------- UTC (1 row) select * from timezone_test; id | t1 | t2 ----+----------------------------+------------------------------- 1 | 2022-05-16 06:10:04.564599 | 2022-05-16 06:10:04.564599+00 (1 row) t1(timestamp类型)在保存数据时丢弃了时区信息,t2(timestamptz类型)保存了时区信息。 把客户端时区设置为东8区(UTC-8),再次查询timezone_test表。 1 2 3 4 5 6 7 8 9 10 11 set time zone 'UTC-8'; show time zone; TimeZone ---------- UTC-8 (1 row) select now(); now ------------------------------- 2022-05-16 14:13:43.175416+08 (1 row) 继续插入当前时间到timezone_test表,并查询。此时t1新插入的值是用的东8区时间,t2根据客户端时区对查询结果进行转换。 1 2 3 4 5 6 7 insert into timezone_test values (2, now(), now() ); select * from timezone_test; id | t1 | t2 ----+----------------------------+------------------------------- 1 | 2022-05-16 06:10:04.564599 | 2022-05-16 14:10:04.564599+08 2 | 2022-05-16 14:15:03.715265 | 2022-05-16 14:15:03.715265+08 (2 rows) timestamp类型只受数据在插入时的时区影响,查询结果不受客户端时区影响。 timestamptz类型在数据插入时记录了时区信息,查询时会根据客户端时区做转换,以客户端时区显示数据。
  • 解决方案 建议根据业务实际情况调整update语句。比如分析public.t2的字段含义,确定更新的目标字段。针对上述案例,如果期望在a值相等的情况下,把public.t1中字段b更新为public.t2中的最大值,那么可以修改为如下逻辑: 1 2 3 4 5 6 7 UPDATE t1 SET t1.b = t2.b_max FROM (SELECT a, max(b) AS b_max FROM t2 GROUP BY a) t2 WHERE t1.a = t2.a; UPDATE 1 SELECT * FROM public.t1; a | b ---+--- 1 | 2 (1 row)
  • 原因分析 当一条SQL语句中同一个元组被多次更新,执行便会报错ERROR:Non-deterministic UPDATE。 可以看到更新操作分成两步执行: 通过关联操作查找满足更新条件的元组。 执行更新操作。 针对上述案例,对于表public.t1中元组 (1, 1)来说,表public.t2中满足更新条件t1.a = t2.a的记录有两条,分别为(1, 1), (1, 2);按照执行器逻辑表t2的元组 (1, 1)需要被更新两次,那么就可能出现两种情况: 表public.t1和表public.t2关联时先命中(1, 1),再命中(1, 2),这时public.t1的元组(1, 1),先被更新为(1,1),再被更新为(1,2),最终结果为(1, 2)。 表public.t1和表public.t2关联时先命中(1, 2),再命中(1, 1),这时public.t1的元组(1, 1),先被更新为(1,2),再被更新为(1,1),最终结果为(1, 1)。 实际执行过程中public.t2表输出结果集的顺序会影响update语句的最终输出结果(实际业务中表public.t2的位置可能是一个非常复杂的子查询),导致了update语句执行结果的随机性,而这个实际业务中是无法接受的。
  • 问题现象 执行update语句报错ERROR:Non-deterministic UPDATE。 1 2 3 4 5 6 7 8 9 10 11 12 CREATE TABLE public.t1(a int, b int) WITH(orientation = column); CREATE TABLE CREATE TABLE public.t2(a int, b int) WITH(orientation = column); CREATE TABLE INSERT INTO public.t1 VALUES (1, 1); INSERT INTO public.t2 VALUES (1, 1),(1, 2); UPDATE t1 SET t1.b = t2.b FROM t2 WHERE t1.a = t2.a; ERROR: Non-deterministic UPDATEDETAIL: multiple updates to a row by a single query for column store table.
  • 问题现象 查看日志提示: [ERROR] Mpp task queryDataAnalyseById or updateDataAnalyseHistoryEndTimesAndResult fail, dataAnalyseId:17615 org.postgresql.util.PSQLException: ERROR: memory is temporarily unavailable sql:vacuum full dws_customer_360.t_user_resource;
  • 处理方法 通过Function的exception方式屏蔽该报错,将大小统一到一个值,对于不存在的表,可以用大小为-1来表示,函数如下: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE OR REPLACE FUNCTION public.pg_t_size(tab_oid OID,OUT retrun_code text) RETURNS text LANGUAGE plpgsql AS $$ DECLARE v_sql text; ts text; BEGIN V_SQL:='select pg_size_pretty(pg_table_size('||tab_oid||'))'; EXECUTE IMMEDIATE V_SQL into ts; IF ts IS NULL THEN RETRUN_CODE:=-1; ELSE return ts; END IF; EXCEPTION WHEN OTHERS THEN RETRUN_CODE:=-1; END$$; 执行如下命令查询结果: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 call public.pg_t_size('1',''); retrun_code ------------- -1 (1 row) select oid from pg_class limit 2; oid ------ 2662 2659 (2 rows) call public.pg_t_size('2662',''); retrun_code ------------- 120 KB (1 row)
  • 处理方法 方法一:检查数据冲突,修改插入数据。例如,修改示例重复字段UA502为UA509。 1 2 INSERT INTO films VALUES ('UA509', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes'); INSERT 0 1 方法二:删除表films主键约束。 1 2 3 4 ALTER TABLE films DROP CONSTRAINT films_pkey; ALTER TABLE INSERT INTO films VALUES ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes'); INSERT 0 1
  • 问题现象 向表中插入数据报错:duplicate key value violates unique constraint "%s"。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 CREATE TABLE films ( code char(5) PRIMARY KEY, title varchar(40) NOT NULL, did integer NOT NULL, date_prod date, kind varchar(10), len interval hour to minute ); NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "films_pkey" for table "films" CREATE TABLE INSERT INTO films VALUES ('UA502', 'Bananas', 105, DEFAULT, 'Comedy', '82 minutes'); INSERT INTO films VALUES ('UA502', 'Bananas', 105, '1971-07-13', 'Comedy', '82 minutes'); ERROR: dn_6003_6004: duplicate key value violates unique constraint "films_pkey" DETAIL: Key (code)=(UA502) already exists.
  • 原因分析 数据文件是从Oracle导入的,文件编码为utf-8。该报错还会提示行数,由于文件特别大,vim命令打不开文件,于是用sed命令把报错行数提出来,再用vim命令打开,发现并没有什么异常。用split命令按行数切割后,部分文件也可以导入。 经分析GaussDB(DWS)的varchar型的字段或变量不允许含有'\0'(也即数值0x00、UTF编码'\u0000')的字符串 ,需在导入前去掉字符串中的'\0'。
  • 问题现象 某表table01中存在以大小写字母组合的名称为“ColumnA”的字段,使用SELECT语句查询该字段时,提示字段不存在,报错:column "columna" does not exist。 1 2 3 4 5 select ColumnA from table01 limit 100; ERROR: column "columna" does not exist LINE 1: select columna from TABLE_01; ^ CONTEXT: referenced column: columna
  • JDBC问题定位 JDBC(Java Database Connectivity,java数据库连接)是应用程序访问数据库的统一标准接口,应用程序可使用JDBC连接数据库并执行SQL。 GaussDB(DWS)提供了对JDBC 4.0特性的支持,本章节提供了JCDB常见问题定位及对应报错和问题的处理方法。 产生JDBC问题的原因主要是三个方面: 应用程序和应用程序框架问题。 JDBC业务功能问题。 数据库配置问题。 JDBC问题在具体业务中的表现可以分为三个大的方面: 执行报错,JDBC抛出异常。 执行效率低,耗时异常。 特性不支持,JDBC未实现的JDK接口。 JDBC问题具体分类可参见表1。 表1 JDBC问题分类 问题分类 问题原因 建立数据库连接失败 JDBC客户端配置问题:包括URL格式不对,或用户名密码错误。 网络不通。 Jar包冲突。 数据库配置问题,数据库未配置远程访问权限。 执行业务抛出异常 传入SQL有误,GaussDB(DWS)不支持。 业务处理异常,返回异常报文。 网络故障。 数据库连接超时,socket已关闭。 性能问题 SQL执行慢。 结果集过大,导致应用程序段响应慢。 用户传入SQL过长,JDBC解析慢。 功能支持问题 JDK未提供标准接口。 JDBC未实现接口。 父主题: JDBC/ODBC类
  • 分析过程 和客户确认是部分业务慢,可以提供部分慢sql,打印执行计划,耗时主要在index scan上,怀疑是IO争抢导致,通过监控IO,发现并没有IO资源使用瓶颈。 查询当前活跃sql,发现有大量的create index语句,需要和客户确认该业务是否合理。 1 SELECT * from pg_stat_activity where state !='idle' and usename !='Ruby'; 根据执行计划,发现在部分DN上耗时较高,查询表的倾斜情况,并未发现有倾斜的情况。 1 SELECT table_skewness('table name'); 联系运维人员登录集群实例,检查内存相关参数,设置不合理,需要优化。 单节点总内存大小为256G max_process_memory为12G,设置过小 shared_buffers为32M,设置过小 work_mem:CN:64M 、DN:64M max_active_statements: -1(不限制并发数) 按以下值设置: gs_guc set -Z coordinator -Z datanode -N all -I all -c "max_process_memory=25GB" gs_guc set -Z coordinator -Z datanode -N all -I all -c "shared_buffers=8GB" gs_guc set -Z coordinator -Z datanode -N all -I all -c "work_mem=128MB" 进一步分析扫描慢的原因,发现表数据膨胀严重,对其中一张8G大小的表,总数据量5万条,做完vacuum full后大小减小为5.6M。
  • 处理方法 请使用具有schema权限的用户登录数据库,执行以下命令将schema中的表权限赋给指定的用户: 1 2 GRANT USAGE ON SCHEMA schema_name TO u1; GRANT SELECT ON ALL TABLES IN SCHEMA schema_name TO u1; 执行以下命令,将schema中未来新建的表的权限也赋予指定的用户: 1 ALTER DEFAULT PRIVILEGES IN SCHEMA schema_name GRANT SELECT ON TABLES TO u1; 上述SQL语句中的“GRANT SELECT”表示赋予的是表的查询权限,如果需要给其他用户赋予表的其他权限,请参考GRANT语法说明。 如果需要给某个用户赋权“可查询数据库所有schema里所有表”,可通过系统表PG_NAMESPACE查询出schema后授权。例如: 1 SELECT 'grant select on all tables in '|| nspname || 'to u1' FROM pg_namespace;
  • 问题现象 连接GaussDB(DWS) 数据库时报错,提示客户端连接数太多。 使用gsql等SQL客户端工具连接数据库时,出现如下所示的报错信息: 1 FATAL: Already too many clients, active/non-active/reserved: 5/508/3. 使用客户端并发连接数据库时,出现如下所示的报错信息: 1 2 [2019/12/25 08:30:35] [ERROR] ERROR: pooler: failed to create connections in parallel mode for thread 140530192938752, Error Message: FATAL: dn_6001_6002: Too many clients already, active/non-active: 468/63. FATAL: dn_6001_6002: Too many clients already, active/non-active: 468/63.
  • 处理方法 可优先通过如下方法进行应急处理: 临时将所有non-active的连接释放掉。 1 SELECT PG_TERMINATE_BACKEND(pid) from pg_stat_activity WHERE state='idle'; 在GaussDB(DWS) 控制台设置会话闲置超时时长session_timeout,在闲置会话超过所设定的时间后服务端将主动关闭连接。 session_timeout默认值为600秒,设置为0表示关闭超时限制,一般不建议设置为0。 session_timeout设置方法如下: 登录GaussDB(DWS) 管理控制台。 在左侧导航栏中,单击“集群管理”。 在集群列表中找到所需要的集群,单击集群名称,进入集群“基本信息”页面。 单击“参数修改”页签,修改参数“session_timeout”,然后单击“保存”。 在“修改预览”窗口,确认修改无误后,单击“保存”。 如果上述方式未能满足业务需求,可继续参考以下方式进行处理: 当前数据库连接已经超过了最大连接数场景处理方式: 查看CN上的连接来自哪里,总数量以及是否超过当前max_connections(默认值CN节点为800,DN节点为5000)。 1 SELECT coorname, client_addr, count(1) FROM pgxc_stat_activity group by coorname, client_addr order by coorname; 判断是否可以调大max_connections。调整策略如下: 调大CN的max_connections会造成并发连接到DN的查询变多,所以需要同步调大DN的max_connections和comm_max_stream。 CN/DN的max_connections一般按照原来的2倍调大,原值比较小的集群可以调节到4倍。 为避免在准备步骤失败,max_prepared_transactions的值不能小于max_connections,建议至少将其设置为等于max_connections,这样每个会话都可以有一个等待中的预备事务。 若上一步中判断可以调整max_connections,则可通过管理控制台调整最大连接数max_connections。 在管理控制台上,集群“基本信息”页面,单击“参数修改”页签,修改参数“max_connections”为合适的值,然后单击“保存”。 针对设置了用户最大连接数的场景处理方式: 在创建用户时由CREATE ROLE命令的CONNECTION LIMIT connlimit子句直接设定,也可以在设定以后用ALTER ROLE的CONNECTION LIMIT connlimit子句修改。 使用PG_ROLES视图查看指定用户的最大连接数。 1 2 3 4 5 SELECT ROLNAME,ROLCONNLIMIT FROM PG_ROLES WHERE ROLNAME='role1'; rolname | rolconnlimit ---------+-------------- role1 | 10 (1 row) 修改用户的最大连接数。 1 ALTER ROLE role1 connection limit 20;
  • 磁盘空间告警订阅 为了减轻客户自行的运维压力,DWS提供了告警订阅的功能:即当集群的磁盘使用率大于设置的阈值时,系统会以短信、邮件形式通知到用户。 设置告警阈值: 登录DWS控制台,左侧选择“告警管理”,单击“告警规则管理”。 在告警规则列表中,单击“节点数据盘使用率超阈值”右侧的“修改”。 在集群列表中单击指定集群,进入集群详情页面。告警策略设置如下: 规则绑定集群:所有集群 告警策略:将数据盘的重要告警配置为70%,持续10分钟,紧急告警配置为75%,持续10分钟。如下设置: 在消息通知服务(SMN)创建主题。 切换到消息通知服务控制台,单击“创建主题”。如下设置“主题名称”和“企业项目”。 主题创建成功后,单击右侧的“添加订阅”。根据需要选择“短信”、“邮件”方式,订阅终端输入对应的手机号或邮箱地址。 输入的手机号或邮箱地址会受到确认短信或邮件,单击确认,即可完成订阅。 添加告警订阅。 回到DWS控制台,左侧选择“告警管理”,切换到“订阅”,单击“创建订阅”。 订阅名称输入“dms_alarm”,告警级别选择“紧急”、“重要”,消息通知主题名称选择上一步创建的主题“dms_alarm”。 单击“确认”。整个告警订阅成功,后续磁盘使用率大于70%和75%则发出通知。
共100000条