documents/solution/high-availability-architecture/optimizing-complex-query-performance.yaml (328 lines of code) (raw):

ROSTemplateFormatVersion: '2015-09-01' Description: zh-cn: 电商业务复杂查询性能优化。 en: Optimizing Complex Query Performance in E-commerce. Parameters: ZoneId: Type: String AssociationProperty: ALIYUN::ECS::Instance::ZoneId Label: en: VSwitch Availability Zone zh-cn: 交换机可用区 ECSInstanceType: Type: String Label: en: Instance Type zh-cn: 实例规格 Description: en: <font color='blue'><b>Before selecting a model, please confirm whether the model is in stock in the current availability zone. To save testing costs, it is recommended to use a model with 2 cores and 4G memory, for example:ecs.c7.large</b></font>. zh-cn: <font color='blue'><b>选择机型前请先确认当前可用区下该机型是否有库存,为节省测试成本,推荐使用2核4G内存的规格,例如:ecs.c7.large</b></font>。 AssociationProperty: ALIYUN::ECS::Instance::InstanceType AssociationPropertyMetadata: ZoneId: ZoneId ECSPassword: Type: String Label: en: root account password zh-cn: root 账号密码 Description: en: Server root account login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in). zh-cn: 服务器root账号登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)。 ConstraintDescription: en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ Special symbol in). zh-cn: 长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;'<>,.?/ 中的特殊符号)。 AllowedPattern: '[0-9A-Za-z\_\-\&:;''<>,=%`~!@#\(\)\$\^\*\+\|\{\}\[\]\.\?\/]+$' MinLength: 8 MaxLength: 30 NoEcho: true PolarDBNodeClass: Type: String Label: en: PolarDB Node Class zh-cn: PolarDB Mysql资源规格 Description: en: <font color='blue'><b>Before selecting a model, please confirm whether the model is in stock in the current availability zone. To save testing costs, it is recommended to use a model with 2 cores and 4G memory, for example:polar.mysql.g2.medium</b></font>, see detail:<a href='https://help.aliyun.com/zh/polardb/polardb-for-mysql/how-to-select-generic-and-exclusive-specifications' target='_blank'><b><font color='red'>Specification inquiry</font></b></a>. zh-cn: <font color='blue'><b>选择机型前请先确认当前可用区下该机型是否有库存,为节省测试成本,推荐使用2核4G内存的规格,例如:polar.mysql.g2.medium</b></font>,<a href='https://help.aliyun.com/zh/polardb/polardb-for-mysql/how-to-select-generic-and-exclusive-specifications' target='_blank'><b><font color='red'>规格查询</font></b></a>。 AssociationProperty: ALIYUN::POLARDB::DBCluster::DBNodeClass AssociationPropertyMetadata: ZoneId: ZoneId PayType: Postpaid DBType: MySQL DBVersion: "8.0" CommodityCode: polardb_payg Default: polar.mysql.g2.large PolarAccountName: Type: String Label: en: Database Account zh-cn: 数据库账号 Description: en: Maximum 16 characters,Consists of a lowercase letter, a number, an underscore, a letter beginning, a letter or a number ending.<br><b>note: <font color='blue'>Keywords cannot be used, e.g.:admin/root</font></b> zh-cn: 最长16个字符, 由小写字母,数字、下划线组成、字母开头,字母或数字结尾。<br><b>注: <font color='blue'>关键字不能用,如:admin/root</font></b> Default: polardb_admin PolarDBName: Type: String Label: en: Database Name zh-cn: 数据库名 Description: en: The value can contain up to 64 lowercase letters, digits, hyphens (-), and underscores (_). It must start with a letter or digit and end with a letter or digit. zh-cn: 由小写字母、数字、中划线(-)、下划线(_)组成,字母或数字开头,字母或数字结尾,最长64个字符。 Default: polardb_db DBAccountPassword: Type: String Label: en: DB password zh-cn: 数据库密码 Description: en: Length 8-32 characters, can contain size letters, Numbers and special symbols (including:!@#$%^&*-+=_). zh-cn: "大小写字母、数字、特殊字符占三种,长度为8~32个字符;特殊字符为 ! @ # $ % ^ & * ( ) _ + - =。" ConstraintDescription: en: Length 8-32, can contain size letters, Numbers and special symbols (including:!@#$%^&*-+=_). zh-cn: 长度8-32,可包含大小字母、数字及特殊符号(包含:!@#$%^&*-+=_)。 MinLength: '8' MaxLength: '32' NoEcho: true Resources: VPC: Type: ALIYUN::ECS::VPC Properties: CidrBlock: 192.168.0.0/16 VpcName: Fn::Sub: VPC-${ALIYUN::StackId} VSwitch: Type: ALIYUN::ECS::VSwitch Properties: ZoneId: Ref: ZoneId VSwitchName: Fn::Sub: vsw_001-${ALIYUN::StackId} VpcId: Ref: VPC CidrBlock: 192.168.1.0/24 SecurityGroup: Type: ALIYUN::ECS::SecurityGroup Properties: VpcId: Ref: VPC SecurityGroupIngress: - PortRange: 80/80 SourceCidrIp: 0.0.0.0/0 IpProtocol: tcp SecurityGroupName: Fn::Sub: SecurityGroup-${ALIYUN::StackId} ECSInstanceGroup: Type: ALIYUN::ECS::InstanceGroup Properties: ZoneId: Ref: ZoneId VpcId: Ref: VPC VSwitchId: Ref: VSwitch SecurityGroupId: Ref: SecurityGroup ImageId: aliyun_3_9_x64_20G_alibase_ InstanceType: Ref: ECSInstanceType IoOptimized: optimized MaxAmount: 1 Password: Ref: ECSPassword SystemDiskCategory: cloud_essd SystemDiskSize: 40 InternetMaxBandwidthOut: 50 PolarDBCluster: Type: ALIYUN::POLARDB::DBCluster Properties: ZoneId: Ref: ZoneId VpcId: Ref: VPC VSwitchId: Ref: VSwitch DBType: MySQL SecurityGroupIds: - Ref: SecurityGroup ClusterNetworkType: VPC DBVersion: '8.0' DBMinorVersion: 8.0.1 ProxyType: GENERAL DBNodeNum: 2 DBNodeClass: Ref: PolarDBNodeClass HotStandbyCluster: 'OFF' CreationCategory: Normal SecurityIPList: 192.168.0.0/16 PayType: Postpaid PolarDBInstance: Type: ALIYUN::POLARDB::DBInstance Properties: CharacterSetName: utf8 DBClusterId: Ref: PolarDBCluster DBName: Ref: PolarDBName DependsOn: - PolarDBCluster PolarDBAccount: Type: ALIYUN::POLARDB::Account Properties: AccountName: Ref: PolarAccountName AccountPassword: Ref: DBAccountPassword AccountType: Normal DBClusterId: Ref: PolarDBCluster DBName: Ref: PolarDBName DependsOn: PolarDBInstance PolarDBAccountPrivilege: Type: ALIYUN::POLARDB::AccountPrivilege Properties: DBClusterId: Ref: PolarDBCluster AccountPrivilege: ReadWrite DBName: Ref: PolarDBName AccountName: Ref: PolarAccountName DependsOn: - PolarDBInstance - PolarDBAccount Sleep: Type: ALIYUN::ROS::Sleep DependsOn: - PolarDBInstance - PolarDBAccount - PolarDBAccountPrivilege - PolarDBCluster Properties: CreateDuration: 60 DBNodes: Type: ALIYUN::POLARDB::DBNodes Properties: DBClusterId: Ref: PolarDBCluster Amount: 1 ImciSwitch: "ON" DependsOn: - Sleep WaitCondition: Type: ALIYUN::ROS::WaitCondition Properties: Count: 1 Handle: Ref: WaitConditionHandle Timeout: 1200 DependsOn: - PolarDBCluster - PolarDBAccountPrivilege - DBNodes WaitConditionHandle: Type: ALIYUN::ROS::WaitConditionHandle InstanceRunCommand: Type: ALIYUN::ECS::RunCommand Properties: InstanceIds: - Fn::Select: - 0 - Fn::GetAtt: - ECSInstanceGroup - InstanceIds CommandContent: Fn::Sub: |- #!/bin/bash cat << EOF >> ~/.bash_profile export DB_HOST="${PolarDBCluster.ClusterConnectionString}" export DB_USER="${PolarAccountName}" export DB_PASSWORD="${DBAccountPassword}" export DB_NAME="${PolarDBName}" export ROS_DEPLOY=true EOF source ~/.bash_profile curl -fsSL https://help-static-aliyun-doc.aliyuncs.com/install-script/complex-query/data-init.sh | bash cat << EOF >> ./create_columnar_index.py import os import pymysql from dbutils.pooled_db import PooledDB db_config = { 'host': os.getenv('DB_HOST', ''), 'user': os.getenv('DB_USER', ''), 'password': os.getenv('DB_PASSWORD', ''), 'database': os.getenv('DB_NAME', ''), 'charset': 'utf8mb4', 'cursorclass': pymysql.cursors.DictCursor } connection_pool = PooledDB( creator=pymysql, maxconnections=100, mincached=1, maxcached=10, maxshared=0, blocking=True, **db_config ) def create_columnar_index(database_name): try: connection = connection_pool.connection() with connection.cursor() as cursor: # 执行创建列式索引的命令 create_index_query = f"CREATE COLUMNAR INDEX FOR TABLES IN {database_name};" cursor.execute(create_index_query) print("Columnar index created successfully.") except Exception as e: print(f"Error: {e}") finally: if connection: connection.close() if __name__ == "__main__": database_name = os.getenv('DB_NAME', '') if not database_name: print("Database name is not set. Please set the DB_NAME environment variable.") else: create_columnar_index(database_name) EOF sudo -E python3 create_columnar_index.py curl -fsSL https://help-static-aliyun-doc.aliyuncs.com/install-script/complex-query/install.sh | bash # 执行成功回调WaitCondition结束waitCondition的等待 ${WaitConditionHandle.CurlCli} -d "{\"Data\" : \"Success\", \"status\" : \"SUCCESS\"}" Type: RunShellScript Timeout: '1200' DependsOn: - DBNodes - PolarDBAccountPrivilege Outputs: Address: Description: en: Web service address. zh-cn: Web服务地址。 Value: Fn::Sub: - http://${PublicIp} - PublicIp: Fn::Select: - 0 - Fn::GetAtt: - ECSInstanceGroup - PublicIps Metadata: 'ALIYUN::ROS::Interface': ParameterGroups: - Parameters: - ZoneId - ECSInstanceType - ECSPassword Label: default: zh-cn: ECS 配置 en: ECS Configuration - Parameters: - PolarDBNodeClass - PolarDBName - PolarAccountName - DBAccountPassword Label: default: zh-cn: PolarDB 配置 en: PolarDB Configuration TemplateTags: - acs:technical-solution:high-availability-architecture:电商业务复杂查询性能优化-tech_solu_190