云服务器内容精选

  • 需求背景 在业务混部场景中,Linux内核调度器需要为高优先级任务赋予更多的调度机会,并需要把低优先级任务对内核调度带来的影响降到最低。原有的在线、离线两级混部调度无法满足业务需求。 为解决此问题,HCE 2.0内核cpu cgroup支持多级混部调度,提供cgroup接口/sys/fs/cgroup/cpu/cpu.qos_level将任务调度级别扩展到5个级别,支持用户对每个cgroup组单独设置优先级。
  • 开启BackwardIndexScan 表1 参数说明 参数名称 级别 描述 optimizer_switch Global,Session 查询优化的总控制开关。 其中,BackwardIndexScan子控制开关为backward_index_scan,控制是否能使用BackwardIndexScan特性,默认值为ON。 ON:优化器能选用BackwardIndexScan。 OFF:优化器不能选用BackwardIndexScan。 除了使用上述开关来控制BackwardIndexScan特性,还可以使用HINT来实现,语法如下。 在SQL语句执行期间开启Backward Index Scan特性 /*+ set_var(optimizer_switch='backward_index_scan=on') */ : 在SQL语句执行期间关闭Backward Index Scan特性 /*+ set_var(optimizer_switch='backward_index_scan=off') */ :
  • 使用示例 创建表,准备数据。 CREATE TABLE test.hotspot1 ( `id` int NOT NULL primary key, `c` int NOT NULL DEFAULT '0' ) ENGINE=InnoDB; INSERT INTO test.hotspot1 VALUES (1, 1); 打开热点行更新开关。 SET GLOBAL rds_hotspot = ON; 修改隔离级别,AUTOCOMMIT。 SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED; SET SESSION AUTOCOMMIT = ON; 发起带HOTSPOT关键字的更新。 UPDATE test.hotspot1 SET c=c+1 WHERE id=1 HOTSPOT; 检查热点行更新状态。 SHOW STATUS like "%hotspot%";
  • 新增关键字 新增标记语句的关键字如下: 表3 新增关键字 关键字 描述 HOTSPOT 表示开启热点更新功能。 NOT_MORE_THAN 可选项。表示目标值不大于某值。 NOT_LESS_THAN 可选项。表示目标值不小于某值。 上述关键字放置在SQL语句末尾。HOTSPOT必须在最前面,NOT_MORE_THAN和NOT_LESS_THAN没有位置前后的要求。 例如:假设id是主键列,c是int类型列,那么支持以下语法: UPDATE c=c+1 where id=10 HOTSPOT; UPDATE c=c+1 where id=10 HOTSPOT NOT_MORE_THAN 100; // c值不大于100 UPDATE c=c-1 where id=10 HOTSPOT NOT_LESS_THAN 0; // c值不小于0 UPDATE c=c+1 where id=10 HOTSPOT NOT_MORE_THAN 100 NOT_LESS_THAN 0; // c值不大于100,不小于0 UPDATE c=c+1 where id=10 HOTSPOT NOT_LESS_THAN 0 NOT_MORE_THAN 100; // c值不大于100,不小于0 当超过NOT_MORE_THAN或者NOT_LESS_THAN的限制时,会向客户端报如下错误: HOTSPOT field value exceeds limit
  • 状态说明 表2 状态说明 状态 说明 Hotspot_total_trx 使用hotspot总事务数 Hotspot_update_errors 更新阶段出错的热点行更新事务,这些出错的事务只会自己更新失败,不会影响其他热点行更新事务的提交。 Hotspot_trx_rollbacked 更新成功,但是由于最终回滚的热点行更新事务数量。当队长(leader)决定回滚时,所有组员(follower)跟着一起回滚。 Hotspot_trx_committed 提交成功的热点行更新事务数量。 Hotspot_batch_size 热点行更新事务分批次提交。该值表示当前批次热点行更新事务的数量。 Hotspot_batch_wait_time 热点行更新按批次持有锁和提交事务。此时间为当前热点行更新批次等待上一批次释放锁的时间,单位微秒。 Hotspot_leader_wait_follower_time 在一个批次中leader需要等待follower完成记录更新,此时间为当前批次leader等待follower的时间,单位微秒。 Hotspot_leader_total_time 当前批次leader的热点行更新事务总时间,单位微秒。 Hotspot_follower_total_time 当前批次某一个follower的热点行更新事务总时间,单位微秒。 Hotspot_follower_wait_commit_time 在一个批次中follower需要等待leader持久化日志,此时间为当前批次某一个follower等待leader持久化日志的时间,单位微秒。 Hotspot_group_counts 每个热点行更新对应一个组,组内事务分批次提交。该值为使用热点行更新的组数。 Hotspot_counter_counts counter用于自动判断热点行更新。当counter中的统计值满足要求时,将会创建group使用热点行更新。该值为counter的总数。
  • 原理介绍 GaussDB (for MySQL)热点行更新的架构如下图所示:分为Counter_hash,Group_hash两部分。其中Counter_hash主要用于实现热点行的自动判断。Group_hash是热点行的实际实现部分,由多个Hotspot group组成。每个Hotspot group对应一个热点行,每个Hotspot group由多个batch组成,交替为热点行提供批量提交服务。
  • 约束与限制 GaussDB(for MySQL)实例的内核版本为2.0.54.240600及以上时支持使用该功能。 功能使用约束如下: where条件中只能使用主键或唯一索引的等值匹配,并且只能更新单条记录。否则将绕过优化正常更新。 不允许修改索引列,否则将绕过优化正常更新。 只对修改列为整数的更新生效,否则将绕过优化正常更新。 只允许对热点行记录进行两个元素的加减操作,且第一个元素与等号左侧相等并满足唯一索引等约束,不允许赋值操作。假设c列为待修改列,d为记录的普通列,那么只允许进行类似c=c+1,或者c=c-1的操作,不允许进行c=d+1,c=1+c,c=c+1+1,c=1+c+1等操作。否则将绕过优化正常更新。 只允许对隐式事务生效。即要求AUTOCOMMIT为ON,并且不在BEGIN,COMMIT显示开启的事务中使用。否则将绕过优化正常更新。 需要使用HOTSPOT显式标记热点行更新事务,或者将rds_hotspot_auto_detection_threshold设置为非0,开启热点行更新自动识别功能。否则将绕过优化正常更新。rds_hotspot_auto_detection_threshold的详细用法请见参数说明。 只对RC级别生效。数据库处于其他隔离级别时将绕过优化正常更新。 无法在stored function, trigger以及event中使用,否则将对客户端报如下错误: HOTSPOT hints can not be used in stored function, trigger or event 行为变更: 一个hotspot事务组内,除了执行失败或者在更新阶段killed的事务外,其他事务被按批次集中提交,集中记录redo log和undo log,只能集中提交或者回滚,无法单独回滚。每个批次提交的事务个数为几十到几百个不等。
  • 参数说明 表1 参数说明 参数名称 参数说明 rds_hotspot 热点行更新优化开关。将其设置为ON将启用热点行更新优化。 rds_hotspot_follower_wait_commit_interval 热点行更新follower事务等待leader事务日志持久化时,进入阻塞前的睡眠时间。单位:微秒。对日志持久化速度慢的实例,建议调大。对于持久化快速的实例,建议设置为0,不休眠直接阻塞。 rds_hotspot_leader_wait_follower_interval 热点行更新leader事务等待follower更新记录的时间单位。单位:微秒。低并发适当调低可以避免性能下降。高并发适当调高可以提升性能。当QPS超过20w时,建议将该值设置为100或者更大。 rds_hotspot_auto_detection_threshold 热点行更新的自动识别功能开关。设置为0表示不启用自动识别功能。设置为非0表示热点行更新的识别阈值。当某个符合热点行要求的行每秒更新次数超过阈值时将启动热点行更新功能。 rds_hotspot_batch_size_lower_limit 每批热点事务大小的建议最小值。每个batch尽可能达到该大小。但是,这并不是严格保证的。当leader发现所有需要等待的follower都已经到达时,batch就进入提交状态。 rds_hotspot_max_memory_size 热点行更新中group和counter占用的内存上限。当group占用的内存超过限制时,将清空group所占用的内存。当counter占用的内存超过限制时,将清空counter所占用的内存。申请新的内存时才会尝试清空旧内存。 rds_hotspot_enable_time_statistics 是否开启热点行更新的时间相关的状态统计功能。将其设置为ON以启用该功能。
  • 开启BackwardIndexScan 表1 参数说明 参数名称 级别 描述 optimizer_switch Global,Session 查询优化的总控制开关。 其中,BackwardIndexScan子控制开关为backward_index_scan,控制是否能使用BackwardIndexScan特性,默认值为ON。 ON:优化器能选用BackwardIndexScan。 OFF:优化器不能选用BackwardIndexScan。 除了使用上述开关来控制BackwardIndexScan特性,还可以使用HINT来实现,语法如下。 在SQL语句执行期间开启Backward Index Scan特性 /*+ set_var(optimizer_switch='backward_index_scan=on') */ : 在SQL语句执行期间关闭Backward Index Scan特性 /*+ set_var(optimizer_switch='backward_index_scan=off') */ :
  • 扩展分类 长度小于256字节的varchar类型字段的在线扩展 create table t1(a varchar(10)); Query OK, 0 rows affected (0.03 sec) alter table t1 modify a varchar(100),ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warning: 0 长度跨越256字节长度的varchar类型字段的在线扩展 create table t1(a varchar(100)); Query OK, 0 rows affected (0.05 sec) alter table t1 modify a varchar(300),ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (0.11 sec) Records: 0 Duplicates: 0 Warning: 0 长度大于256字节的varchar类型字段的在线扩展 create table t1(a varchar(300)); Query OK, 0 rows affected (0.08 sec) alter table t1 modify a varchar(500),ALGORITHM=INPLACE, LOCK=NONE; Query OK, 0 rows affected (0.06 sec) Records: 0 Duplicates: 0 Warning: 0
  • 支持的RDS for MySQL版本 建议您使用最新小版本的实例在线扩展varchar类型字段。更多操作,详见升级内核小版本。 表1 在线扩展varchar类型字段支持的版本 varchar类型字段长度 RDS for MySQL 5.6 RDS for MySQL 5.7 RDS for MySQL 8.0 长度小于256字节 不支持 支持 支持 长度跨越256字节长度 支持 支持 不支持 长度大于256字节 不支持 支持 支持
  • Statement Outline表介绍 GaussDB(for MySQL)内置了一个系统表(outline)保存Hint,系统启动时会自动创建该表,无需您手动创建。创建表的SQL语句如下: CREATE TABLE `mysql`.`outline` ( `Id` bigint(20) NOT NULL AUTO_INCREMENT, `Schema_name` varchar(64) COLLATE utf8_bin DEFAULT NULL, `Digest` varchar(64) COLLATE utf8_bin NOT NULL, `Digest_text` longtext COLLATE utf8_bin, `Type` enum('IGNORE INDEX','USE INDEX','FORCE INDEX','OPTIMIZER') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL, `Scope` enum('','FOR JOIN','FOR ORDER BY','FOR GROUP BY') CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT '', `State` enum('N','Y') CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL DEFAULT 'Y', `Position` bigint(20) NOT NULL, `Hint` text COLLATE utf8_bin NOT NULL, PRIMARY KEY (`Id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_bin STATS_PERSISTENT=0 COMMENT='Statement outline'
  • 功能特点 表1 INNODB_ALTER_TABLE_PROGRESS表字段详解 字段 说明 THREAD_ID 线程ID QUERY ALTER TABLE SQL语句内容 START_TIME DDL开始时间 ELAPSED_TIME 已执行的时间(s) ALTER_TABLE_STAGE 当前执行的内容 STAGE_COMPLETED 已完成的工作单位 STAGE_ESTIMATED 预估的工作单位 一个DDL从开始到结束可能有下面几个阶段(ALTER_TABLE_STAGE字段的值): stage/innodb/alter table (read PK and internal sort):读取主键。 stage/innodb/alter table (merge sort):根据主键排序,这个过程可能较慢,因为会有临时文件生成。 stage/innodb/alter table (insert):将排序后的数据插入表中。 stage/innodb/alter table (log apply index):将DDL过程中客户执行的DML日志应用到本次创建/修改的索引。 stage/innodb/alter table (flush):数据刷盘。 stage/innodb/alter table (log apply table):将DDL过程中客户执行的DML日志应用到本次创建/修改的表。 stage/innodb/alter table (end):结束阶段。
  • 逻辑订阅完整使用示例 发布端创建表 create table tableName(id int primary key, num int); 发布端创建发布 create publication pubName for table tableName; 发布端创建一个Failover Slot(若为PostgreSQL12或13版本,则去掉第四个参数false) SELECT * FROM pg_create_logical_replication_slot('slotname', 'pgoutput', false, false, true); 发布端插入数据 insert into tableName values(1,1); insert into tableName values(2,2); 订阅端创建表 create table tableName (id int primary key, num int); 订阅端创建订阅,指定创建的Failover Slot名称 create subscription subName connection 'host=192.168.0.10 dbname=postgres user=root port=5432 password=xxxxxxx' publication pubName with(copy_data=true,create_slot=false,slot_name= slotname); 订阅端查询数据,验证数据是否订阅到 select * from tableName; 主备切换 发布端继续插入数据,在订阅端查看,逻辑订阅不会断开。
  • 使用场景 RDS for PostgreSQL的逻辑订阅故障转移(Failover Slot)功能用来将那些指定为failover slot的逻辑复制槽信息从主实例同步到备实例,当主备切换之后逻辑订阅能够继续进行,实现逻辑复制槽的故障转移。 当用户使用逻辑复制时,由于slot信息不会随着主备切换转移到新的主实例上,一旦实例发生主备切换,逻辑订阅就会断开,此时除非手动重新创建slot,否则逻辑订阅无法重新连接。RDS for PostgreSQL的Failover Slot功能可以将所有的logical slot从主实例同步到备实例,避免主备切换后逻辑订阅断开。