热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

【存储】RAID2.0+、多路径技术、磁盘可靠性技术

RAID2.0RAID2.0技术RAID技术发展RAID2.0软件逻辑对象RAID2.0基本原理硬盘域StoragePool&TierDiskGroup(DG







RAID2.0+


  • RAID 2.0+技术
    • RAID技术发展
    • RAID 2.0+软件逻辑对象
    • RAID 2.0+基本原理
    • 硬盘域
    • Storage Pool & Tier
    • Disk Group(DG)
    • LD(逻辑磁盘)
    • Chunk(CK)
    • Chunk Group(CKG)
    • Extent
    • Grain
    • Volume & LUN

  • 多路径技术
    • 多路径技术原理
    • 多路径软件与OS集成方式
    • UltraPath功能
      • Failover
      • Failback


  • 磁盘可靠性技术
    • 硬盘可靠性
    • 硬盘失效分类
    • 硬盘智能扫描和坏道修复
    • 硬盘智能在线诊断系统
    • 硬盘预拷贝
    • 慢IO快速响应
    • RAID重构技术简介
    • RAID重构技术原理



RAID 2.0+技术

RAID技术发展

在这里插入图片描述
在最初的RAID技术中,是将几块小容量廉价的磁盘组合成一个大的逻辑磁盘给大型机使用。后来硬盘的容量不断增大,组建RAID的初衷不再是构建一个大容量的磁盘,而是利用RAID技术实现数据的可靠性和安全性,以及提升存储性能,由于单个容量硬盘都已经较大了,数据硬盘组建的RAID容量更大,然后再把RAID划分成一个一个的LUN映射给服务器使用。随着硬盘技术的发展,单块硬盘的容量已经达到数T,传统RAID技术在硬盘重构的过程中需要的时间越来越长,也增加了在重构过程中其它硬盘再坏掉对数据丢失造成的风险,为了解决这一问题,块虚拟化技术应运而生。RAID 2.0+ 是华为的块虚拟化技术,该技术将物理空间和数据空间分散分布成分散的块,可以充分发挥系统的读写能力,方便扩展,也方便了空间的按需分配,数据的热度排布,迁移,它是华为所有Smart软件特性的实现基础。同时,由于热备空间也是分散在多个盘上的,因此硬盘数据的重构写几乎可以同时进行,避免了写单个热备盘造成的性能瓶颈,大大减少了重构时间。

RAID 2.0+软件逻辑对象

在这里插入图片描述

  • 华为RAID2.0+采用底层硬盘管理和上层资源管理两层虚拟化管理模式,在系统内部,每个硬盘空间被划分成一个个小粒度的数据块,基于数据块来构建RAID组,使得数据均匀地分布到存储池的所有硬盘上,同时,以数据块为单元来进行资源管理,大大提高了资源管理的效率。
    • OceanStor存储系统支持不同类型(SSD、SAS、NL-SAS)的硬盘(SATA盘理论可用,只是其性能较低,企业级存储中已很少使用),这些硬盘组成一个个的硬盘域(Disk Domain)。在一个硬盘域中,同种类型的硬盘构成一个存储层,每个存储层内部再按一定的规则划分为Disk Group;
    • 各存储层的硬盘被划分为固定大小的Chunk(CK),其中,SSD层和SAS层的CK的大小为64MB,NL-SAS层的CK大小为256M。
    • OceanStor 存储系统通过随机算法,将每一个存储层的Chunk(CK)按照用户设置的“RAID策略”来组成Chunk Group(CKG),用户可以为存储池(StoragePool)中的每一个存储层分别设置“RAID策略”。
    • OceanStor存储系统会将Chunk Group(CKG)切分为更小的Extent。Extent作为数据迁移的最小粒度和构成Thick LUN的基本单位,在创建存储池(Storage Pool)时可以在“高级”选项中进行设置,默认4MB。对于Thin LUN或文件系统,会在Extent上再进行更细粒度的划分(Grain),并以Grain为单位映射到Thin LUN、文件系统。(Thin LUN的概念将在后面的章节中描述)
  • 若干Extent组成了卷(Volume),卷(Volume)对外体现为主机访问的LUN(这里的LUN为Thick LUN)。在处理用户的读写请求以及进行数据迁移时,LUN向存储系统申请空间、释放空间、迁移数据都是以Extent为单位进行的。例如:用户在创建LUN时,可以指定容量从某一个存储层中获得,此时LUN由指定的某一个存储层上的Extent组成。在用户的业务开始运行后,存储系统会根据用户设定的迁移策略,对访问频繁的数据以及较少被访问的数据在存储层之间进行迁移(此功能需要购买SmartTier License)。此时,LUN上的数据就会以Extent为单位分布到存储池的各个存储层上。
  • 在用户创建Thin LUN或文件系统时,OceanStor存储系统还会在Extent的基础上再进行更细粒度的划分(Grain),并以Grain为单位映射到Thin LUN或文件系统,从而实现对存储容量的精细化管理。

RAID 2.0+基本原理

在这里插入图片描述

硬盘域

在这里插入图片描述

  • 在传统RAID中,要将硬盘空间提供给业务主机的第一步操作是 创建RAID组。但是对创建RAID组这一操作有一些限制和要求:RAID组中的硬盘的类型是相同的,硬盘的大小和转速需要保持一致,而且一个RAID组中的硬盘个数不建议超过12个。
  • 华为RAID2.0+技术中采用了另一种实现方法。在该方法中,第一步操作不是 创建RAID组,而是创建硬盘域。一个硬盘域就是一组硬盘。一个硬盘只能属于一个硬盘域。OceanStor存储系统可以创建一个或多个硬盘域。看起来,硬盘域的概念似乎跟RAID组的概念类似,都是一组硬盘,但实际上还是有很大的区别。在创建的RAID组中,这组硬盘已经按照设定某个RAID组级别进行了绑定,且这组硬盘的类型,大小,转速都必须是一样的。但是在一个硬盘域中,硬盘的个数可以大很多,比如上百个,而且可以最多包含3种类型的硬盘,每种类型的硬盘对应分配到一个存储层级,SSD盘对应分配到高性能层,SAS盘分配到性能层,NL-SAS盘分配到容量层。如果硬盘域中没有相应的硬盘类型,则该硬盘域就没有相应的存储层。更为关键的区别是,硬盘域的主要作用是将这一组盘和哪一组盘分开,目的是实现故障、性能和存储资源等的完全隔离。在创建硬盘域时,RAID级别尚未指定,即数据的冗余保护方式还未指定。事实上,RAID2.0+ 对数据冗余保护方式的设置更加灵活,更加精细化。硬盘域中硬盘组成的存储空间,将被划分成更小粒度的存储池,以及为各个存储层级内共享的热备空间。热备空间大小是系统根据管理员为该硬盘域设置的热备策略(高、低、无)以及该硬盘域各存储层的硬盘个数自动设置的,而不再是传统RAID组中那样,由管理员指定某个特定的盘做热备盘。

Storage Pool & Tier

在这里插入图片描述

  • 一个存储池基于指定的一个硬盘域创建,可以从该硬盘域上动态的分配Chunk(CK)资源,并按照每个存储层级(Tier)的“RAID策略”组成Chunk Group(CKG)向应用提供具有RAID保护的存储资源。
  • 存储池根据硬盘类型可划分为多个Tier,OceanStor存储系统支持的存储层级和硬盘类型上图左表所示。
  • 创建存储池可以指定该存储池从硬盘域上划分的存储层级(Tier)类型以及该类型的“RAID策略”和“容量”。
  • OceanStor存储系统支持RAID1、RAID10、RAID3、RAID5、RAID50和RAID6,支持的RAID策略和配置上图右表所示。
  • 容量层由大容量的SATA、NL-SAS盘组成,RAID策略建议使用双重校验方式的RAID6。(SATA盘较少使用,部分产品规格上已经不支持)

Disk Group(DG)

在这里插入图片描述

  • OceanStor存储系统会在每个硬盘域内根据每种类型的硬盘数量自动划分为一个或多个Disk Group(DG)。
  • 一个Disk Group(DG)只包含一种硬盘类型
  • 任意一个CKG的多个CK来自于同一个Disk Group(DG)的不同硬盘
  • Disk Group(DG)属于系统内部对象,主要作用为故障隔离,由OceanStor存储系统自动完成配置,对外不体现。

LD(逻辑磁盘)

在这里插入图片描述

Chunk(CK)

在这里插入图片描述

  • 块大小是系统在切分物理空间的时候固定的大小,不能进行更改。

Chunk Group(CKG)

在这里插入图片描述

  • 一个CKG中的CK均来自于同一个DG中的硬盘,CKG具有RAID属性(RAID属性实际配置在Tier上),CK和CKG均属于系统内部对象,由存储系统自动完成配置,对外不体现。

Extent

在这里插入图片描述

  • 一个Extent归属于一个Volume或一个LUN,Extent大小在创建存储池时可以进行设置,创建之后不可更改,不同存储池的Extent大小可以不同,但同一存储池中的Extent大小是统一的。

Grain

在这里插入图片描述

  • Thin LUN以Grain为单位映射到LUN,对于Thick LUN,没有该对象。

Volume & LUN

在这里插入图片描述

  • 一个Volume对象用于组织同一个LUN的所有Extent、Grain逻辑存储单元,可动态申请释放Extent来增加或者减少Volume实际占用的空间。

多路径技术

在这里插入图片描述

  • 用户数据从主机侧到磁盘阵列,经历的典型路径为:主机 -> SAN网络 -> 存储系统机头-> 存储系统磁盘。
  • 所谓多路径技术,即在一台主机和存储阵列端使用多条路径连接,使主机到阵列的可见路径大于一条,其间可以跨过多个交换机,避免在交换机处形成单点故障。如上右图中,主机到存储阵列的可见路径有2条,即 (1,3)(2,4 ),该路径上有两台独立的交换机。在这种模式下,当路径1断开时,数据流会在主机多路径软件的导引下选择路径(2,4 )到达存储阵列侧,同样在左侧交换机失效时,也会自动导引到右侧交换机到达存储阵列。在路径1恢复的情况下,IO流会自动切回原有路径下发。整个切换和恢复过程对主机应用透明,完全避免了由于主机和阵列间的路径故障导致IO中断。
  • 存储系统冗余保护方案涉及了这个路径上的所有领域,在主机侧和SAN网络领域,通过结合UltraPath多路径软件及其它多路径软件,保证了前端路径没有单点故障;在存储机头侧,使用了全冗余硬件及热插拔技术实现了双控双活的冗余保护;在磁盘侧,利用磁盘双端口技术及磁盘多路径技术,实现了磁盘侧冗余保护。

多路径技术原理

在这里插入图片描述

  • 多路径软件的作用:
    • 避免了同一LUN有多条路径可达导致的操作系统逻辑错误。
    • 增强了链路的可靠性,避免了因为单个链路故障而导致的系统故障。

多路径软件与OS集成方式

在这里插入图片描述

  • 一般来说,多路径软件工作在磁盘驱动之下,以提供虚拟磁盘给上层应用访问,但也可以工作在磁盘驱动之上而在LVM之下(如Linux平台的各主流多路径软件)。
  • 多路径软件在与OS集成方面主要有以下两种差异:
    • 屏蔽原生磁盘,并创建虚拟SCSI磁盘优点:
      • 安全,用户无法使用原生的冗余磁盘,避免了误操作情况下数据破坏。
      • 对上层应用透明,部署多路径软件前后磁盘无任何变化,因此不需要更改上层应用配置。
      • 兼容性更好:某些应用固定只识别标准SCSI磁盘。
    • 屏蔽原生磁盘,并创建虚拟SCSI磁盘缺点:
      • 非OS原生多路径软件需要OS驱动栈支持事件拦截机制才能实现原生磁盘屏蔽;否则就需要使用hook方式替换系统函数,存在与第三方驱动共存风险。
  • 不拦截原生磁盘,额外创建虚拟磁盘优点:
    • 与第三方驱动共存兼容性较好。
  • 不拦截原生磁盘,额外创建虚拟磁盘缺点:
    • 用户可以使用原生的冗余磁盘,误操作情况下可能导致数据破坏
    • 需要上层应用更新配置。
    • 存在兼容性问题。

UltraPath功能


Failover

在这里插入图片描述

  • 当同一存储控制器有多条路径连接到主机,当LUN归属于该控制器时,当主路径故障时,会优先选择同控制器的其他端口的路径。
  • UltraPath在路径故障时可以自动将IO转移到其他可用路径,流程如下图所示:
    1. 应用向UltraPath生成的虚拟磁盘下发IO。
    2. UltraPath将IO转发给一个path 1(即SCSI设备)。
    3. 路径故障导致该path 1上IO失败。
    4. UltraPath将IO重新下发给另一个path 2。
    5. path 2返回IO成功。
    6. UltraPath向上层应用返回IO成功。

Failback


  • U1traPath在检测到路径故障恢复后会自动重新把I0下发到该路径。
  • 路径恢复有两种方式:
    • 对于支持热拔插的系统(如Windows) ,主机与存储之间的链路断开会导致SCSI设备被删除,相应的在链路恢复后会触发重新创建SCSI设备,对于这种场景U1traPath可以立即感知到路径恢复;
    • 对于不支持热拔插的系统(如AIX、低版本的Linux),U1 traPath通过周期例测感知路径恢复。

磁盘可靠性技术

硬盘可靠性

在这里插入图片描述

  • 电气部分和软件的作用是驱动机械部分完成数据的存取。

硬盘失效分类

在这里插入图片描述

  • UNC:Uncorrectable。
  • 硬盘坏道产生原因:
    • 逻辑坏道,如:磁头附着有污渍,硬盘内部有颗粒粉尘,外界干扰导致磁头飞行不稳定,写操作意外中断(例如断电),振动等。
    • 物理坏道,如:盘片本身有暇疵,硬盘内部金属颗粒,外界冲击导致头碟接触(HDI)等。
    • 磁头退化,如:磁头遭受静电击穿或过电流ESD/EOS,磁头来料质量问题,硬盘工作环境恶劣加速老化(温度高,电压不稳等)等

硬盘智能扫描和坏道修复

在这里插入图片描述

  • 硬盘坏道很多是由于写的时候造成,或者是擦伤,这些坏道是无法实时发现的,只能在数据读取时才发现。
  • 因此,硬盘坏道的后台扫描就十分重要了,否则等数据读取时,有可能RAID条带上的两个数据都是坏的,就无法恢复了。
  • 硬盘的容量越来越大,如果简单的逐个扇区扫描,一次扫描的周期会超过1个月甚至几个月,实际上就失去了及时发现坏道的效果。
  • 华为存储,研究坏道产生的原理规律:1、如果一个扇区损坏,其周围的扇区也可能有损坏;2、如果某个时间发现坏块,这段时间内其他扇区发生损坏的概率也高。
  • 根据该规律,设计了跳跃式扫描算法:间隔跳跃式检查硬盘部分扇区,但发现坏道时,检查附近的扇区,并提升检查速度,当坏道发现减少时,降低检查速度。
  • 现在后台扫描的准确度和及时率已经提升了数倍。

硬盘智能在线诊断系统

在这里插入图片描述

  • 优势:解决NPF问题(由于硬盘Firmware异常,短暂外部振动等偶发原因导致的硬盘软失效),减小RAID失效几率,最大程度保证业务连续性和数据可靠性。
  • 据统计,SATA硬盘年故障率约为2.5%,其中70%为可修复坏道。以30天为周期对硬盘进行周期性扫描,就意味着硬盘坏道每30天被全部发现并修复一次。由此,可以计算出实现硬盘介质扫描技术之后,硬盘年故障率可降低到λ=2.5%×0.3+2.5%×0.7×30/365= 0.89%,Raid组失效率可以降低约1个数量级。
    可以通过两种途径来检测硬盘坏道。
  • 读写失败自动分析。硬盘读写失败可能有多种原因,如硬盘磁头损坏、硬盘接口损坏、连接线缆损坏、硬盘被拔出等。当硬盘读写失败发生时,存储系统会根据系统当前状态、硬盘当前状态、IO失败信息等进行综合分析,判断该次读写失败原因是否为硬盘坏道。
  • 硬盘介质主动扫描。存储系统还支持硬盘介质后台扫描技术,利用硬盘空闲周期检查硬盘介质,及时发现硬盘坏道,避免累积错误。存储系统的硬盘介质扫描,摈弃了顺序读取硬盘所有扇区的传统方式,直接使用硬盘的内建介质扫描功能,避免了硬盘扫描对后端带宽的占用,将对系统性能的影响降到最低。当对正在进行介质扫描的硬盘进行读写时,扫描动作自动停止,转而处理读写操作,在读写停止之后,硬盘可以从之前的断点继续扫描。

硬盘预拷贝

在这里插入图片描述

  • 硬盘有自身的故障预测机制,但该机制,用硬盘厂商自身的话说,很不准确。
  • 因为华为存储,在硬盘自身机制基础上,设计了自己的预测机制,把预测准确度提升了数倍。
  • 技术原理:
    • 系统硬盘进行健康监控,当发现硬盘错误统计超过设定阈值后,立即报硬盘即将失效
    • RAID组通过拷贝的方式,将数据从疑似故障盘中迁移到热备空间,同时向管理人员告警,提醒更换疑似故障盘。
  • 技术优势:大大降低RAID组重构事件发生的概率,提高系统的可靠性。

慢IO快速响应

在这里插入图片描述

  • 硬盘是机械部件,偶尔一些IO比较慢是正常的,普通的应用也感觉不到。但对于客户的核心应用来讲,一般都对访问时延很敏感,这时慢的IO可能会影响应用甚至业务中断。
  • 华为存储,充分利用RAID技术,当某些硬盘IO比较慢时,及时放弃该硬盘IO,而改用读取其他硬盘的数据来校验生成该盘数据,从而尽快返回核心应用需要的数据。这样就有效保证了核心应用的业务连续性。
  • 技术原理:
    • 硬盘由于处理物理坏道、磁头问题、振动等异常,内部进行多次retry,IO响应时间过长(秒级),导致业务卡顿或者中断
    • 系统对下发给硬盘的IO进行时间监控,如果超过设定阈值,则通过RAID组降级读快速响应主机
  • 技术优势:快速响应业务,真正支撑对时延敏感的企业核心关键业务

RAID重构技术简介

在这里插入图片描述
OceanStor存储系统针对硬盘采用了多重故障容错设计,具有硬盘在线诊断、DHA(Disk Health Analyzer,硬盘故障诊断与预警)、坏道后台扫描、坏道修复等多种可靠性保障,RAID2.0+技术会根据热备策略自动在硬盘域中预留一定数量的热备空间,用户无需进行设置,当系统自动检测到硬盘上某个区域不可修复的介质错误或整个硬盘发生故障时,系统会自动进行重构,将受影响的数据块数据快速重构到其他硬盘的热备空间中,实现系统的快速自愈合。

RAID重构技术原理

在这里插入图片描述

  • 容量的增长使得传统RAID不得不面临一个严重的问题:10年前重构一块硬盘可能只需要几十分钟,而如今重构一块硬盘需要十几甚至几十个小时。越来越长的重构时间使得企业的存储系统在出现硬盘故障时长时间处于非容错的降级状态,存在极大的数据丢失风险,存储系统在重构过程中由于业务和重构的双重压力导致数据丢失的案例也屡见不鲜。
  • 基于底层块级虚拟化的RAID2.0+技术由于克服了传统RAID重构的目标盘(热备盘)性能瓶颈,使得重构数据流的写带宽不再成为重构速度的瓶颈,从而大大提升了重构速度,降低了双盘失效的概率,提升了存储系统的可靠性。
  • 图中显示了传统RAID和RAID2.0+两种技术重构原理的对比:
    • 左图传统RAID中,HDD0~HDD4五块硬盘创建RAID5,HDD5为热备盘,当HDD1故障后,HDD0、HDD2、HDD3、HDD4通过异或算法将重构的数据写入HDD5中;
    • 在右图的RAID2.0+示意图中,当HDD1故障后,故障盘HDD1中的数据按照CK的粒度进行重构,只重构已分配使用的CK(图中HDD1的CK12 和 CK13),存储池中所有的硬盘都参与重构过程,重构的数据分布在多块硬盘中(图中的HDD4和HDD9)。






推荐阅读
  • 高端存储技术演进与趋势
    本文探讨了高端存储技术的发展趋势,包括松耦合架构、虚拟化、高性能、高安全性和智能化等方面。同时,分析了全闪存阵列和中端存储集群对高端存储市场的冲击,以及高端存储在不同应用场景中的发展趋势。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
  • Ubuntu 环境下配置 LAMP 服务器
    本文详细介绍了如何在 Ubuntu 系统上安装和配置 LAMP(Linux、Apache、MySQL 和 PHP)服务器。包括 Apache 的安装、PHP 的配置以及 MySQL 数据库的设置,确保读者能够顺利搭建完整的 Web 开发环境。 ... [详细]
  • 利用ZFS和Gluster实现分布式存储系统的高效迁移与应用
    本文探讨了在Ubuntu 18.04系统中利用ZFS和Gluster文件系统实现分布式存储系统的高效迁移与应用。通过详细的技术分析和实践案例,展示了这两种文件系统在数据迁移、高可用性和性能优化方面的优势,为分布式存储系统的部署和管理提供了宝贵的参考。 ... [详细]
  • SSAS入门指南:基础知识与核心概念解析
    ### SSAS入门指南:基础知识与核心概念解析Analysis Services 是一种专为决策支持和商业智能(BI)解决方案设计的数据引擎。该引擎能够为报告和客户端应用提供高效的分析数据,并支持在多维数据模型中构建高性能的分析应用。通过其强大的数据处理能力和灵活的数据建模功能,Analysis Services 成为了现代 BI 系统的重要组成部分。 ... [详细]
  • Linux系统快捷键大全及使用技巧
    本文详细介绍了Linux系统中的各种快捷键,包括命令行和VIM编辑器中的常用快捷键,帮助用户提高操作效率。同时,文章还提供了关于字体配置、软件安装等方面的实用信息。 ... [详细]
  • CentOS7通过RealVNC实现多人使用服务器桌面
    背景:公司研发团队通过VNC登录到CentOS服务器的桌面实现软件开发工作为防止数据外泄,需要在RealVNC设置禁止传输文件、访问粘贴板等策略过程&# ... [详细]
  • 花生壳内网穿透:实现企业智能网关远程管理和维护
    随着物联网技术的发展,企业对智能网关的需求日益增加。本文介绍如何利用花生壳内网穿透技术,实现企业智能网关的远程管理和维护,提高效率,降低成本。 ... [详细]
  • 1.前言PAP和CHAP协议是目前的在PPP(MODEM或ADSL拨号)中普遍使用的认证协议,CHAP在RFC1994中定义,是一种挑战响应式协议&#x ... [详细]
  • 开发笔记:empireCMS 帝国cms功能总结 ... [详细]
  • 本文探讨了SSD购买后是否需要进行4K对齐的问题,并详细解释了4K对齐的原理及其重要性。通过对比机械硬盘与固态硬盘的结构,文章深入分析了4K对齐对SSD性能的影响,并提供了具体的对齐方法。 ... [详细]
  • TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得
    TypeScript 实战分享:Google 工程师深度解析 TypeScript 开发经验与心得 ... [详细]
  • 为了向用户提供虚拟应用程序,通常会在基础架构中部署StoreFront或Web Interface。为了确保安全的远程访问,通常需要在DMZ中配置Secure Gateway或Access Gateway。本文详细对比了这两种界面工具的功能特性,包括用户管理、安全性、性能优化等方面,为企业选择合适的解决方案提供了全面的参考。 ... [详细]
  • 考前准备方面,我的考试时间安排在上午11点至12点,只需提前20分钟到达考场的接待休息区即可。由于我居住在福田区,交通便利,可以选择多种方式前往考场。为了确保顺利通过考试,我建议考生提前熟悉考试流程和环境,并合理规划出行时间,以保持良好的心态和状态。此外,考前复习应注重理论与实践相结合,多做模拟题,加强对重点知识点的理解和掌握。 ... [详细]
  • 本文深入探讨了ASP.NET中ViewState、Cookie和Session三种状态管理技术的区别与应用场景。ViewState主要用于保存页面控件的状态信息,确保在多次往返服务器过程中数据的一致性;Cookie则存储在客户端,适用于保存少量用户偏好设置等非敏感信息;而Session则在服务器端存储数据,适合处理需要跨页面保持的数据。文章详细分析了这三种技术的工作原理及其优缺点,并提供了实际应用中的最佳实践建议。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有