华为云用户手册

  • KooMessage 服务开通以后,是否还需要开通消息&短信(Message & SMS )服务? 开通KooMessage服务会默认开通消息&短信服务,是可以使用消息&短信(Message & SMS)服务,消息&短信(Message & SMS)服务用于智能信息AIM的短信发送。如您不使用华为云短信发送通道进行智能消息AIM的发送,只使用智能信息AIM+的短链生成和解析,可关闭消息&短信(Message & SMS)服务。 父主题: 服务开通
  • KooMessage智能信息和普通短信的区别是什么? 智能信息是通过手机终端增强技术和用户数据分析能力,以可交互的富媒体方式精准触达到最终消费者。可实现与用户应用交互、内容访问、信息查询、智能客服等实时互动。支持视频、高清图片、文字等多种媒体元素,支持浏览器内置访问、LBS、APP、快应用、服务号、快捷支付等应用交互能力,有效帮助企业客户与用户实现智能、快速、精准的营销互动沟通与服务。 父主题: 服务能力咨询
  • 智能信息模板审核时间 KooMessage运营审核时段为法定工作日的9:00-18:00,周末及节假日不进行审核。 如有加急或特殊需求,请联系运营团队。 不同厂商智能信息模板审核时间段有所差异,具体请参考表1。 表1 不同厂商智能信息模板审核时间 厂商 智能信息模板审核时间段 华为终端厂商 工作日:9:00-18:00 小米终端厂商 工作日:10:00-18:00 OPPO终端厂商 工作日:10:00-18:00 VIVO终端厂商 工作日:10:00-18:00 魅族终端厂商 工作日:9:00-18:00 父主题: 智能信息模板制作规范
  • 智能信息入网所需材料准备 表1 智能信息入网所需材料 智能信息所需资料 AIM AIM+ 是否加盖公章 是否可添加水印 营业执照复印件(三证合一9开头) √ √ √ × 智能信息及富媒体消息类业务素材承诺函 √ √ √ √ 经办人身份证复印件(正反面) √ × √ √ 经办人手持身份证照片拍照 √ × × √ 经办人授权书 √ × √ √ 签名说明书 √ × √ √ 签名授权函 √ × √ √ 公司关系授权函 (如果签名跟企业名称不符,需提供“公司关系授权函”及其他签名证明材料) 根据需要提供 根据需要提供 √ √ 七大类(房产/互金/投资/移民/教育/培训/社交)以及游戏等行业需根据实际发送内容进行额外资质提供。
  • 资质审核规范 企业单位营业执照的扫描件,企业单位信息应当可在全国企业信用信息公示系统查询; 事业单位法人证书和组织机构代码证的扫描件,社会团体法人登记证和组织机构代码证的扫描件,组织机构代码证应当在全国组织机构代码管理中心查询; 营业执照复印件文档可添加备注,例如“仅限华为云审核专用”; 复印件需保持完整,不可有遮挡、覆盖等影响材料完整的行为; 不可更改文件内容,否则视为无效; 经办人身份证复印件和经办人手持身份证照片拍照应与经办人授权书主体保持一致; 资质审核文件内公司署名与签署日期为必填项,否则视为无效; 公司关系授权函为发送内容涉及两家或两家以上企业,需要授权方与被授权方加盖公章,并承诺上线合作的品牌、业务、产品运营均取得合法有效授权,内容合法合规; A-B原则,如果投放主体为A,原则上只能投放自有业务,B为A的合作企业、投放主体A的子业务,因合作需要或联合活动业务,在B业务或B业务授权的前提下,可通过主体A发送B业务。具体投放一事一议; 投放主体提供的资质各项证书期限应涵盖智能信息内容的投放期限及产品、服务的提供期限;投放主体提供的主体经营范围应涵盖在KooMessage待推广的业务及产品中。
  • 问题现象 Flink作业提交时,jobmanager启动成功,但taskmanager一直是启动中直到超时,报错如下: org.apache.flink.runtime.jobmanager.scheduler.NoResourceAvailableException: Could not allocate the required slot within slot request timeout. Please make sure that the cluster has enough resources
  • 如何修改HDFS主备倒换类? 当 MRS 3.x版本集群使用HDFS连接NameNode报类org.apache.hadoop.hdfs.server.namenode.ha.AdaptiveFailoverProxyProvider无法找到时,是由于MRS 3.x版本集群HDFS的主备倒换类默认为该类,可通过如下方式解决。 方式一:添加hadoop-plugins-xxx.jar到程序的classpath或者lib目录中。 hadoop-plugins-xxx.jar包一般在HDFS客户端目录下:$HADOOP_HOME/share/hadoop/common/lib/hadoop-plugins-8.0.2-302023.jar 方式二:将HDFS的如下配置项修改为开源类: dfs.client.failover.proxy.provider.hacluster=org.apache.hadoop.hdfs.server.namenode.ha.ConfiguredFailoverProxyProvider 父主题: 组件配置类
  • 表引擎选择建议 自助报表分析、行为数据分析,在不涉及重复数据聚合的情况下,建议使用ReplicatedMergeTree表引擎。 涉及到物化视图等聚合函数的场景,建议使用ReplicatedAggregatingMergeTree表引擎。 经常有数据去重或有update修改数据的场景下,建议使用ReplacingMergeTree表引擎,配合使用argMax函数获取最新数据。 表1 应用场景列表 引擎名称 应用场景 MergeTree ClickHouse中最重要的引擎,基于分区键(partitioning key)的数据分区分块存储、前缀稀疏索引(order by和primary key)。 ReplacingMergeTree 相对于MergeTree,它会用最新的数据覆盖具有相同主键的重复项。 删除老数据的操作是在分区异步merge的时候进行处理,只有同一个分区的数据才会被去重,分区间及shard间重复数据不会被去重,所以应用侧想要获取到最新数据,需要配合argMax函数一起使用。 SummingMergeTree 当合并SummingMergeTree表的数据片段时,ClickHouse会把所有具有相同主键的行进行汇总,将同一主键的行替换为包含sum后的一行记录。 如果主键的组合方式使得单个键值对应于大量的行,则可以显著的减少存储空间并加快数据查询的速度。 AggregatingMergeTree 该引擎继承自MergeTree,并改变了数据片段的合并逻辑。 ClickHouse会将一个数据片段内所有具有相同主键(准确的说是排序键)的行替换成一行,这一行会存储一系列聚合函数的状态。可以使用AggregatingMergeTree表引擎来做增量数据的聚合统计,包括物化视图的数据聚合。 CollapsingMergeTree 在创建时与MergeTree基本一样,除了最后多了一个参数,需要指定Sign位(必须是Int8类型)。 CollapsingMergeTree会异步地删除(折叠)除了特定列Sign1和-1值以外的所有字段的值重复的行。 VersionedCollapsingMergeTree 是CollapsingMergeTree的升级,使用不同的collapsing算法,该算法允许使用多个线程以任何顺序插入数据。 Replicated*MergeTree 只有Replicated*MergeTree系列引擎是上面介绍的引擎的多副本版本,为了提升数据和服务的可靠性,建议使用副本引擎: ReplicatedMergeTree ReplicatedSummingMergeTree ReplicatedReplacingMergeTree ReplicatedAggregatingMergeTree ReplicatedCollapsingMergeTree ReplicatedVersionedCollapsingMergeTree ReplicatedGraphiteMergeTree
  • 数据修改 建议慎用delete、update的mutation操作 标准SQL的更新、删除操作是同步的,即客户端要等服务端反回执行结果(通常是int值);而ClickHouse的update、delete是通过异步方式实现的,当执行update语句时,服务端立即返回执行成功还是失败结果,但是实际上此时数据还没有修改完成,而是在后台排队等着进行真正的修改,可能会出现操作覆盖的情况,也无法保证操作的原子性。 业务场景要求有update、delete等操作,建议使用ReplacingMergeTree、CollapsingMergeTree、VersionedCollapsingMergeTree引擎,使用方式参见:https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/collapsingmergetree/。 建议少或不增删数据列 业务提前规划列个数,如果将来有更多列要使用,可以规划预留多列,避免在生产系统跑业务过程中进行大量的alter table modify列操作,导致不可以预知的性能、数据一致性问题。 对于批量数据清理,建议根据分区来操作: ALTER TABLE table_name DROP PARTITION partition_name; 禁止修改索引列 对索引列的修改会导致现有索引失效,触发重建索引,期间查询数据不准确。 如果业务场景必须修改索引列,推荐用ReplacingMergeTree引擎建表,使用数据写入+去重引擎代替数据更新场景:https://clickhouse.tech/docs/zh/engines/table-engines/mergetree-family/collapsingmergetree/。
  • 数据查询建议 建议查询指定分区 通过指定分区字段会减少底层数据库扫描的文件数量,提升查询性能,实际经验:700个分区的千列大表,需要查询一个分区中有7000万数据,其他699个分区中无数据,虽然只有一个分区有数据,其他分区无数据,但是查询指定分区为百毫秒级性能,没有指定分区查询性能为1~2秒左右,性能相差20倍。 慎用final查询 在查询语句的最后跟上final,通常是对于ReplacingMergeTree引擎,数据不能完全去重情况下,有些开发人员习惯写final关键字进行实时合并去重操作(merge-on-read),保证查询数据无重复数据。可以通过argMax函数或其他方式规避此问题。
  • 研发包结构 图1 研发包结构 Service下所有的main.tf文件中的Resource实例不能有重叠,否则会导致资源被覆盖或删除。 表1 研发包结构介绍 文件名 说明 Service(推荐方式) 按云服务维度的资源模板,整个云服务涉及资源的生命周期都在同一个 RFS 资源模板中管理。 MicroService 按微服务维度的资源模板管理,当一个云服务的每个微服务有单独的资源时使用。 envXname 云服务/微服务部署环境,每个环境的RFS包资源都是与环境配套,每个环境都有单独的资源模板。 package.json 固定名称与格式,发布包版本信息,类型,软件包名称,版本。 { "type": "rfstemplate", // 固定 "name": "templatename", // RFS模板名称,服务下唯一 "envid": "envid1", // 云服务的环境ID "version": "1.0.0", // RFS模板版本号 "maintf": "main.tf", // 实际创建资源的TF文件 "variablestf": "variable.tf" // 存储参数变量的TF文件 } main.tf RFS实际使用的模板文件,通过此文件来管理华为云资源。当前支持的华为云资源有CCE、D CS 、DNS、ECS、Kafka、RDS及VPC,模板文件样例分别参考CCE资源RFS模板文件、DCS资源RFS模板文件、DNS资源RFS模板文件、ECS资源RFS模板文件、Kafka资源RFS模板文件、RDS资源RFS模板文件及VPC资源RFS模板文件。 详细的开发规范请参考Terraform文档。 variable.tf RFS资源模板中涉及到的变量值,可能多个云服务变量名称不一致,提取出来单独设置。样例如下: CCE-Name-1234: "CCE-Cluster-ERS" 说明: 建议敏感数据不在此文件设置,敏感数据在界面手动输入。
  • DCS资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_dcs_instance": { "dcs-cx83b": { "charging_mode": "postPaid", "availability_zones": ["cn-north-4a", "cn-north-4a"], "vpc_id": "18b117f8-****-****-****-6d022db472a1", "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a", "maintain_begin": "18:00:00", "maintain_end": "22:00:00", "engine_version": "5.0", "capacity": 1, "flavor": "redis.ha.xu1.large.r2.1", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "password": "${var.DCS-Password-qvwu}", "name": "dcs-rfs-001", "engine": "Redis" } } }, "variable": { "DCS-Password-qvwu": { "description": "dcs password for dcs-cx83b", "type": "string", "sensitive": true, "nullable": true, "default": null } } }
  • VPC资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_vpc": { "vpc-krkup": { "name": "vpc-rfs-001", "cidr": "192.168.0.0/16", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d" } }, "huaweicloud_vpc_subnet": { "vpc-subnet-ppnwk": { "name": "subnet-rfs-001", "cidr": "192.168.3.0/24", "gateway_ip": "192.168.3.1", "vpc_id": "c6131e37-****-****-****-5fffa75982f3", "depends_on": ["huaweicloud_vpc.vpc-krkup"] } }, "huaweicloud_vpcep_endpoint": { "vpcep_endpoint-4epnv": { "service_id": "ebc591db-****-****-****-15354c9bef25", "network_id": "${huaweicloud_vpc_subnet.vpc-subnet-ppnwk.id}", "vpc_id": "${huaweicloud_vpc_subnet.vpc-subnet-ppnwk.vpc_id}" } }, "huaweicloud_networking_secgroup": { "sg-rmo7v": { "name": "sg-rfs-all-deny", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "description": "通用Web服务器,默认放通22、3389、80、443端口和ICMP协议。 适用于需要远程登录、公网ping及用于网站服务的云服务器场景。", "depends_on": ["huaweicloud_vpc.vpc-krkup"] } }, "huaweicloud_networking_secgroup_rule": { "sg-rule-d28sj": { "action": "allow", "direction": "ingress", "ethertype": "IPv4", "protocol": "icmp", "remote_ip_prefix": "0.0.0.0/0", "priority": 1, "security_group_id": "${huaweicloud_networking_secgroup.sg-rmo7v.id}" } } } }
  • CCE资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_cce_cluster": { "cce-cluster-yfclf": { "vpc_id": "18b117f8-****-****-****-6d022db472a1", "name": "cce-cluster-rfs-001", "cluster_version": "v1.27", "charging_mode": "postPaid", "flavor_id": "cce.s2.small", "container_network_type": "vpc-router", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a" } }, "huaweicloud_cce_node": { "cce-node-pmqnn": { "name": "cce-node-rfs-001", "charging_mode": "postPaid", "flavor_id": "c7.large.2", "os": "Huawei Cloud EulerOS 2.0", "runtime": "containerd", "root_volume": { "size": 50, "volumetype": "SAS" }, "password": "${var.CCE-Node-Password-u9fi}", "cluster_id": "d6eb9020-****-****-****-0255ac1000ac", "availability_zone": "cn-north-4c", "data_volumes": [{ "volumetype": "SAS", "size": 100 }], "storage": { "selectors": [{ "name": "cceUse", "type": "evs", "match_label_count": 1, "match_label_size": 100, "match_label_volume_type": "SAS" }], "groups": [{ "name": "vgpaas", "cce_managed": true, "selector_names": ["cceUse"], "virtual_spaces": [{ "name": "runtime", "size": "90%", "runtime_lv_type": "linear" }, { "name": "kubernetes", "size": "10%", "lvm_lv_type": "linear" }] }] }, "depends_on": ["huaweicloud_cce_cluster.cce-cluster-yfclf"], "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a" } } }, "variable": { "CCE-Node-Password-u9fi": { "description": "Password for cce-node-pmqnn", "type": "string", "sensitive": true, "nullable": false, "default": "" } } }
  • ECS资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_compute_instance": { "ecs-qh7h5": { "name": "ecs-rfs-001", "charging_mode": "postPaid", "admin_pass": "${var.ECS-Password-ia2c}", "flavor_id": "s6.small.1", "system_disk_type": "SAS", "availability_zone": "cn-north-4a", "network": { "uuid": "bef6af2f-****-****-****-9e78ef03eb6a" }, "security_group_ids": ["986d4460-****-****-****-f5f237df42c0"], "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "system_disk_size": 40, "image_id": "86405805-****-****-****-09f30b497c98" } } }, "variable": { "ECS-Password-ia2c": { "description": "Ecs password for ecs-qh7h5", "type": "string", "sensitive": true, "nullable": true, "default": null } } }
  • DNS资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_dns_zone": { "dns-zone-iz7r1": { "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "zone_type": "private", "router": { "router_id": "c6131e37-****-****-****-5fffa75982f3" }, "name": "exampleninenine.com" } } } }
  • Kafka资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_dms_kafka_instance": { "kafka-gq8ef": { "manager_password": "${var.Kafka-Manager-Password-nsbl}", "name": "kafka-rfs-001", "charging_mode": "postPaid", "manager_user": "kafka-manager-rfs", "flavor_id": "s6.2u4g.cluster.small", "engine_version": "3.x", "broker_num": 3, "storage_spec_code": "dms.physical.storage.high.v2", "availability_zones": ["cn-north-4a"], "storage_space": 300, "vpc_id": "18b117f8-****-****-****-6d022db472a1", "network_id": "bef6af2f-****-****-****-9e78ef03eb6a", "security_group_id": "32ed0723-****-****-****-7c0fb748d436", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "retention_policy": "time_base" } } }, "variable": { "Kafka-Manager-Password-nsbl": { "description": "Manager Password for kafka-gq8ef", "type": "string", "sensitive": true, "nullable": false, "default": "" } } }
  • RDS资源RFS模板文件 { "terraform": { "required_providers": { "huaweicloud": { "source": "huawei.com/provider/huaweicloud", "version": "1.56.0" } } }, "provider": { "huaweicloud": { "auth_url": "https://iam.cn-north-4.myhuaweicloud.com/v3", "insecure": true, "region": "cn-north-4" } }, "resource": { "huaweicloud_rds_instance": { "rds-instance-yaqsb": { "name": "rds-rfs-001", "charging_mode": "postPaid", "db": { "type": "MySQL", "version": "8.0", "password": "${var.RDS-Password-u6z0}" }, "ha_replication_mode": "async", "volume": { "size": 40, "type": "ULTRAHIGH" }, "vpc_id": "18b117f8-****-****-****-6d022db472a1", "subnet_id": "bef6af2f-****-****-****-9e78ef03eb6a", "security_group_id": "32ed0723-****-****-****-7c0fb748d436", "enterprise_project_id": "2191bb05-****-****-****-96f098494b8d", "availability_zone": ["cn-north-4c", "cn-north-4c"], "flavor": "rds.mysql.c6.large.2.ha" } } }, "variable": { "RDS-Password-u6z0": { "description": "Password for rds-instance-yaqsb", "type": "string", "sensitive": true, "nullable": false, "default": "" } } }
  • 自定义lua配置 表14 customLuaConf字段说明 参数名 是否必选 说明 slb100GlobalInit 否 大小不得超过16KB slb200WorkerInit 否 大小不得超过16KB slb300PreFlowControl 否 大小不得超过16KB slb400OnFlowControled 否 大小不得超过16KB slb500PreGrey 否 大小不得超过16KB slb600PostGrey 否 大小不得超过16KB slb700PostRoute 否 大小不得超过16KB slb750RespHeaderFilter 否 大小不得超过16KB slb800RespBodyFilter 否 大小不得超过16KB slb_instance_config/SLB_100_Global_Init_iac3.lua #SLB_100_Global_Init_iac3.lua默认配置 --the custom point SLB_100_Global_Init, running when Global init. --will be triggered in exec function, so pls make sure there is a exec function in global_init local global_init = {}; function global_init.exec(gen_param) --eg:ngx.log(ngx.ERR,"i am in global_init") end return global_init slb_instance_config/SLB_200_Worker_Init_iac3.lua #SLB_200_Worker_Init_iac3.lua默认配置 --the custom point SLB_200_Worker_Init, running when Worker init. --will be triggered in exec function, so pls make sure there is a exec function in worker_init local worker_init = {}; function worker_init.exec(gen_param) --eg:ngx.log(ngx.ERR,"i am in worker init"); end return worker_init slb_instance_config/SLB_300_Pre_FlowControl_iac3.lua #SLB_300_Pre_FlowControl_iac3.lua默认配置 --the custom point SLB_300_Pre_FlowControl, running before flowcontrol and blacklist. --will be triggered in exec function, so pls make sure there is a exec function in pre_flowcontrol local pre_flowcontrol = {}; function pre_flowcontrol.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in pre flowcontrol") end return pre_flowcontrol slb_instance_config/SLB_400_On_FlowControled_iac3.lua #SLB_400_On_FlowControled_iac3.lua默认配置 --the custom point SLB_400_On_FlowControlled, running when request is flowcontrolled or blocked due to blacklist. --will be triggered in exec function, so pls make sure there is a exec function in on_flowcontroled local on_flowcontroled = {}; function on_flowcontroled.exec(gen_param) --eg:ngx.log(ngx.ERR,"the flowcontrol type is:",gen_param.control_type) end return on_flowcontroled slb_instance_config/SLB_500_Pre_Grey_iac3.lua #SLB_500_Pre_Grey_iac3.lua默认配置 --the custom point SLB_500_Pre_Grey, running before Greyrule judge. --will be triggered in exec function, so pls make sure there is a exec function in pre_grey local pre_grey = {}; function pre_grey.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in pre grey"); end return pre_grey slb_instance_config/SLB_600_Post_Grey_iac3.lua #SLB_600_Post_Grey_iac3.lua默认配置 --the custom point SLB_600_Post_Grey, running after get result of greyrule. --will be triggered in exec function, so pls make sure there is a exec function in post_grey local post_grey = {}; function post_grey.exec(gen_param) --eg:ngx.log(ngx.ERR,"I AM IN POST GREY"); end return post_grey slb_instance_config/SLB_700_Post_Route_iac3.lua #SLB_700_Post_Route_iac3.lua默认配置 --the custom point SLB_700_Post_Route, running after get result of routerule. --will be triggered in exec function, so pls make sure there is a exec function in post_route local post_route = {}; function post_route.exec(gen_param) --eg:ngx.log(ngx.ERR,"I AM IN POST Route"); end return post_route slb_instance_config/SLB_750_Resp_Header_Filter_iac3.lua #SLB_750_Resp_Header_Filter_iac3.lua默认配置 --the custom point SLB_750_Resp_Header_Filter, running during header filter. --will be triggered in exec function, so pls make sure there is a exec function in header_filter local header_filter = {}; function header_filter.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in header filter"); end return header_filter slb_instance_config/SLB_800_Resp_Body_Filter_iac3.lua #SLB_800_Resp_Body_Filter_iac3.lua默认配置 --the custom point SLB_800_Resp_Body_Filter, running during body filter. --will be triggered in exec function, so pls make sure there is a exec function in body_filter local body_filter = {}; function body_filter.exec(gen_param) --eg:ngx.log(ngx.ERR,"I am in body filter"); end return body_filter
  • 内网段配置 表3 innerSegmentsConf字段说明 参数名 是否必选 说明 segment 是 IP地址段,格式为ip/子网掩码。 slb_instance_config/inner_segments_config.yaml #内网段配置 - segment: 10.0.0.0/8 - segment: 127.0.0.1/32 - segment: 172.16.0.0/12 - segment: 192.168.0.0/16 - segment: 100.125.0.0/16
  • 流控配置 表9 flowControlConf字段说明 参数名 是否必选 说明 flowControlSwitch 是 流控总开关,取值为on或off。 autoDivideSwitch 是 分摊模式开关,取值为on或off。 flowControlOrder 是 流控类型执行顺序,和下面的流控配置相匹配。 nodeFlowControl 否 节点级流控配置 interfaceFlowControl 否 接口级流控配置 serviceFlowControl 否 服务级流控配置 ipFlowControl 否 IP流控配置 singleParamFlowControl 否 自定义参数流控配置 multiParamFlowControl 否 多参数组合流控配置 quotaFlowControl 否 配额流控配置 concurrentFlowControl 否 并发连接流控配置
  • 其他配置 表13 confLuaConf字段说明 参数名 说明 addGreyFlag 灰度标记开关,取值为on或off。 greyTestSwitch 灰度测试开关,取值为on或off。 greyTestServiceId 灰度测试服务Id。 greyTestSwitch为on时必传。 getIpType 取IP方式,取值为1或2,1表示从左取,2表示从右取,默认为1。 isBypassOnGreyDown 灰度服务器全部宕机后,请求路由到生产开关,取值为on或off,默认为off。 areaGreyGetIpFromLeft 地域灰度IP从左侧取值开关,取值为on或off,默认为off。 greyTestQpsLimit 灰度测试每秒转发量限制,取值为1到1000。 successRateAlarmAbsThreshold 成功率告警阈值绝对值,非负浮点数,取值为0到100,默认值为90。 successRateAlarmOffsetThreshold 成功率下降告警阈值(相比1分钟前或者5分钟前),非负浮点数,取值为0到100,默认值为5。 healthCheckAlarmServerCountThreshold 健康检查不健康机器数告警阈值,正整数,默认为1,表示有1台节点不健康就会告警。 healthCheckAlarmDurationThreshold 健康检查告警持续时间阈值,非负正整数,默认为0,表示不健康主机立即告警;如果配置为1,表示发现不健康持续1分钟以上,才会告警。 concurrentFlowControlAlarmThreshold 并发请求流控告警阈值,非负整数,默认为0,表示只要发生1次流控,就会告警。 serviceFlowControlAlarmThreshold 服务级流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 singleParamFlowControlAlarmThreshold 自定义参数流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 multiParamFlowControlAlarmThreshold 多参数流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 quotaFlowControlAlarmThreshold 配额流控告警阈值,非负整数,默认0,表示只要发生1次流控,就会告警。 manyRequestPreAlarmThreshold 请求数过多告警阈值,正整数,例如:25000,表示每个cpu每分钟平均处理达到25000请求,则触发告警。 以4C的主机为例,1分钟处理超过25000*4=100000请求,则开始告警。 manyRequestAlarmThreshold 请求数警阈值,非负整数,默认为0。 statisticsParams 统计日志参数,格式为格式为ParamName:position。 ParamName为参数名称。 Position为参数位置,取值为queryString或header。 slb_instance_config/conf_lua_config.yaml #其他配置 addGreyFlag: 'off' #非必填,灰度标记开关,取值为off或on greyTestSwitch: 'off' #非必填,灰度测试开关,取值为off或on greyTestServiceId: 123456 #非必填,灰度测试服务ID isBypassOnGreyDown: 'off' #非必填,宕机时路由到生产集群开关,取值为off或on areaGreyGetIpFromLeft: 'off' #非必填,地域灰度IP从左取值开关 ,取值为off或on getIpType: 1 #非必填,取IP方式,取值为1或2 statisticsParams: #非必填,统计日志参数 greyTestQpsLimit: 1000 #非必填,灰度测试每秒转发量限制,取值为1到1000 manyRequestAlarmThreshold: 1000 #非必填,请求数量告警 successRateAlarmAbsThreshold: 90 #非必填,成功率告警阈值,取值为0到100 successRateAlarmOffsetThreshold: 90 #非必填,成功率下降告警阈值,取值为0到100 healthCheckAlarmServerCountThreshold: 1000 #非必填,健康检查告警阈值 healthCheckAlarmDurationThreshold: 1000 #非必填,健康告警持续时间阈值 concurrentFlowControlAlarmThreshold: 1000 #非必填,并发连接流控告警阈值 serviceFlowControlAlarmThreshold: 1000 #非必填,服务级流控告警阈值 multiParamFlowControlAlarmThreshold: 1000 #非必填,多参数流控告警阈值 singleParamFlowControlAlarmThreshold: 1000 #非必填,自定义参数流控告警阈值 quotaFlowControlAlarmThreshold: 1000 #非必填,配额流控告警阈值 manyRequestPreAlarmThreshold: 1000 #非必填,请求数量预告警
  • 重写重定向配置 表2 urlResetConf字段说明 参数名 是否必选 说明 transferType 是 转换类型,为以下枚举值: rewriteGrey 灰度重写 rewriteNormal 生产重写 redirectGrey 灰度重定向 redirectNormal 生产重定向 source 是 匹配路径,例:/abc/portal/login.jsp(.*)$ target 是 目标路径,例:/abc/def/$1 slb_instance_config/url_reset_config.yaml #重写重定向配置 - transferType: rewriteNormal #必填,转发类型,rewriteNormal代表生产重写 source: /a1 #必填,匹配路径 target: /b1 #必填,目标路径 - transferType: rewriteGrey #必填,转发类型,rewriteGrey代表灰度重写 source: /a2 #必填,匹配路径 target: /b2 #必填,目标路径
  • nginx配置 slb_instance_config/nginx.conf #nginx默认配置 #user slb slb; worker_processes auto; #worker_cpu_affinity 0001 0010 0100 1000; pid logs/nginx.pid; ##################################################################### ### Default: Close the error log error_log /dev/null crit; # nofile per worker around 20000-100000 is ok, eg, if have 8 worker, nginx will use no more than 8*worker_rlimit_nofile nofile, should make this result less than system nofile. worker_rlimit_nofile 51200; events { use epoll; # connections per worker, usually setup same or similar value as worker_rlimit_nofile. worker_connections 51200; } http { ##################################################################### ### load basic lua script include 'lua/nginx.http.lua.conf'; init_by_lua_file 'conf/lua/initial.lua'; init_worker_by_lua_file 'conf/lua/initialWorker.lua'; log_by_lua_file 'conf/lua/monitor/LogRequest.lua'; #rewrite_by_lua_no_postpone on; ##################################################################### uninitialized_variable_warn off; server_tokens off; autoindex off; port_in_redirect off; ssi off; proxy_hide_header X-Powered-By; add_header X-XSS-Protection "1; mode=block"; add_header X-frame-options SAMEORIGIN; add_header X-Content-Type-Options nosniff; add_header Strict-Transport-Security "max-age=31536000; includeSubDomains "; add_header Content-Security-Policy "default-src 'self'"; add_header Cache-control "no-cache, no-store, must-revalidate"; add_header Pragma no-cache; add_header Expires 0; client_header_timeout 60s; client_body_timeout 60s; keepalive_timeout 75s; send_timeout 60s; client_header_buffer_size 1k; large_client_header_buffers 4 8k; client_body_buffer_size 16k; client_max_body_size 1m; proxy_buffer_size 8k; proxy_buffers 8 8k; proxy_busy_buffers_size 16k; include mime.types; default_type text/html; ##################################################################### ### gzip compress gzip on; gzip_http_version 1.1; gzip_comp_level 5; gzip_min_length 1k; gzip_disable "MSIE [1-6]."; gzip_types text/plain text/css text/xml text/javascript application/json application/x-javascript application/xml application/xml+rss application/xhtml+xml; ##################################################################### ### enabled the error page process fastcgi_intercept_errors on; error_page 400 401 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 /4xx.html; error_page 500 501 502 503 504 505 /5xx.html; ##################################################################### ### log format and switch. log_format main '$time_local|$request_time|$upstream_response_time|$uri' '|$status|$body_bytes_sent|$request_length|$bytes_sent|$http_user_agent|$http_host' '|$upstream_addr|$upstream_status|$scheme|$is_grey_server|$resp_status|$server_protocol'; access_log logs/access.log main buffer=5m flush=10s; log_format bigData '$time_local|$server_addr|$upstream_addr|$is_grey_server|$uri' '|$upstream_status|$resp_status|$request_time|$upstream_response_time|$request_length|$bytes_sent|$connections_active|$target_all|$remote_addr' '|$http_x_forwarded_for|$request_method|$http_user_agent|$status|$http_referer|$server_protocol|$body_bytes_sent|$request_length|$http_host|$request' '|$server_port|-|$http_x_api_method||||||||||'; access_log logs/access_for_big_data.log bigData buffer=5m flush=10s; ##################################################################### ### load sub configure include vhosts/*.conf; include slb_conf/*.conf; }
  • 配置管理 本章介绍如何通过IaC代码描述配置信息,支持私有配置和公共配置两种类型。 IaC3.0公共配置集模型与私有配置项绝大部分字段参数一样,具体请参见表1。 表1 配置管理字段说明 参数 是否必选 类型 说明 格式校验 name 是 string 配置集名称 私有配置集:服务环境下name唯一。 公共配置集:产品环境下name唯一。 建议:^[A-Za-z0-9_]{1,64} type 是 string 资源类型 私有配置集:WiseCloud::MicroService::PrivateConfig 公共配置集:WiseCloud::MicroService::PublicConfig - prefix 否 string 为虚机订阅坐标,虚机部署按prefix前缀来订阅配置,容器场景下不填。 私有配置样例:/app/cloudeye/WiseEyeConfig/v1/rnd 公共配置样例:/public/cloudeye/test 私有配置:/app/${scope}/${module}/${version}/${tag} 公共配置:/public/${scope}/${tag} version 私有配置必填 公共配置无此字段 string 配置版本 满足正则:^[A-Za-z0-9_.,:()-]{1,100} schema 否 object 配置项属性,描述配置项类型和作用。 properties属性为key-object格式,key是配置名称,object是配置项各项描述。 N/A description:最大长度256。 format当前支持的类型如表2所示。 records 是 object 描述配置,key:value格式,key为配置名称,value为配置值。 records数组内: key:满足正则^[A-Za-z0-9_.,:-]{1,100}$ value:最大长度5000 format为schema下的一个字段,对配置进行说明,不同的配置项在使用方式上有所不同。 表2 format说明 类型 中文 说明 notype 未分类 不提供时配置项默认为未分类的类型。 sensitive 敏感配置项 标记此配置项为敏感配置项,此类配置项存储的是配置在STS的路径,非配置密文。 env 环境 - business 调优 - thirdparty 对接三方配置 - system 业务系统配置项 - middleware 中间件配置 - internal 对接内部服务配置 - function 服务功能调优配置 - oap OAP - 私有配置样例: name: my_config type: WiseCloud::MicroService::PrivateConfig properties: prefix: /app/cloudeye/WiseeyeConfig/v1/rnd version: v1 schema: type: object properties: keyl: description: type: string format: notype key2: description: type: string format: sensitive records: key1: value1 key2: value2 公共配置样例: name: test_config_lhq type: WiseCloud::MicroService::PublicConfig properties: prefix: /public/cloudeye/wiseEyeConfigService schema: type: object properties: key_lhq1: description: KEY1相关描述 type: string format: notype key_lhq2: description: KEY2相关描述 type: string format: notype records: key_lhq1: value_lhq1 key_lhq2: value_lhq2 父主题: 资源列表
  • 包描述文件介绍 包描述文件package.json样例如下: { "type": "iacspec", # 代码包类型 "name": "service/1180196813870297088", # 代码包名称,格式:service/{服务Id}(必须) "version": "1.0.0" # 代码包版本号(必须) } 表1 package.json字段说明 位置 类型 必填 描述 type string 是 包类型,常量:iacspec或iacpatch。 name string 是 包名称 iacspec包名称格式:service/{service-id},其中service-id为服务ID。 iacpatch包名称格式:service/{service-id}/{component-name},其中{service-id}为服务ID,{component-name}为组件名称。 您可以在AppStage运维中心右上角的个人账号信息管理中,选择“租户管理”,查看服务ID。 version string 是 版本号。 父主题: 应用平台IaC部署代码开发
  • 转发策略配置 本章介绍通过IaC进行转发策略配置的管理,包括监听下的转发策略、健康检查、后端服务器及动态路由管理。对应的资源类型为WiseCloud::LoadBalancer::SLB::RouteRule。 表1 转发策略配置字段说明 参数名 是否必选 说明 listenerGroupName 是 SLB监听名称,一个转发策略实例只能绑定一个监听实例。 targetGroups 否 后端集群 routes 否 转发策略(Locations) dynamicRoutes 否 动态路由 表2 targetGroups字段说明 参数名 是否必选 说明 name 是 后端集群名,不超过150位,不包含特殊字符。 protocol 是 协议,取值为:HTTP或HTTPS。 loadBalancer 是 后端集群负载均衡类型 healthCheck 否 健康检查 表3 loadBalancer字段说明 参数名 是否必选 说明 strategy 是 负载均衡算法,支持"roundRobin"、"protocolParam"、"IP_HASH"、"least_conn"。 slowStartDelay 否 预热时延,不超过30。 slowStartPeriod 否 预热周期,不超过30。 slowStartFactor 否 预热因子,默认为10,不小于1,不超过100。 hashParam 否 哈希转发字段名,Strategy类型为protocolParam时必填 长度不超过50,由字母加数字,下划线,横杠,点组成。 customParam 否 自定义参数,不包含by_lua。 默认取第一个后端集群的健康检查配置,如果为空,使用默认值。 表4 healthCheck字段说明 参数名 是否必选 说明 switchStatus 否 是否开启健康检查,取值为on或off,不填或者其他字符均为off。 protocol 否 协议,默认HTTP,不可修改。 path 否 检查路径,长度不超过500,由字母、数字、横杠、下划线和点组成。 successCodes 否 成功码列表,100-600之间的数字,以逗号隔开。 healthyThreshold 否 健康阈值,取值范围2-10,默认为2。 interval 否 探测间隔时间,取值范围1-50,默认为5。 timeout 否 探测超时时间,取值范围1-300,默认为10。 unhealthyThreshold 否 不健康阈值,取值范围2-10,默认为3。 表5 RouteRule字段说明 参数名 是否必选 说明 location 否 转发策略地址,长度不超过500,非中文。 targetGroup 否 后端集群名,长度不超过150,由字母、数字、下划线、横杠和点组成。 grayServiceName 否 灰度规则 degradeUrl 是 降级url 不降级:unDegrade 默认降级:defaultDegrade 只有值为defaultDegrade时才为默认降级,其他值均认为是不降级。 configs 否 通用与高级配置 表6 dynamicRoutes字段说明 参数名 是否必选 说明 name 是 名称,长度不超过50,由字母、数字、下划线、横杠和点组成,不能包含-in-且不能以-in结尾。 switchStatus 是 开关,取值为on或off。 defaultTargetGroup 是 默认后端集群 enableGrey 是 默认后端集群是否仍参考灰度进行分流,取值为on/off,默认为off,只有输入on才为打开状态。 rules 否 动态路由规则 locations 否 动态路由关联的转发策略列表。 表7 rules字段说明 参数名 是否必选 说明 condition 是 名称 targetGroup 是 后端集群 enableGray 是 是否仍参考灰度进行分流,取值为on或off,默认为off,只有输入on才为打开状态。 转发策略模板yaml - name: hw_test // 必填项,不可修改,不可重复 type: WiseCloud::LoadBalancer::SLB::RouteRule // 资源类型为转发策略配置 properties: routes: // 非必填 - targetGroup: group1 grayServiceName: grayServce_hw location: /abc_hw1 degradeUrl: unDegrade // 必填项,unDegrade不降级,defaultDegrade默认降级 configs: hostSwitch: 'off' addHeaders: - value: b key: aaa clientConnectionFreeTime: 60 rewrites: - source: /test option: break target: /test_hw proxyReadTimeout: 60 setVals: - value: bbb key: aaa keepaliveSwitch: 'off' proxyBuffersSize: 2 m expiresSwitch: 'on' proxyBuffersSwitch: 'on' accessLogSwitch: 'on' clientMaxBodySize: 3 k clientBodyBufferSize: 2 k expiresSize: 2 m proxyNextUpstreamCondition: 'error,timeout' proxySendTimeout: 60 xForwardedForSwitch: 'off' proxyNextUpstreamSwitch: 'on' allowMethod: 'POST,PUT,DELETE' targetGroups: // 非必填 - protocol: HTTP // 必填项 loadBalancer: // 必填项,负载均衡类型 strategy: roundRobin // 必填项,负载均衡策略 healthCheck: // 非必填,健康检查 path: /abc_test protocol: HTTP // 固定项 successCodes: '200,302' healthyThreshold: '2' unhealthyThreshold: '3' switchStatus: 'on' // 默认关闭,on为打开,打开时,不传其他参数均使用默认值 name: group1 // 必填项,并且不可重复,长度不超过150,不包含特殊字符 - protocol: HTTP loadBalancer: hashParam: $xxx strategy: protocolParam customParam: $xxx healthCheck: switchStatus: 'off' name: group2 listenerGroupName: zwx_listener1 // 必填项,SLB监听名称,一个转发策略实例只能绑定一个监听实例 dynamicRoutes: // 非必填 - enableGrey: 'off' defaultTargetGroup: group1 // 必填并且存在于targetGroups中 name: /abc_test1_hw locations: - location: /abc_hw1 rules: - targetGroup: group1 enableGray: 'off' switchStatus: 'on' 父主题: SLB
  • 使用configparser工具 在Dockerfile文件中,为configparser文件添加可执行权限。 定义业务配置项模板文件和meta.txt,样例如图1 业务配置项模板所示。 图1 业务配置项模板 在业务配置项模板文件(.tmpl文件)中,使用 {{参数名称}} 格式定义需要动态替换的参数,样例如图2所示。 图2 模板参数定义 在meta.txt文件中定义需要替换的业务配置项模板文件。如图3所示。 图3 替换业务配置项模板文件 application.properties.tmpl为配置文件模板,application.properties为目标配置文件。 配置中指定的文件路径是相对于meta.txt文件的路径。 启动业务进程之前,在启动脚本中调用configparser工具,进行参数替换。使用方式如下: /opt/huawei/app/bin/configparser -meta /opt/huawei/app/configtemplate/meta.txt -log configparser.log -mode front -tempPath /opt/huawei/app/configtemplate/config-temp 使用绝对路径的方式调用configparser工具,/opt/huawei/app/bin/为容器启动时的绝对路径。 -meta:指定meta.txt文件,/opt/huawei/app/configtemplate/为容器启动时meta.txt文件的绝对路径。 -log:存放configparser工具的运行日志。 -mode front:固定使用此参数值。 -tempPath:工具运行过程中生成临时文件的路径。 /opt/huawei/app/configtemplate/为容器启动时的绝对路径,必须保证此目录路径存在。config-temp文件夹可以不存在,会自动创建,运行结束后会清理此路径。 如果不配置,默认使用/opt/huawei/app/nuwa/config-temp。
  • 如何定义流水线 meta.yaml文件涉及applyPipeline/pipelines两个字段。pipelines中支持定义多个流程,applyPipeline描述本次变更要使用的流程。pipeline能力丰富,通过设计pipeline可以实现精巧的多阶段部署、部分变更、主动暂停等复杂场景的变更编排。 样例如下: type: WiseCloud::Environment # 保留字,声明这是一个针对环境的IAC代码 applyPipeline: default # 代码中指定的默认pipeline,指定的pipeline必须是在pipelines中声明的 pipelines: # 列表,可以定义多个pipeline,并在执行任务时选择 - name: default # pipeline名称 action: Serial # 此pipeline执行任务的策略 Serial(串行)/ Parallel(并行) tasks: # 声明流水线的子任务,通过声明pipeline的任务,实现对资源部署流程的编排 - name: apply-chaosmonkey-stage1 action: Serial tasks: - name: deploy action: Serial tasks: - name: apply-chaosmonkey-por action: Apply component: name: WiseEyeChaosMonkeyPortal - name: all action: Serial tasks: - name: apply-chaosmonkey-stage1 action: Serial tasks: - name: deploy action: Serial tasks: - name: apply-chaosmonkey-por action: Apply component: name: WiseEyeChaosMonkeyPortal - name: apply-chaosmonkey-stage2 action: Serial tasks: - name: deploy action: Serial tasks: - name: apply-chaosmonkey-mgr action: Apply component: name: WiseEyeChaosMonkeyMgrService 表1 meta.yaml字段说明 字段 说明 type 描述当前环境类型,当前为固定值WiseCloud::Environment。 applyPipeline 定义默认选用的组件编排流水线名称,当前默认使用environment-deploy。 pipelines pipelines中支持定义多个流程。
  • 操作步骤 使用STS的敏感配置项管理功能 ,需要在ACMS中录入敏感配置项,具体请参见录入敏感配置。 在IaC脚本中的业务配置项配置文件中指定敏感配置项坐标,敏感配置项坐标在ACMS中生成。 此处以增加一个名为spring.redis.password的敏感配置项为例,这个敏感配置项是访问Redis的密码。 spring.redis.password: MicroService/{service}/{microservice}/spring.redis.password/default # 敏感配置项坐标为:MicroService/服务名/微服务名/敏感配置项名称/敏感配置项标签 在IaC脚本中的业务配置项属性定义文件中,声明该配置项为敏感配置项。 type: object properties: spring.redis.password: format: sensitive 在application.yml配置文件中增加敏感配置项名称的配置。 nuwa: security: config: sensitiveWords: spring.redis.password,org.app.protocol-login.oauth.clientSecret,org.app.jwt-key 启动敏感配置项自动解密。 在启动类中添加@EnableStsEncryptableProperties注解。
共100000条