数据中心床围栏护栏如何选择?

本篇中我们来设计一个邻近区域服务,用来寻找附近的场所,比如餐馆、酒店、电影院和博物馆等,是类似于Yelp这种寻找附近的餐馆或者在谷歌地图上寻找最近的加油站,这类功能的核心组件。一、细化问题,明确设计边界仅有一个名字是不够的,我们可以通过下列问题来进一步细化需求:用户能否指定搜索范围?如果范围内没有足够的结果,系统要不要扩展搜索?最大的搜索范围是多少?用户能否在界面上切换搜索范围?具体的业务信息是否能增加、修改和删除?这些操作要不要实时生效?用户在使用过程中可能同时也在移动,搜索的结果也会不同,要不要自动刷新?我们把边界框定如下:我们需要在指定范围内搜索,用户可以在界面上切换选项,比如500m、1km、2km、5km、20km。商户信息需要支持增加、删除、修改,可以在第二天生效。假定用户的移动速度是相对较慢的,不需要持续刷新页面。功能需求基于用户的位置(经纬度)和范围,返回商户信息。商户信息可以增加、删除和更新,但是不需要实时反映出来。用户可以查阅商户的详细信息。非功能需求低延迟,用户可以快速看到周边商户的信息。数据隐私,位置信息属于隐私信息,当我们设计LBS服务的时候,始终需要考虑用户隐私的问题,需要符合诸如GDPR之类的法律法规。高可用与扩展性,确保系统在峰值时刻可以应对来自热点地区的激增流量。初步估算我们初步估算一下规模,大致了解一下面临的挑战。假定日活用户1亿,商户2亿。平均每个用户搜索5次,用户分布在全球各个时区,搜索的QPS大致在5000左右。二、概要设计API设计我们使用RESTful的风格来设计API。GET /v1/search/nearby这个接口根据特定的搜索条件返回商户。在真实的应用中一般还要考虑分页,但眼下先不提。请求参数:字段描述类型latitude给定位置的纬度decimallongitude给定位置的经度decimalradius可选,默认值是5000米Int{
“total”: 10,
“businesses”: [{business object}]
}范围的商户对象包含了渲染搜索结果页所需要的东西,不过到详情页之后还需要诸如图片、评论、评分之类额外的信息。因此当用户点进商户详情页之后,通常还需要新的接口来获取详细信息。GET /v1/businesses/:id 返回一个商户的详细信息POST /v1/businesses 添加一个商户PUT /v1/businesses/:id 更新商户的详情DELETE /v1/businesses/:id 删除一个商户如果你想了解更加真实而完善的搜索API,可以参考Google Places API和Yelp的接口。数据模型读写比例由于搜索近邻商户和查阅商户详情的功能十分常用,因此读取的量是很大的。另一方面,写入的量相对较小,增加、删除、修改商户信息的操作都比较低频。对于这种以读取为主的场景,MySQL这样的关系型数据库是比较合适的,让我们一起看下数据结构的设计。数据结构核心的数据表有两个:商户表和地理索引表。商户表保存商户的详细信息,主键是bisuness_id,其它字段还有address、city、state、country、latitude和longitude。地理索引表用于高效处理空间操作,涉及一些geohash的内容,后面会详细展开。概要设计概要设计如下图所示。系统整体分两大块:基于位置的服务(LBS)和商户相关的服务。让我们逐一查看这些组件。负载均衡器负载均衡器可以自动将入站流量分配到多个服务节点上。一般情况下,公司会有单一的DNS入口,然后在内部对API调用进行路由,根据URL路径匹配对应的服务。基于位置的服务(LBS)LBS服务根据给定的位置和半径寻找近邻的商户,是系统的核心组件,具有如下的特点:都是读取的服务,没有写入请求。QPS很高,尤其是在热点地区和时段。服务是无状态的,适合水平扩展。商户服务商户服务主要处理两类请求:商户的创建、更新和删除,这些请求都是写操作,QPS不高。用户查阅商户详情,在热点时段的QPS很高。数据库集群数据库集群使用主从结构,主库处理所有的写入请求,由多个副本负责处理读取操作。数据首先保存到主库,然后同步到从库中。由于同步过程有延迟,LBS所读取的数据和主库之间可能会存在不一致的情况。由于我们的商户信息不需要实时更新,因而这些不一致是可以接受的。商户服务和LBS的可扩展性商户服务和LBS都是无状态的服务,可以在高峰时刻通过添加更多服务器来应对流量,在非高峰时段移除服务器。如果系统部署在云上,我们可以规划不同的可用区域,进一步提升可用性。寻找商户的算法在现实中,人们使用现成的空间数据库,比如Redis的Geohash,或者Postgres的PostGIS扩展。这里我们暂且不谈,试试看手搓一个地理空间索引。寻找近邻商户有几种不同的方案,我们列举一些选项,讨论优缺点。方案一:二维搜索最朴素也最符合直觉的做法是根据坐标和半径直接搜索,伪代码SQL如下:SELECT business_id, latitude, longitude
FROM business
WHERE (latitude BETWEEN {:my_lat} - radius AND {:my_lat} + radius)
AND (longitude BETWEEN {:my_long} - radius AND {:my_long} - radius)这种方式需要扫描全表,效率很低。我们能否对经纬度所在的列进行索引呢?如果索引,可以提升效率吗?答案是否定的。问题在于数据是二维的,每个维度上返回的数据量都很大。比如纬度中的1度,代表的是环绕地球的一整圈。即便通过数据库索引提升了某一个维度的搜索速度,在另一个维度上就无能为力了。那么我们能否将二维的数据映射到一维呢?答案是肯定的。我们先来看几种不同的索引方法。广义来说,地理位置索引有两种:哈希:Even Grid、Geohash、cartesian tiers等树:quadtree、Google S2、RTree等 尽管这些方法底层的实现各不相同,但指导理念是相同的,那便是“将地图划分为更小的区域,构建索引,快速搜索”。在上述方法中,geohash、quadtree和Google S2是在实际生产中最常用的,让我们逐一了解。方案二:平均划分好的网格 一个简单的方案是将全世界平均划分为小网格,一个格子中包含多个商户,每个商户只属于一个格子。这个方案也不是不能用,但有一个重大的缺陷:商户的分布并不平均。比如纽约的市中心有许多商户,而沙漠和海洋的格子里面压根没有商户。仅仅将地图平均划分,会产生十分不平衡的数据分布。理想中,应该在稠密地区使用更细粒度的格子,在稀疏区域使用粗粒度的格子。另一个挑战是在固定的网格中寻找近邻的格子。方案三:GeohashGeohash比平均划分网格的方案好一些,它将二维的经纬度映射为字母和数字构成的一维字符串。Geohash算法递归地将世界切分为更小的格子,每个各自占据一个比特位。我们从整体上来看一下geohash是如何工作的。首先,根据赤道和子午线将地球划分为四个区域。 维度范围[-90, 0]用0表示维度范围[0, 90]用1表示经度范围[-180, 0]用0表示经度范围[0, 180]用1表示其次,将每个格子划分为四个更小的格子,通过不同的经纬度比特位来表示每个格子。 不断重复,直到网格的精度达到要求。Geohash通常使用base32的表示,下面是俩例子:谷歌总部的geohash:1001 10110 01001 10000 11011 11010,base32的表示为9q9hvu。Meta总部的geohash:1001 10110 01001 10001 10000 10111,base32的表示为9q9jhr。Geohash的精度(也叫作层级)有12等,如下表所示。比较常用的4到6之间到层级,6以上的格子太小,4以下的格子太大。Geohash的长度格子表示的宽度和高度15,009.4km x 4,992.6km(地球的大小)21,252.3km x624.1km3156.5km x 156km439.1km x 19.5km54.9km x 4.9km61.2km x 609.4m7152.9m x 152.4m838.2m x 19m94.8m x 4.8m101.2m ×59.5cm1114.9cm x 14.9cm123.7cm x 1.9cm我们应该如何选择正确的精度?格子中最小的长度可以覆盖用户选择的搜索半径即可,两者的对应关系如下表所示:搜素半径Geohash长度0.5km61km52km55km420km4这个方法在大部分情况下都管用,不过要谨慎处理geohash边界相关的边缘情况。一般情况下,两个geohash共享的前缀越长,它们就越是接近,从前面的例子也可以看的出来。边界问题之一:上述规则反过来并不成立。因为位于子午线和赤道两侧的位置分属世界不同的“半边”。比如,法国的La Roche-Chalais(geohash:u000)距离Pomerol(geohash:ezzz)仅仅30km,但是不共享任何的前缀。由于这个边界因素,下面这样通过SQL查询前缀就没有办法获取所有近邻的商户。SELECT * FROM geohash_index WHERE geohash LIKE ‘9q8zn%’边界问题之二:两个位置共享很长的前缀,但是分属不同的geohash。解决方案是,不仅要获取当前格子中的商户,还要获取邻近格子中的。邻近区域的geohash可以在固定时间内计算出来。另外还有个问题:当前格子和邻近格子中的商户加起来也不够怎么办?一个办法是当前范围内有多少就返回多少,最方便,缺点也最明显,没有足够的结果来满足用户的需求。另一个办法是扩展搜索范围。我们可以去掉geohash的最后一位,使用这个新的geohash来获取邻近的商户。如果还是没有足够多的结果,则再去掉一位,以此类推,直至返回的结果超过所要的数量。方案四:Quadtree另一个流行的解决方案是Quadtree,又叫四叉树。四叉树是一种数据结构,常用于分割二维空间,递归地将其划分为四个小格子,直至其内容满足特定的条件。比如,可以设置条件,不断划分空间,直至格子中的商户数量不多于100个。有了四叉树之后,我们可以在内存中构建这么个树,以供查询。注意,四叉树是一种内存数据结构,而非数据库方案。它运行在每个LBS服务器上,在服务器启动的时候进行构建。下图展示的是将整体不断切分为四叉树的逻辑过程。 下图是个例子,假设全世界一共有200M商户,然后从根节点开始分为四块,不断递归,直至没有哪个节点中的商户超过100个。 构建这种四叉树的伪代码如下:public void buildQuadtree(TreeNode node) {
if (countNumberOfBusinessInCurrentGrid(node) > 100) {
node.subdivide();
for (TreeNode child: node.getChildren()) {
buildQuadtree(child);
}
}
} 关于四叉树,还要考虑如下的问题:保存整个四叉树需要多少内存?为了回答这个问题,我们可以分门别类看下保存的各种数据。类别描述尺寸叶节点左上角和右下角的坐标,框定格子范围32字节(8x4)叶节点格子中商户的所有ID每个ID有8字节x100(商户数量)叶节点小计832字节枝干节点左上角和右下角的坐标,框定格子范围32字节(8x4)枝干节点4个子节点的指针32字节(8x4)枝干节点小计64字节尽管我们构建四叉树的时候需要用到网格中商户的数量,但这个数字本身并不需要保存在四叉树的节点中,可以从数据库的记录中推断出来。了解清楚每个节点的结构,接下来是内存的实际开销。每个格子最多包含100个商户叶节点的数量大约是200M/100=~2M枝干节点的数量是2M/3=~0.67M(枝干节点是叶节点数量的三分之一,可以通过数学方式推导出来)总的内存开销便是2M x 832字节 + 0.67M x 64字节 =~1.71GB。即便再算上一些额外的开销,构建四叉树的内存开销也不算大。乍一看,一台服务器便可以装下整个四叉树,那我们是不是就只需要一台服务器呢?当然不是,还要考虑读取的请求,一台服务器的CPU和带宽是不够的,需要将读取负载分散到各个服务器上。构建整个四叉树需要多少时间?总商户数量是n,每个叶节点上不超过100个商户,构建四叉树的时间复杂度便是(n/100)log(n/100)。对于200M个商户,可能需要几分钟的时间。如何通过四叉树获取周围的商户?在内存中构建四叉树。四叉树构建完成之后,从根节点遍历,直至找到当前搜索的位置。如果其所在叶节点包含100个商户,直接返回节点内容;否则,加上邻近节点的商户,凑够数量再返回。四叉树在运维方面的考量上文提到,对于包含200M家商户的四叉树,在服务器启动的时候需要几分钟才能构建完毕,这么长的启动时间对于运维的影响是不得不考量的。在四叉树构建的过程中,服务器是不能对外提供服务的。因此,我们需要增量式的滚动更新服务器,每次只更新一小部分服务器,避免集群的大部分服务变得不可用,最终服务挂掉。这里也可以使用蓝绿部署的策略,但是新服务器同时向数据库请求200M条商户信息也会对系统造成很大的压力。总的来说,这个问题是可以解决的,不过会进一步提升设计复杂度。另一个运维方面的考量是如何在商户新增和删除的时候更新四叉树。最简单的方案是增量重构四叉树,每次重构一小部分服务器上的树,直至完成整个集群的更新。但这也意味着有些服务器会在一段时间内返回过时的数据。不过这在需求层面一般都是可以接受的折衷,甚至可以通过商业条款约定第二天生效。这样我们就可以在夜间任务中更新缓存。不过这样会有一个隐患,即同时会有许多的键同时失效,对缓存服务器造成不小的压力。当然我们也可以在商户增加或删除的时候实时更新四叉树,不过这会使设计变得复杂,如果还要考虑多线程并发访问的时候。并发锁的引入也会使得四叉树的实现更困难。方案五:Google S2谷歌的S2几何库是这个领域的另一个重要方案,也是一种内存解决方案。它基于希尔伯特曲线(一种空间填充曲线)将球体映射为一维索引。希尔伯特曲线有一个十分重要的特性:在希尔伯特曲线上相邻的两个点,在一维索引上的距离也很近。在一维空间中搜索远比在二维空间上效率高。有兴趣的读者可以在网上找一些关于希尔伯特空间的工具练练手。S2是一个复杂的库,原理不需要所有人都理解,但是由于其广泛应用于Google、Tinder这样的大公司,其优势还是有必要说下的。S2可以在任意精度层面上覆盖任意区域,因此适合用来做地理围栏。根据维基百科的解释,“地理围栏是一种虚拟的围栏,围住一块真实的地理区域。地理围栏可以动态生成,既可以是距离某个位置一定半径范围内的区域,也可以是一组预先定义好的边界(比如邻居的围墙或者学校的校园)。”通过地理围栏,我们可以圈住一块特定的区域,当有人跑出来的时候可以立刻通知用户,这比本文说的近邻服务使用场景更加丰富。S2的另一个优势是区域覆盖算法。相较于geohash的固定精度,我们可以在S2中指定最小精度、最大精度、最大格子等。其中的格子尺寸是灵活多变的。更多详情可以参考S2工具的文档。方案推荐为了高效地寻找附近的商户,我们讨论了一系列可选方案:geohash、四叉树和S2。我们从下表看到,不同的公司和产品选择了不同的方案。地理索引公司geohash必应地图、Redis、MongoDB、Lyft四叉树Yext同时支持geohash和四叉树ElasticSearchS2谷歌地图、Tinder结束这一节之前,我们快速比较一下geohash和四叉树Geohash易于使用和实现,不需要构造树结构支持返回特定范围内的商户如果geohash的精度确定了,那么网格的大小也就确定了,不能根据数据密度动态调整大小。如果要支持动态调整,就需要更复杂的逻辑。更新索引十分方便,如果要从索引中去除某个商户,只需要找到对应的索引记录,删除其中指定的商户即可。四叉树由于需要构建一棵树,所以实现略复杂一些。可以获取K个邻近的商户。有时候我们只希望返回K个近邻的商户,而无所谓这些商户是否位于特定的范围内。比如,当你出门在外,车里的油不够了,你可能就只关心K个最近的加油站。即便这些加油站离你不近,但是app仍然需要返回这些结果。对于这类查询,四叉树就特别合适,因为其可以根据数字K不断拆分,也可以自动调整查询范围,直至找到K个结果。它可以根据密度动态调整网格大小。对于索引的更新要比geohash更加复杂。四叉树是一种树型数据结构。如果我们需要删除某个商户,就需要从根节点遍历到叶节点,才能完成删除。比如下图展示的例子,我们想要删除一个ID=2的商户,就需要从根节点一路找到叶节点,这个过程的时间复杂度商户O(log(n))。一旦涉及多线程访问,则需要引入同步锁,实现就会更加复杂。另外,如果某个叶节点上没有空间容纳新增加的商户,此时对于树的再平衡也很复杂。预先留些余量可能会缓解一下问题。 三、深入设计到这里,读者应该已经对系统的全貌有个概念了,下面我们深入个别具体的领域进行设计。数据库的扩展这里主要关注的是两个核心表的扩展:商户表和地理索引表。商户表商户表的数据可能一台服务器还装不下,所以需要提前考虑分片工作。最简单的方案就是根据商户的ID进行分片。这种分片机制可以使得负载平摊到所有的分片上,维护起来也更加方便。地理索引表Geohash和四叉树的使用都十分广泛,简便起见这里以geohash为例子。下面是两种不同的表设计方案。方案一:针对每个geohash的键,保存一个JSON数组,数组中包含商户的ID。也就是说,某一个geohash范围内所有的商户ID都保存在同一行中。方案二:如果同一个geohash对应着多个商户,每一个商户都独自占据一条记录。不同的数据行中,geohash可能是相同的。我们的建议是方案二,处于下面的理由:在方案一中,如果需要更新一个商户,则需要获取整个商户ID的数组,遍历数组,再找到对应的商户。如果要新增一个商户,我们同样要扫描整个数组,确保没有重复。我们还需要对数组加锁,以免并发修改。这种边缘情况特别多。对于方案二,两列(geohash和商户ID)共同构成了组合键,商户的增删就十分便捷,也无需加锁。在扩展地理索引表的时候,一个常见的错误是直奔对应的分片,而不考虑数据表的实际大小。在我们的场景中,整个地理索引表不算大(四叉树索引只需要1.71GB内存,geohash的存储空间需求也是类似的)。不过虽然整个地理索引一台服务器完全装得下,但是考虑到读取的流量,单台数据库服务器的CPU和带宽很可能不够。这种情况下就需要将读取的请求分散到多个数据库服务器上。一般来说,关系型数据库服务器的扩展有两种方案,一是增加读副本,另一个是分片。这里对于geohash来说,分片的逻辑很复杂,需要侵入到应用层,也没有特别坚实的技术原因支持分片,因为一台服务器就容得下。所以这里使用一系列只读副本来分担读请求才是更合理的方案,也更易于开发和维护。缓存一般在介绍缓存层之前,我们不妨先问问自己,是否真的需要一个缓存层。真正要让缓存发挥作用,还是要仔细思考一下的:主要的负荷都是读取,而且数据集的规模相对不大。数据完全可以放进现代服务器的工作内存中,此时查询就不受限于I/O,其运行速度和内存缓存是一样的。如果读取性能成为了瓶颈,我们可以增加数据库的只读副本来提升读取吞吐量。所以在探讨缓存的时候要注意进行性能测试和成本分析,如果缓存可以满足业务需求,然后再深入设计缓存方案。缓存的主键选择缓存主键的时候,最直白的就是以用户的位置坐标(经纬度)为缓存主键。但是这么做有一些缺陷:从移动设备获取的坐标只是一种估计,不准确的。即便站在原地不动,每次获取的坐标也会略微不同。用户会从一个地方移动到另一个地方,使得位置坐标发生轻微变化。对于大部分应用而言,这个变化意义是不大的。因此,位置坐标不是一个好的缓存主键。理想中,即便位置有些许变化,也应该映射到相同的缓存键。前文提到的geohash和四叉树就解决了这个问题,它们将同一个网格内的所有商户都映射到了相同的geohash中。缓存的数据类型我们需要缓存两类数据以提升系统性能。geohash -> 网格中商户ID的清单由于商户信息是相对稳定不变的,我们可以预先计算给定geohash中的商户ID清单,保存在Redis这类键值存储中。让我们看一个具体的例子第一步:获取指定geohash对应的商户ID清单。SELECT business_id FROM geohash_index WHERE geohash LIKE `{:geohash}%`第二步:如果缓存没有命中,就将结果保存保存在Redis中。Public List<String> getNearbuBusinessIds(String geohash) {
String cacheKey = hash(geohash)
List<String> listOfBusinessIds = Redis.get(cacheKey);
if (listOfBusinessIds == null) {
listOfBusinessIds = {Run the select SQL query above};
Cache.set(cacheKey, listOfBusinessIds, ‘1d’)
}
return listOfBusinessIds
}当有商户被增加、修改或删除的时候,更新数据库,然后使缓存失效。由于这类操作的量是很小的,因而也无需锁机制。根据需求,用户可以在客户端选择0.5km、1km、2km和5km四种搜索半径,对应的geohash长度分别为4、5、5和6。为了快速获取不同半径的数据,我们在Redis中缓存三个精度的数据(geohash_4、geohash_5、geohash_6)。我们的需求是200M的商户,每个商户ID是8字节,每个商户都要保存在3个精度中,那么缓存所需的总的空间便是:8字节 x 200M x 3 =~ 5GB现代的Redis服务器内存基本都能放得下这些数据。不过出于高可用和低延迟的考虑,我们会在全球部署Redis集群,每个节点都包含相同的数据。商户ID -> 商户对象 这种数据的缓存就比较直接了,缓存主键是商户的ID,值是商户对象,包含商户名字、地址、图片地址等等。部署区域和可用区我们将LBS服务部署在了多个不同区域的可用区中,有如下的好处:确保用户和系统在物理空间上更近。比如美国西海岸的用户会连接那个区域的数据中心,欧洲的用户会连接欧洲的数据中心。可以更加灵活地根据人口分配流量。比如日韩这种人口密度较高的,可以设置单独的区域,或者在多个可用区部署服务。隐私法规。有的国家要去用户数据的使用和保存只能在本国境内。这时候就需要在对应国家设置区域,部署DNS路由,将来自该国的请求都转发到那个区域。根据时间或商户类型进行过滤你可能还会面临这样的需求,比如,如何返回当前正在营业的商户?如何只返回餐馆?当我们使用geohash或者四叉树将地图分割为小块之后,从搜索结果返回的数据量相对较小,因此可以先获取商户ID的列表,然后合并商户对象,再基于营业时间或商户类型进行过滤。最终架构图把所有内容整合起来,得到如下的架构图。获取近邻服务的流程你试图在Yelp上寻找500m范围内的餐馆。客户端将用户位置(维度=37.776720,经度=-122.416730)和搜索半径(500m)发送到负载均衡。负载均衡将请求转发给LBS。根据用户位置和半径,LBS寻找符合条件的geohash长度。通过查询长度表,得到geohash的长度为6。LBS计算近邻的geohash,加入列表中。结果类似下面这种:list_of_geohashes = [my_geohash, neighbor1_geohash, neighbor2_geohash, …, neighbor8_geohash]对于列表中的每个geohash,LBS调用“geohash”Redis服务器,获取对应的商户ID。这个过程可以并行化,降低延迟。根据返回的商户ID,LBS再次调用商户信息的Redis服务器,合成完整的商户信息,然后计算商户和用户之间的距离,排序,返回最终结果。查看、更新、增加和删除商户所有和商户有关的API都和LBS分离。如果要查阅商户的详细信息,商户服务首先检查商户信息的Redis服务器上是否有数据。如果有缓存数据,就直接返回客户端;否则从数据库集群中获取数据,再保存到Redis缓存中,以便后续请求直接从缓存中获取结果。由于需求上来说,增加和更新商户可以第二天才生效,缓存数据可以通过夜间任务进行更新。四、设计总结本篇中,我们展示了近邻服务的设计,是一个用到空间索引的典型LBS服务。我们讨论了若干索引方式:二维搜索平均分割的网格Geohash四叉树谷歌S2Geohash、四叉树和S2广泛用于不同的技术公司中,我们选择geohash作为例子,展示地理索引如何工作。在深入设计环节,我们讨论了为什么缓存有助于降低延迟,应该缓存什么内容,如何使用缓存快速获取近邻商户。我们还讨论了数据库的分片和副本。我们还看了如何将LBS服务部署于不同的区域中以提高可用性,是用户和服务器的物理距离更近,更符合当地的隐私法律。看到这里,本篇基本告一段落,也感谢各位读者。
在数据中心的任何东西,要经过深谋远虑和精心规划,才能很好地将真正的解决方案和不切实际的方案之间的差异体现出来。人们在这几年里已经看到了很多的例子,下面分享一下数据中心围笼的经验教训:
当工作人员在数据中心划分安全区域时,需要提供一个灵活的、经济实惠的围笼解决方案完成工作。然而,在数据中心的任何东西,要经过深谋远虑和精心规划,才能很好地将真正的解决方案和不切实际的方案之间的差异体现出来。人们在这几年里已经看到了很多的例子,下面分享一下数据中心围笼的经验教训:
1.使用专门为数据中心设计的围笼
用链式栅栏或围栏标准建设围笼,可以节省成本,这是很有诱惑力的。但人们已经看到许多这样的尝试,其中没有一个被认为是成功的。有很多理由让他们清楚这些“做”的方法,最大的原因就是节省了成本,但最终是在浪费时间。企业认为为数据中心建造的围笼会省却很多麻烦。
2.检查围笼的孔隙大小
企业把一些最敏感的储物架上锁,没有钥匙,没有人能进去,所以这是安全的,真是这样吗?如果有人把网络电缆连接到一个机架上,然后将其从笼子里的一个洞里伸进去,那么会发生什么事?用一点时间和耐心,就会可以很容易地将网线直接插入设备。然而,许多数据中心的机架在设计上没考虑这种明显的进入方式。最好的做法是机架笼子开口小于一个RJ45连接器,从而降低这类风险。
3.使笼子很难拆卸
许多数据中心的围笼有一个“致命弱点”,就是可以使用一个可调节的扳手就可以拆卸。只要用扳手松开几个螺栓,机架笼一整块可以去掉。如果企业是关注符合安全标准,暴露的螺栓是一个隐患。一些围笼系统提供了没有办法隐藏外露的螺栓,这就给用户留下另一个需要解决的问题。因此一定要选择一个隐藏所有螺栓的围笼解决方案,使其不能被从外部拆开。
4.考虑天花板和地板
正如人们可能已经猜到的,当在设计围笼系统时,必须考虑上部和下部的空间防护,以符合安全标准。可能有人通过天花板和攀越围笼进入安全区?或者通过拆除地砖,在底下爬入的方式?如果想实现符合安全法规则的话,那么这些情况必须得到解决。有些机架笼子供应商提供天花板的解决方案,使它相对容易地封装围笼顶部。然而,为了防止从下面的地板进入,可以创建自制的围栏或路障。这并不容易,但可以做一些先进的规划或发挥一些创造力。关键是从各个角度来看待这个安全区,要确保关闭所有可能的入口点。
5.规划围笼入口
出人意料的是,有很多规划要考虑围笼的入口。首先,会面对摆动门与滑门的问题。一些围笼系统无法容纳推拉门,这迫使要让出很多入口空间,在寸土寸金的数据中心,这些看似微小的细节将会增加更多的成本,因此在设计规划时一定要未雨绸缪。另外一个重要的考虑因素是围笼入口锁定系统的问题。门会自动关闭吗?它会自动锁定,或者只能从外面锁定?因此在仔细规划,否则可能会有一些不好的结果。例如,如果工作人员无法从内部锁上门,他们可以在“安全”的区域工作时,这个大门将会长时间开放。
6.熟悉自己的义务
数据中心不同的设备和存储数据都部署在安全区中,则可能会受到许多安全标准限制,如SSAE16,HIPAA,PCI或SOC2等标准规范。在某些情况下,立法规定提供了对敏感数据应该被保护的具体指导方针,所以在进行规划之前,一定要确保企业熟悉自已的所有义务。
7.美学问题
企业在先进的安全软件和设备方面投入巨资,安装了最先进的安全摄像机和出入门禁系统,并实施了严格的安全协议和流程。所有这一切在客户参观时将会展示其先进性和安全性。然而,当客户在数据中心的安全分区参观时,看到一个拼凑的业余水平的镀锌钢结构建筑围栏时,他们会怎么想?显然,这会让人产生巨大的失望,并对企业的安全性产生怀疑。事实上,围笼要以更加专业外观的解决方案替代。这表明在一个竞争激烈的市场中,美学是多么重要的。请在规划数据中心围笼的解决方案时记住这一点!河南亿恩科技股份有限公司(www.enkj.com)始创于2000年,专注服务器托管租用,是国家工信部认定的综合电信服务运营商。亿恩为近五十万的用户提供服务器托管、服务器租用、机柜租用、云服务器、网站建设、网站托管等网络基础服务,另有网总管、名片侠网络推广服务,使得客户不断的获得更大的收益。
服务器/云主机 24小时售后服务电话:0371-60135900
虚拟主机/智能建站 24小时售后服务电话:0371-55621053
网络版权侵权举报电话:0371-60135995
服务热线:0371-60135900
标签
数据中心
分享到:责任编辑:小柳

我要回帖

更多关于 床围栏护栏 的文章