华为云用户手册

  • 前提条件 请确保弹性云服务器在备份前已完成如下操作: Linux弹性云服务器优化并安装Cloud-init工具 Windows弹性云服务器优化并安装Cloudbase-init工具 备份的状态必须为“可用”,或者状态为“创建中”并在备份状态列显示“可用于创建镜像”时,才允许执行创建镜像操作。 备份开始创建后会进入“创建中”的状态,一段时候过后,“创建中”的下方会出现“可用于创建镜像”的提示。此时,虽然备份仍在创建中,不能用于恢复,但是可以执行创建镜像的操作。 用于创建镜像的备份必须包含系统盘的备份。 仅支持使用弹性云服务器的备份创建镜像,不支持使用裸金属服务器的备份创建镜像。
  • 产品规格差异 应用身份管理服务OneAccess提供了基础版、专业版两种规格。各规格支持的功能如表1。 基础版提供部分功能,暂不支持条件访问控制等专业功能,支持的用户数为100或500,适用于小型企业,支持包年/包月计费方式。 专业版提供更多访问控制、权限管理、扩容等专业功能,支持按需调整用户数量,支持用户数量为200或1000~10000之间,能够满足政府、中大型企业对云上业务高性价比、高可靠性的需求。支持包年/包月计费方式。 表1 产品规格功能说明 支持内容 基础版 专业版 增加用户容量 支持 支持 条件访问控制 不支持 支持 自定义API访问控制 不支持 支持 细粒度权限 不支持 支持 身份同步 不支持 支持 云桥Agent 不支持 支持 组织与用户 支持 支持 自定义用户属性 支持 支持 认证集成(OAUTH、SAML、OIDC、CAS、插件代填、OPEN_API) 不支持插件代填和OPEN_API。 支持 身份源(企业微信、钉钉、飞书、AD、LDAP、薪人薪事、北森HR、名才HR、SAP SuccessFactors、泛微OA_E9) 支持 支持 应用授权(手动、自动) 支持 支持 企业API(内置API、自定义API产品) 不支持自定义API产品。 支持 认证源 支持认证源有:微信、微博、QQ、支付宝、钉钉、Welink、企业微信、云之家、飞书、泛微eteams、AD、LDAP。 支持支持认证源有:微信、微博、qq、支付宝、钉钉、Welink、企业微信、云之家、飞书、泛微eteams、SAML、OIDC、OAuth、CAS、AD、LDAP 、Kerberos、FIDO2 区域范围 不支持 支持 管理员权限 支持 支持 密码策略 支持 支持 审计 支持 支持 企业信息 支持 支持 短信网关 支持 支持 邮件网关 支持 支持 钉钉网关 支持 支持 语音网关 支持 支持 数据字典 支持 支持 数据导入 支持 支持 全局参数设置 支持 支持 界面配置 (内置模板、自定义) 支持 支持 服务配置 支持 支持
  • 启动团队标注任务 登录到console标注页面后在“我参与的”页签下,可查看到分配的标注任务,单击任务名称,可进入标注页面。不同类型的标注作业,标注方式不同,详细请参见: 图像分类 物体检测 文本分类 命名实体 文本三元组 语音分割 在标注页面中,每个成员可查看“未标注”、“待确认”、“已驳回”、“待审核”、“审核通过”、“验收通过”的图片信息。请及时关注管理员驳回以及待修正的图片。 当团队标注任务中,分配了Reviewer角色,则需要对标注结果进行审核,审核完成后,再提交给管理员验收。 图1 成员标注平台 父主题: 团队标注
  • 代码示例 本示例用于设置桶名为exampleBucket的存储类型。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.AccessControlList; import com.obs.services.model.AvailableZoneEnum; import com.obs.services.model.CreateBucketRequest; import com.obs.services.model.ObsBucket; import com.obs.services.model.StorageClassEnum; public class CreateBucket001 { public static void main(String[] args) { // 您可以通过环境变量获取访问密钥AK/SK,也可以使用其他外部引入方式传入。如果使用硬编码可能会存在泄露风险。 // 您可以登录访问管理控制台获取访问密钥AK/SK String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 // String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 //String endPoint = System.getenv("ENDPOINT"); // 创建ObsClient实例 // 使用永久AK/SK初始化客户端 ObsClient obsClient = new ObsClient(ak, sk,endPoint); // 使用临时AK/SK和SecurityToken初始化客户端 // ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint); try { CreateBucketRequest request = new CreateBucketRequest(); //示例桶名 String exampleBucket = "examplebucket"; //示例桶区域位置 String exampleLocation = "cn-north-4"; request.setBucketName(exampleBucket); // 设置桶访问权限为私有读写,默认也是私有读写 request.setAcl(AccessControlList.REST_CANNED_PRIVATE); // 设置桶的存储类型为标准存储 request.setBucketStorageClass(StorageClassEnum.STANDARD); // 设置桶区域位置(以区域为华北-北京四为例),location 需要与 endpoint的位置信息一致 request.setLocation(exampleLocation); // 指定创建多AZ桶,如果不设置,默认创建单AZ桶 request.setAvailableZone(AvailableZoneEnum.MULTI_AZ); // 创建桶 ObsBucket bucket = obsClient.createBucket(request); // 创建桶成功 System.out.println("CreateBucket successfully"); System.out.println("RequestId:"+bucket.getRequestId()); } catch (ObsException e) { System.out.println("CreateBucket failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code: " + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message: " + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); } catch (Exception e) { System.out.println("CreateBucket failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 代码示例 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.inventory.GetInventoryConfigurationRequest; import com.obs.services.model.inventory.GetInventoryConfigurationResult; import com.obs.services.model.inventory.InventoryConfiguration; public class GetInventoryConfiguration001 { public static void main(String[] args) { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 // String endPoint = System.getenv("ENDPOINT"); String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 创建ObsClient实例 try (ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint)) { // 设置相关示例参数 String exampleBucketName = "example-bucket"; String exampleConfigurationId = "exampleConfigId001"; GetInventoryConfigurationRequest request = new GetInventoryConfigurationRequest(exampleBucketName, exampleConfigurationId); // 获取桶清单配置规则 GetInventoryConfigurationResult result = obsClient.getInventoryConfiguration(request); InventoryConfiguration inventoryConfiguration = result.getInventoryConfiguration(); // 打印inventoryConfiguration的所有成员 System.out.println("ConfigurationId:" + inventoryConfiguration.getConfigurationId()); System.out.println("DestinationBucket:" + inventoryConfiguration.getDestinationBucket()); System.out.println("InventoryFormat:" + inventoryConfiguration.getInventoryFormat()); System.out.println("Enabled:" + inventoryConfiguration.getEnabled()); System.out.println("Frequency:" + inventoryConfiguration.getFrequency()); System.out.println("IncludedObjectVersions:" + inventoryConfiguration.getIncludedObjectVersions()); System.out.println("InventoryPrefix:" + inventoryConfiguration.getInventoryPrefix()); System.out.println("ObjectPrefix:" + inventoryConfiguration.getObjectPrefix()); System.out.println("OptionalFields:" + inventoryConfiguration.getOptionalFields()); // 打印HTTP状态码 System.out.println("HTTP Code: " + result.getStatusCode()); System.out.println("GetInventoryConfiguration succeeded"); } catch (ObsException e) { System.out.println("GetInventoryConfiguration failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code: " + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); } catch (Exception e) { System.out.println("GetInventoryConfiguration failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 配置 keyManagerFactory 验证服务端证书 通过配置 KeyManagerFactory,可以在本地保存证书,并校验服务端返回证书是否正确。 String endPoint = "https://your-endpoint"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String jksPassword = "you-jks-password"; String jksPath = "/path/to/your/keystore/file"; KeyStore ks = KeyStore.getInstance("JKS"); char[] passArray = jksPassword.toCharArray(); FileInputStream inputStream = new FileInputStream(jksPath); ks.load(inputStream, passArray); KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm()); kmf.init(ks, passArray); String trustJKSPassword = "you-trustJKS-password"; String trustJKSPath = "/path/to/your/trustKeyStore/file"; KeyStore trustKeyStore = KeyStore.getInstance("JKS"); char[] trustPassArray = trustJKSPassword.toCharArray(); FileInputStream trustInputStream = new FileInputStream(trustJKSPath); trustKeyStore.load(trustInputStream, trustPassArray); TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()); tmf.init(trustKeyStore); ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); config.setKeyManagerFactory(kmf); config.setTrustManagerFactory(tmf); ObsClient obsClient = new ObsClient(ak, sk, config); 本地证书保存格式应为 jks 格式,可以运行以下命令调用 Java 自带的 keytool 工具将 cer 证书转换为 jks 证书。 keytool -import -file your-cer-file.cer -keystore your-keystore-file.jks
  • 配置自定义随机数生成器SecureRandom 当使用配置类(ObsConfiguration)创建OBS客户端(ObsClient)时,您可通过ObsConfiguration配置类对ObsClient进行配置。 可以通过ObsConfiguration.setSecureRandom方法去设置自定义的随机数生成器,如果不设置,默认为new SecureRandom(), 然而在某些平台上new SecureRandom()可能会使用不安全的默认实现。 出于安全考虑,建议用户通过ObsConfiguration.setSecureRandom()设置一个种子是真随机数的SecureRandom。 请注意,当操作系统没有足够的熵来生成随机数时(比如系统刚启动时),那么生成真随机数的SecureRandom可能会阻塞,直到足够的熵可用为止。 建议同时通过相关措施补充熵(例如linux下的haveged),改善熵源不足时生成真随机数阻塞的问题。
  • 配置 HTTP 代理 配置 HTTP 代理后, SDK 将会通过的代理访问服务端。 String endPoint = "https://your-endpoint"; // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); String proxyUrl = "proxy.com"; int proxyPort = 8080; String proxyUser = "userName"; String proxyPassword = "password"; ObsConfiguration config = new ObsConfiguration(); config.setEndPoint(endPoint); config.setHttpProxy(proxyUrl, proxyPort, proxyUser, proxyPassword); ObsClient obsClient = new ObsClient(ak, sk,config);
  • 创建桶 开发过程中,您有任何问题可以在github上提交issue,或者在华为云对象存储服务论坛中发帖求助。接口参考文档详细介绍了每个接口的参数和使用方法。 桶是OBS全局命名空间,相当于数据的容器、文件系统的根目录,可以存储若干对象。以下代码展示如何新建一个桶: obsClient.createBucket("bucketname"); 桶的名字是全局唯一的,所以您需要确保不与已有的桶名称重复。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用类IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 更多创建桶的信息,请参见创建桶。 创建桶时,如果使用的终端节点归属于默认区域华北-北京一(cn-north-1),则可以不指定区域;如果使用的终端节点归属于其他区域,则必须指定区域,且指定的区域必须与终端节点归属的区域一致。当前有效的区域名称可从这里查询。 您可以使用带参数创建方式,在创建桶时,指定桶的区域位置。 父主题: 快速入门
  • 代码示例 import com.obs.services.ObsClient; import com.obs.services.exception.ObsException; import com.obs.services.model.HeaderResponse; import com.obs.services.model.inventory.DeleteInventoryConfigurationRequest; import com.obs.services.model.inventory.GetInventoryConfigurationRequest; import com.obs.services.model.inventory.GetInventoryConfigurationResult; import com.obs.services.model.inventory.InventoryConfiguration; public class DeleteInventoryConfiguration001 { public static void main(String[] args) { // 认证用的ak和sk硬编码到代码中或者明文存储都有很大的安全风险,建议在配置文件或者环境变量中密文存放,使用时解密,确保安全;本示例以ak和sk保存在环境变量中为例,运行本示例前请先在本地环境中设置环境变量ACCESS_KEY_ID和SECRET_ACCESS_KEY_ID。 // 您可以登录访问管理控制台获取访问密钥AK/SK,获取方式请参见https://support.huaweicloud.com/usermanual-ca/ca_01_0003.html String ak = System.getenv("ACCESS_KEY_ID"); String sk = System.getenv("SECRET_ACCESS_KEY_ID"); // 【可选】如果使用临时AK/SK和SecurityToken访问OBS,同样建议您尽量避免使用硬编码,以降低信息泄露风险。 // 您可以通过环境变量获取访问密钥AK/SK/SecurityToken,也可以使用其他外部引入方式传入。 String securityToken = System.getenv("SECURITY_TOKEN"); // endpoint填写桶所在的endpoint, 此处以华北-北京四为例,其他地区请按实际情况填写。 // 您可以通过环境变量获取endPoint,也可以使用其他外部引入方式传入。 // String endPoint = System.getenv("ENDPOINT"); String endPoint = "https://obs.cn-north-4.myhuaweicloud.com"; // 创建ObsClient实例 try (ObsClient obsClient = new ObsClient(ak, sk, securityToken, endPoint)) { // 设置相关示例参数 String exampleBucketName = "example-bucket"; String exampleConfigurationId = "exampleConfigId001"; DeleteInventoryConfigurationRequest request = new DeleteInventoryConfigurationRequest(exampleBucketName, exampleConfigurationId); // 删除桶清单配置规则 HeaderResponse result = obsClient.deleteInventoryConfiguration(request); // 打印HTTP状态码 System.out.println("HTTP Code: " + result.getStatusCode()); System.out.println("DeleteInventoryConfiguration succeeded"); } catch (ObsException e) { System.out.println("DeleteInventoryConfiguration failed"); // 请求失败,打印http状态码 System.out.println("HTTP Code: " + e.getResponseCode()); // 请求失败,打印服务端错误码 System.out.println("Error Code:" + e.getErrorCode()); // 请求失败,打印详细错误信息 System.out.println("Error Message:" + e.getErrorMessage()); // 请求失败,打印请求id System.out.println("Request ID:" + e.getErrorRequestId()); System.out.println("Host ID:" + e.getErrorHostId()); } catch (Exception e) { System.out.println("DeleteInventoryConfiguration failed"); // 其他异常信息打印 e.printStackTrace(); } } }
  • 获取桶策略请求参数说明 表1 请求参数列表 参数名称 参数类型 是否必选 描述 bucketName String 必选 参数解释: 桶名。 约束限制: 桶的名字需全局唯一,不能与已有的任何桶名称重复,包括其他用户创建的桶。 桶命名规则如下: 3~63个字符,数字或字母开头,支持小写字母、数字、“-”、“.”。 禁止使用IP地址。 禁止以“-”或“.”开头及结尾。 禁止两个“.”相邻(如:“my..bucket”)。 禁止“.”和“-”相邻(如:“my-.bucket”和“my.-bucket”)。 同一用户在同一个区域多次创建同名桶不会报错,创建的桶属性以第一次请求为准。 默认取值: 无
  • 方案优势 无需设置弹性公网IP,节省网络带宽成本 API网关可通过手动创建的负载通道或者导入CCE的工作负载生成的负载通道,访问CCE中工作负载的地址。 API网关可通过手动创建的负载通道或者导入CCE的工作负载生成的负载通道,动态监测工作负载下所有实例的地址变化,并自动更新到负载通道中。 支持通过CCE工作负载标签配置进行灰度发布,完成灰度测试与版本切换。 提供多种认证方式,增加访问安全性。 提供访问流量控制策略,增加后端服务的安全性 与直接访问容器应用相比,API网关提供流量控制,确保后端服务稳定运行。 支持多实例负载均衡,合理利用资源,增加系统可靠性。
  • 应用场景 云容器引擎(Cloud Container Engine,即CCE)中的工作负载,以及微服务,可通过API网关将服务能力以API形式对外开放。 开放CCE工作负载支持以下两种方式,推荐使用方式一直接创建负载通道的方式开放CCE工作负载: 方式一 在API网关中直接创建负载通道,通过负载通道访问CCE工作负载中的实例地址,动态监测工作负载下实例IP地址变化。开放API时使用负载通道访问后端服务,通过API的形式将云容器应用的服务能力开放出来。 方式二 一键式导入CCE工作负载,自动生成API和负载通道,API与相应生成的负载通道绑定,动态监测工作负载下实例IP地址变化。通过API的形式开放云容器引擎中的工作负载以及微服务等能力。
  • 应用场景 当在公网中调用APIG上公开的业务API时,如果不限制API调用的次数,随着用户的不断增加,会引起后端性能的下降,甚至会因为恶意用户发送的大量请求导致网站或程序崩溃。APIG提供了传统策略——流量控制,从API、用户、凭据、源IP等多个维度进行流控。 然而,随着用户多样性以及需求多样性的增加,传统流控策略无法满足更加精细的流量控制场景。比如针对某一请求参数的流控或者某一租户的流控,APIG在传统流量控制策略的基础上提供了插件策略——流量控制2.0,通过制定更加精细的方案来进行流控。 以下将以流量控制2.0为例,进行实践说明,讲述如何通过创建流量控制2.0策略来应对不同场景的网关限流。
  • 约束与限制 API添加流量控制2.0策略相当于流量控制2.0策略同步绑定了API。同一个环境中,一个API只能被一个流量控制2.0策略绑定,但一个流量控制2.0策略可以绑定多个API。(使用前提是绑定的API已发布。) 如果API未绑定流量控制2.0策略,流控限制值为实例“配置参数”中“ratelimit_api_limits”的参数运行值。 如果一个API绑定传统流量控制策略后,继续绑定流量控制2.0策略,传统流量控制策略会失效。 参数流控的规则最多可定义100个。 策略内容最大长度65535。 如果您的实例不支持流量控制2.0,请联系技术支持。
  • 方案优势 流量控制2.0策略可以限制单位时间内API的被调用次数,支持基础流控、参数流控和基于基础流控的特殊流控。 基础流控:可以对API、用户、凭据、源IP进行多维度流控,与已有的流量控制策略说明功能一致,但配置方式不兼容。 参数流控:支持根据Header、Path、Method、Query以及系统变量中的参数值进行自定义流控。 基于基础流控的特殊流控:对某个租户或凭证进行特定的流控。 支持从用户、凭据和时间段等不同的维度限制对API的调用次数。 支持按天以及按时分秒粒度的流量控制。
  • 连通云专线与API网关 创建VPC。 具体请参考《虚拟私有云 VPC》。 专享版API网关需要绑定1个VPC,将本地数据中心与VPC之间建立云专线后,API网关即可访问本地数据中心的服务。 图2 创建VPC示例参考 需要为API网关规划1个子网段。 一条云专线只能打通本地数据中心到1个VPC的网络,您在云上的资源,建议都绑定到同一VPC中,避免不同VPC都需要使用云专线访问本地数据中心带来的成本增加。 如果已有VPC,可不用新建。 购买专享版API网关。 具体请参考购买专享版API网关。 购买云专线。 购买一条连接本地数据中心到华为云API网关(所绑定的虚拟私有云)的云专线,请按以下操作顺序执行: 购买物理连接接入 即购买一条连接本地数据中心与华为云的运营商线路。建议您选择“一站式接入”,华为云负责施工工程。 如果已有数据中心到华为云的物理连接,可直接使用。 创建虚拟网关 虚拟网关用于关联专享版API网关绑定的VPC。 在选择VPC网段时,需要添加专享版API网关所使用的网段,表示允许专线可访问的VPC子网。可在专享版API网关控制台查询网段详情。 创建虚拟接口 虚拟接口将物理连接与虚拟网关(配置了VPC和网段)关联绑定,打通物理与专享版API网关所在VPC的网络。 注意远端网关与远端子网要分别配置您本地数据中心的开放API接口访问的网关和子网。例如您本地数据中心的API调用地址为http://192.168.0.25:80/{URI},则远端网关和远端子网要配置192.168.0.25所在的子网段与网关。 配置本地路由 如果本地数据中心的子网不在以下三个大子网段内,暂时不支持配置本地路由:10.0.0.0/8-24、172.16.0.0/12-24、192.168.0.0/16-24。 验证网络连通。 再创建一台按需的ECS,选择与专享版API网关相同的VPC、子网与安全组。只要本地数据中心能连通ECS,则与专享版API网关也能连通。
  • 应用场景 gRPC是RPC(远程过程调用)的一种,只需定义每个API的Request和Response,剩下的gRPC框架就可以完成。它的典型特征就是使用protobuf(protocol buffers)作为其接口定义语言(Interface Definition Language,缩写IDL),同时底层的消息交换格式也是使用protobuf。 当用户使用gRPC服务时,可以通过API网关创建API,实现gRPC服务的路由转发。
  • 产品功能 表1 KooPhone服务功能概览 功能名称 功能描述 发布区域 云手机实例管理 支持云手机实例关机、开机、重启、绑定/解绑用户、应用卸载。 支持云手机实例运行、登录状态查询。 支持查看云手机实例绑定状态、到期时间。 华南-广州 西南-贵阳一 华北-北京四 端云协同引擎 提供端侧和云侧的音视频流编解码能力。 支持断网和网络切换后的自动重连。 支持音视频采样频率和码率的自动调整。 支持端云之间的应用上传。 华南-广州 西南-贵阳一 华北-北京四 端云设备仿真 支持触控、麦克风、摄像头、GPS、陀螺仪、加速度传感器、重力传感器、光线传感器的设备仿真能力。 华南-广州 西南-贵阳一 华北-北京四 安全管控能力 支持云手机防截屏能力。 支持应用安装黑白名单管控能力。 支持端云之间音视频流、控制流的数据加密传输。 云机在推送视频流时叠加实时水印。 华南-广州 西南-贵阳一 华北-北京四
  • 问题现象 创建分区表索引HR_staffS_p1_index1,不指定索引分区的名字。 1 CREATE INDEX HR_staffS_p1_index1 ON HR.staffS_p1 (staff_ID) LOCAL; 创建分区索引HR_staffS_p1_index2,并指定索引分区的名字。 1 2 3 4 5 6 CREATE INDEX HR_staffS_p1_index2 ON HR.staffS_p1 (staff_ID) LOCAL ( PARTITION staff_ID1_index, PARTITION staff_ID2_index TABLESPACE example3, PARTITION staff_ID3_index TABLESPACE example4 ) TABLESPACE example; 修改索引分区staff_ID1_index的表空间为example1: 调用“ALTER INDEX HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1;”提示索引不存在。
  • 原因分析 重新创建索引CREATE INDEX HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1,提示索引已存在,然后执行以下SQL命令或者gsql客户端元命令\d+ HR.staffS_p1 查询索引时发现索引已存在。 1 SELECT * FROM DBA_INDEXES WHERE index_name = HR.staffS_p1 ; 推测是当前模式是public模式,而不是hr模式,导致检索不到该索引。 使用“ALTER INDEX hr.HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1;”验证推测,发现调用成功。 接着调用ALTER SESSION SET CURRENT_SCHEMA TO hr;再次调用“ALTER INDEX HR_staffS_p1_index2 MOVE PARTITION staff_ID2_index TABLESPACE example1;”发现设置成功。
  • 处理方法 以上述问题现象中的“字符串类型varchar直接转换为整数型integer”报错为例,可以先将字段类型修改为decimal(任意精度型)再进行转换来处理。 具体的操作步骤如下: 假设报错表名为product,表定义如下: 1 SELECT * FROM PG_GET_TABLEDEF('product'); 将查询结果转换为整数型。 1 SELECT CAST(price AS integer) FROM product; 出现如下报错: 修改表字段的数据类型为decimal。 1 ALTER TABLE product ALTER COLUMN price TYPE decimal(10,1); 成功转换字段为整数型。 1 SELECT CAST(price AS integer) FROM product;
  • 原因分析 以UTF-8编码为例,一个中文占3~4个字节,即8个中文占24~32字节,超出VARCHAR(18)的最大18字节限制。 当表中某一字段包含有中文字符时,可使用char_length或length函数来查询字段字符长度,使用lengthb函数来查询字段字节长度。 1 2 3 4 5 SELECT length('数据库database'); length -------- 11 (1 row) 1 2 3 4 5 SELECT lengthb('数据库database'); length -------- 17 (1 row)
  • 问题现象 新建一个数据库表,某个表字段使用character类型,在Java中读取character类型的字段时返回类型为什么是byte? 例如,创建如下所示的表: 1 2 3 4 CREATE TABLE IF NOT EXISTS table01( msg_id character(36), msg character varying(50) ); 在Java中,读取character类型的字段代码如下: 1 ColumnMetaInfo(msg_id,1,Byte,true,false,1,true);
  • 处理方法 应根据数据实际情况规划分区,以保证插入的数据都在规划好的分区中。 如果已规划的分区无法满足实际应用条件,可以增加分区后再插入数据。针对上述案例,可以增加分区c2,分区范围介于5000和MAXVALUE之间: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 ALTER TABLE startend_pt ADD PARTITION P6 VALUES LESS THAN (MAXVALUE); SELECT partition_name,high_value FROM dba_tab_partitions WHERE table_name='startend_pt'; partition_name | high_value ----------------+------------ p1_0 | 1 p1_1 | 201 p1_2 | 401 p1_3 | 601 p1_4 | 801 p1_5 | 1000 p2 | 2000 p3 | 2500 p4 | 3000 p5_1 | 4000 p5_2 | 5000 p6 | MAXVALUE (12 rows) INSERT INTO startend_pt VALUES (1,5001); SELECT * FROM startend_pt; c1 | c2 ----+------ 1 | 5001 (1 row)
  • 问题现象 给范围分区表插入数据报错:inserted partition key does not map to any table partition。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 CREATE TABLE startend_pt (c1 INT, c2 INT) DISTRIBUTE BY HASH (c1) PARTITION BY RANGE (c2) ( PARTITION p1 START(1) END(1000) EVERY(200) , PARTITION p2 END(2000), PARTITION p3 START(2000) END(2500) , PARTITION p4 START(2500), PARTITION p5 START(3000) END(5000) EVERY(1000) ); SELECT partition_name,high_value FROM dba_tab_partitions WHERE table_name='startend_pt'; partition_name | high_value ----------------+------------ p1_0 | 1 p1_1 | 201 p1_2 | 401 p1_3 | 601 p1_4 | 801 p1_5 | 1000 p2 | 2000 p3 | 2500 p4 | 3000 p5_1 | 4000 p5_2 | 5000 (11 rows) INSERT INTO startend_pt VALUES (1,5001); ERROR: dn_6003_6004: inserted partition key does not map to any table partition
  • 解决办法 为防止出现分区间隙,需要将ADD PARTITION的START值前移。 示例:对于分区表partitiontest 1 2 3 4 5 6 7 8 9 10 CREATE TABLE partitiontest ( c_int integer, c_time TIMESTAMP WITHOUT TIME ZONE ) PARTITION BY range (c_int) ( partition p1 start(100)end(108), partition p2 start(108)end(120) ); 使用如下两种语句会发生报错: 1 2 ALTER TABLE partitiontest ADD PARTITION p3 start(120)end(130), DROP PARTITION p2; ERROR: start value of partition "p3" NOT EQUAL up-boundary of last partition. 1 2 ALTER TABLE partitiontest DROP PARTITION p2,ADD PARTITION p3 start(120)end(130) ; ERROR: start value of partition "p3" NOT EQUAL up-boundary of last partition. 可以修改语句为: 1 ALTER TABLE partitiontest ADD PARTITION p3 start(108)end(130), DROP PARTITION p2; 1 ALTER TABLE partitiontest DROP PARTITION p2,ADD PARTITION p3 start(108)end(130) ;
  • 处理方法 String_agg中增加order by,语句修改为如下格式保证ename字段是按照相同的顺序来拼接的,从而满足查询结果是稳定的。 1 2 3 4 select count(*) from (select deptno, string_agg(ename, ',' order by ename desc) from employee group by deptno) t1 , (select deptno, string_agg(ename, ',' order by ename desc) from employee group by deptno) t2 where t1.string_agg = t2.string_agg;
  • 原因分析 客户的SQL语句中使用了string_agg函数,语句逻辑如下: 执行如下SQL语句: 1 2 3 4 select count(*) from (select deptno, string_agg(ename, ',') from employee group by deptno) t1 , (select deptno, string_agg(ename, ',') from employee group by deptno) t2 where t1.string_agg = t2.string_agg;
  • 处理方法 8.0以下版本集群清理系统表需要先执行DELETE FROM,再执行VACUUM FULL。 此处仅以gs_wlm_session_info系统表为例: 1 2 DELETE FROM pg_catalog.gs_wlm_session_info; VACUUM FULL pg_catalog.gs_wlm_session_info; 8.0及以上(8.0.x/8.1.1/8.1.3)版本集群可执行以下命令清理系统表: 1 TRUNCATE TABLE dbms_om.gs_wlm_session_info; 此系统表的schema是dbms_om。
共100000条