华为云用户手册

  • 重置密码 仅支持为通过添加成员加入组织的管理式华为账号重置密码。 在“组织和用户管理”页面,选择组织。页面左上方设有组织下拉栏,可切换不同的组织。 单击“成员管理”。 选中目标部门。支持搜索部门名称,可搜索后选中部门名称。 单击待重置密码成员所在行“操作”列的“重置密码”。 在“重置密码”页面选择“自动生成密码”或“手工输入密码”。如果选择“手工输入密码”,需输入具体密码。密码设置完成后单击“确定”。
  • 下载客户端 购买云手机以后,管理员将云手机实例分配给用户,用户手机号码会接收到绑定成功通知短信。 KooPhone客户端提供两种下载方式。 用户访问绑定成功短信中的下载链接,下载并安装客户端App。 用户可以访问云手机服务-华为云官网,单击“移动端下载”进入下载页扫码下载安装包,如图1所示。 图1 云手机服务-华为云官网 Android的系统要求最低配置:Android6.0。 父主题: 客户端使用
  • 前提条件 给用户组授权之前,请您了解用户组可以添加的角色,如表1 KooPhone 系统角色,并结合实际需求进行选择。 表1 KooPhone系统角色 角色名称 描述 角色类别 KooPhone Administrator KooPhone所有权限用户,拥有该权限的用户可以拥有 KooPhone支持的全部权限。 系统角色 KooPhone ReadOnlyUser KooPhone只读权限用户。 系统角色
  • 入门流程 首次使用云手机服务(KooPhone)的流程如图1所示,本文以在控制台上的操作为例进行介绍。 通过该手册您可以了解KooPhone的基本操作流程,帮助您更快上手操作。 图1 入门流程 表1 流程说明 购买产品 流程 说明 购买云手机 购买云手机 根据实际业务需求,选择合适的云手机类型、规格等配置信息,确认价格并下单。 创建组织和用户 管理员通过控制台创建组织并配置成员、部门。 分配云手机 管理员在云手机实例管理页面为成员分配云手机。 下载客户端 用户参照短信通知或访问KooPhone客户端下载页下载Android手机客户端。 登录并使用 用户登录云手机App进入云机,即可使用。
  • 应用示例 连接数据库。 具体步骤参见使用gsql命令行客户端连接集群。 创建表student,有id,name和score三个属性。使用哈希函数加密保存name,使用对称密码算法保存score。 1 2 3 4 CREATE TABLE student (id int, name text, score text, subject text); INSERT INTO student VALUES (1, gs_hash('alice', 'sha256'), gs_encrypt('95', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('math', '1234')); INSERT INTO student VALUES (2, gs_hash('bob', 'sha256'), gs_encrypt('92', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('english', '1234')); INSERT INTO student VALUES (3, gs_hash('peter', 'sha256'), gs_encrypt('98', '12345', 'aes128', 'cbc', 'sha256'),gs_encrypt_aes128('science', '1234')); 不使用密钥查询表student,通过查询结果可知:没有密钥的用户即使拥有了select权限也无法看到name和score这两列加密数据。 1 2 3 4 5 6 7 8 9 10 11 12 select * from student; id | name | score | subject ----+------------------------------------------------------------------+--------------------------------------------------------------------------------------------------------------------------+----------- ----------------------------------------------------------------------------------- 1 | 2bd806c97f0e00af1a1fc3328fa763a9269723c8db8fac4f93af71db186d6e90 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1e2gGLr4/ATdCUjTEvova3cb/Ba3ZKqIn1yNVGEFBvJnTq/3sLF4//Gm8qG7AyfNbbqdW3aYErLVpbE/QWFX9Ig== | aFEWQR2gkj iu6sfsAad+dHzfFDHePZ6xd44zyekh+qVFlh9FODZ0DoaFAJXctwUsiqaiitTxW8c CS EaNjS/E7Ke1ruY= 2 | 81b637d8fcd2c6da6359e6963113a1170de795e4b725b84d1e0b4cfd9ec58ce9 | AAAAAAAAAABAuUC3VQ+MvPCDAaTUySl1taXxAoDqE793hgyCJvC0ESdAX5Mtgdq2LXI1f5ZxraQ73WIJVtIBX8oe3gTDxoXGlHbHht4kzM4U8dOwr5rjgg== | aFEWQR2gkj iu6sfsAad+dM8tPTDo/Pds6ZmqdmjGiKxf39+Wzx5NoQ6c8FrzihnRzgc0fycWSu5YGWNOKYWhRsE84Ac= 3 | 026ad9b14a7453b7488daa0c6acbc258b1506f52c441c7c465474c1a564394ff | AAAAAAAAAACnyusORPeApqMUgh56ucQu3uso/Llw5MbPFMkOXuspEzhhnc9vErwOFe6cuGtx8muEyHCX7V5yXs+8FxhNh3n5L3419LDWJJLY2O4merHpSg== | zomphRfHV4 H32hTtgkio1PyrobVO8N+hN7kAKwtygKP2E7Aaf1vsjmtLHcL88jyeJNe1lxe0fAvodzPJAxAuV3UJN4M= (3 rows) 使用密钥查询表student,通过查询结果可知:拥有密钥的用户通过使用gs_encrypt对应的解密函数gs_decrypt解密后,可以查看加密数据。 1 2 3 4 5 6 7 select id, gs_decrypt(score, '12345', 'aes128', 'cbc', 'sha256'),gs_decrypt_aes128(subject, '1234') from student; id | gs_decrypt | gs_decrypt_aes128 ----+------------+------------------- 1 | 95 | math 2 | 92 | english 3 | 98 | science (3 rows)
  • 技术背景 哈希函数 哈希函数又称为摘要算法,对于数据data,Hash函数会生成固定长度的数据,即Hash(data)=result。这个过程是不可逆的,即Hash函数不存在反函数,无法由result得到data。在不应保存明文场景(比如口令password属于敏感信息),系统管理员用户也不应该知道用户的明文口令,就应该使用哈希算法存储口令的单向哈希值。 实际使用中会加入盐值和迭代次数,避免相同口令生成相同的哈希值,以防止彩虹表攻击。 图1 哈希函数 对称密码算法 对称密码算法使用相同的密钥来加密和解密数据。对称密码算法分为分组密码算法和流密码算法。 分组密码算法将明文分成固定长度的分组,用密钥对每个分组加密。由于分组长度固定,当明文长度不是分组长度的整数倍时,会对明文做填充处理。由于填充的存在,分组密码算法得到的密文长度会大于明文长度。 流加密算法是指加密和解密双方使用相同伪随机加密数据流作为密钥,明文数据依次与密钥数据流顺次对应加密,得到密文数据流。实践中数据通常是一个位(bit)并用异或(xor)操作加密。流密码算法不需要填充,得到的密文长度等于明文长度。 图2 对称密码算法
  • 技术实现 GaussDB (DWS)主要提供了哈希函数和对称密码算法来实现对数据列的加解密。哈希函数支持sha256,sha384,sha512和国密sm3。对称密码算法支持aes128,aes192,aes256和国密sm4。 哈希函数 md5(string) 将string使用MD5加密,并以16进制数作为返回值。MD5的安全性较低,不建议使用。 gs_hash(hashstr, hashmethod) 以hashmethod算法对hashstr字符串进行信息摘要,返回信息摘要字符串。支持的hashmethod:sha256, sha384, sha512, sm3。 对称密码算法 gs_encrypt(encryptstr, keystr, cryptotype, cryptomode, hashmethod) 采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。 gs_decrypt(decryptstr, keystr,cryptotype, cryptomode, hashmethod) 采用cryptotype和cryptomode组成的加密算法以及hashmethod指定的HMAC算法,以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。 gs_encrypt_aes128(encryptstr,keystr) 以keystr为密钥对encryptstr字符串进行加密,返回加密后的字符串。keystr的长度范围为1~16字节。 gs_decrypt_aes128(decryptstr,keystr) 以keystr为密钥对decryptstr字符串进行解密,返回解密后的字符串。解密使用的keystr必须保证与加密时使用的keystr一致才能正常解密。keystr不得为空。 有关函数的更多内容,请参见使用函数加解密。
  • 验证 在DWS新建的test数据库下,执行以下SQL语句查询表apex2_dynamic_add_remain_test的行数,如与源数据行数一致,说明数据一致。 1 SELECT COUNT(*) FROM db_user01.apex2_dynamic_add_remain_test; 执行以下语句检查数据倾斜率。 数据分布率在10%以内说明数据离散分布正常。数据迁移完成。 1 SELECT TABLE_SKEWNESS('db_user01.apex2_dynamic_add_remain_test'); 父主题: 表全量数据迁移
  • 创建外表 建立不包含分区列的HDFS外表,表关联的外部服务器为hdfs_server,表对应的HDFS服务上的文件格式为‘orc’,HDFS上的数据存储路径为'/user/hive/warehouse/product_info_orc/'。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 DROP FOREIGN TABLE IF EXISTS product_info_output_ext; CREATE FOREIGN TABLE product_info_output_ext ( product_price integer , product_id char(30) , product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt integer , product_comment_time date , product_comment_num integer , product_comment_content varchar(200) ) SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca OPTIONS ( format 'orc', foldername '/user/hive/warehouse/product_info_orc/', compression 'snappy', version '0.12' ) Write Only;
  • 执行导出数据 创建普通表product_info_output。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 DROP TABLE product_info_output; CREATE TABLE product_info_output ( product_price int , product_id char(30) , product_time date , product_level char(10) , product_name varchar(200) , product_type1 varchar(20) , product_type2 char(10) , product_monthly_sales_cnt int , product_comment_time date , product_comment_num int , product_comment_content varchar(200) ) with (orientation = column,compression=middle) distribute by hash (product_name); 将表product_info_output的数据通过外表product_info_output_ext导出到数据文件中。 1 INSERT INTO product_info_output_ext SELECT * FROM product_info_output; 若出现以下类似信息,说明数据导出成功。 1 INSERT 0 10
  • 创建外部服务器 使用Data Studio连接已创建好的DWS集群。 新建一个具有创建数据库权限的用户dbuser: 1 CREATE USER dbuser WITH CREATEDB PASSWORD 'password'; 切换为新建的dbuser用户: 1 SET ROLE dbuser PASSWORD 'password'; 创建新的mydatabase数据库: 1 CREATE DATABASE mydatabase; 执行以下步骤切换为连接新建的mydatabase数据库。 在Data Studio客户端的“对象浏览器”窗口,右键单击数据库连接名称,在弹出菜单中单击“刷新”,刷新后就可以看到新建的数据库。 右键单击“mydatabase”数据库名称,在弹出菜单中单击“打开连接”。 右键单击“mydatabase”数据库名称,在弹出菜单中单击“打开新的终端”,即可打开连接到指定数据库的SQL命令窗口,后面的步骤,请全部在该命令窗口中执行。 为dbuser用户授予创建外部服务器的权限,8.1.1及以后版本,还需要授予使用public模式的权限: 1 2 GRANT ALL ON FOREIGN DATA WRAPPER hdfs_fdw TO dbuser; GRANT ALL ON SCHEMA public TO dbuser; //8.1.1及以后版本,普通用户对public模式无权限,需要赋权,8.1.1之前版本不需要执行。 其中FOREIGN DATA WRAPPER的名字只能是hdfs_fdw,dbuser为创建SERVER的用户名。 执行以下命令赋予用户使用外表的权限。 1 ALTER USER dbuser USEFT; 切换回Postgres系统数据库,查询创建 MRS 数据源后系统自动创建的外部服务器。 1 SELECT * FROM pg_foreign_server; 返回结果如: 1 2 3 4 5 6 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- gsmpp_server | 10 | 13673 | | | | gsmpp_errorinfo_server | 10 | 13678 | | | | hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:9820,192.168.1.218:9820",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (3 rows) 切换到mydatabase数据库,并切换到dbuser用户。 1 SET ROLE dbuser PASSWORD 'password'; 创建外部服务器。 SERVER名字、地址、配置路径保持与8一致即可。 1 2 3 4 5 6 7 CREATE SERVER hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca FOREIGN DATA WRAPPER HDFS_FDW OPTIONS ( address '192.168.1.245:9820,192.168.1.218:9820', //MRS管理面的Master主备节点的内网IP,可与DWS通讯。 hdfscfgpath '/MRS/8f79ada0-d998-4026-9020-80d6de2692ca', type 'hdfs' ); 查看外部服务器。 1 SELECT * FROM pg_foreign_server WHERE srvname='hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca'; 返回结果如下所示,表示已经创建成功: 1 2 3 4 srvname | srvowner | srvfdw | srvtype | srvversion | srvacl | srvoptions --------------------------------------------------+----------+--------+---------+------------+--------+--------------------------------------------------------------------------------------------------------------------- hdfs_server_8f79ada0_d998_4026_9020_80d6de2692ca | 16476 | 13685 | | | | {"address=192.168.1.245:9820,192.168.1.218:9820",hdfscfgpath=/MRS/8f79ada0-d998-4026-9020-80d6de2692ca,type=hdfs} (1 row)
  • 初始表创建 此小节所附为本Tutorial首次创建表时所用到的表创建语法。这些表没有设置存储方式、分布键、分布方式和压缩方式。 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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 CREATE TABLE store_sales ( ss_sold_date_sk integer , ss_sold_time_sk integer , ss_item_sk integer not null, ss_customer_sk integer , ss_cdemo_sk integer , ss_hdemo_sk integer , ss_addr_sk integer , ss_store_sk integer , ss_promo_sk integer , ss_ticket_number bigint not null, ss_quantity integer , ss_wholesale_cost decimal(7,2) , ss_list_price decimal(7,2) , ss_sales_price decimal(7,2) , ss_ext_discount_amt decimal(7,2) , ss_ext_sales_price decimal(7,2) , ss_ext_wholesale_cost decimal(7,2) , ss_ext_list_price decimal(7,2) , ss_ext_tax decimal(7,2) , ss_coupon_amt decimal(7,2) , ss_net_paid decimal(7,2) , ss_net_paid_inc_tax decimal(7,2) , ss_net_profit decimal(7,2) ) ; CREATE TABLE date_dim ( d_date_sk integer not null, d_date_id char(16) not null, d_date date , d_month_seq integer , d_week_seq integer , d_quarter_seq integer , d_year integer , d_dow integer , d_moy integer , d_dom integer , d_qoy integer , d_fy_year integer , d_fy_quarter_seq integer , d_fy_week_seq integer , d_day_name char(9) , d_quarter_name char(6) , d_holiday char(1) , d_weekend char(1) , d_following_holiday char(1) , d_first_dom integer , d_last_dom integer , d_same_day_ly integer , d_same_day_lq integer , d_current_day char(1) , d_current_week char(1) , d_current_month char(1) , d_current_quarter char(1) , d_current_year char(1) ) ; CREATE TABLE store ( s_store_sk integer not null, s_store_id char(16) not null, s_rec_start_date date , s_rec_end_date date , s_closed_date_sk integer , s_store_name varchar(50) , s_number_employees integer , s_floor_space integer , s_hours char(20) , s_manager varchar(40) , s_market_id integer , s_geography_class varchar(100) , s_market_desc varchar(100) , s_market_manager varchar(40) , s_division_id integer , s_division_name varchar(50) , s_company_id integer , s_company_name varchar(50) , s_street_number varchar(10) , s_street_name varchar(60) , s_street_type char(15) , s_suite_number char(10) , s_city varchar(60) , s_county varchar(30) , s_state char(2) , s_zip char(10) , s_country varchar(20) , s_gmt_offset decimal(5,2) , s_tax_precentage decimal(5,2) ) ; CREATE TABLE item ( i_item_sk integer not null, i_item_id char(16) not null, i_rec_start_date date , i_rec_end_date date , i_item_desc varchar(200) , i_current_price decimal(7,2) , i_wholesale_cost decimal(7,2) , i_brand_id integer , i_brand char(50) , i_class_id integer , i_class char(50) , i_category_id integer , i_category char(50) , i_manufact_id integer , i_manufact char(50) , i_size char(20) , i_formulation char(20) , i_color char(20) , i_units char(10) , i_container char(10) , i_manager_id integer , i_product_name char(50) ) ; CREATE TABLE time_dim ( t_time_sk integer not null, t_time_id char(16) not null, t_time integer , t_hour integer , t_minute integer , t_second integer , t_am_pm char(2) , t_shift char(20) , t_sub_shift char(20) , t_meal_time char(20) ) ; CREATE TABLE promotion ( p_promo_sk integer not null, p_promo_id char(16) not null, p_start_date_sk integer , p_end_date_sk integer , p_item_sk integer , p_cost decimal(15,2) , p_response_target integer , p_promo_name char(50) , p_channel_dmail char(1) , p_channel_email char(1) , p_channel_catalog char(1) , p_channel_tv char(1) , p_channel_radio char(1) , p_channel_press char(1) , p_channel_event char(1) , p_channel_demo char(1) , p_channel_details varchar(100) , p_purpose char(15) , p_discount_active char(1) ) ; CREATE TABLE customer_demographics ( cd_demo_sk integer not null, cd_gender char(1) , cd_marital_status char(1) , cd_education_status char(20) , cd_purchase_estimate integer , cd_credit_rating char(10) , cd_dep_count integer , cd_dep_employed_count integer , cd_dep_college_count integer ) ; CREATE TABLE customer_address ( ca_address_sk integer not null, ca_address_id char(16) not null, ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) ) ; CREATE TABLE household_demographics ( hd_demo_sk integer not null, hd_income_band_sk integer , hd_buy_potential char(15) , hd_dep_count integer , hd_vehicle_count integer ) ; CREATE TABLE customer ( c_customer_sk integer not null, c_customer_id char(16) not null, c_current_cdemo_sk integer , c_current_hdemo_sk integer , c_current_addr_sk integer , c_first_shipto_date_sk integer , c_first_sales_date_sk integer , c_salutation char(10) , c_first_name char(20) , c_last_name char(30) , c_preferred_cust_flag char(1) , c_birth_day integer , c_birth_month integer , c_birth_year integer , c_birth_country varchar(20) , c_login char(13) , c_email_address char(50) , c_last_review_date char(10) ) ; CREATE TABLE income_band ( ib_income_band_sk integer not null, ib_lower_bound integer , ib_upper_bound integer ) ; 父主题: 附录:表创建语法
  • 步骤4:创建新表并加载数据 为每张表选择了存储方式、压缩级别、分布方式和分布列后,使用这些属性创建表并重新加载数据。以便对比表设计前后的系统性能。 执行CREATE TABLE创建表前,删除前面创建的表。 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 DROP TABLE store_sales; DROP TABLE date_dim; DROP TABLE store; DROP TABLE item; DROP TABLE time_dim; DROP TABLE promotion; DROP TABLE customer_demographics; DROP TABLE customer_address; DROP TABLE household_demographics; DROP TABLE customer; DROP TABLE income_band; DROP FOREIGN TABLE obs_from_store_sales_001; DROP FOREIGN TABLE obs_from_date_dim_001; DROP FOREIGN TABLE obs_from_store_001; DROP FOREIGN TABLE obs_from_item_001; DROP FOREIGN TABLE obs_from_time_dim_001; DROP FOREIGN TABLE obs_from_promotion_001; DROP FOREIGN TABLE obs_from_customer_demographics_001; DROP FOREIGN TABLE obs_from_customer_address_001; DROP FOREIGN TABLE obs_from_household_demographics_001; DROP FOREIGN TABLE obs_from_customer_001; DROP FOREIGN TABLE obs_from_income_band_001; 创建具有存储方式和分布方式的表。 限于篇幅,此处仅给出再次创建store_sales的语法。请从附录设计调优后二次表创建中拷贝其他表的语法进行创建。 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 CREATE TABLE store_sales ( ss_sold_date_sk integer , ss_sold_time_sk integer , ss_item_sk integer not null, ss_customer_sk integer , ss_cdemo_sk integer , ss_hdemo_sk integer , ss_addr_sk integer , ss_store_sk integer , ss_promo_sk integer , ss_ticket_number bigint not null, ss_quantity integer , ss_wholesale_cost decimal(7,2) , ss_list_price decimal(7,2) , ss_sales_price decimal(7,2) , ss_ext_discount_amt decimal(7,2) , ss_ext_sales_price decimal(7,2) , ss_ext_wholesale_cost decimal(7,2) , ss_ext_list_price decimal(7,2) , ss_ext_tax decimal(7,2) , ss_coupon_amt decimal(7,2) , ss_net_paid decimal(7,2) , ss_net_paid_inc_tax decimal(7,2) , ss_net_profit decimal(7,2) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY hash (ss_item_sk); 为这些表加载样例数据。 在基准表中记录加载时间。 基准 优化前 优化后 加载时间(11张表) 341584ms 257241ms 占用存储 Store_Sales 42GB - Date_Dim 11MB - Store 232kB - Item 110MB - Time_Dim 11MB - Promotion 256kB - Customer_Demographics 171MB - Customer_Address 170MB - Household_Demographics 504kB - Customer 441MB - Income_Band 88kB - 总存储空间 42GB - 查询执行时间 查询1 14552.05ms - 查询2 27952.36ms - 查询3 17721.15ms - 总执行时间 60225.56ms - 执行ANALYZE更新统计信息。 1 ANALYZE; 返回ANALYZE后,表示执行成功。 1 ANALYZE 检查数据倾斜性。 对于Hash分表策略,如果分布列选择不当,可能导致数据倾斜,查询时出现部分DN的I/O短板,从而影响整体查询性能。因此在采用Hash分表策略之后需对表的数据进行数据倾斜性检查,以确保数据在各个DN上是均匀分布的。可以使用以下SQL检查数据倾斜性 1 SELECT a.count,b.node_name FROM (SELECT count(*) AS count,xc_node_id FROM table_name GROUP BY xc_node_id) a, pgxc_node b WHERE a.xc_node_id=b.node_id ORDER BY a.count desc; 其中xc_node_id对应DN,一般来说,不同DN的数据量相差5%以上即可视为倾斜,如果相差10%以上就必须要调整分布列。GaussDB(DWS)支持多分布列特性,可以更好地满足数据分布的均匀性要求。 父主题: 调优表实践
  • 设计调优后二次表创建 本节所附为调优表实践中进行了存储方式、压缩级别、分布方式和分布列选择后,二次建表语法。 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 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 CREATE TABLE store_sales ( ss_sold_date_sk integer , ss_sold_time_sk integer , ss_item_sk integer not null, ss_customer_sk integer , ss_cdemo_sk integer , ss_hdemo_sk integer , ss_addr_sk integer , ss_store_sk integer , ss_promo_sk integer , ss_ticket_number bigint not null, ss_quantity integer , ss_wholesale_cost decimal(7,2) , ss_list_price decimal(7,2) , ss_sales_price decimal(7,2) , ss_ext_discount_amt decimal(7,2) , ss_ext_sales_price decimal(7,2) , ss_ext_wholesale_cost decimal(7,2) , ss_ext_list_price decimal(7,2) , ss_ext_tax decimal(7,2) , ss_coupon_amt decimal(7,2) , ss_net_paid decimal(7,2) , ss_net_paid_inc_tax decimal(7,2) , ss_net_profit decimal(7,2) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY hash (ss_item_sk); CREATE TABLE date_dim ( d_date_sk integer not null, d_date_id char(16) not null, d_date date , d_month_seq integer , d_week_seq integer , d_quarter_seq integer , d_year integer , d_dow integer , d_moy integer , d_dom integer , d_qoy integer , d_fy_year integer , d_fy_quarter_seq integer , d_fy_week_seq integer , d_day_name char(9) , d_quarter_name char(6) , d_holiday char(1) , d_weekend char(1) , d_following_holiday char(1) , d_first_dom integer , d_last_dom integer , d_same_day_ly integer , d_same_day_lq integer , d_current_day char(1) , d_current_week char(1) , d_current_month char(1) , d_current_quarter char(1) , d_current_year char(1) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY replication; CREATE TABLE store ( s_store_sk integer not null, s_store_id char(16) not null, s_rec_start_date date , s_rec_end_date date , s_closed_date_sk integer , s_store_name varchar(50) , s_number_employees integer , s_floor_space integer , s_hours char(20) , s_manager varchar(40) , s_market_id integer , s_geography_class varchar(100) , s_market_desc varchar(100) , s_market_manager varchar(40) , s_division_id integer , s_division_name varchar(50) , s_company_id integer , s_company_name varchar(50) , s_street_number varchar(10) , s_street_name varchar(60) , s_street_type char(15) , s_suite_number char(10) , s_city varchar(60) , s_county varchar(30) , s_state char(2) , s_zip char(10) , s_country varchar(20) , s_gmt_offset decimal(5,2) , s_tax_precentage decimal(5,2) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY replication; CREATE TABLE item ( i_item_sk integer not null, i_item_id char(16) not null, i_rec_start_date date , i_rec_end_date date , i_item_desc varchar(200) , i_current_price decimal(7,2) , i_wholesale_cost decimal(7,2) , i_brand_id integer , i_brand char(50) , i_class_id integer , i_class char(50) , i_category_id integer , i_category char(50) , i_manufact_id integer , i_manufact char(50) , i_size char(20) , i_formulation char(20) , i_color char(20) , i_units char(10) , i_container char(10) , i_manager_id integer , i_product_name char(50) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY replication; CREATE TABLE time_dim ( t_time_sk integer not null, t_time_id char(16) not null, t_time integer , t_hour integer , t_minute integer , t_second integer , t_am_pm char(2) , t_shift char(20) , t_sub_shift char(20) , t_meal_time char(20) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY replication; CREATE TABLE promotion ( p_promo_sk integer not null, p_promo_id char(16) not null, p_start_date_sk integer , p_end_date_sk integer , p_item_sk integer , p_cost decimal(15,2) , p_response_target integer , p_promo_name char(50) , p_channel_dmail char(1) , p_channel_email char(1) , p_channel_catalog char(1) , p_channel_tv char(1) , p_channel_radio char(1) , p_channel_press char(1) , p_channel_event char(1) , p_channel_demo char(1) , p_channel_details varchar(100) , p_purpose char(15) , p_discount_active char(1) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY replication; CREATE TABLE customer_demographics ( cd_demo_sk integer not null, cd_gender char(1) , cd_marital_status char(1) , cd_education_status char(20) , cd_purchase_estimate integer , cd_credit_rating char(10) , cd_dep_count integer , cd_dep_employed_count integer , cd_dep_college_count integer ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY hash (cd_demo_sk); CREATE TABLE customer_address ( ca_address_sk integer not null, ca_address_id char(16) not null, ca_street_number char(10) , ca_street_name varchar(60) , ca_street_type char(15) , ca_suite_number char(10) , ca_city varchar(60) , ca_county varchar(30) , ca_state char(2) , ca_zip char(10) , ca_country varchar(20) , ca_gmt_offset decimal(5,2) , ca_location_type char(20) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY hash (ca_address_sk); CREATE TABLE household_demographics ( hd_demo_sk integer not null, hd_income_band_sk integer , hd_buy_potential char(15) , hd_dep_count integer , hd_vehicle_count integer ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY replication; CREATE TABLE customer ( c_customer_sk integer not null, c_customer_id char(16) not null, c_current_cdemo_sk integer , c_current_hdemo_sk integer , c_current_addr_sk integer , c_first_shipto_date_sk integer , c_first_sales_date_sk integer , c_salutation char(10) , c_first_name char(20) , c_last_name char(30) , c_preferred_cust_flag char(1) , c_birth_day integer , c_birth_month integer , c_birth_year integer , c_birth_country varchar(20) , c_login char(13) , c_email_address char(50) , c_last_review_date char(10) ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY hash (c_customer_sk); CREATE TABLE income_band ( ib_income_band_sk integer not null, ib_lower_bound integer , ib_upper_bound integer ) WITH (ORIENTATION = column,COMPRESSION=middle) DISTRIBUTE BY replication; 父主题: 附录:表创建语法
  • 附录使用说明 本节所附为调优表实践中使用到的SQL测试语句,推荐您将每节的SQL语句拷贝并另存为.sql文件。例如,创建一个包含“初始表创建”SQL语句的create_table_fir.sql文件。创建后使用SQL客户端工具执行.sql文件效率更高,且利于统计用例的总耗费时间。使用gsql运行.sql文件的方法如下: 1 gsql -d database_name -h dws_ip -U username -p port_number -W password -f XXX.sql 示例中的部分信息请替换成您所用GaussDB(DWS)集群的实际值: 1 gsql -d postgres -h 10.10.0.1 -U dbadmin -p 8000 -W password -f create_table_fir.sql 如示例中涉及的以下信息可根据实际情况替换: postgres:所要连接的数据库名称。 10.10.0.1:集群连接地址。 dbadmin:集群数据库的用户名。默认管理员用户为“dbadmin”。 8000:创建集群时设置的“数据库端口”。 password:创建集群时设置的密码。 父主题: 附录:表创建语法
  • 选择分布列 当表的分布方式选择了Hash分布策略时,分布列选取至关重要。在这一步中,建议按照选择分布列选择分布键: 选择各表的主键作为Hash表分布键。 表名 记录数 分布方式 分布键 Store_Sales 287997024 Hash ss_item_sk Date_Dim 73049 Replication - Store 402 Replication - Item 204000 Replication - Time_Dim 86400 Replication - Promotion 1000 Replication - Customer_Demographics 1920800 Hash cd_demo_sk Customer_Address 1000000 Hash ca_address_sk Household_Demographics 7200 Replication - Customer 1981703 Hash c_customer_sk Income_Band 20 Replication -
  • 选择分布方式 依据步骤2:测试初始表结构下的系统性能并建立基线中所基线的各表大小,分布方式设置如下: 表名 行数 分布方式 Store_Sales 287997024 Hash Date_Dim 73049 Replication Store 402 Replication Item 204000 Replication Time_Dim 86400 Replication Promotion 1000 Replication Customer_Demographics 1920800 Hash Customer_Address 1000000 Hash Household_Demographics 7200 Replication Customer 1981703 Hash Income_Band 20 Replication
  • 共享带宽 当您有大量业务在云上时,如果每个ECS单独使用一条独享带宽,则需要较多的带宽实例,并且总的带宽费用会较高,如果所有实例共用一条带宽,就可以节省企业的网络运营成本,同时方便运维统计。共享带宽是独立的带宽产品,支持将多个按需计费的弹性公网IP添加到共享带宽,对多个弹性公网IP进行集中限速。您可以将EIP绑定到ECS、NAT网关、ELB等产品,从而使这些产品使用共享带宽。 支持两种计费模式: 按带宽计费:如果您使用的弹性公网IP较多,并且错峰明显,使用共享带宽可以大幅节约成本。 按增强型95计费:如果您部署的业务经常有突发峰值,可以选择增强型95计费。既可以保证业务系统不受峰值带宽不够的影响,又可以避免带宽峰值设置过大带来的成本浪费。
  • 共享流量包 共享流量包是公网流量的预付费套餐,价格比后付费流量更低,大大降低了公网流量成本。共享流量包购买后立即生效,自动抵扣按需计费(按流量计费)的EIP带宽产生的流量资费,使用简单,无需额外操作。 共享流量包适用哪些场景? 对于按流量计费的带宽,启用共享流量包后,该带宽所产生的流量费用优先从共享流量包中进行抵扣。共享流量包全部使用完后,再按后付费流量进行结算。从节约成本的角度看,流量越大,节省的成本越多。 共享流量包使用说明 只能抵扣同一区域产生的带宽流量,不支持跨区域抵扣。 共享流量包包括动态和静态两种类型,分别抵扣全动态BGP和静态BGP产生的流量。 共享流量包具有使用有效期(从购买开始计算1个自然月或1个自然年)。超过有效期后,没有使用完的流量无法继续使用。建议根据业务系统历史情况仔细评估需要多少共享流量包。 共享流量包支持自动续费功能。如果您开通了自动续费功能,那么共享流量包到期前7天内,系统会尝试自动续费扣款,续费成功后,共享流量包中剩余的流量可以在新的有效期内继续使用。 共享流量包全部使用完后,系统会自动按后付费流量进行结算,不会导致业务系统无法使用。
  • 应用场景 将弹性公网IP绑定到弹性云服务器上,可以实现弹性云服务器访问公网的目的。如果您需要为弹性云服务器更换弹性公网IP,暂不支持直接更换弹性云服务器的弹性公网IP。您可以先解绑当前的弹性公网IP,再重新为弹性云服务器绑定新的弹性公网IP。 如果无可更换的弹性公网IP,您需要先申请新的弹性公网IP,再进行更换操作。 为防止误删除操作,弹性公网IP存在24小时缓存机制,对于已释放过弹性公网IP的用户,24小时内会优先分配之前使用过的弹性公网IP。 如需申请新的弹性公网IP地址,建议您先购买新的弹性公网IP后再释放旧的弹性公网IP。 详细内容请参考弹性公网IP的分配策略。
  • 约束与限制 一个弹性公网IP只能绑定一个云资源,且弹性公网IP和云资源必须位于同一个区域。 通用可用区的EIP不支持绑定至边缘可用区的实例,边缘可用区的EIP也不支持绑定至通用可用区的实例。 关于边缘可用区和普通可用区的区别请参考《智能边缘小站用户指南》。 弹性公网IP与云资源属于不同的资源,弹性公网IP的计费方式和云资源不同的情况下,不影响绑定。 比如,包年/包月的弹性公网IP可以绑定给按需计费的弹性云服务器使用。 资源欠费被冻结的EIP,或绑定的服务器对外有攻击行为等安全原因被冻结的EIP,无法进行绑定、解绑等操作。需要先解除冻结,具体参见EIP资源在什么情况下会被冻结,如何解除被冻结的EIP资源
  • 为弹性云服务器更换弹性公网IP流程 本章节介绍为弹性云服务器更换新的弹性公网IP总体流程,流程说明如表1所示。 表1 为ECS更换新的EIP流程说明 步骤 说明 步骤一:解绑弹性公网IP 将已绑定的弹性公网IP EIP-A从弹性 云服务器ECS -A中解绑。 步骤二:绑定新的弹性公网IP 在绑定弹性公网IP页面,为弹性云服务器ECS-A绑定新的弹性公网IP EIP-B。 步骤三:释放已被解绑的弹性公网IP 如果不及时释放该弹性公网IP,会产生弹性公网IP保有费,当您无需继续使用此弹性公网IP时,您可以释放EIP-A。 父主题: 为弹性云服务器更换弹性公网IP
  • 资源规划 为弹性云服务器更换弹性公网IP,您需要规划资源,本示例中为您详细介绍资源情况。 虚拟私有云VPC 、弹性公网IP、弹性云服务器ECS位于同一个区域内。 以下资源规划详情仅为示例,您可以根据需要自行修改。 虚拟私有云VPC:1个,资源规划详情如表1所示。 表1 VPC资源规划详情 VPC名称 VPC网段 子网名称 子网网段 关联路由表 VPC 192.168.0.0/16 Subnet 192.168.1.0/24 默认路由表 弹性云服务器ECS:1个,资源规划详情如表2所示。 表2 ECS资源规划详情 ECS名称 镜像 VPC名称 子网名称 安全组 私有IP地址 ECS-A 公共镜像: EulerOS 2.5 64bit VPC Subnet sg-demo: 通用We b服务器 192.168.1.99 弹性公网IP:2个,资源规划详情如表3所示。 表3 EIP资源规划详情 EIP名称 线路 带宽大小 购买时长:1个月 规格 EIP-A 全动态BGP 1 Mbit/s Subnet-A 122.xx.xx.189 EIP-B 全动态BGP 5 Mbit/s Subnet-A 122.xx.xx.166 父主题: 为弹性云服务器更换弹性公网IP
  • 权限控制 全球SIM联接 服务客户默认拥有服务提供的所有功能权限。如若需要给管理员创建的 IAM 子用户授权,只需给该子用户所在用户组配置“cn-north-4 [华北-北京四]”区域的Tenant Guest权限。 关于Tenant Guest权限的介绍和开通方法,详细参见系统权限,将其加入用户组,并给用户组授予策略或角色。 只有管理员才有购买全球SIM联接服务资源和进行续费操作的权限,子用户只能对已有资源进行日常维护。
  • 请求参数 表3 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 用户Token,使用Token鉴权方式时必填。通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 Authorization 否 String 使用AK/SK方式认证时必填,携带的鉴权信息。 X-Sdk-Date 否 String 使用AK/SK方式认证时必填,请求的发生时间。 X-Project-Id 否 String 使用AK/SK方式认证时必填,携带项目ID信息。
  • 响应参数 状态码: 200 表4 响应Header参数 参数 参数类型 描述 X-request-id String 此字段携带请求ID号,以便任务跟踪。格式为:request_id-timestamp-hostname(request_id在服务器端生成UUID,timestamp为当前时间戳,hostname为处理当前接口的服务器名称) 表5 响应Body参数 参数 参数类型 描述 total Integer 查询结果的总元素数量 callback_config Array of RecordCallbackConfig objects 转码模板 表6 RecordCallbackConfig 参数 参数类型 描述 id String 配置规则ID,在创建配置规则成功后服务端返回 publish_domain String 直播推流域名 app String app名称。如果需要匹配任意应用则需填写*。录制规则匹配的时候,优先精确app匹配,如果匹配不到,则匹配* notify_callback_url String 录制回调通知url地址 notify_event_subscription Array of strings 订阅录制通知消息。消息类型。RECORD_NEW_FILE_START开始创建新的录制文件。RECORD_FILE_COMPLETE录制文件生成完成。RECORD_OVER录制结束。RECORD_FAILED表示录制失败。如果不填写,默认订阅RECORD_FILE_COMPLETE sign_type String 加密类型,包含如下取值 HMACSHA256 MD5 create_time String 创建时间,格式:yyyy-mm-ddThh:mm:ssZ,UTC时间。 在查询的时候返回 update_time String 修改时间,格式:yyyy-mm-ddThh:mm:ssZ,UTC时间。 在查询的时候返回 状态码: 400 表7 响应Header参数 参数 参数类型 描述 X-request-id String 此字段携带请求ID号,以便任务跟踪。格式为:request_id-timestamp-hostname(request_id在服务器端生成UUID,timestamp为当前时间戳,hostname为处理当前接口的服务器名称) 表8 响应Body参数 参数 参数类型 描述 error_code String 错误码 error_msg String 错误描述
  • 响应示例 状态码: 200 查询录制回调成功 { "total" : 1, "callback_config" : [ { "id" : "e2fe84def7e476651034ec4b9e92bc30", "publish_domain" : "publish.xxx.com", "app" : "*", "notify_callback_url" : "http://100.95.129.234:8456/base_record_notify", "notify_event_subscription" : [ "RECORD_FILE_COMPLETE", "RECORD_NEW_FILE_START" ], "create_time" : "2020-03-02T08:59:45Z", "update_time" : "2020-03-09T08:59:45Z" } ]} 状态码: 400 查询录制回调失败 { "error_code" : "LIVE.100011001", "error_msg" : "Request Illegal"}
  • URI GET /v1/{project_id}/record/callbacks 表1 路径参数 参数 是否必选 参数类型 描述 project_id 是 String 项目ID,获取方法请参考获取项目ID。 表2 Query参数 参数 是否必选 参数类型 描述 publish_domain 否 String 直播推流域名 app 否 String 流应用名称 offset 否 Integer 偏移量,表示从此偏移量开始查询,offset大于等于0 limit 否 Integer 每页记录数,取值范围[1,100],默认值10
  • 响应示例 状态码: 200 处理成功返回。 { "record_data_list" : [ { "time" : "2020-08-18T07:00:00Z", "concurrent_count" : 20 }, { "time" : "2020-08-18T08:00:00Z", "concurrent_count" : 15 } ]} 状态码: 400 参数错误。 { "error_code" : "LIVE.100011001", "error_msg" : "Invalid request parameter: publish_domain"}
  • 请求参数 表3 请求Header参数 参数 是否必选 参数类型 描述 X-Auth-Token 否 String 用户Token。使用Token鉴权方式时必选。 通过调用IAM服务获取用户Token接口获取(响应消息头中X-Subject-Token的值)。 Authorization 否 String 使用AK/SK方式认证时必选,携带的鉴权信息。 X-Sdk-Date 否 String 使用AK/SK方式认证时必选,请求的发生时间。 X-Project-Id 否 String 使用AK/SK方式认证时必选,携带项目ID信息, 与路径参数中的项目ID相同。
共100000条