存储系统及其数据写入方法转让专利

申请号 : CN202210091468.0

文献号 : CN114415968B

文献日 :

基本信息:

PDF:

法律信息:

相似专利:

发明人 : 陈飞

申请人 : 南京晓庄学院

摘要 :

本发明公开了一种存储系统及其数据写入方法,所述方法包括接收数据写入请求,根据写入请求对应的数据和存储系统的状态,选择数据存储的RAID级别;所述存储系统的物理磁盘切分为多个存储块,根据RAID级别对应的存储结构,来自不同物理磁盘的多个存储块配置为存储组,多个存储组配置为相应RAID级别的RAID存储组;根据数据存储的RAID级别分配存储空间,并确定存储组的条带关系,将写入请求按照条带与存储块之间的映射关系拆分为多个子请求;执行子请求,完成数据写入。采用上述技术方案,保持数据冗余的同时仍然能够提供高性能的数据写入。

权利要求 :

1.一种存储系统的数据写入方法,其特征在于,包括:

接收数据写入请求,根据写入请求对应的数据和存储系统的状态,选择数据存储的RAID级别;所述存储系统的物理磁盘切分为多个存储块,根据RAID级别对应的存储结构,来自不同物理磁盘的多个存储块配置为存储组,多个存储组配置为相应RAID级别的RAID存储组;若存储系统的状态是,没有配置冗余存储空间或冗余存储空间不足时,选择RAID0级别;

若存储系统的状态是单冗余存储空间,由数据长度决定的写入性能确定两副本RAID1或RAID5;若存储系统的状态是双冗余存储空间,由数据长度决定的写入性能确定三副本RAID1或RAID6;所述冗余存储空间指镜像副本存储空间或校验存储空间;

根据数据存储的RAID级别分配存储空间,并确定存储组的条带关系,将写入请求按照条带与存储块之间的映射关系拆分为多个子请求;

执行子请求,完成数据写入。

2.根据权利要求1所述的存储系统的数据写入方法,其特征在于,所述存储系统配置的RAID级别,包括RAID0、RAID1、RAID5和RAID6中的至少一个。

3.根据权利要求2所述的存储系统的数据写入方法,其特征在于,所述执行子请求,还包括:记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系。

4.根据权利要求3所述的存储系统的数据写入方法,其特征在于,所述存储系统的物理磁盘切分为多个存储大小相等的存储块。

5.根据权利要求4所述的存储系统的数据写入方法,其特征在于,还包括数据迁移,步骤包括:将数据从存储空间中进行读取,按照条带关系重新组织;

将组织完成的数据按照相应的RAID级别分配新的存储空间,进行数据写入,更新数据写入的逻辑地址和存储空间的物理地址之间的对应关系,同时释放迁移前占用存储空间。

6.一种存储系统,其特征在于,包括:RAID部署模块、数据写入模块和磁盘阵列,其中:所述RAID部署模块,用于接收数据写入请求,根据写入请求对应的数据和存储系统的状态,选择数据存储的RAID级别;若存储系统的状态是,没有配置冗余存储空间或冗余存储空间不足时,选择RAID0级别;若存储系统的状态是单冗余存储空间,由数据长度决定的写入性能确定两副本RAID1或RAID5;若存储系统的状态是双冗余存储空间,由数据长度决定的写入性能确定三副本RAID1或RAID6;所述冗余存储空间指镜像副本存储空间或校验存储空间;

所述数据写入模块,用于根据数据存储的RAID级别分配存储空间,并确定存储组的条带关系,将写入请求按照条带与存储块之间的映射关系拆分为多个子请求;执行子请求,完成数据写入;

所述磁盘阵列,物理磁盘切分为多个存储块,根据RAID级别对应的存储结构,来自不同物理磁盘的多个存储块配置为存储组,多个存储组配置为相应RAID级别的RAID存储组。

7.根据权利要求6所述的存储系统,其特征在于,包括空间管理模块,用于分配存储空间,记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系。

8.根据权利要求7所述的存储系统,其特征在于,包括数据迁移模块,用于将数据从存储空间中进行读取,按照条带关系重新组织;将组织完成的数据按照相应的RAID级别分配存储空间,进行数据写入;空间管理模块用于记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系,更新并释放空闲的存储空间。

说明书 :

存储系统及其数据写入方法

技术领域

[0001] 本发明涉及数据存储技术领域,尤其涉及存储系统及其数据写入方法。

背景技术

[0002] RAID(Redundant Array of Inexpensive Disk),即廉价冗余磁盘阵列,是目前存储系统常用的一种数据冗余备份技术。根据磁盘不同的组合方式,RAID可以分为RAID0、RAID1、RAID10、RAID3、RAID5、RAID6等多种级别。
[0003] 随着网络技术及信息处理技术的发展,存储系统含有的物理磁盘越来越多,RAID6级别因为能够同时容忍两块磁盘损坏,兼顾性能与磁盘空间率的同时,还能更大限度的保护用户数据的可靠性,因而在存储设备中广泛采用。
[0004] 其中存在问题是,采用RAID6的存储系统会存在写惩罚以及非一致性数据更新的问题,尤其是在小数据写入以及磁盘故障导致存储系统降级时,RAID6的写惩罚对数据写入性能影响尤其明显。

发明内容

[0005] 发明目的:本发明提供一种存储系统及其数据写入方法,通过在多个物理磁盘上设置多种RAID级别,根据存储系统的存储空间状态和写入数据的长度,适应性的选择最适合的RAID级别,旨在保持数据冗余的同时仍然能够提供高性能的数据写入。
[0006] 技术方案:本发明提供一种存储系统的数据写入方法,包括:接收数据写入请求,根据写入请求对应的数据和存储系统的状态,选择数据存储的RAID级别;所述存储系统的物理磁盘切分为多个存储块,根据RAID级别对应的存储结构,来自不同物理磁盘的多个存储块配置为存储组,多个存储组配置为相应RAID级别的RAID存储组;根据数据存储的RAID级别分配存储空间,并确定存储组的条带关系,将写入请求按照条带与存储块之间的映射关系拆分为多个子请求;执行子请求,完成数据写入。
[0007] 具体的,所述存储系统配置的RAID级别,包括RAID0、RAID1、RAID5和RAID6中的至少一个。
[0008] 具体的,所述选择数据存储的RAID级别,包括:若存储系统的状态是,没有配置冗余存储空间或冗余存储空间不足时,选择RAID0级别;若存储系统的状态是单冗余存储空间,由数据长度决定的写入性能确定两副本RAID1或RAID5;若存储系统的状态是双冗余存储空间,由数据长度决定的写入性能确定三副本RAID1或RAID6;所述冗余存储空间指镜像副本存储空间或校验存储空间。
[0009] 具体的,所述执行子请求,还包括:记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系。
[0010] 具体的,所述存储系统的物理磁盘切分为多个存储大小相等的存储块。
[0011] 具体的,还包括数据迁移,步骤包括:将数据从存储空间中进行读取,按照条带关系重新组织;将组织完成的数据按照相应的RAID级别分配新的存储空间,进行数据写入,更新数据写入的逻辑地址和存储空间的物理地址之间的对应关系,同时释放迁移前占用存储空间。
[0012] 本发明还提供一种存储系统,包括:RAID部署模块、数据写入模块和磁盘阵列,其中:所述RAID部署模块,用于接收数据写入请求,根据写入请求对应的数据和存储系统的状态,选择数据存储的RAID级别;所述数据写入模块,用于根据数据存储的RAID级别分配存储空间,并确定存储组的条带关系,将写入请求按照条带与存储块之间的映射关系拆分为多个子请求;执行子请求,完成数据写入;所述磁盘阵列,物理磁盘切分为多个存储块,根据RAID级别对应的存储结构,来自不同物理磁盘的多个存储块配置为存储组,多个存储组配置为相应RAID级别的RAID存储组。
[0013] 具体的,所述RAID部署模块,用于若存储系统的状态是,没有配置冗余存储空间或冗余存储空间不足时,选择RAID0级别;若存储系统的状态是单冗余存储空间,由数据长度决定的写入性能确定两副本RAID1或RAID5;若存储系统的状态是双冗余存储空间,由数据长度决定的写入性能确定三副本RAID1或RAID6;所述冗余存储空间指镜像副本存储空间或校验存储空间。
[0014] 具体的,包括空间管理模块,用于分配存储空间,记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系。
[0015] 具体的,包括数据迁移模块,用于将数据从存储空间中进行读取,按照条带关系重新组织;将组织完成的数据按照相应的RAID级别分配存储空间,进行数据写入;空间管理模块用于记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系,更新并释放空闲的存储空间。
[0016] 有益效果:与现有技术相比,本发明具有如下显著优点:保持数据冗余的同时仍然能够提供高性能的数据写入。

附图说明

[0017] 图1a是RAID6大写方式原理图。
[0018] 图1b是RAID6小写方式原理图。
[0019] 图2a是降级条带的大写方式原理图。
[0020] 图2b是降级条带的小写方式原理图。
[0021] 图3是本发明提供的存储系统的结构示意图。
[0022] 图4是本发明提供的数据映射关系的示意图。
[0023] 图5是本发明提供的数据迁移方法的示意图。
[0024] 图6本发明提供的存储系统的硬件示意图。

具体实施方式

[0025] 下面结合附图对本发明的技术方案作进一步说明。
[0026] 在对本发明提供的方案详细说明之前,先对本发明涉及的相关术语、原理进行简单的说明。
[0027] 条带:RAID是由多块磁盘组成,条带技术将数据以块的方式分布存储在多个磁盘中,从而可以对数据进行并发处理。这样写入和读取数据就可以在多个磁盘上并发进行,从而良好的扩展I/O性能。
[0028] RAID0:是一种简单的、无数据冗余的数据条带化技术,将数据分散存储在所有的磁盘中,以独立访问的方式实现多块磁盘的并发读写,从而实现多倍的带宽性能,读写的速度是所有RAID级别中最快的一种。但RAIDO没有镜像、校验等冗余信息,所以无法提供数据保护的功能,一旦出现磁盘损坏,则会丢失所有数据。
[0029] 镜像RAID:镜像RAID条带化技术是根据数据的副本数,将数据完全一致地写到多块磁盘上。镜像RAID是通过牺牲一定的存储空间来实现数据的冗余。如果镜像副本数为2,其整体的空间利用率只有50%。虽然镜像RAID的空间利用率低,但却提供了很好的数据保护。一块磁盘损坏,不会导致数据丢失,同时对数据的读写性能影响很小。
[0030] RAID5和RAID6:这两种RAID级别是通过将同一个条带上的数据按照某种格式进行编码计算得到校验信息,然后将数据写入对应的数据盘,而校验信息则写入校验盘。RAID5只有一块校验盘,能够容忍存储池损坏一块磁盘。而RAID6则有两个校验盘,能够容忍同时损坏两块磁盘。一般情况下,在配置存储池时,将数据盘配置为2的幂次,如4+1,表示4块数据盘,1块校验盘的RAID5存储池;而4+2,则表示4块数据盘,2块校验盘的RAID6存储池。RAID5和RAID6在没有磁盘损坏时,读性能与RAID0和RAID1有一样的高带宽。但数据写入时,由于需要计算校验数据,因此写性能会受到比较大的影响。而如果RAID5和RAID6条带上存在故障磁盘时,则对数据的读写性能影响都很大。计算校验数据一般有大写和小写两种方式,为了说明不同的写入方式对性能的影响,下面结合附图对大写、小写以及存在故障磁盘时的读写原理作简单的介绍。
[0031] 图1a为RAID6的4+2条带大写方式的原理示意图;图1b为RAID6的4+2小写方式的原理示意图。具体地,如图1a和图1b所示,当对条带D1写入新的数据时,为了计算条带新的校验值P和Q,可以通过采用大写或者小写的方式实现,其中大写方式,需要先预读出D2、D3和D4的数据,然后根据RAID6计算得到校验值P和Q,可得到NewP1=NewD1^D2^D3^D4;NewQ1=k1*NewD1^k2*D2^k3*D3^k4*D4。计算完成后,将NewD1以及NewP1和NewQ1写入条带,完成数据写入。小写方式,需要先预读出D1以及P和Q的数据,然后根据RAID6大写的等价等式可计算得到新的P和Q,即NewP1=NewD1^D1^P1,New Q1=k1*NewD1^k1*D1^Q1。
[0032] 图2为RAID6的4+2条带存在故障磁盘数据写入原理示意图,其中存在两种情况,图2a为新写入的数据正好落在故障盘上,在这种场景下,则只能采用大写方式;图2b为新写入的数据落在其他正常的磁盘上,在这种场景下,则只能采用小写方式实现。
[0033] 根据所述RAID6的原理可知,具有两块校验盘,因此能够同时容忍两块磁盘损坏,在兼顾性能与磁盘空间率的同时,还能更大限度的保护用户数据的可靠性。但无论是采用大写方式还是小写方式写入数据,都不可避免的需要先通过预读数据盘或者校验盘上的老数据,才能计算出新的校验数据,并且每一次写入新的数据都需要写入校验盘,这种额外增加的预读和写校验盘就是RAID5和RAID6的写惩罚。写惩罚的次数越多,对性能的影响就越大。另外,根据RAID5或者RAID6的数据写入方式可知,写入的数据将会分布在不同的磁盘上,一旦在写入过程某块磁盘出现写入错误,而其他磁盘写入成功,则整个条带的数据将被破坏,无法再通过P或者Q计算出正确的数据,这就是非一致性更新的问题。
[0034] 参阅图3,本发明提供一种存储系统的数据写入方法,包括:接收数据写入请求,根据写入请求对应的数据和存储系统的状态,选择数据存储的RAID级别;所述存储系统的物理磁盘切分为多个存储块,根据RAID级别对应的存储结构,来自不同物理磁盘的多个存储块配置为存储组,多个存储组配置为相应RAID级别的RAID存储组;根据数据存储的RAID级别分配存储空间,并确定存储组的条带关系,将写入请求按照条带与存储块之间的映射关系拆分为多个子请求;执行子请求,完成数据写入。
[0035] 本发明实施例中,所述存储系统配置的RAID级别,包括RAID0、RAID1、RAID5和RAID6中的至少一个。
[0036] 在具体实施中,可以选择系统内的部分或全部存储资源创建一个存储池,为存储池配置数据冗余模式,例如可以配置为4+2模式,则表示存储系统同一个条带上双冗余,允许同时损坏两块磁盘。
[0037] 本发明实施例中,所述存储系统的物理磁盘切分为多个存储大小相等的存储块。
[0038] 在具体实施中,将存储池内的每个物理磁盘,按照固定的大小进行切分,将所有的物理磁盘都切分成大小相等的存储块(Chunk)。所述的固定大小可以根据实际需要设定,不做特殊限定。所有物理磁盘切分的存储块被虚拟化成一个存储池,供后续的空间管理分配使用。
[0039] 在具体实施中,根据冗余模式(冗余存储空间),部署不同RAID级别的空间管理模块。例如配置为4+2冗余模式,则可以部署以下RAID级别:RAID0;两副本RAID1;三副本RAID1;RAID5;RAID6。其中RAID0用于当整个存储系统处于无冗余磁盘的场景时的数据写入;两副本RAID1和RAID5用于当整个存储系统只有一块冗余磁盘的场景时的数据写入,更具体地,两副本RAID1用于小块数据写入,而RAID6用于大块数据写入。在实际实施的过程中,可以选择部署其中几种RAID级别或全部RAID级别,根据实际部署的RAID级别,选择其中性能最高的一种来完成数据的写入。
[0040] 在具体实施中,根据冗余模式,将来自不同磁盘上的存储块组成RAID存储组(Chunk RAID Groups)。以4+2冗余模式的RAID6为例,即需要分别从6块不同的物理磁盘上选择一个存储块组成存储组(Chunk Group),以便数据能够落在6块不同的物理磁盘上,确保当两块磁盘故障时,仍然能够保证数据能够正常读取和恢复。多个存储组组成了该RAID级别的RAID存储组。
[0041] 在具体实施中,RAID存储组中的存储组进一步切分成更细粒度的小存储块(Blocks),来自于同一个存储组不同存储块上的小存储块组成一个条带。
[0042] 在具体实施中,一个或多个条带即是逻辑存储单元(LUN)存储数据的基本单位。所述的LUN是可以直接映射给主机实现数据读写的存储单元,在处理用户的读写请求以及进行数据迁移时,LUN向存储系统申请空间、释放空间和数据迁移都以空间管理模块的条带为单位进行的。
[0043] 参阅图4,列举部署三副本RAID1和RAID6两种的存储系统,逻辑存储单元LUN接收主机数据写入请求,根据数据写入的长度和存储系统当前的状态,选择合适的空间管理模块分配存储空间,数据写入完成后记录LUN的逻辑地址到物理地址的映射。空间管理模块从存储池的不同磁盘上获取存储块,根据RAID级别组成存储组,并进一步切分为更细粒度的小存储块,分配给LUN。空间管理模块管理空闲空间,并维护存储组到各物理磁盘存储块之间的映射关系。物理磁盘存储池负责将物理磁盘切分为存储块,分配和维护每个磁盘存储块空间的使用情况。
[0044] 在具体实施中,接收来自主机的数据写入请求,写入请求中包含写入LUN的起始逻辑地址LBA以及需要写入的数据长度。由于空间管理分配和释放的最小单位为存储系统定义的小存储块,因此在分配空间之前,先检查主机写入请求是否B1ock对齐,如逻辑地址以及数据长度为非对齐,则需要在写入请求的头部和尾部进行预读补齐,确保写入数据的完整性。
[0045] 本发明实施例中,若存储系统的状态是,没有配置冗余存储空间或冗余存储空间不足时,选择RAID0级别;若存储系统的状态是单冗余存储空间,由数据长度决定的写入性能确定两副本RAID1或RAID5;若存储系统的状态是双冗余存储空间,由数据长度决定的写入性能确定三副本RAID1或RAID6;所述冗余存储空间指,镜像副本存储空间或校验存储空间。
[0046] 在具体实施中,假设创建存储池配置为RAID6的4+2冗余模式,并且部署所有RAID级别来进行说明的。如果系统当前为无冗余状态,则直接从RAID0空间管理模块分配存储空间;如果系统当前只有单冗余状态,则进一步根据写请求的数据长度确定是从两副本RAID1还是从RAID5(4+1)空间管理模块分配存储空间,具体判定条件为:如果写入数据的长度小于4个Blocks,则从两副本RAID1中分配存储空间,否则从RAID5分配。以写入数据长度为1个Block为例,在保证同等数据冗余条件下,根据两副本RAID1和RAID5的原理可知,两副本RAID1需要写入次数为2,而RAID5最少需要预读3块盘,写3块盘,因此写入放大是6,从RAID1分配存储空间性能是最高的。其他分配存储空间的情况同理,根据存储池磁盘配置(2+2、4+2或8+2等)和写入的数据长度,计算得到写入放大,根据写入放大选择写入性能更高的RAID级别,并分配相应的存储空间。
[0047] 本发明实施例中,记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系。
[0048] 在具体实施中,根据确定的空间管理模块RAID级别以及分配的存储空间,确定条带关系,完成多副本的数据写入或者计算P和Q校验码后,完成整个条带的数据写入。所述的空间管理模块,维护RAID存储组与物理磁盘之间的映射关系,主机的写入请求按照条带与物理磁盘之间的映射关系拆分成不同的子请求,下发到各个物理磁盘。主机写入请求中的写入地址为逻辑地址LBA,空间管理模块分配的存储空间为物理地址PBA,LBA和PBA的大小都对齐到Block大小。Block的编址方式为,高8位用来表示所属的Chunk RAID Group标识,低56位用来表示在该RAID存储组内的偏移。
[0049] 在具体实施中,所有拆分的子请求写入完成后,空间管理模块记录本次写入请求分配的存储空间和管理本模块内的空闲空间,逻辑卷LUN层记录LBA到PBA之间的映射关系,完成本次的写入请求。
[0050] 在具体实施中,RAID存储组到物理磁盘之间的映射关系,物理磁盘空间的使用情况,空间管理模块的Block分配使用情况以及逻辑卷LUN层LBA到PBA之间的映射关系等存储系统的元数据,可以有独立的存储介质,无数据数据结构可以采用数据库或者其他自定义的数据类型。
[0051] 由RAID的实现原理可知,不同的RAID级别,其有效存储空间有很大的差别,其中两副本RAID1的有效存储空间只有总磁盘空间的50%,三副本RAID1的有效存储空间只有总磁盘空间的33%。对于配置为4+2的RAID6的存储系统来说,其有效的存储空间是总磁盘空间的66%。因此为了在保证写入性能的同时,还能充分利用磁盘的存储空间。
[0052] 本发明实施例中,还包括数据迁移,步骤包括:将数据从存储空间中进行读取,按照条带关系重新组织;将组织完成的数据按照相应的RAID级别新的分配存储空间,进行数据写入,更新数据写入的逻辑地址和存储空间的物理地址之间的对应关系,同时释放迁移前占用存储空间。
[0053] 在具体实施中,数据迁移模块可以实现将用户的数据从低空间利用率级别的RAID迁移到高空间利用率级别的RAID。参阅图5,该示意图以两副本RAID1迁移到4+2的RAID6为例,实际使用中,可以从RAID0、三副本RAID1或者RAID5存储空间的迁移,实现冗余度的提升或者提升有效存储空间。
[0054] 在具体实施中,数据迁移开始,从待迁移的RAID存储组获取待迁移的Block列表。所述的待迁移B1ock指的是含有有效用户数据的存储空间。将这些有效存储空间上的用户数据读取出来,并按照RAID6的4+2的条带关系,重新组织用户数据。从RAID6对应的空间管理模块分配一个满条带的存储空间,用重新组织好的用户数据计算条带的P和Q校验码,完成一个整条带的数据写入。写入完成后,首先需要更新逻辑卷LUN的数据映射关系,然后再更新RAID6空间管理模块的空闲空间和释放两副本RAID1占用的存储空间。
[0055] 本发明还提供一种存储系统,包括:RAID部署模块、数据写入模块和磁盘阵列,其中:
[0056] 所述RAID部署模块,用于接收数据写入请求,根据写入请求对应的数据和存储系统的状态,选择数据存储的RAID级别;
[0057] 所述数据写入模块,用于根据数据存储的RAID级别分配存储空间,并确定存储组的条带关系,将写入请求按照条带与存储块之间的映射关系拆分为多个子请求;执行子请求,完成数据写入;
[0058] 所述磁盘阵列,物理磁盘切分为多个存储块,根据RAID级别对应的存储结构,来自不同物理磁盘的多个存储块配置为存储组,多个存储组配置为相应RAID级别的RAID存储组。
[0059] 本发明实施例中,包括空间管理模块,用于分配存储空间,记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系。
[0060] 本发明实施例中,包括数据迁移模块,用于将数据从存储空间中进行读取,按照条带关系重新组织;将组织完成的数据按照相应的RAID级别分配存储空间,进行数据写入;空间管理模块用于记录数据写入的逻辑地址和存储空间的物理地址之间的对应关系,更新并释放空闲的存储空间。
[0061] 本发明实施例中,所述RAID部署模块,用于若存储系统的状态是,没有配置冗余存储空间或冗余存储空间不足时,选择RAID0级别;若存储系统的状态是单冗余存储空间,由数据长度决定的写入性能确定RAID1或RAID5;若存储系统的状态是双冗余存储空间,选择RAID6;所述冗余存储空间指镜像副本存储空间或校验存储空间。
[0062] 本发明实施例中,所述RAID部署模块,用于数据长度小于4个小存储块时,选择RAID1;数据长度大于等于4个小存储块时,选择RAID5;所述小存储块为存储系统支持的最小粒度的数据块,由存储组进行进一步的划分得到。
[0063] 参阅图6,存储系统的硬件包含存储系统控制器和磁盘阵列,其中存储系统控制器为双控制器架构,互为备份和负荷分担。磁盘阵列为包含若干物理磁盘的磁盘柜,与存储系统控制器之间通过系统总线相连。存储系统控制器10和存储系统控制器20,具有相同的结构和功能,两个控制器之间互为备份和负荷分担,可有效保证存储系统的安全和可靠性,保证存储系统的写操作性能。
[0064] 所述的磁盘阵列30,包含若干物理磁盘,为存储系统提供实际的物理存储空间。可为各种不同的存储介质,甚至可以不同的存储介质混合搭配。存储系统基于该磁盘阵列创建存储池并部署相应的存储系统控制器。