华为云用户手册

  • 注意事项 如果没有参数,VACUUM处理当前数据库里用户拥有相应权限的每个表。如果参数指定了一个表,VACUUM只处理指定的那个表。 要对一个表进行VACUUM操作,通常用户必须是表的所有者,被授予了指定表VACUUM权限的用户或者被授予了gs_role_vacuum_any角色的用户,系统管理员默认拥有此权限。数据库的所有者允许对数据库中除了共享目录以外的所有表进行VACUUM操作(该限制意味着只有系统管理员才能真正对一个数据库进行VACUUM操作)。VACUUM命令会跳过那些用户没有权限的表进行垃圾回收操作。 VACUUM不能在事务块内执行。 建议生产数据库经常清理(至少每晚一次),以保证不断地删除失效的行。尤其是在增删了大量记录之后,对受影响的表执行VACUUM ANALYZE命令是一个很好的习惯。这样将更新系统目录为最近的更改,并且允许查询优化器在规划用户查询时有更好的选择。 不建议日常使用FULL选项,但是可以在特殊情况下使用。例如在用户删除了一个表的大部分行之后,希望从物理上缩小该表以减少磁盘空间占用。VACUUM FULL通常要比单纯的VACUUM收缩更多的表尺寸。如果执行此命令后所占用物理空间无变化(未减少),请确认是否有其他活跃事务(删除数据事务开始之前开始的事务,并在VACUUM FULL执行前未结束)存在,如果有等其他活跃事务退出进行重试。 VACUUM会导致I/O流量的大幅增加,这可能会影响其他活动会话的性能。因此,有时候会建议使用基于开销的VACUUM延迟特性。 如果指定了VERBOSE选项,VACUUM将打印处理过程中的信息,以表明当前正在处理的表。各种有关当前表的统计信息也会打印出来。 语法格式中含有带括号的选项列表时,选项可以以任何顺序写入。如果没有括号,则选项必须按语法显示的顺序给出。 VACUUM和VACUUM FULL时,会根据参数vacuum_defer_cleanup_age延迟清理行存表记录,即不会立即清理刚刚删除的元组。 VACUUM ANALYZE先执行一个VACUUM操作,然后给每个选定的表执行一个ANALYZE。对于日常维护脚本而言,这是一个很方便的组合。 简单的VACUUM(不带FULL选项)只是简单地回收空间并且令其可以再次使用。这种形式的命令可以和对表的普通读写并发操作,因为没有请求排他锁。VACUUM FULL执行更广泛的处理,包括跨块移动行,以便把表压缩到最少的磁盘块数目里。这种形式要慢许多并且在处理的时候需要在表上施加一个排他锁。 VACUUM列存表内部执行的操作包括三个:迁移delta表中的数据到主表、VACUUM主表的delta表、VACUUM主表的desc表。该操作不会回收delta表的存储空间,如果要回收delta表的冗余存储空间,需要对该列存表执行VACUUM DELTAMERGE。 如果有长查询访问系统表,此时执行VACUUM FULL,长查询可能会阻塞VACUUM FULL连接访问系统表,导致连接超时报错。 VOLATILE临时表不支持执行VACUUM FULL操作,VACUUM FULL执行时会直接跳过VOLATILE临时表。 对列存分区表执行VACUUM FULL,会同时锁表和锁分区。 对表执行VACUUM FULL操作时会触发表重建(表重建过程中会先把数据转储到一个新的数据文件中,重建完成之后会删除原始文件),当表比较大时,重建会消耗较多的磁盘空间。当磁盘空间不足时,要谨慎对待大表VACUUM FULL操作,防止触发集群只读。
  • LAST_VALUE(value any) 描述:LAST_VALUE函数取各组内的最后一个值作为返回结果。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,LAST_VALUE(id) OVER(ORDER BY score DESC) FROM score; id | classid | score | last_value ----+---------+-------+------------ 1 | 1 | 95 | 2 2 | 2 | 95 | 2 5 | 2 | 88 | 5 3 | 2 | 85 | 3 4 | 1 | 70 | 6 6 | 1 | 70 | 6 (6 rows)
  • NTH_VALUE(value any, nth integer) 描述:NTH_VALUE函数返回该组内的第nth行作为结果。若该行不存在,则默认返回NULL。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,NTH_VALUE(id,3) OVER(ORDER BY score DESC) FROM score; id | classid | score | nth_value ----+---------+-------+----------- 1 | 1 | 95 | 2 | 2 | 95 | 5 | 2 | 88 | 5 3 | 2 | 85 | 5 4 | 1 | 70 | 5 6 | 1 | 70 | 5 (6 rows)
  • FIRST_VALUE(value any) 描述:FIRST_VALUE函数取各组内的第一个值作为返回结果。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,FIRST_VALUE(id) OVER(ORDER BY score DESC) FROM score; id | classid | score | first_value ----+---------+-------+------------- 1 | 1 | 95 | 1 2 | 2 | 95 | 1 5 | 2 | 88 | 1 3 | 2 | 85 | 1 4 | 1 | 70 | 1 6 | 1 | 70 | 1 (6 rows)
  • CUME_DIST() 描述:CUME_DIST函数为各组内对应值生成累积分布序号。即根据公式(小于等于当前值的数据行数)/(该分组总行数totalrows)计算所得的相对序号。 返回值类型:DOUBLE PRECISION 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,CUME_DIST() OVER(ORDER BY score DESC) FROM score; id | classid | score | cume_dist ----+---------+-------+------------------ 1 | 1 | 95 | .333333333333333 2 | 2 | 95 | .333333333333333 5 | 2 | 88 | .5 3 | 2 | 85 | .666666666666667 4 | 1 | 70 | 1 6 | 1 | 70 | 1 (6 rows)
  • NTILE(num_buckets integer) 描述:NTILE函数根据num_buckets integer将有序的数据集合平均分配到num_buckets所指定数量的桶中,并将桶号分配给每一行。分配时应尽量做到平均分配。 返回值类型:INTEGER 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,NTILE(3) OVER(ORDER BY score DESC) FROM score; id | classid | score | ntile ----+---------+-------+------- 1 | 1 | 95 | 1 2 | 2 | 95 | 1 5 | 2 | 88 | 2 3 | 2 | 85 | 2 4 | 1 | 70 | 3 6 | 1 | 70 | 3 (6 rows)
  • LAG(value any [, offset integer [, default any ]]) 描述:LAG函数为各组内对应值生成滞后值。即当前值对应的行数往前偏移offset位后所得行的value值作为序号。若经过偏移后行数不存在,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,LAG(id,3) OVER(ORDER BY score DESC) FROM score; id | classid | score | lag ----+---------+-------+----- 1 | 1 | 95 | 2 | 2 | 95 | 5 | 2 | 88 | 3 | 2 | 85 | 1 4 | 1 | 70 | 2 6 | 1 | 70 | 5 (6 rows)
  • LEAD(value any [, offset integer [, default any ]]) 描述:LEAD函数为各组内对应值生成提前值。即当前值对应的行数向后偏移offset位后所得行的value值作为序号。若经过向后偏移后行数超过当前组内的总行数,则对应结果取为default值。若无指定,在默认情况下,offset取为1,default值取为NULL。 返回值类型:与参数数据类型相同。 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id,classid,score,LEAD(id,3) OVER(ORDER BY score DESC) FROM score; id | classid | score | lead ----+---------+-------+------ 1 | 1 | 95 | 3 2 | 2 | 95 | 4 5 | 2 | 88 | 6 3 | 2 | 85 | 4 | 1 | 70 | 6 | 1 | 70 | (6 rows)
  • ROW_NUMBER() 描述:ROW_NUMBER函数为各组内值生成连续排序序号,其中相同的值其序号也不相同。 返回值类型:BIGINT 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id, classid, score,ROW_NUMBER() OVER(ORDER BY score DESC) FROM score ORDER BY score DESC; id | classid | score | row_number ----+---------+-------+------------ 1 | 1 | 95 | 1 2 | 2 | 95 | 2 5 | 2 | 88 | 3 3 | 2 | 85 | 4 6 | 1 | 70 | 5 4 | 1 | 70 | 6 (6 rows)
  • PERCENT_RANK() 描述:PERCENT_RANK函数为各组内对应值生成相对序号,即根据公式 (rank - 1) / (total rows - 1)计算所得的值。其中rank为该值依据RANK函数所生成的对应序号,totalrows为该分组内的总元素个数。 返回值类型:DOUBLE PRECISION 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id, classid, score,PERCENT_RANK() OVER(ORDER BY score DESC) FROM score; id | classid | score | dense_rank ----+---------+-------+------------ 1 | 1 | 95 | 1 2 | 2 | 95 | 1 5 | 2 | 88 | 2 3 | 2 | 85 | 3 6 | 1 | 70 | 4 4 | 1 | 70 | 4 (6 rows)
  • RANK() 描述:RANK函数为各组内值生成跳跃排序序号,其中相同的值具有相同序号,但相同值占用多个编号。 返回值类型:BIGINT 示例: 给定表score(id, classid, score),每行表示学生id,所在班级id以及考试成绩。 使用RANK函数对学生成绩进行排序: 1 2 3 4 5 6 7 8 9 10 11 12 13 CREATE TABLE score(id int,classid int,score int); INSERT INTO score VALUES(1,1,95),(2,2,95),(3,2,85),(4,1,70),(5,2,88),(6,1,70); SELECT id, classid, score,RANK() OVER(ORDER BY score DESC) FROM score; id | classid | score | rank ----+---------+-------+------ 1 | 1 | 95 | 1 2 | 2 | 95 | 1 6 | 1 | 70 | 5 4 | 1 | 70 | 5 5 | 2 | 88 | 3 3 | 2 | 85 | 4 (6 rows)
  • DENSE_RANK() 描述:DENSE_RANK函数为各组内值生成连续排序序号,其中相同的值具有相同序号,相同值只占用一个编号。 返回值类型:BIGINT 示例: 1 2 3 4 5 6 7 8 9 10 SELECT id, classid, score,DENSE_RANK() OVER(ORDER BY score DESC) FROM score; id | classid | score | dense_rank ----+---------+-------+------------ 1 | 1 | 95 | 1 2 | 2 | 95 | 1 5 | 2 | 88 | 2 3 | 2 | 85 | 3 6 | 1 | 70 | 4 4 | 1 | 70 | 4 (6 rows)
  • 语法格式 窗口函数需要特殊的关键字OVER语句来指定窗口触发窗口函数。OVER语句用于对数据进行分组,并对组内元素进行排序。窗口函数用于给组内的值生成序号: 1 2 3 4 function_name ([expression [, expression ... ]]) OVER ( window_definition ) function_name ([expression [, expression ... ]]) OVER window_name function_name ( * ) OVER ( window_definition ) function_name ( * ) OVER window_name 其中window_definition子句option为: 1 2 3 4 [ existing_window_name ] [ PARTITION BY expression [, ...] ] [ ORDER BY expression [ ASC | DESC | USING operator ] [ NULLS { FIRST | LAST } ] [, ...] ] [ frame_clause ] PARTITION BY选项指定了将具有相同PARTITION BY表达式值的行分为一组。 ORDER BY选项用于控制窗口函数处理行的顺序。ORDER BY后面必须跟字段名,若ORDER BY后面跟数字,该数字会被按照常量处理,对目标列没有起到排序的作用。 frame_clause子句option为: 1 2 [ RANGE | ROWS ] frame_start [ RANGE | ROWS ] BETWEEN frame_start AND frame_end 当需要指定一个窗口对分组内所有行结果进行计算时,我们需要指定窗口区间开始的行和结束的行。窗口区间支持RANGE、ROWS两种模式,ROWS以物理单位(行)指定窗口,RANGE将窗口指定为逻辑偏移量。 RANGE、ROWS中可以使用BETWEEN frame_start AND frame_end指定边界可取值。如果仅指定frame_start,则frame_end默认为CURRENT ROW。 frame_start和frame_end取值为: CURRENT ROW,当前行。 N PRECEDING,当前行向前第n行。 UNBOUNDED PRECEDING,当前PARTITION的第1行。 N FOLLOWING,当前行向后第n行。 UNBOUNDED FOLLOWING,当前PARTITION的最后1行。 需要注意,frame_start不能为UNBOUNDED FOLLOWING,frame_end不能为UNBOUNDED PRECEDING,并且frame_end选项不能比上面取值中出现的frame_start选项早。例如RANGE BETWEEN CURRENT ROW AND N PRECEDING是不被允许的。
  • 示例 创建一个分区表: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 CREATE TABLE tpcds.inventory_p1 ( INV_DATE_SK INTEGER NOT NULL, INV_ITEM_SK INTEGER NOT NULL, INV_WAREHOUSE_SK INTEGER NOT NULL, INV_QUANTITY_ON_HAND INTEGER ) DISTRIBUTE BY HASH(INV_ITEM_SK) PARTITION BY RANGE(INV_DATE_SK) ( PARTITION P1 VALUES LESS THAN(2451179), PARTITION P2 VALUES LESS THAN(2451544), PARTITION P3 VALUES LESS THAN(2451910), PARTITION P4 VALUES LESS THAN(2452275), PARTITION P5 VALUES LESS THAN(2452640), PARTITION P6 VALUES LESS THAN(2453005), PARTITION P7 VALUES LESS THAN(MAXVALUE) ); 创建索引ds_inventory_p1_index1。 1 CREATE INDEX ds_inventory_p1_index1 ON tpcds.inventory_p1 (INV_ITEM_SK) LOCAL; 对表tpcds.inventory_p1进行聚集: 1 CLUSTER tpcds.inventory_p1 USING ds_inventory_p1_index1; 对分区p3进行聚集: 1 CLUSTER tpcds.inventory_p1 PARTITION (p3) USING ds_inventory_p1_index1; 对数据库中可以进行聚集的表进聚集: 1 CLUSTER;
  • 功能描述 根据一个索引对表进行聚簇排序。 CLUSTER指示 GaussDB (DWS)基于索引名指定的索引来聚簇由表名指定的表。 索引名指定的索引索引必须已经定义在指定表上。 当对一个表聚簇后,该表将基于索引信息进行物理排序。聚簇是一次性操作:当表被更新之后, 更改的内容不会被聚簇。也就是说,系统不会试图按照索引顺序对新的存储内容及更新记录进行重新聚簇。 在对一个表聚簇之后,GaussDB(DWS)会记录在哪个索引上建立了聚簇。 形式CLUSTER table_name会使用前面所用的同一个索引对表重新聚簇。用户也可以用CLUSTER或ALTER TABLE的SET WITHOUT CLUSTER形式把索引设置为可用于后续的聚簇操作或清除任何之前的设置。 不含参数的CLUSTER会将当前用户所拥有的数据库中的先前做过聚簇的所有表重新聚簇,如果是系统管理员调用,则是所有已被聚簇过的表。 在对一个表进行聚簇的时候,会在其上请求一个AC CES S EXCLUSIVE锁。这样就避免了在CLUSTER完成之前对此表执行其它的操作(包括读写)。
  • 注意事项 只有行存B-tree索引支持CLUSTER操作。 如果用户只是随机访问表中的行,那么表中数据的实际存储顺序是无关紧要的。但是, 如果对某些数据的访问多于其它数据,而且有一个索引将这些数据分组, 那么使用CLUSTER中会有所帮助。如果从一个表中请求一定索引范围的值, 或者是一个索引值对应多行,CLUSTER也会有所帮助,因为如果索引标识出第一匹配行所在的存储页,所有其它行也可能已经在同一个存储页里了,这样便节省了磁盘访问的时间,加速了查询。 在聚簇过程中,系统创建一个按照索引顺序建立的表的临时拷贝的同时,也会建立表上的每个索引的临时拷贝。因此,需要磁盘上有足够的剩余空间, 至少是表大小和索引大小的和。 因为CLUSTER会记住聚集信息,可以第一次手动聚簇想要聚簇的表,然后设置一个定期运行的维护脚本,其中执行不带任何参数的CLUSTER,这样那些表就会被周期性地重新聚簇。 因为优化器记录着有关表的排序的统计,所以建议在新近聚簇的表上运行ANALYZE。否则,优化器可能会选择很差劲的查询规划。 CLUSTER不允许在事务中执行。
  • 语法格式 对一个表进行聚簇排序。 1 CLUSTER [ VERBOSE ] table_name [ USING index_name ]; 对一个分区进行聚簇排序。 1 CLUSTER [ VERBOSE ] table_name PARTITION ( partition_name ) [ USING index_name ]; 对已做过聚簇的表重新进行聚簇。 1 CLUSTER [ VERBOSE ];
  • VPC的子网间是否可以通信? 不同VPC之间的网络默认不通,因此不同VPC的子网网络也不互通。 您可以使用以下方法连通不同VPC之间的网络: 通过VPC对等连接或者企业路由器ER,连通同区域的不同VPC。 对等连接,请参见对等连接简介。 企业路由器,请参见什么是企业路由器。 通过云连接CC,连通不同区域的VPC。 云连接,请参见什么是云连接。 同一个VPC内的子网网络默认互通。当您的组网中使用网络ACL和安全组防护网络安全时,也会影响子网之间的网络通信。 网络ACL:您可以根据实际情况选择是否为子网关联网络ACL,当子网关联了网络ACL,不同网络ACL的网络默认隔离。那么如果同一个VPC的子网关联不同的网络ACL,并且未添加放通规则时,网络默认不通。 安全组:VPC子网内部署的实例(如E CS )必须关联安全组,不同安全组的网络默认隔离。那么如果同一个VPC内的实例关联不同安全组,并且未添加放通规则时,网络默认不通。 当网络ACL和安全组同时存在时,流量优先匹配网络ACL规则,详细说明如表1。 图1 一个VPC内不同子网通信组网图 表1 一个VPC内不同子网通信场景说明 网络通信场景 网络安全配置 网络通信情况说明 不同子网之间通信 子网未关联网络ACL 实例关联相同安全组 子网网络默认互通:子网3和子网4未关联网络ACL,那么子网3和子网4网络互通。 子网内实例网络默认互通:ECS07、ECS08、ECS09和ECS10均关联安全组A,那么这些ECS网络互通。 子网关联相同网络ACL 实例关联不同安全组 子网网络默认互通:子网1和子网2均关联网络ACL A,那么子网1和子网2网络互通。 子网内实例网络默认不通:子网1内的ECS01和ECS02关联安全组A,子网2内的ECS05和ECS06关联安全组B,那么安全组A和安全组B未添加放通规则时,不同安全组内的ECS网络不通,比如ECS01和ECS05网络不通。 子网关联不同网络ACL 子网网络默认不通:子网1关联网络ACL A,子网5关联网络ACL B,那么网络ACL A和网络ACL B未添加放通规则时,子网1和子网5的网络不通。 此时子网网络不通,因此不论子网内ECS是否属于同一个安全组,网络均不通。 一个子网内通信 实例关联不同安全组 子网内实例网络默认不通:子网1内的ECS01和ECS02关联安全组A,ECS03和ECS04关联安全组B,那么安全组A和安全组B未添加放通规则时,即使在同一个子网内,不同安全组内的ECS网络不通,比如ECS01和ECS03网络不通。 父主题: 虚拟私有云与子网类
  • 独享带宽与共享带宽有何区别? 独享带宽:只针对一个弹性公网IP进行限速,该弹性公网IP只能被一个云资源(弹性云服务器、NAT网关、弹性负载均衡等)使用。 共享带宽:可以针对多个弹性公网IP进行集中限速,带宽可以添加多个按需计费的弹性公网IP。弹性公网IP添加和移出共享带宽对业务不产生影响。 独享带宽与共享带宽不支持直接互相转换,但针对按需计费的弹性公网IP,您可以购买一个共享带宽,进行如下操作: 将弹性公网IP添加到共享带宽,则弹性公网IP使用共享带宽。 将弹性公网IP移出共享带宽,则弹性公网IP使用独享带宽。 父主题: 带宽类
  • 步骤四:验证网络互通情况 对等连接路由添加完成后,执行以下操作,验证本端VPC和对端VPC的通信情况。 登录本端VPC内的弹性云服务器,本示例中为ECS-A01。 弹性云服务器有多种登录方法,具体请参见登录弹性云服务器。 执行以下命令,验证ECS-A01和的RDS-B01是否可以通信。 ping 对端服务器的IP地址 命令示例: ping 172.17.0.21 回显类似如下信息,表示ECS-A01与RDS-B01可以通过通信,VPC-A和VPC-B之间的对等连接创建成功。 [root@ecs-A02 ~]# ping 172.17.0.21 PING 172.17.0.21 (172.17.0.21) 56(84) bytes of data. 64 bytes from 172.17.0.21: icmp_seq=1 ttl=64 time=0.849 ms 64 bytes from 172.17.0.21: icmp_seq=2 ttl=64 time=0.455 ms 64 bytes from 172.17.0.21: icmp_seq=3 ttl=64 time=0.385 ms 64 bytes from 172.17.0.21: icmp_seq=4 ttl=64 time=0.372 ms ... --- 172.17.0.21 ping statistics --- 本示例中ECS-A01和RDS-B01位于同一个安全组内,因此只要VPC-A和VPC-B之间的对等连接创建成功后,就可以实现网络互通。如果您需要连通的实例位于不同的安全组内,那么您需要在安全组的入方向规则中,添加放通对端安全组的规则,具体方法请参见实现不同安全组的实例内网网络互通。 对于更多对等连接网络不通的问题,处理方法请参见为什么对等连接创建完成后不能互通?。
  • 操作场景 不同VPC之间网络不通,您可以通过对等连接连通同一个区域下的VPC。本章节指导用户创建不同账户下的VPC对等连接,即连通的两个VPC位于不同账户下。 本文档以在账户A下的VPC-A和账户B的VPC-B之间创建对等连接为例,实现业务服务器ECS-A01和数据库服务器RDS-B01之间的通信。 创建步骤如下: 步骤一:创建VPC对等连接 步骤二:对端账户接受VPC对等连接 步骤三:添加VPC对等连接路由 步骤四:验证网络互通情况 图1 不同账户下的对等连接组网示例 当前VPC对等连接暂不收取您的任何费用。
  • 约束与限制 对等连接是建立在两个VPC之间的网络连接,两个VPC之间只能建立一个对等连接。 对等连接仅可以连通同区域的VPC,不同区域的VPC之间不能创建对等连接。 您可以通过对等连接连通位于华为云中国站和国际站相同区域的VPC,比如VPC-A位于中国站的“中国-香港”区域,VPC-B位于国际站的“中国-香港”区域,可以通过对等连接连通VPC-A和VPC-B。 若要实现不同区域VPC之间互通,您可以使用云连接,详细内容请参见跨区域VPC互通。 若您仅需要不同区域的几台ECS之间互通,您可以为ECS申请和绑定弹性公网IP,通过EIP实现ECS外网互通。此场景适用于ECS数量较少的情况。 配置对等连接时,当您的本端VPC和对端VPC存在网段重叠的情况时,那么您的对等连接可能会不生效。 针对该情况,以下不同情况下的组网配置示例,请您参考对等连接使用示例。 创建不同账户下的对等连接时: 创建不同账户下的VPC对等连接时,如果在账号A下发起创建对等连接请求,需要账号B接受该请求才可以,如果账号B拒绝,则该对等连接创建失败。 为了确保网络安全,请您不要接受来自未知账号的对等连接申请。
  • 安全组配置流程 图6 安全组配置流程 表2 安全组配置流程说明 序号 步骤 说明 操作指导 1 创建安全组 创建安全组规则时候,您可以使用系统提供的模板,支持“通用Web服务器”和“开放全部端口”等模板。模板中会预置部分安全组规则,详细信息请参见安全组模板说明。 创建安全组 2 配置安全组规则 安全组创建完成后,如果模板里面的规则不能满足业务要求,您还可以在安全组中添加新的安全组规则,或者修改已有的安全组规则。 添加安全组规则 快速添加多条安全组规则 3 在安全组中添加实例 创建实例的时候,会自动将实例加入一个安全组内,实例将会受到安全组的保护。 如果一个安全组无法满足您的要求,您可以将实例加入多个安全组。 在安全组中添加或移出实例
  • 实践建议 请您遵循白名单原则配置安全组规则,即安全组内实例默认拒绝所有外部的访问请求,通过添加允许规则放通指定的网络流量。 添加安全组规则时,请遵循最小授权原则。例如,放通22端口用于远程登录云服务器时,建议仅允许指定的IP地址登录,谨慎使用0.0.0.0/0(所有IP地址)。 请您尽量保持单个安全组内规则的简洁,通过不同的安全组来管理不同用途的实例。如果您使用一个安全组管理您的所有业务实例,可能会导致单个安全组内的规则过于冗余复杂,增加维护管理成本。 您可以将实例按照用途加入到不同的安全组内。例如,当您具有面向公网提供网站访问的业务时,建议您将运行公网业务的Web服务器加入到同一个安全组,此时仅需要放通对外部提供服务的特定端口,例如80、443等,默认拒绝外部其他的访问请求。同时,请避免在运行公网业务的Web服务器上运行内部业务,例如MySQL、Redis等,建议您将内部业务部署在不需要连通公网的服务器上,并将这些服务器关联至其他安全组内。 对于安全策略相同的多个IP地址,您可以将其添加到一个IP地址组内统一管理,并在安全组内添加针对该IP地址组的授权规则。当IP地址发生变化时,您只需要在IP地址组内修改IP地址,那么IP地址组对应的安全组规则将会随之变更,无需逐次修改安全组内的规则,降低了安全组管理的难度,提升效率。具体方法,请参见使用IP地址组提升安全组规则管理效率。 请您尽量避免直接修改已运行业务的安全组规则。如果您需要修改使用中的安全组规则,建议您先克隆一个测试安全组,然后在测试安全组上进行调试,确保测试安全组内实例网络正常后,再修改使用中的安全组规则,减少对业务的影响。具体方法,请参见克隆安全组。 您在安全组内新添加实例,或者修改安全组的规则后,此时不需要重启实例,安全组规则会自动生效。 如果您的安全组规则配置完未生效,请参考为什么配置的安全组规则不生效?。
  • 流量匹配安全组规则的顺序 一个实例可以关联多个安全组,并且一个安全组内可以包含多个安全组规则。安全组规则匹配流量时,首先按照优先级进行排序,其次按照策略匹配,拒绝策略高于允许策略。如图2所示,以入方向的流量为例,实例的网络流量将按照以下原则匹配安全组规则,入方向和出方向的流量匹配顺序相同。 首先,流量按照安全组的顺序进行匹配。您可以自行调整安全组顺序,安全组序号越小,表示优先级越高。 比如,安全组A的序号为1,安全组B的序号为2,安全组A的优先级高于安全组B,流量优先匹配安全组A内的入方向规则。 其次,流量按照安全组规则的优先级和策略进行匹配。 先按照安全组规则优先级匹配,优先级的数字越小,优先级越高。 比如安全组规则A的优先级为1,安全组规则B的优先级为2,安全组规则A的优先级高于安全组规则B,流量优先匹配安全组规则A。 安全组规则优先级相同的情况下,再按照策略匹配,拒绝策略高于允许策略。 流量按照协议端口和源地址,遍历了所有安全组内的入方向规则。 如果成功匹配某个规则,则执行以下操作: 如果规则的策略是允许,则允许该流量访问安全组内实例。 如果规则的策略是拒绝,则拒绝该流量访问安全组内实例。 如果未匹配上任何规则,则拒绝该流量访问安全组内的实例。 图2 安全组匹配顺序
  • 安全组应用示例 您可以在安全组内放通指定IP地址,允许指定IP地址访问安全组内实例,或者在某个安全组内放通另外一个安全组,实现不同安全组内的实例内网互通。通过安全组规则,您可以灵活控制组网内流量的走向,以确保您的网络安全,以下为您提供了典型组网的安全组配置示例。 控制指定IP地址/安全组访问:如图3所示,在VPC-X中有两个子网Subnet-A和Subnet-B,Subnet-A中的ECS承载同一类业务,需要相同的网络连接请求,因此均关联至安全组Sg-A。同理,Subnet-B中的ECS均关联至另外一个安全组Sg-B。 安全组Sg-A入方向规则A01允许从指定IP地址 (172.16.0.0/24)访问安全组内实例的SSH(22)端口,用于远程登录安全组内的Linux云服务器。 安全组Sg-A入方向规则A02允许安全组内的实例可使用任何协议和端口互相通信,即子网Subnet-A内的ECS网络互通。 安全组Sg-B入方向规则B01允许Sg-A内的实例访问Sg-B内实例的SSH(22)端口,即通过子网Subnet-A的ECS可远程登录Subnet-B内的ECS。 安全组Sg-B入方向规则B02允许安全组内的实例可使用任何协议和端口互相通信,即子网Subnet-B内的ECS网络互通。 两个安全组的出方向规则允许所有流量从安全组内实例流出。 图3 安全组应用示例(控制指定IP地址/安全组访问) 控制虚拟IP访问:如果您通过中间网络实例在不同子网的实例之间转发流量,比如图4中,子网Subnet-A的ECS通过虚拟IP和子网Subnet-B的ECS互相通信。由于存在中间网络实例,此时安全组规则的源地址选择实例所在的安全组时,无法放通中间网络实例转发的流量,源地址必须设置成中间网络实例的私有IP地址或者子网网段。 在VPC-X中有两个子网Subnet-A和Subnet-B,Subnet-A中的ECS关联至安全组Sg-A,Subnet-B中的ECS关联至安全组Sg-B。通过虚拟IP将Subnet-A中的ECS搭建成Keepalived高可用集群,后端服务器ECS-A01和ECS-A02形成主备模式,对外使用虚拟IP进行通信。 安全组Sg-A入方向规则A01允许Sg-B内的实例使用任何协议和端口访问Sg-A内的实例。 安全组Sg-B入方向规则说明如下: 规则B02:允许Sg-A内的实例使用私有IP地址访问Sg-B内实例,但是当前组网下,Sg-A内的实例和Sg-B内的实例通信需要经过虚拟IP,此时虚拟IP的流量无法流入Sg-B内的实例,该规则不适用于当前组网。 规则B01:允许虚拟IP(192.168.0.21)使用任何协议和端口访问Sg-B内的实例。当前组网中,您还可以将源地址设置成子网Subnet-A的网段192.168.0.0/24。 图4 安全组应用示例(控制虚拟IP访问) 控制公网/ELB/数据库访问:如图5所示,在VPC-X中,通过弹性负载均衡ELB和弹性公网IP等服务搭建了一个Web网站,可以面向公网提供服务。为了提升可靠性,每个可用区内都有一套用作Web服务器的ECS和对应的RDS MySQL数据库服务器,其中ELB、Web服务器以及数据库服务器分别属于不同的安全组。您需要参考以下配置,在对应的安全组中放通HTTP(80)、HTTPS(443)以及MySQL(3306)端口。 在ELB的安全组Sg-C中,规则C01和C02允许来自公网的HTTP/HTTPS流量访问ELB实例的80和443端口,源地址为0.0.0.0/0 (任意IP地址)。 在Web服务器的安全组Sg-A中,规则A01和A02允许来自ELB实例的HTTP/HTTPS流量访问Web服务器的80和443端口,源地址为ELB实例的安全组Sg-C。 在数据库服务器的安全组Sg-B中,规则B01允许Web服务器访问数据库,源地址为Web服务器的安全组Sg-A。 图5 安全组应用示例(控制公网/ELB/数据库访问) 更多安全组规则配置示例,请参见安全组配置示例。
  • 安全组的限制 为了确保良好的网络性能体验,建议一个实例最多关联5个安全组。 建议一个安全组关联的实例数量不应超过6000个,否则会引起安全组性能下降。 在一个安全组中,对于入方向规则来说,源地址是安全组的规则数量+源地址是IP地址组的规则数量+端口是不连续端口号的规则数量 ≤ 128条,否则超过数量的安全组规则将不生效。出方向的限制和入方向一致。 源地址是安全组时,包括本安全组和其他安全组。 不连续端口号取值示例为22,25,27。 如果您添加安全组规则时,使用IP地址组或者不连续端口,那么该安全组规则对不同规格云服务器的生效情况存在差异,为了避免您的安全组规则不生效,请您查看表3了解详情。 表3 安全组规则限制 安全组规则 云服务器类型 添加安全组规则时,“源地址”和“目的地址”可选择“IP地址组” 不支持的X86云服务器规格如下: 通用计算型(S1型、C1型、C2型 ) 内存优化型(M1型) 高性能计算型(H1型) 磁盘增强型( D1型) GPU加速型(G1型、G2型) 超大内存型(E1型、E2型、ET2型) 添加安全组规则时,“协议端口”可配置为不连续端口号 不支持的X86云服务器规格如下: 通用计算型(S1型、C1型、C2型 ) 内存优化型(M1型) 高性能计算型(H1型) 磁盘增强型( D1型) GPU加速型(G1型、G2型) 超大内存型(E1型、E2型、ET2型) 所有鲲鹏云服务器规格不支持配置不连续端口。 如果您在鲲鹏云服务器中添加安全组规则时,使用了不连续端口号,那么除了该条规则不会生效,该规则后的其他规则也不会生效。比如: 您先配置了安全组规则A(不连续端口号22,24),再配置了下一条安全组规则B(独立端口号9096),则安全组规则A和B均不会生效。 X86云服务器规格详情,请参见规格清单(X86)。 鲲鹏云服务器规格详情,请参见规格清单(鲲鹏)。
  • 安全组 安全组是一个逻辑上的分组,为具有相同安全保护需求并相互信任的云服务器、云容器、云数据库等实例提供访问策略。安全组创建后,用户可以在安全组中定义各种访问规则,当实例加入该安全组后,即受到这些访问规则的保护。 您在创建实例时(比如云服务器),必须将实例加入一个安全组,如果此前您还未创建任何安全组,那么系统会自动为您创建默认安全组并关联至该实例。除了默认安全组,您还可以根据业务需求创建自定义安全组并关联至实例。一个实例可以关联多个安全组,多个安全组按照优先级顺序依次匹配流量。 安全组中包括入方向规则和出方向规则,您可以针对每条入方向规则指定来源、端口和协议,针对出方向规则指定目的地、端口和协议,用来控制安全组内实例入方向和出方向的网络流量。以图1为例,在区域A内,某客户有一个 虚拟私有云VPC -A和子网Subnet-A,在子网Subnet-A中创建一个 云服务器ECS -A,并为ECS-A关联一个安全组Sg-A来保护ECS-A的网络安全。 安全组Sg-A的入方向存在一条放通ICMP端口的自定义规则,因此可以通过个人PC (计算机)ping通ECS-A。但是安全组内未包含允许SSH流量进入实例的规则,因此您无法通过个人PC远程登录ECS-A。 当ECS-A需要通过EIP访问公网时,由于安全组Sg-A的出方向规则允许所有流量从实例流出,因此ECS-A可以访问公网。 图1 安全组架构图 您可以免费使用安全组资源,当前不收取任何费用。
  • 安全组及规则的工作原理 安全组是有状态的。如果您从实例发送一个出站请求,且该安全组的出方向规则是放通的话,那么无论其入方向规则如何,都将允许该出站请求的响应流量流入。同理,如果该安全组的入方向规则是放通的,那无论出方向规则如何,都将允许入站请求的响应流量可以流出。 安全组使用连接跟踪来标识进出实例的流量信息,入方向安全组的规则变更,对原有流量立即生效。出方向安全组规则的变更,不影响已建立的长连接,只对新建立的连接生效。 当您在安全组内增加、删除、更新规则,或者在安全组内添加、移出实例时,系统会自动清除该安全组内所有实例入方向的连接,详细说明如下: 由入方向流量建立的连接,已建立的长连接将会断开。所有入方向流量立即重新建立连接,并匹配新的安全组入方向规则。 由出方向流量建立的连接,已建立的长连接不会断开,依旧遵循原有安全组规则。出方向流量新建立的连接,将会匹配新的安全组出方向规则。 对于已建立的长连接,流量断开后,不会立即建立新的连接,需要超过连接跟踪的老化时间后,才会新建立连接并匹配新的规则。比如,对于已建立的ICMP协议长连接,当流量中断后,需要超过老化时间30s后,将会新建立连接并匹配新的规则,详细说明如下: 不同协议的连接跟踪老化时间不同,比如已建立连接状态的TCP协议连接老化时间是600s,ICMP协议老化时间是30s。对于除TCP和ICMP的其他协议,如果两个方向都收到了报文,连接老化时间是180s,如果只是单方向收到了报文,另一个方向没有收到报文,则连接老化时间是30s。 TCP协议处于不同状态下的连接老化时间也不相同,比如TCP连接处于ESTABLISHED(连接已建立)状态时,老化时间是600s,处于FIN-WAIT(连接即将关闭)状态时,老化时间是30s。 安全组规则遵循白名单原理,当在规则中没有明确定义允许或拒绝某条流量时,安全组一律拒绝该流量流入或者流出实例。 在入方向中,当请求匹配上安全组中入方向规则的源地址,并且策略为“允许”时,允许该请求进入,其他请求一律拦截。因此,默认情况下您一般不用在入方向配置策略为“拒绝”的规则。 表1中的入方向规则,确保安全组内实例内网网络互通,不建议您删除或者修改该安全组规则。 在出方向中,表1中的出方向规则允许所有流量从安全组内实例流出,即实例可访问外部任意IP和端口。如果您删除了该规则,则安全组内的实例无法访问外部,请您谨慎操作。 表1 安全组规则说明 方向 策略 类型 协议端口 源地址/目的地址 入方向 允许 IPv4 全部 源地址:当前安全组 入方向 允许 IPv6 全部 源地址:当前安全组 出方向 允许 IPv4 全部 目的地址:0.0.0.0/0 出方向 允许 IPv6 全部 目的地址:::/0
  • 安全组规则 安全组中包括入方向规则和出方向规则,用来控制安全组内实例的入方向和出方向的网络流量。 入方向规则:控制外部请求访问安全组内的实例,即流量流入实例。 出方向规则:控制安全组内实例访问外部的请求,即流量从实例流出。 安全组规则由协议端口、源地址/目的地址等组成,关键信息说明如下: 策略:支持允许或拒绝。当流量的协议、端口、源地址/目的地址成功匹配某个安全组规则后,会对流量执行规则对应的策略,允许或拒绝流量。 优先级:优先级可选范围为1-100,数字越小,规则优先级级别越高。安全组规则匹配流量时,首先按照优先级进行排序,其次按照策略排序,拒绝策略高于允许策略,更多信息请参见流量匹配安全组规则的顺序。 类型:支持设置IPv4和IPv6协议的规则。 协议端口:包括网络协议类型和端口范围。 网络协议:匹配流量的协议类型,支持TCP、UDP、ICMP和GRE协议。 端口范围:匹配流量的目的端口,取值范围为:1~65535。 源地址或目的地址:在入方向中,匹配流量的源地址。在出方向中,匹配流量的目的地址。 您可以使用IP地址、安全组、IP地址组作为源地址或者目的地址。 IP地址:某个固定的IP地址或者网段,支持IPv4和IPv6地址。比如:192.168.10.10/32(IPv4地址)、192.168.1.0/24(IPv4网段)、2407:c080:802:469::/64(IPv6网段) 安全组:目标安全组和当前安全组位于同一区域,表示流量匹配目标安全组内所有实例的私有IP地址。比如:当安全组A内有实例a,安全组B内有实例b,在安全组A的入方向规则中,放通源地址为安全组B的流量,则来自实例b的内网访问请求被允许进入实例a。 IP地址组:IP地址组是一个或者多个IP地址的集合,对于安全策略相同的IP网段和IP地址,此处建议您使用IP地址组简化管理。
共100000条