华为云用户手册

  • 开发流程说明 开发微服务应用 如果您已经完成了微服务应用的开发,可以跳过本流程,进入准备环境。 进行微服务应用开发,首先需要进行技术选型。技术选型是一个复杂的问题,技术决策者需要考虑使用的技术是否容易被团队成员掌握,技术能否满足项目对于功能、性能、可靠性方面的要求,还需要考虑商业服务等多方面的因素。本文档不探讨技术选型,假设技术团队已经选择了适合自己的开发框架。大部分技术团队都会选择开源框架来构建业务。 开发微服务应用的具体内容,请参考开发微服务应用。 使用Spring Cloud,通常会使用下面的技术进行本地微服务开发: 使用Java Chassis,通常会使用下面的技术进行本地微服务开发: 准备环境 创建云上环境,以支持微服务引擎接入调试、云上应用部署和使用微服务引擎功能。一般情况下,会创建一个测试环境和一个生产环境。通过ServiceStage,能够非常方便的管理云上环境,详细内容请参考准备环境。 对接微服务应用 用于微服务应用对接微服务引擎,涉及到对已经开发好的应用的配置文件、构建脚本的修改。修改完成后,需要对应用重新编译、打包,通过ServiceStage将应用包部署到微服务引擎,详细内容请参考对接微服务应用。 部署微服务应用 开发完成的微服务应用,通过ServiceStage部署到微服务引擎,详细内容请参考部署微服务应用。 使用微服务引擎功能 对于持续发展的应用系统,都会持续完善和迭代,每个迭代可能需要对微服务应用进行更新升级,需要使用更多的微服务引擎功能。持续迭代的功能演进,会重复上面的应用开发、编译、打包和部署环节。详细内容请参考使用微服务引擎功能。
  • 本地开发工具说明 本地开发工具包含了微服务引擎2.x的本地轻量化版本,提供用于本地开发的轻量服务中心、配置中心,和简单易用的界面。 使用说明请参考本地开发工具压缩包中的README.md文件。 表1 本地引擎资源配额限制 功能 资源 最大配额 微服务管理 微服务版本数量(个) 10,000 单个微服务实例数量(个) 100 单个微服务契约数量(个) 500 配置管理 配置数量(个) 600 表2 本地轻量化微服务引擎版本说明 版本 对应微服务引擎版本 发行时间 获取路径 2.1.7 2.x 2023.6.1 Local- CS E-2.1.7-windows-amd64.zip Local-CSE-2.1.7-linux-amd64.zip Local-CSE-2.1.7-linux-arm64.zip 本地轻量化微服务引擎仅作为本地开发调测,请勿用于商业使用。 本地轻量化微服务引擎支持在Windows、Linux系统下使用。 父主题: 附录
  • 开发能力要求 本文档的主要目的就是说明这些开源微服务开发框架如何接入和使用微服务引擎的功能,假设您已经熟悉和掌握如下开发能力: 使用Java语言进行微服务开发。假设您已经基于一种ServiceStage支持的微服务开发框架开发了应用系统,并期望将应用系统托管在微服务引擎上运行。本文档提供微服务应用接入微服务引擎的相关技术支持。开源微服务开发框架如何使用不是本文档的范围,您可以通过开源社区获取相关微服务开发框架的入门材料和开发指南。 理解注册中心、配置中心在微服务应用中的作用,并在项目中搭建和使用注册中心。不同的微服务开发框架默认支持的开源注册中心会有差异,理解注册中心的作用,可以更加容易的更换注册中心。 熟悉应用部署,请参考创建并部署组件。
  • Java Chassis微服务组件配置安全认证账号名和密码 配置文件配置方式 为微服务的“microservice.yml”文件增加以下配置,若已配置请忽略。 servicecomb: credentials: rbac.enabled: true #结合用户实际值配置 cipher: default account: name: test #结合用户实际配置 password: mima #结合用户实际配置 cipher: default 用户密码password默认为明文存储,无法保证安全。建议您对密码进行加密存储,请参考配置安全认证参数。 环境变量注入方式 为微服务添加如表2所示环境变量。 添加环境变量,请参考管理应用环境变量。 表2 环境变量 环境变量 说明 servicecomb_credentials_rbac_enabled true:开启安全认证。 false:不开启安全认证。 servicecomb_credentials_account_name 结合用户实际值配置。 servicecomb_credentials_account_password 结合用户实际值配置。 说明: 用户密码password默认为明文存储,无法保证安全。建议您对密码进行加密存储,请参考配置安全认证参数。
  • Spring Cloud微服务组件配置安全认证账号名和密码 配置文件配置方式 为微服务的“bootstrap.yml”文件增加以下配置,若已配置请忽略。 spring: cloud: servicecomb: credentials: account: name: test #结合用户实际值配置 password: mima #结合用户实际值配置 cipher: default 用户密码password默认为明文存储,无法保证安全。建议您对密码进行加密存储,请参考自定义实现password的加密存储算法。 环境变量注入方式 为微服务添加如表1所示环境变量。 添加环境变量,请参考管理应用环境变量。 表1 环境变量 环境变量 说明 spring_cloud_servicecomb_credentials_account_name 结合用户实际值配置。 spring_cloud_servicecomb_credentials_account_password 结合用户实际值配置。 说明: 用户密码password默认为明文存储,无法保证安全。建议您对密码进行加密存储,请参考自定义实现password的加密存储算法。
  • 操作步骤 登录微服务引擎控制台。 在左侧导航栏选择“应用网关 ”。 单击待查看的实例的名称,进入该实例的基本信息页面。 在“基础信息”区域的“标签”参数处,您可以根据实际需要,执行以下操作: 新增标签 新增标签会影响网关业务十秒左右,请在业务低峰期时增加。 单击“标签管理”,弹出“编辑标签”窗口。 单击“ 新增标签”,您可在“标签键”和“标签值”中输入标签信息。 单击“确定”,为实例添加标签成功。 修改标签 修改标签会影响网关业务十秒左右,请在业务低峰期时修改。 单击“标签管理”,弹出“编辑标签”窗口。 您可在原有的“标签键”和“标签值”输入框中修改标签键与标签值信息。 单击“确定”,标签修改成功。 删除标签 单击标签所在行的,删除该标签。
  • 重置密码 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的开启了安全认证的ServiceComb引擎。 单击“系统管理”。 在弹出的“安全认证”对话框输入该ServiceComb引擎下关联了admin角色权限的账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 在“账号管理”页签,选择待重置密码的账号名,单击“操作”列的“重置密码”。 输入“新密码”和“确认密码”。 查看提示信息确认需要重置密码后,勾选“我已确认知晓”。 单击“保存”,完成密码重置。
  • 删除账号 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的开启了安全认证的ServiceComb引擎。 单击“系统管理”。 在弹出的“安全认证”对话框输入该ServiceComb引擎下关联了admin角色权限的账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 在“账号管理”页签,单击待删除账号“操作”列的“删除”。 在弹出的对话框中输入“DELETE”,单击“确定”。
  • 修改密码 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的开启了安全认证的ServiceComb引擎。 单击“系统管理”。 在弹出的“安全认证”对话框输入账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 连接ServiceComb引擎的账号未关联admin角色权限,仅可修改当前登录账号的密码。 连接ServiceComb引擎的账号关联了admin角色权限,可修改该ServiceComb引擎下所有账号的密码。 创建账号请参考新增账号。 在“账号管理”页签,选择登录该ServiceComb引擎的账号名,单击“操作”列的“修改密码”。 输入“原密码”、“新密码”和“确认密码”。 查看提示信息确认需要修改密码后,勾选“我已确认知晓”。 也可单击“系统管理”页面右上角的“修改密码”,修改当前登录账号的密码。 单击“保存”,完成密码修改。
  • 新增账号 创建新账号前,可先根据实际业务需要创建角色。 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的开启了安全认证的ServiceComb引擎。 单击“系统管理”。 在弹出的“安全认证”对话框输入该ServiceComb引擎下关联了admin角色权限的账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 在“账号管理”页签,单击“新增账号”,参考下表设置账号参数。 参数名称 参数说明 账号名称 输入新账号名称。 说明: 账号创建后,账号名称不可修改。 账号角色 根据实际业务需求,选择账号角色。 说明: 一个账号下最多可关联5个角色。 密码 输入账号密码。 确认密码 再次输入账号密码。 单击“确定”,完成新账号创建。
  • 查看账号角色权限 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的开启了安全认证的ServiceComb引擎。 单击“系统管理”。 在弹出的“安全认证”对话框输入该ServiceComb引擎下关联了admin角色权限的账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 单击账号列表中待查看账号“角色”列的角色名称,在弹出页面可以查看账号关联的角色名称及权限配置情况。
  • 编辑账号 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的开启了安全认证的ServiceComb引擎。 单击“系统管理”。 在弹出的“安全认证”对话框输入该ServiceComb引擎下关联了admin角色权限的账号名及其密码,单击“确定”。 首次连接ServiceComb引擎,请输入root账号名及创建ServiceComb引擎时输入的密码。 创建账号请参考新增账号。 在“账号管理”页签,单击待编辑账号“操作”列的“编辑账号”。 根据实际业务需求,选择“账号角色”。 一个账号下最多可关联5个角色。 单击“保存”,完成账号编辑。
  • 操作步骤 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版 ”。 单击待操作的实例的名称,进入该实例的基本信息页面。 在“基础信息”区域的“标签”参数处,您可以根据实际需要,执行以下操作: 新增标签 新增标签会影响网关业务十秒左右,请在业务低峰期时增加。 单击“标签管理”,弹出“编辑标签”窗口。 单击“ 新增标签”,您可在“标签键”和“标签值”中输入标签信息。 单击“确定”,为实例添加标签成功。 修改标签 修改标签会影响网关业务十秒左右,请在业务低峰期时修改。 单击“标签管理”,弹出“编辑标签”窗口。 您可在原有的“标签键”和“标签值”输入框中修改标签键与标签值信息。 单击“确定”,标签修改成功。 删除标签 单击标签所在行的,删除该标签。
  • 开启安全认证 登录微服务引擎控制台。 在左侧导航栏选择“ServiceComb引擎专享版”。 单击待操作的引擎。 在“网络配置 & 安全”区域,单击“开启安全认证”。 如果引擎版本低于1.2.0,执行5。 如果引擎版本为1.2.0及以上版本,执行6。 升级引擎至1.2.0或以上版本。 单击“升级”。 选择“升级后版本”,查看版本说明,根据需要决定是否升级到该版本后,单击“确定”。 在刚升级成功的ServiceComb引擎的“网络配置 & 安全”区域,单击“开启安全认证”。 在“系统管理”页面开启安全认证。 首次开启安全认证,单击“去开启安全认证”。 需先创建root账号。输入root账号的“密码”和“确认密码”,单击“立即创建”。 再次开启安全认证,输入引擎中已关联了admin角色的账号名称及其密码。 (可选)参考角色管理,根据业务需要,创建角色。 (可选)参考账号管理,根据业务需要,创建账号。 在“系统管理”页面单击“设置安全认证”,根据实际业务需要设置安全配置。 选择开启“控制台安全认证”,请执行11。 开启控制台安全认证后,进入微服务引擎控制台界面,需要使用账号、密码登录。登录账号用户只能查看、配置有权限的服务。 选择开启“编程接口安全认证”,请执行10。 开启编程接口安全认证,会自动同步开启“控制台安全认证”。 开启编程接口安全认证后,需要在微服务的配置文件中添加对应用户的账号密码,否则服务无法注册到引擎。 关闭编程接口安全认证,微服务的配置文件中无需配置账号密码即可将服务注册到引擎,效率性能更高,建议用于VPC内访问时使用。 配置SDK,对于已部署但未配置安全认证参数的微服务组件,请参考配置微服务安全认证的账号名和密码 先为组件配置微服务安全认证的账号名和密码,再升级组件。 单击“确定”。 等待ServiceComb引擎更新完成,引擎状态由“配置中”变为“可用”,开启安全认证成功。
  • 操作步骤 登录微服务引擎控制台。 在左侧导航栏选择“应用网关 ”。 单击待查看的实例的名称,进入该实例的基本信息页面。 在“基础信息”区域的“标签”参数处,您可以根据实际需要,执行以下操作: 新增标签 新增标签会影响网关业务十秒左右,请在业务低峰期时增加。 单击“标签管理”,弹出“编辑标签”窗口。 单击“ 新增标签”,您可在输入框中分别输入标签键和标签值。 单击“确定”,为实例添加标签成功。 修改标签 修改标签会影响网关业务十秒左右,请在业务低峰期时修改。 单击“标签管理”,弹出“编辑标签”窗口。 您可在原有的标签键和标签值输入框中修改标签键与标签值信息。 单击“确定”,标签修改成功。 删除标签 单击标签所在行的,删除该标签。
  • AstroPro权限 默认情况下,新建的 IAM 用户没有任何权限,需要将其加入用户组,并给用户组授予策略或角色,才能使得用户组中的用户获得对应的权限,这一过程称为授权。授权后,用户就可以基于被授予的权限对云服务进行操作。 AstroPro部署时通过物理区域划分,为项目级服务。授权时,“作用范围”需要选择“区域级项目”,然后在指定区域(如华北-北京4)对应的项目(cn-north-4)中设置相关权限,并且该权限仅对此项目生效。如果在“所有项目”中设置权限,则该权限在所有区域项目中都生效。访问AstroPro时,需要先切换至授权区域。 根据授权精细程度分为角色和策略。 角色:IAM最初提供的一种根据用户的工作职能,定义权限的粗粒度授权机制。该机制以服务为粒度,提供有限的服务相关角色用于授权。由于华为云各服务之间存在业务依赖关系,因此给用户授予角色时,可能需要一并授予依赖的其他角色,才能正确完成业务。角色并不能满足用户对精细化授权的要求,无法完全达到企业对权限最小化的安全管控要求。 策略:IAM最新提供的一种细粒度授权的能力,可以精确到具体服务的操作、资源以及请求条件等。基于策略的授权是一种更加灵活的授权方式,能够满足企业对权限最小化的安全管控要求。 如表1所示,包括了AstroPro的所有系统权限。 表1 AstroPro系统权限 策略名称 描述 类别 策略内容 Astro Pro FullAccess AstroPro服务所有权限。 系统策略 Astro Pro FullAccess策略内容 Astro Pro InstanceManagement AstroPro服务应用实例操作、管理权限。 系统策略 Astro Pro InstanceManagement策略内容 表2列出了AstroPro常用操作与系统策略的授权关系,您可以参照该表选择合适的系统策略。 表2 AstroPro操作与系统策略关系 操作 Astro Pro FullAccess Astro Pro InstanceManagement 查询商品可售卖周期 √ √ 查询订单信息 √ √ 订购询价 √ √ 查询实例信息 √ √ 变更询价 √ √ 云服务到期查询 √ √ 购买实例 √ √ 购买扩容包 √ √ 实例升级 √ √ 实例冻结 √ √ 实例解冻 √ √ 删除实例 √ √
  • Astro Pro InstanceManagement策略内容 { "Version": "1.1", "Statement": [ { "Action": [ "astropro:instance:*" ], "Effect": "Allow" } ] }
  • 环境要求 Web SDK运行环境要求,如表1所示。 表1 环境要求 环境项 使用限制 开发工具 Microsoft Visual Studio Code、WebStorm或其他Web IDE开发工具。 语言 Javascript或Typescript。 编译环境 建议Node 17+。 浏览器 浏览器使用限制,请参见表2。 由于浏览器的安全策略限制,仅支持通过“https://域名”方式访问,否则无法获取麦克风权限。 表2 浏览器适配详情 操作系统类型 浏览器类型 浏览器版本 Windows Chrome浏览器 91+ Edge浏览器 80+ Android 微信内嵌浏览器(TBS内核) - 微信内嵌浏览器(XWEB内核) - 企业微信内嵌浏览器 - 移动版Chrome浏览器 91+ iOS 微信内嵌浏览器 iOS 14.3+ 微信6.5+版本 移动版Safari浏览器 -
  • 删除Pod 删除pod时,Kubernetes终止Pod中所有容器。 Kubernetes向进程发送SIGTERM信号并等待一定的秒数(默认为30)让容器正常关闭。 如果它没有在这个时间内关闭,Kubernetes会发送一个SIGKILL信号杀死该进程。 Pod的停止与删除有多种方法,比如按名称删除,如下所示。 $ kubectl delete po nginx -n $namespace_name pod "nginx" deleted 同时删除多个Pod。 $ kubectl delete po pod1 pod2 -n $namespace_name 删除所有Pod。 $ kubectl delete po --all -n $namespace_name pod "nginx" deleted 根据Label删除Pod,Label详细内容将会在下一个章节介绍。 $ kubectl delete po -l app=nginx -n $namespace_name pod "nginx" deleted
  • 创建Pod kubernetes资源可以使用YAML描述(如果您对YAML格式不了解,可以参考YAML语法),也可以使用JSON,如下示例描述了一个名为nginx的Pod,这个Pod中包含一个名为container-0的容器,使用nginx:alpine镜像,使用的资源为0.5核CPU、1024M内存。 apiVersion: v1 # Kubernetes的API Version kind: Pod # Kubernetes的资源类型 metadata: name: nginx # Pod的名称 spec: # Pod的具体规格(specification) containers: - image: nginx:alpine # 使用的镜像为 nginx:alpine name: container-0 # 容器的名称 resources: # 申请容器所需的资源,云容器实例中limits与requests的值必须相同 limits: cpu: 500m # 0.5核 memory: 1024Mi requests: cpu: 500m # 0.5核 memory: 1024Mi imagePullSecrets: # 拉取镜像使用的证书,必须为imagepull-secret - name: imagepull-secret 如上面YAML的注释,YAML描述文件主要为如下部分: metadata:一些名称/标签/namespace等信息 spec:Pod实际的配置信息,包括使用什么镜像,volume等 如果去查询Kubernetes的资源,您会看到还有一个status字段,status描述kubernetes资源的实际状态,创建时不需要配置。这个示例是一个最小集,其他参数定义后面会逐步介绍。 kubernetes资源的参数定义的解释,您可以通过具体资源的API参考查询对应的解释。 Pod定义好后就可以使用kubectl创建,如果上面YAML文件名称为nginx.yaml,则创建命令如下所示,-f 表示使用文件方式创建。 $ kubectl create -f nginx.yaml -n $namespace_name pod/nginx created
  • 什么是Pod Pod是Kubernetes创建或部署的最小单位。一个Pod封装一个或多个容器(container)、存储资源(volume)、一个独立的网络IP以及管理控制容器运行方式的策略选项。 Pod使用主要分为两种方式: Pod中运行一个容器。这是Kubernetes最常见的用法,您可以将Pod视为单个封装的容器,但是Kubernetes是直接管理Pod而不是容器。 Pod中运行多个需要耦合在一起工作、需要共享资源的容器。通常这种场景下是应用包含一个主容器和几个辅助容器(SideCar Container),如图1所示,例如主容器为一个web服务器,从一个固定目录下对外提供文件服务,而辅助的容器周期性的从外部下载文件存到这个固定目录下。 图1 Pod 实际使用中很少直接创建Pod,而是使用Kubernetes中称为Controller的抽象层来管理Pod实例,例如Deployment和Job。Controller可以创建和管理多个Pod,提供副本管理、滚动升级和自愈能力。通常,Controller会使用Pod Template来创建相应的Pod。
  • 使用GPU 云容器实例支持使用GPU(必须在GPU类型命名空间下),申请GPU资源的方法非常简单,只需要在容器定制中申请GPU字段即可。 具体的规格信息请参考约束与限制中的“Pod规格”。 您需要设置Pod的metadata.annotations中添加cri.cci.io/gpu-driver字段,指定使用哪个版本显卡驱动,取值如下: gpu-460.106 gpu-418.126 如下示例创建一个容器规格为NVIDIA V100 16G x 1,CPU 4核,内存32GiB的Pod。 apiVersion: v1 kind: Pod metadata: name: gpu-test annotations: cri.cci.io/gpu-driver: gpu-418.126 # 指定GPU显卡的驱动版本 spec: containers: - image: tensorflow:latest name: container-0 resources: limits: cpu: 4000m # 4核 memory: 32Gi nvidia.com/gpu-tesla-v100-16GB: 1 # 申请GPU资源,支持 1、2、4、8,代表几块显卡 requests: cpu: 4000m # 4核 memory: 32Gi nvidia.com/gpu-tesla-v100-16GB: 1 imagePullSecrets: - name: imagepull-secret
  • 查询Pod详情 Pod创建完成后,可以使用kubectl get pods命令查询Pod的状态,如下所示。 $ kubectl get pods -n $namespace_name NAME READY STATUS RESTARTS AGE nginx 1/1 Running 0 40s 可以看到此处nginx这个Pod的状态为Running,表示正在运行;READY为1/1,表示这个Pod中有1个容器,其中1个容器的状态为Ready。 可以使用kubectl get命令查询具体Pod的配置信息,如下所示,-o yaml表示以YAML格式返回,还可以使用 -o json,以JSON格式返回。 $ kubectl get pod nginx -o yaml -n $namespace_name 您还可以使用kubectl describe命令查看Pod的详情。 $ kubectl describe pod nginx -n $namespace_name
  • 处理方法 方法一 该处理方法仅8.1.3及以上集群版本支持。 登录 GaussDB (DWS) 管理控制台。 在集群列表中单击指定集群名称。 进入“集群详情”页面,切换至“智能运维”页签。 在运维详情部分切换至运维计划模块。单击“添加运维任务”按钮。 弹出添加运维任务边栏。 运维任务选择“Vacuum”。 调度模式选择“指定目标”,智能运维将在指定时间窗内,自动下发表级Vacuum任务。 用户可配置需要Vacuum的列存表,其中一行对应一张表,每张表以数据库名、模式名、表名表示,以空格进行分割。 单击“下一步:定时配置”,配置Vacuum类型,推荐选择“周期型任务”,GaussDB(DWS)将自动在自定义时间窗内执行Vacuum。 确认无误后,单击“下一步:配置确认”,完成配置。 方法二 对列存表更新操作后,需要进行VACUUM FULL清理,更多用法请参见VACUUM的“VACUUM”章节的“VACUUM”章节。 1 VACUUM FULL table_name;
  • 原因分析 SQL运行慢可从以下几方面进行分析: 使用EXPLAIN命令查看SQL执行计划,根据执行计划判断是否需要进行SQL调优。 分析查询是否被阻塞,导致语句运行时间过长,可以强制结束有问题的会话。 审视和修改表定义。选择合适的分布列,避免数据倾斜。 分析SQL语句是否使用了不下推的函数,建议更换为支持下推的语法或函数。 对表定期执行vacuum full和analyze操作,可回收已更新或已删除的数据所占据的磁盘空间。 检查表有无索引支撑,建议例行重建索引。 数据库经过多次删除操作后,索引页面上的索引键将被删除,造成索引膨胀。例行重建索引,可有效的提高查询效率。 对业务进行优化,分析能否将大表进行分表设计。
  • 排查方法 查看相关表CU中数据分布情况,以下操作在DN执行 查看列存表对应的cudesc表 针对非分区表: 1 SELECT 'cstore.'||relname FROM pg_class where oid = (SELECT relcudescrelid FROM pg_class c inner join pg_namespace n on c.relnamespace = n.oid where relname = 'table name' and nspname = 'schema name'); 针对分区表: 1 SELECT 'cstore.'||relname FROM pg_class where oid in (SELECT p.relcudescrelid FROM pg_partition p,pg_class c,pg_namespace n where c.relnamespace = n.oid and p.parentid = c.oid and c.relname = 'table name' and n.nspname = 'schema name' and p.relcudescrelid != 0); 查看cudesc中各CU的rowcount情况 查询步骤一返回的cudesc表信息,查询结果类似如下,主要关注row_count过小(远小于6w)的CU数量,如果此数量较大,说明当前小CU多,CU膨胀问题严重,影响存储效率和查询访问效率。
  • 原因分析 两个不同的事务对同一个表中的同一行数据进行并发更新/操作,导致后操作的事务发生了回滚。 举例说明: 打开一个连接Session A,使用普通用户u1连接GaussDB(DWS)数据库,在u1的同名SCHEMA u1下创建测试表u1.test,并插入数据。 1 2 CREATE TABLE test (id int, name varchar(50)); INSERT INTO test VALUES (1, 'lily'); 打开一个新的连接会话Session B,使用系统管理员dbadmin连接GaussDB(DWS)数据库,开启事物1,执行UPDATE操作,UPDATE语句执行成功。 1 2 3 4 START TRANSACTION; UPDATE u1.test SET id = 3 WHERE name = 'lily'; UPDATE 1 在会话Session A中开启事务2,执行相同的UPDATE语句,执行报错。 1 2 3 4 START TRANSACTION; UPDATE test SET id = 3 WHERE name = 'lily'; ERROR: dn_6003_6004: abort transaction due to concurrent update test 289502. 针对上述案例,两个不同的事务并发更新了同一条记录,而并发更新同一条记录发生冲突不会等待锁,直接报错:abort transaction due to concurrent update。 在实际业务中,并不是只有并发UPDATE同一条记录会报错,select、delete等其他SQL并发操作,也有可能报错:abort transaction due to concurrent update。
  • 原因分析 上述问题中撤销user3对表t1的访问权限未生效是因为:之前执行过GRANT SELECT ON table t1 TO public;这条SQL语句,该语句中关键字public表示该权限要赋予给所有角色,包括之后新创建的角色,所以新用户user3对该表也有访问权限。public可以看做是一个隐含定义好的组,它包含所有角色。 因此,执行完REVOKE SELECT ON table t1 FROM user3;之后,虽然user3用户没有了表t1的访问权限(通过系统表pg_class的relacl字段可查看t1表的权限),但是他仍然有public的权限,所以仍能访问该表。
  • 调用存储过程报错 ERROR: cached plan must not change result type 问题分析:由于JDBC中使用了PreparedStatement,默认重复执行5次就会缓存plan,在此之后有如果重建表操作(例如修改表定义),再次执行就会报错ERROR: cached plan must not change result type。 处理方法:在JDBC连接字串中指定prepareThreshold=0,不再cache plan。例如: 1 String url = "jdbc:postgresql:// 192.168.0.10:2000/postgres?prepareThreshold=0";
  • Broken pipe, connection reset by peer 问题分析:网络故障,数据库连接超时。 处理方法:检查网络状态,修复网络故障,影响数据库连接超时的因素,例如数据库参数session_timeout。 登录控制台单击指定集群名称。 在左侧导航栏选择“参数修改”,搜索参数“session_timeout”查看超时时间参数。 将session_timeout的CN、DN参数值设置为0,详情可参见修改数据库参数。
共100000条