存储器的测试

存储器的测试,第1张

存储器测试的目的是确认在存储设备中的每一个存储位置都在工作。换一句话说,如果你把数50存储在一个具体的地址,你希望可以找到存储在那里的那个数,直到另一个数写入。任何存储器测试的基本方法是,往存储器写入一些数据,然后根据内存设备的地址,校验读回的数据。如果所有读回的数据和那些写入的数据是一样的,那么就可以说存储设备通过了测试。只有通过认真选择的一组数据你才可以确信通过的结果是有意义的。

当然,像刚才描述的有储器的测试不可避免地具有破坏性。在内存测试过程中,你必须覆盖它原先的内容。因为重写非易失性存储器内容通常来说是不可行的,这一部分描述的测试通常只适用于RAM 的测试。 一,普通的存储器问题

在学习具体的测试算法之前,你应该了解可能遇到的各种存储器问题。在软件工程师中一个普遍的误解是,大部分的存储器问题发生在芯片的内部。尽管这类问题一度是一个主要的问题,但是它们在日益减少。存储设备的制造商们对于每一个批量的芯片都进行了各种产品后期测试。因此,即使某一个批量有问题,其中某个坏芯片进人到你的系统的可能性是微乎其微的。

你可能遇到的一种类型的存储芯片问题是灾难性的失效。这通常是在加工好之后芯片受到物理或者是电子损伤造成的。灾难性失效是少见的,通常影响芯片中的大部分。因为一大片区域受到影响,所以灾难性的失效当然可以被合适的测试算法检测到。

存储器出问题比较普遍的原因是电路板故障。典型的电路板故障有:

(1)在处理器与存储设备之间的连线问题

(2)无存储器芯片

(3)存储器芯片的不正确插人

二,测试策略

最好有三个独立的测试:数据总线的测试、地址总线的测试以及设备的测试。前面两个测试针对电子连线的问题以及芯片的不正确插入;第三个测试更倾向于检测芯片的有无以及灾难性失效。作为一个意外的结果,设备的测试也可以发现控制总线的问题,尽管它不能提供关于问题来源的有用信息。

执行这三个测试的顺序是重要的。正确的顺序是:首先进行数据总线测试,接着是地址总线测试,最后是设备测试。那是因为地址总线测试假设数据总线在正常工作,除非数据总线和地址总线已知是正常的,否则设备测试便毫无意义。如果任何测试失败,你都应该和一个硬件工程师一起确定问题的来源。通过查看测试失败处的数据值或者地址,应该能够迅速地找出电路板上的问题。

1,数据总线测试

我们首先要测试的就是数据总线。我们需要确定任何由处理器放置在数据总线上的值都被另一端的存储设备正确接收。最明显的测试方法就是写人所有可能的数据值并且验证存储设备成功地存储了每一个。然而,那并不是最有效率的测试方法。一个更快的测试方法是一次测试总线上的一位。如果每一个数据上可被设置成为 0 和1,而不受其他数据位的影响,那么数据总线就通过了测试。

2,地址总线测试

在确认数据总线工作正常之后,你应该接着测试地址总线。记住地址总线的问题将导致存储器位置的重叠。有很多可能重叠的地址。然而,不必要测试每一个可能的组合。你应该努力在测试过程中分离每一个地址位。你只需要确认每一个地址线的管脚都可以被设置成0和 1,而不影响其他的管脚。

3,设备测试

一旦你知道地址和数据总线是正确的,那么就有必要测试存储设备本身的完整性。要确认的是设备中的每一位都能够保持住0和 1。这个测试实现起来十分简单,但是它花费的时间比执行前面两项测试花费的总时间还要长。

对于一个完整的设备测试,你必须访问(读和写)每一个存储位置两次。你可以自由地选择任何数据作为第一步测试的数据,只要在进行第二步测试的时候把这个值求反即可。因为存在没有存储器芯片的可能性,所以最好选择一组随着地址变化(但是不等于地址)的数。优化措施

市场上并不缺少提高数据存储效率的新技术,然而这些新技术绝大多数都是关注备份和存档的,而非主存储。但是,当企业开始进行主存储数据缩减时,对他们来说,了解主存储优化所要求的必要条件十分重要。

主存储,常常被称为1级存储,其特征是存储活跃数据――即经常被存取并要求高性能、低时延和高可用性的数据。主存储一般用于支持关键任务应用,如数据库、电子邮件和交易处理。大多数关键应用具有随机的数据取存模式和不同的取存要求,但它们都生成机构用来运营它们的业务的大量的数据。因此,机构制作数据的许多份拷贝,复制数据供分布使用,库存数据,然后为安全保存备份和存档数据。

绝大多数数据是起源于主数据。随着数据存在的时间增加,它们通常被迁移到二级和三级存储保存。因此,如果机构可以减少主数据存储占用空间,将能够在数据生命期中利用这些节省下来的容量和费用。换句话说,更少的主存储占用空间意味着更少的数据复制、库存、存档和备份。

试图减少主存储占用空间存储管理人员可以考虑两种减少数据的方法:实时压缩和数据去重。

直到不久前,由于性能问题,数据压缩一直没有在主存储应用中得到广泛应用。然而,Storwize等厂商提供利用实时、随机存取压缩/解压技术将数据占用空间压缩15:1的解决方案。更高的压缩率和实时性能使压缩解决方案成为主存储数据缩减的可行的选择。

在备份应用中广泛采用的数据去重技术也在被应用到主存储。目前为止,数据去重面临着一大挑战,即数据去重处理是离线处理。这是因为确定数量可能多达数百万的文件中的多余的数据块需要大量的时间和存储处理器做大量的工作,因此非常活跃的数据可能受到影响。当前,推出数据去重技术的主要厂商包括NetApp、Data Domain和OcarinaNetworks。 一、零性能影响

与备份或存档存储不同,活跃数据集的性能比能够用某种形式的数据缩减技术节省的存储容量更为关键。因此,选择的数据缩减技术必须不影响到性能。它必须有效和简单;它必须等价于“拨动一个开关,就消耗更少的存储”。

活跃存储缩减解决方案只在需要去重的数据达到非活跃状态时才为活跃存储去重。换句话说,这意味着实际上只对不再被存取但仍保存在活跃存储池中的文件――近活跃存储级――进行去重。

去重技术通过建议只对轻I/O工作负载去重来避免性能瓶颈。因此,IT基础设施的关键组件的存储没有得到优化。数据库排在关键组件清单之首。由于它们是1级存储和极其活跃的组件并且几乎始终被排除在轻工作负载之外,去重处理从来不分析它们。因此,它们在主存储中占据的空间没有得到优化。

另一方面,实时压缩系统实时压缩所有流经压缩系统的数据。这导致节省存储容量之外的意外好处:存储性能的提高。当所有数据都被压缩时,每个I/O请求提交的数据量都有效地增加,硬盘空间增加了,每次写和读 *** 作都变得效率更高。

实际结果是占用的硬盘容量减少,总体存储性能显著提高。

主存储去重的第二个好处是所有数据都被减少,这实现了包括数据库在内的所有数据的容量节省。尽管Oracle环境的实时数据压缩可能造成一些性能问题,但迄今为止的测试表明性能提高了。

另一个问题是对存储控制器本身的性能影响。人们要求今天的存储控制器除了做伺服硬盘外,还要做很多事情,包括管理不同的协议,执行复制和管理快照。再向这些功能增加另一个功能可能会超出控制器的承受能力――即使它能够处理额外的工作负载,它仍增加了一个存储管理人员必须意识到可能成为潜在I/O瓶颈的过程。将压缩工作交给外部专用设备去做,从性能问题中消除了一个变数,而且不会给存储控制器造成一点影响。

二、高可用性

许多关注二级存储的数据缩减解决方案不是高可用的。这是由于它们必须立即恢复的备份或存档数据不像一级存储中那样关键。但是,甚至在二级存储中,这种概念也逐渐不再时兴,高可用性被作为一种选择添加到许多二级存储系统中。

可是,高可用性在主存储中并不是可选的选项。从数据缩减格式(被去重或被压缩)中读取数据的能力必须存在。在数据缩减解决方案中(其中去重被集成到存储阵列中),冗余性是几乎总是高可用的存储阵列的必然结果。

在配件市场去重系统中,解决方案的一个组件以数据的原始格式向客户机提供去重的数据。这个组件就叫做读出器(reader)。读出器也必须是高可用的,并且是无缝地高可用的。一些解决方案具有在发生故障时在标准服务器上加载读出器的能力。这类解决方案经常被用在近活跃的或更合适的存档数据上它们不太适合非常活跃的数据集。

多数联机压缩系统被插入系统中和网络上,放置(逻辑上)在交换机与存储之间。因此,它们由于网络基础设施级上几乎总是设计具有的高可用性而取得冗余性。沿着这些路径插入联机专用设备实现了不需要IT管理人员付出额外努力的无缝的故障切换;它利用了已经在网络上所做的工作。

三、节省空间

部署这些解决方案之一必须带来显著的容量节省。如果减少占用容量的主存储导致低于标准的用户性能,它没有价值。

主数据不具有备份数据通常具有的高冗余存储模式。这直接影响到总体容量节省。这里也有两种实现主数据缩减的方法:数据去重和压缩。

数据去重技术寻找近活跃文件中的冗余数据,而能取得什么水平的数据缩减将取决于环境。在具有高冗余水平的环境中,数据去重可以带来显著的ROI(投资回报),而另一些环境只能取得10%到20%的缩减。

压缩对所有可用数据都有效,并且它在可以为高冗余数据节省更多的存储容量的同时,还为主存储应用常见的更随机的数据模式始终带来更高的节省。

实际上,数据模式冗余度越高,去重带来的空间节省就越大。数据模式越随机,压缩带来的空间节省就越高。

四、独立于应用

真正的好处可能来自所有跨数据类型(不管产生这些数据是什么应用或数据有多活跃)的数据缩减。虽然实际的缩减率根据去重数据的水平或数据的压缩率的不同而不同,但所有数据都必须合格。

当涉及存档或备份时,应用特有的数据缩减具有明确的价值,并且有时间为这类数据集定制缩减过程。但是对于活跃数据集,应用的特殊性将造成性能瓶颈,不会带来显著的容量缩减的好处。

五、独立于存储

在混合的厂商IT基础设施中,跨所有平台使用同样的数据缩减工具的能力不仅将进一步增加数据缩减的ROI好处,而且还简化了部署和管理。每一个存储平台使用一种不同的数据缩减方法将需要进行大量的培训,并造成管理级上的混乱。

六、互补

在完成上述所有优化主存储的工作后,当到了备份主存储时,最好让数据保持优化的格式(被压缩或去重)。如果数据在备份之前必须扩展恢复为原始格式,这将是浪费资源。

为备份扩展数据集将需要:

使用存储处理器或外部读出器资源解压数据

扩展网络资源以把数据传送给备份目标;

把额外的资源分配给保存备份数据的备份存储设备。

控制器?还是控制台?

第一:控制台是管理SQL server数据库引擎的一个工具;

第二:安装控制台后,可以方便的管理数据库,例如通过控制台手动附加应用程序的数据库文件、备份或恢复数据库、创建数据库、管理索引、编写存储过程等所有与数据库相关的 *** 作;

第三:SQL server准确的说是“数据库引擎”,可以同时驱动多个SQL数据库,腾讯SQL数据库是其中之一的“数据库应用”。

以Kubernetes为代表的容器编排工具在应用开发部署领域起正发挥着颠覆性的变革作用。随着微服务架构的发展,从开发人员的角度来看,应用逻辑架构与基础设施架构之间开始解耦,这意味着开发者能够将精力更多集中在软件构建以及价值交付身上。

当管理Docker镜像的时候,Kubernetes也让实际应用变的十分便捷灵活。在利用Kubernetes进行容器架构的应用部署时,管理员们将在无需修改底层代码的前提下将其部署在任何位置——包括公有云、混合云乃至私有云。

虽然Kubernetes在扩展性、便携性与管理性等方面的表现都相当给力,但截至目前,它仍然不支持存储状态。与之对应的是,如今的大多数应用都是有状态的——换言之,要求在一定程度上配合外部存储资源。

Kubernetes架构本身非常灵活的,能够根据开发者的需求、规范以及实际负载情况,对容器进行随意创建与撤销。此外,Pod和容器还具有自我修复与复制能力。因此从本质上讲,它们的生命周期普遍非常短暂。

但是,现有持久存储解决方法无法支持动态的应用场景,而持久化存储也无法满足动态创建与撤销的需求。

当我们需要将有状态应用部署到其它基础架构平台,或者另一家内部或混合云供应商的环境中时,可移植性低下无疑将成为我们面临的巨大挑战。更具体地讲,持久化存储解决方案往往会锁定于特定云服务供应商,而无法灵活完成转移。

另外,云原生应用中的存储机制也相当复杂、难于理解。Kubernetes中的不少存储术语极易混淆,其中包含着复杂的含义与微妙的变化。再有,在原生Kubernetes、开源框架以及托管与付费服务之间还存在着诸多选项,这极大增加了开发人员在做出决定之前的考量与试验成本。

以下是CNCF列出的云原生存储可选方案:

我们首先从最简单的场景出发,即在Kubernetes当中部署一套数据库。具体流程包括:选择一套符合需求的数据库,让它在本地磁盘上运行,然后将其作为新的工作负载部署到集群当中。但是,由于数据库中存在的一些固有属性,这种方式往往无法带来符合预期的效果。

容器本身是基于无状态原则进行构建的,凭借这一天然属性,我们才能如此轻松地启动或撤销容器环境。由于不存在需要保存及迁移的数据,集群也就不需要同磁盘读写这类密集型 *** 作绑定在一起了。

但对于数据库,其状态必须随时保存。如果以容器方式部署在集群当中的数据库不需要进行迁移,或者不需要频繁开关,那么其基本属性就相当于一种物理存储设备。在理想情况下,使用数据的容器应该与该数据库处于同一Pod当中。

当然,这并不是说将数据库部署在容器中的作法不可取。在某些应用场景下,这样的设计完全能够满足需求。举例来说,在测试环境或者处理非生产级数据时,由于总体数据量很小,将数据库纳入集群完全没有问题。但在实际生产中,开发人员往往需要仰仗于外部存储机制。

Kubernetes到底是如何与存储资源彼此通信的?其利用的是控制层接口。这些接口负责将Kubernetes与外部存储相对接。接入Kubernetes的外部存储解决方案被称为“卷插件(Volume Plugins)”。正是有了卷插件的存在,存储资源才得以抽象化并实现可移植性。

以前,卷插件一般由核心Kubernetes代码库进行构建、链接、编译以及装载。这样就极大的限制了开发人员的发挥空间,同时也带来了额外的维护开销。因此,项目维护人员们决定在Kubernete的代码库上增加一些新的存储功能。

随着CSI以及Flexvolume的引入,卷插件如今可以在集群中直接部署,而完全无需更改代码库。

原生Kubernetes与存储

持久卷是由管理员负责配置的存储单元,它们独立于任何单一Pod之外,因此不受Pod生命周期的影响。

存储资源有两种使用方式:静态存储与动态存储。

实际上,静态定义的持久卷并不能适应Kubernetes的可移植特性,因为存储资源具有对环境的依赖性——例如AWS EBS或者GCE Persistent Disk。另外,手动绑定还需要根据不同供应商的存储方案修改YAML文件。

在资源分配方面,静态配置实际上也违背了Kubernetes的设计原则。后者的CPU与内存并非事先被分配好绑定在Pod或者容器上,而是以被动态形式进行分配。

通过简单的说明,相信大家已经了解了原生Kubernetes对外部存储资源的使用方式。当然,这里仅仅做出概括,实际使用场景中还有更多其它因素需要考量。

CSI——容器存储接口

下面来看容器存储接口(简称CSI)。CSI是由CNCF存储工作组创建的统一标准,旨在定义一个标准的容器存储接口,从而使存储驱动程序能够在任意容器架构下正常起效。

CSI规范目前已经在Kubernetes中得到普及,大量驱动插件被预先部署在Kubernetes集群内供开发人员使用。如此一来,我们就可以利用Kubernetes上的CSI卷来访问与CSI兼容的开放存储卷。

CSI的引入,意味着存储资源能够作为Kubernetes集群上的另一种工作负载实现容器化以及部署。

相关开源项目

目前,围绕云原生技术涌现出大量工具与项目。但作为生产场景中的一大突出问题,我们往往很难在云原生架构中选择最合适的开源项目。换言之,解决方案选项太多,反而令存储需求变得更难解决。

我们再看一次CNCF列出的云原生存储的可选方案:

下面我会分享一下当下流行的存储方案Ceph与Rook,还有Rancher开源的容器化分布式存储Longhorn。

Ceph

Ceph是一种动态托管、横向扩展的分布式存储集群。Ceph面向存储资源提供一种逻辑抽象机制,其设计理念包括无单点故障、自管理以及软件定义等特性。Ceph可以面向同一套存储集群分别提供块存储、对象存储以及文件存储的对应接口。

Ceph架构相当复杂的,其中使用到大量的底层技术,例如RADOS、librados、RADOSGW、RDB、CRUSH算法,外加monitor、OSD以及MDS等功能性组件。这里我们先不谈它的底层架构,关键在于Ceph属于一种分布式存储集群,这使得扩展更便利、能够在不牺牲性能的前提下消除单点故障,且提供涵盖对象存储、块存储以及文件存储的统一存储体系。

Ceph架构图

Rook

另一个有趣且颇具人气的项目是Rook,这是一项旨在将Kubernetes与Ceph融合起来的技术方案。从本质上讲,它将计算节点和存储节点放进了同一个集群当中。

Rook是一种云原生编排器,并对Kubernetes做出扩展。Rook允许用户将Ceph放置在容器内,同时提供卷管理逻辑以立足Kubernetes之上实现Ceph的可靠运行。Rook还使本应由集群管理员 *** 作的多种任务完成了自动化实现,其中包括部署、引导、配置、扩展以及负载均衡等等。

Rook自身不具备持久状态,也不需要单独管理。这,才是真正与Kubernetes设计原则相符的存储资源管理方案。

Rook凭借着将Ceph与Kubernetes协同起来的强大能力而颇受欢迎,在GitHub上获得近4000颗星,1600多万次的下载,并吸引到100多名贡献者,现已进入CNCF孵化阶段。

Longhorn

Longhorn项目是Rancher Labs推出的开源的基于云和容器部署的分布式块存储新方式。Longhorn遵循微服务的原则,利用容器将小型独立组件构建为分布式块存储,并使用容器编排来协调这些组件,形成d性分布式系统。

如今,基于云和容器的部署规模日益扩大,分布式块存储系统也正变得越来越复杂,单个存储控制器上的volume数量在不断增加。2000年代初,存储控制器上的volume数量只有几十个,但现代云环境却需要数万到数百万的分布式块存储卷。存储控制器变成了高度复杂的分布式系统。

Longhorn充分利用了近年来关于 如何编排大量的容器和虚拟机的核心技术 。例如,Longhorn并没有构建一个可以扩展到100,000个volume的高度复杂的控制器,而是出于让存储控制器简单轻便的考虑,创建了100,000个单独的控制器。然后,我们可以利用像Kubernetes这样的最先进的编排系统来调度这些独立的控制器,共享一组磁盘中的资源,协同工作,形成一个d性的分布式块存储系统。

Longhorn基于微服务的设计还有很多其他优势。因为每个volume都有自己的控制器,在升级每个volume的控制器和replica容器时,是不会导致IO *** 作明显的中断的。Longhorn可以创建一个长期运行的工作来编排所有live volume的升级,同时确保不会中断系统正在进行的 *** 作。为确保升级不会导致意外的问题,Longhorn可以选择升级一小部分volume,并在升级过程中出现问题时回滚到旧版本。这些做法在现代微服务应用中已得到广泛应用,但在存储系统中并不常见。希望Longhorn可以 助力于微服务在存储领域的更多应用。

结 语

对于实际应用层面出现的任何问题,最重要的自然是判断需求、设计系统或者选择适当的工具。同样的道理也适用于云原生环境。虽然具体问题非常复杂,但也必然会出现大量工具方案尝试解决。随着云原生世界的持续发展,我们可以肯定,新的解决方案将不断涌现。未来,一切都会更加美好!


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/sjk/6693078.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-26
下一篇 2023-03-26

发表评论

登录后才能评论

评论列表(0条)

保存