高可用共享文件系统(内部文件共享系统)

网友投稿 661 2023-02-01


本篇文章给大家谈谈高可用共享文件系统,以及内部文件共享系统对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享高可用共享文件系统的知识,其中也会对内部文件共享系统进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

nfs hdfs gfs tfs区别

nfs hdfs gfs tfs的各项区别:

nfs通过rpcbind这个服务去跟客户端通信的。NFS网络文件系统一般被用来存储共享视频,图片,附件等静态资源(一般把网站用户上传的文件都放到NFS共享里, 例如BBS 产品的图片,附件,头次昂,注意网站BBS程序不要放NFS共享里)。

NFS是当前互联网系统架构中最常用的数据存储服务之一,特别是对中小型企业来讲是非常合适的一个分布式文件系统,大公司或门户除了使用NFS外,还可能会使用MFS,GFS,FASTDFS,TFS等分布式文件系统。

TFS(Taobao FileSystem)是一个高可扩展、高可用、高性能、面向互联网服务的分布式文件系统,其设计目标是支持海量的非结构化数据。

目前,国内自主研发的文件系统可谓凤毛麟角。淘宝在这一领域做了有效的探索和实践,Taobao File System(TFS)作为淘宝内部使用的分布式文件系统,针对海量小文件的随机读写访问性能做了特殊优化,承载着淘宝主站所有图片、商品描述等数据存储。

HDFS 参照了它所以大部分架构设计概念是类似的,比如 HDFS NameNode 相当于 GFS Master,HDFS DataNode 相当于 GFS chunkserver。 

但还有些细节不同的地方,所以本文主要分析下不同的地方。

总结如下:

分布式文件系统(Distributed File System,DFS)是指文件系统管理的物理存储资源不一定直接连接在本地节点上,而是通过计算机网络与节点(可简单的理解为一台计算机)相连;或是若干不同的逻辑磁盘分区或卷标组合在一起而形成的完整的有层次的文件系统。

分布式文件存储系统通过什么方式提高可用性和安全性

一。分布式Session的几种实现方式1.基于数据库的Session共享 2.基于NFS共享文件系统 3.基于memcached 的session,如何保证 memcached 本身的高可用性? 4. 基于resin/tomcat web容器本身的session复制机制 5. 基于TT/Redis 或 jbosscache 进行 session 共享。6. 基于cookie 进行session共享或者是:一、Session Replication 方式管理 (即session复制)简介:将一台机器上的Session数据广播复制到集群中其余机器上使用场景:机器较少,网络流量较小优点:实现简单、配置较少、当网络中有机器Down掉时不影响用户访问缺点:广播式复制到其余机器有一定廷时,带来一定网络开销二、Session Sticky 方式管理简介:即粘性Session、当用户访问集群中某台机器后,强制指定后续所有请求均落到此机器上使用场景:机器数适中、对稳定性要求不是非常苛刻优点:实现简单、配置方便、没有额外网络开销缺点:网络中有机器Down掉时、用户Session会丢失、容易造成单点故障三、缓存集中式管理简介:将Session存入分布式缓存集群中的某台机器上,当用户访问不同节点时先从缓存中拿Session信息使用场景:集群中机器数多、网络环境复杂优点:可靠性好缺点:实现复杂、稳定性依赖于缓存的稳定性、Session信息放入缓存时要有合理的策略写入二。Session和Cookie的区别和联系以及Session的实现原理1、session保存在服务器,客户端不知道其中的信息;cookie保存在客户端,服务器能够知道其中的信息。 2、session中保存的是对象,cookie中保存的是字符串。 3、session不能区分路径,同一个用户在访问一个网站期间,所有的session在任何一个地方都可以访问到。而cookie中如果设置了路径参数,那么同一个网站中不同路径下的cookie互相是访问不到的。 4、session需要借助cookie才能正常<nobr oncontextmenu="return false;" onmousemove="kwM(3);" id="key3" onmouseover="kwE(event,3, this);" style="COLOR: #6600ff; BORDER-BOTTOM: 0px dotted; BACKGROUND-COLOR: transparent; TEXT-DECORATION: underline" onclick="return kwC();"onmouseout="kwL(event, this);" target="_blank"工作</nobr。如果客户端完全禁止cookie,session将失效。http是无状态的协议,客户每次读取web页面时,服务器都打开新的会话,而且服务器也不会自动维护客户的上下文信息,那么要怎么才能实现网上商店中的 购物车呢,session就是一种保存上下文信息的机制,它是针对每一个用户的,变量的值保存在服务器端,通过SessionID来区分不同的客 户,session是以cookie或URL重写为基础的,默认使用cookie来实现,系统会创造一个名为JSESSIONID的输出cookie,我 们叫做session cookie,以区别persistentcookies,也就是我们通常所说的cookie,注意session cookie是存储于浏览器内存中的,并不是写到硬盘上的,这也就是我们刚才看到的JSESSIONID,我们通常情是看不到JSESSIONID的,但 是当我们把浏览器的cookie禁止后,web服务器会采用URL重写的方式传递Sessionid,我们就可以在地址栏看到 sessionid=KWJHUG6JJM65HS2K6之类的字符串。明白了原理,我们就可以很容易的分辨出persistent cookies和session cookie的区别了,网上那些关于两者安全性的讨论也就一目了然了,session cookie针对某一次会话而言,会话结束session cookie也就随着消失了,而persistent cookie只是存在于客户端硬盘上的一段文本(通常是加密的),而且可能会遭到cookie欺骗以及针对cookie的跨站脚本攻击,自然不如 session cookie安全了。通常session cookie是不能跨窗口使用的,当你新开了一个浏览器窗口进入相同页面时,系统会赋予你一个新的sessionid,这样我们信息共享的目的就达不到 了,此时我们可以先把sessionid保存在persistent cookie中,然后在新窗口中读出来,就可以得到上一个窗口SessionID了,这样通过session cookie和persistent cookie的结合我们就实现了跨窗口的session tracking(会话跟踪)。在一些web开发的书中,往往只是简单的把Session和cookie作为两种并列的http传送信息的方式,sessioncookies位于服务器端,persistent cookie位于客户端,可是session又是以cookie为基础的,明白的两者之间的联系和区别,我们就不难选择合适的技术来开发web service了。 总之:一、cookie机制和session机制的区别 具体来说cookie机制采用的是在客户端保持状态的方案,而session机制采用的是在服务器端保持状态的方案。 同时我们也看到,由于在服务器端保持状态的方案在客户端也需要保存一个标识,所以session机制可能需要借助于cookie机制来达到保存标识的目的,但实际上还有其高可用共享文件系统他选择。 二、会话cookie和持久cookie的区别 如果不设置过期时间,则表示这个cookie生命周期为浏览器会话期间,只要关闭浏览器窗口,cookie就消失了。这种生命期为浏览会话期的cookie被称为会话cookie。会话cookie一般不保存在硬盘上而是保存在内存里。 如果设置了过期时间,浏览器就会把cookie保存到硬盘上,关闭后再次打开浏览器,这些cookie依然有效直到超过设定的过期时间。 存储在硬盘上的cookie可以在不同的浏览器进程间共享,比如两个IE窗口。而对于保存在内存的cookie,不同的浏览器有不同的处理方式。 三、如何利用实现自动登录 当用户在某个网站注册后,就会收到一个惟一用户ID的cookie。客户后来重新连接时,这个用户ID会自动返回,服务器对它进行检查,确定它是否为注册用户且选择了自动登录,从而使用户无需给出明确的用户名和密码,就可以访问服务器上的资源。 四、如何根据用户的爱好定制站点 网站可以使用cookie记录用户的意愿。对于简单的设置,网站可以直接将页面的设置存储在cookie中完成定制。然而对于更复杂的定制,网站只需仅将一个惟一的标识符发送给用户,由服务器端的数据库存储每个标识符对应的页面设置。 五、cookie的发送 1.创建Cookie对象 2.设置最大时效 3.将Cookie放入到HTTP响应报头如果你创建了一个cookie,并将高可用共享文件系统他发送到浏览器,默认情况下它是一个会话级别的cookie:存储在浏览器的内存中,用户退出浏览器之后被删除。如 果你希望浏览器将该cookie存储在磁盘上,则需要使用maxAge,并给出一个以秒为单位的时间。将最大时效设为0则是命令浏览器删除该cookie。发送cookie需要使用HttpServletResponse的addCookie方法,将cookie插入到一个 Set-Cookie HTTP请求报头中。由于这个方法并不修改任何之前指定的Set-Cookie报头,而是创建新的报头,因此我们将这个方法称为是addCookie,而 非setCookie。同样要记住响应报头必须在任何文档内容发送到客户端之前设置。 六、cookie的读取 1.调用request.getCookie 要获取有浏览器发送来的cookie,需要调用HttpServletRequest的getCookies方法,这个调用返回Cookie对象的数组,对应由HTTP请求中Cookie报头输入的值。 2.对数组进行循环,调用每个cookie的getName方法,直到找到感兴趣的cookie为止 cookie与你的主机(域)相关,而非你的servlet或JSP页面。因而,尽管你的servlet可能只发送了单个cookie,你也可能会得到许多不相关的cookie。 例如: String cookieName = “userID”; Cookie cookies[] = request.getCookies(); if (cookies!=null){ for(int i=0;iCookiecookie = cookies[i]; if (cookieName.equals(cookie.getName())){ doSomethingWith(cookie.getValue()); } } } 七、如何使用cookie检测初访者 A.调用HttpServletRequest.getCookies()获取Cookie数组 B.在循环中检索指定名字的cookie是否存在以及对应的值是否正确 C.如果是则退出循环并设置区别标识 D.根据区别标识判断用户是否为初访者从而进行不同的操作 八、使用cookie检测初访者的常见错误 不能仅仅因为cookie数组中不存在在特定的数据项就认为用户是个初访者。如果cookie数组为null,客户可能是一个初访者,也可能是由于用户将cookie删除或禁用造成的结果。但是,如果数组非null,也不过是显示客户曾经到过你的网站或域,并不能说明他们曾经访问过你的servlet。其它servlet、JSP页面以及 非Java Web应用都可以设置cookie,依据路径的设置,其中的任何cookie都有可能返回给用户的浏览器。 正确的做法是判断cookie数组是否为空且是否存在指定的Cookie对象且值正确。 九、使用cookie属性的注意问题 属性是从服务器发送到浏览器的报头的一部分;但它们不属于由浏览器返回给服务器的报头。  因此除了名称和值之外,cookie属性只适用于从服务器输出到客户端的cookie;服务器端来自于浏览器的cookie并没有设置这些属性。 因而不要期望通过request.getCookies得到的cookie中可以使用这个属性。这意味着,你不能仅仅通过设置cookie的最大时效, 发出它,在随后的输入数组中查找适当的cookie,读取它的值,修改它并将它存回Cookie,从而实现不断改变的cookie值。 十、如何使用cookie记录各个用户的访问计数 1.获取cookie数组中专门用于统计用户访问次数的cookie的值 2.将值转换成int型 3.将值加1并用原来的名称重新创建一个Cookie对象 4.重新设置最大时效 5.将新的cookie输出 十一、session在不同环境下的不同含义 session,中文经常翻译为会话,其本来的含义是指有始有终的一系列动作/消息,比如打电话是从拿起电话拨号到挂断电话这中间的一系列过程可以称之为一个session。 然而当session一词与网络协议相关联时,它又往往隐含了“面向连接”和/或“保持状态”这样两个含义。 session在Web开发环境下的语义又有了新的扩展,它的含义是指一类用来在客户端与服务器端之间保持状态的解决方案。有时候Session也用来指这种解决方案的存储结构。 十二、session的机制 session机制是一种服务器端的机制,服务器使用一种类似于散列表的结构(也可能就是使用散列表)来保存信息。但程序需要为某个客户端的请求创建一个session的时候,服务器首先检查这个客户端的请求里是否包含了一个session标识-称为sessionid,如果已经包含一个session id则说明以前已经为此客户创建过session,服务器就按照session id把这个session检索出来使用(如果检索不到,可能会新建一个,这种情况可能出现在服务端已经删除了该用户对应的session对象,但用户人为 地在请求的URL后面附加上一个JSESSION的参数)。 如果客户请求不包含session id,则为此客户创建一个session并且生成一个与此session相关联的session id,这个session id将在本次响应中返回给客户端保存。 十三、保存session id的几种方式 A.保存session id的方式可以采用cookie,这样在交互过程中浏览器可以自动的按照规则把这个标识发送给服务器。 B. 由于cookie可以被人为的禁止,必须有其它的机制以便在cookie被禁止时仍然能够把session id传递回服务器,经常采用的一种技术叫做URL重写,就是把session id附加在URL路径的后面,附加的方式也有两种,一种是作为URL路径的附加信息,另一种是作为查询字符串附加在URL后面。网络在整个交互过程中始终 保持状态,就必须在每个客户端可能请求的路径后面都包含这个sessionid。 C.另一种技术叫做表单隐藏字段。就是服务器会自动修改表单,添加一个隐藏字段,以便在表单提交时能够把session id传递回服务器。 十四、session什么时候被创建 一个常见的错误是以为session在有客户端访问时就被创建,然而事实是直到某server端程序(如Servlet)调用HttpServletRequest.getSession(true)这样的语句时才会被创建。 十五、session何时被删除 session在下列情况下被删除: A.程序调用HttpSession.invalidate() B.距离上一次收到客户端发送的session id时间间隔超过了session的最大有效时间 C.服务器进程被停止 再次注意关闭浏览器只会使存储在客户端浏览器内存中的session cookie失效,不会使服务器端的session对象失效。

五大常见的MySQL高可用方案(最全)

1. 概述

我们在考虑MySQL数据库的高可用的架构时,主要要考虑如下几方面:

如果数据库发生了宕机或者意外中断等故障,能尽快恢复数据库的可用性,尽可能的减少停机时间,保证业务不会因为数据库的故障而中断。

用作备份、只读副本等功能的非主节点的数据应该和主节点的数据实时或者最终保持一致。

当业务发生数据库切换时,切换前后的数据库内容应当一致,不会因为数据缺失或者数据不一致而影响业务。

关于对高可用的分级在这里我们不做详细的讨论,这里只讨论常用高可用方案的优缺点以及高可用方案的选型。

2. 高可用方案

2.1. 主从或主主半同步复制

使用双节点数据库,搭建单向或者双向的半同步复制。在5.7以后的版本中,由于lossless replication、logical多线程复制等一些列新特性的引入,使得MySQL原生半同步复制更加可靠。

常见架构如下:

通常会和proxy、keepalived等第三方软件同时使用,即可以用来监控数据库的 健康 ,又可以执行一系列管理命令。如果主库发生故障,切换到备库后仍然可以继续使用数据库。

优点:

架构比较简单,使用原生半同步复制作为数据同步的依据;

双节点,没有主机宕机后的选主问题,直接切换即可;

双节点,需求资源少,部署简单;

缺点:

完全依赖于半同步复制,如果半同步复制退化为异步复制,数据一致性无法得到保证;

需要额外考虑haproxy、keepalived的高可用机制。

2.2. 半同步复制优化

半同步复制机制是可靠的。如果半同步复制一直是生效的,那么便可以认为数据是一致的。但是由于网络波动等一些客观原因,导致半同步复制发生超时而切换为异步复制,那么这时便不能保证数据的一致性。所以尽可能的保证半同步复制,便可提高数据的一致性。

该方案同样使用双节点架构,但是在原有半同复制的基础上做了功能上的优化,使半同步复制的机制变得更加可靠。

可参考的优化方案如下:

2.2.1. 双通道复制

半同步复制由于发生超时后,复制断开,当再次建立起复制时,同时建立两条通道,其中一条半同步复制通道从当前位置开始复制,保证从机知道当前主机执行的进度。另外一条异步复制通道开始追补从机落后的数据。当异步复制通道追赶到半同步复制的起始位置时,恢复半同步复制。

2.2.2. binlog文件服务器

搭建两条半同步复制通道,其中连接文件服务器的半同步通道正常情况下不启用,当主从的半同步复制发生网络问题退化后,启动与文件服务器的半同步复制通道。当主从半同步复制恢复后,关闭与文件服务器的半同步复制通道。

优点:

双节点,需求资源少,部署简单;

架构简单,没有选主的问题,直接切换即可;

相比于原生复制,优化后的半同步复制更能保证数据的一致性。

缺点:

需要修改内核源码或者使用mysql通信协议。需要对源码有一定的了解,并能做一定程度的二次开发。

依旧依赖于半同步复制,没有从根本上解决数据一致性问题。

2.3. 高可用架构优化

将双节点数据库扩展到多节点数据库,或者多节点数据库集群。可以根据自己的需要选择一主两从、一主多从或者多主多从的集群。

由于半同步复制,存在接收到一个从机的成功应答即认为半同步复制成功的特性,所以多从半同步复制的可靠性要优于单从半同步复制的可靠性。并且多节点同时宕机的几率也要小于单节点宕机的几率,所以多节点架构在一定程度上可以认为高可用性是好于双节点架构。

但是由于数据库数量较多,所以需要数据库管理软件来保证数据库的可维护性。可以选择MMM、MHA或者各个版本的proxy等等。常见方案如下:

2.3.1. MHA+多节点集群

MHA Manager会定时探测集群中的master节点,当master出现故障时,它可以自动将最新数据的slave提升为新的master,然后将所有其他的slave重新指向新的master,整个故障转移过程对应用程序完全透明。

MHA Node运行在每台MySQL服务器上,主要作用是切换时处理二进制日志,确保切换尽量少丢数据。

MHA也可以扩展到如下的多节点集群:

优点:

可以进行故障的自动检测和转移;

可扩展性较好,可以根据需要扩展MySQL的节点数量和结构;

相比于双节点的MySQL复制,三节点/多节点的MySQL发生不可用的概率更低

缺点:

至少需要三节点,相对于双节点需要更多的资源;

逻辑较为复杂,发生故障后排查问题,定位问题更加困难;

数据一致性仍然靠原生半同步复制保证,仍然存在数据不一致的风险;

可能因为网络分区发生脑裂现象;

2.3.2. zookeeper+proxy

Zookeeper使用分布式算法保证集群数据的一致性,使用zookeeper可以有效的保证proxy的高可用性,可以较好的避免网络分区现象的产生。

优点:

较好的保证了整个系统的高可用性,包括proxy、MySQL;

扩展性较好,可以扩展为大规模集群;

缺点:

数据一致性仍然依赖于原生的mysql半同步复制;

引入zk,整个系统的逻辑变得更加复杂;

2.4. 共享存储

共享存储实现了数据库服务器和存储设备的解耦,不同数据库之间的数据同步不再依赖于MySQL的原生复制功能,而是通过磁盘数据同步的手段,来保证数据的一致性。

2.4.1. SAN共享储存

SAN的概念是允许存储设备和处理器(服务器)之间建立直接的高速网络(与LAN相比)连接,通过这种连接实现数据的集中式存储。常用架构如下:

使用共享存储时,MySQL服务器能够正常挂载文件系统并操作,如果主库发生宕机,备库可以挂载相同的文件系统,保证主库和备库使用相同的数据。

优点:

两节点即可,部署简单,切换逻辑简单;

很好的保证数据的强一致性;

不会因为MySQL的逻辑错误发生数据不一致的情况;

缺点:

需要考虑共享存储的高可用;

价格昂贵;

2.4.2. DRBD磁盘复制

DRBD是一种基于软件、基于网络的块复制存储解决方案,主要用于对服务器之间的磁盘、分区、逻辑卷等进行数据镜像,当用户将数据写入本地磁盘时,还会将数据发送到网络中另一台主机的磁盘上,这样的本地主机(主节点)与远程主机(备节点)的数据就可以保证实时同步。常用架构如下:

当本地主机出现问题,远程主机上还保留着一份相同的数据,可以继续使用,保证了数据的安全。

DRBD是linux内核模块实现的快级别的同步复制技术,可以与SAN达到相同的共享存储效果。

优点:

两节点即可,部署简单,切换逻辑简单;

相比于SAN储存网络,价格低廉;

保证数据的强一致性;

缺点:

对io性能影响较大;

从库不提供读操作;

2.5. 分布式协议

分布式协议可以很好解决数据一致性问题。比较常见的方案如下:

2.5.1. MySQL cluster

MySQL cluster是官方集群的部署方案,通过使用NDB存储引擎实时备份冗余数据,实现数据库的高可用性和数据一致性。

优点:

全部使用官方组件,不依赖于第三方软件;

可以实现数据的强一致性;

缺点:

国内使用的较少;

配置较复杂,需要使用NDB储存引擎,与MySQL常规引擎存在一定差异;

至少三节点;

2.5.2. Galera

基于Galera的MySQL高可用集群, 是多主数据同步的MySQL集群解决方案,使用简单,没有单点故障,可用性高。常见架构如下:

优点:

多主写入,无延迟复制,能保证数据强一致性;

有成熟的社区,有互联网公司在大规模的使用;

自动故障转移,自动添加、剔除节点;

缺点:

需要为原生MySQL节点打wsrep补丁

只支持innodb储存引擎

至少三节点;

2.5.3. POAXS

Paxos 算法解决的问题是一个分布式系统如何就某个值(决议)达成一致。这个算法被认为是同类算法中最有效的。Paxos与MySQL相结合可以实现在分布式的MySQL数据的强一致性。常见架构如下:

优点:

多主写入,无延迟复制,能保证数据强一致性;

有成熟理论基础;

自动故障转移,自动添加、剔除节点;

缺点:

只支持innodb储存引擎

至少三节点;

3. 总结

随着人们对数据一致性的要求不断的提高,越来越多的方法被尝试用来解决分布式数据一致性的问题,如MySQL自身的优化、MySQL集群架构的优化、Paxos、Raft、2PC算法的引入等等。

而使用分布式算法用来解决MySQL数据库数据一致性的问题的方法,也越来越被人们所接受,一系列成熟的产品如PhxSQL、MariaDB Galera Cluster、Percona XtraDB Cluster等越来越多的被大规模使用。

随着官方MySQL Group Replication的GA,使用分布式协议来解决数据一致性问题已经成为了主流的方向。期望越来越多优秀的解决方案被提出,MySQL高可用问题可以被更好的解决。

HDFS的高可用性

由于namenode在内存中维护系统中的文件和数据块的映射信息,所以对于一个海量文件的集群来说,内存将成为系统横向扩展瓶颈。Hadoop在2.x的版本引入了联邦HDFS(HDFS Federation),通过在集群中添加namenode实现。

Federation的架构:

1、每个namenode相互独立,单独维护一个由namespace元数据和数据块池(block pool)组成的命名空间卷(namespace volume)——图中的NS-x。

2、数据块池包含该命名空间下文件的所有数据块。命名空间卷相互独立,两两间互不通信,即使一个namenode挂掉,也不会影响其他namenode

3、datanode被用作通用的数据存储设备,每个datanode要向集群中所有的namenode注册,且周期性的向所有namenode发送心跳和报告,并执行来自所有namenode的命令

4、当一个namespace被删除后,所有datanode上与其对应的block pool也会被删除。当集群升级时,每个namespacevolume作为一个基本单元进行升级。

虽然引入了多个namenode管理多份namespace,但是对于单个namenode,依然存在单点故障问题(Single point of failure),如果某个namenode挂掉了,那么所有客户端都无法操作文件。

联邦hdfs仍然需要引入secondary namenode。直到secondary namenode满足以下所有条件时,才能提供服务:

1、将命名空间镜像导入内存

2、重演编辑日志

3、接收到足够的来自datanode的块映射报告并退出安全模式。

保障集群的可用性,可以使用NAS共享存储。主备namenode之间通过NAS进行元数据同步。但是有一下缺陷:

1、硬件设备必须支持NAS

2、部署复杂,部署完namenode还需要在NFS挂载、解决NFS的单点及脑裂,容易出错

3、无法实现同一时间只能有一个namenode写数据

Hadoop2针对以上问题增加了QJM(Quorum Journal Manager),由多个JN组成,一般配置为奇数个。QJM中有一对active-standby的namenode。当active namenode失效时,standby namenode会接管它继续提供服务。

工作原理如下:

1、namenode之间通过一组 journal node 共享编辑日志,standby namenode接管后,需要读取整个编辑日志来与active namenode同步状态,并继续读取active namenode写入的新操作。

2、datanode需要同时向这组active-standby namenode发送数据块处理报告,因为数据块的映射信息保存在namenode的内存中。

3、客户端使用ZKFC(zookeeper failover-controller)来处理namenode失效问题,该进程运行在每个namenode上,通过heartbeat监测active namenode是否失效

4、secondary namenode的角色被standby namenode取代,由standby namenode为active namenode设置check point

5、QJM的实现没有使用zookeeper。但是在HA选举active namenode时,使用了zookeeper。

6、在某些特殊情况下(如网速慢),可能发生故障转移,这时有肯能两个namenode都是active namenode——脑裂。QJM通过fencing(规避)来避免这种现象。

Namenode(包括 YARN ResourceManager) 的主备选举是通过 ActiveStandbyElector 来完成的,ActiveStandbyElector 主要是利用了 Zookeeper 的写一致性、 临时节点和观察者机制

1、 创建锁节点: 如果 ZKFC 检测到对应的 NameNode 的状态正常,那么表示这个 NameNode有资格参加Zookeeper 的主备选举。如果目前还没有进行过主备选举的话,那么相应的会发起一次主备选举,尝试在 Zookeeper 上创建一个路径为/hadoopha/${dfs.nameservices}/ActiveStandbyElectorLock 的临时结点, Zookeeper 的写一致性会保证最终只会有一次结点创建成功,那么创建成功的 NameNode 就会成为主 NameNode, 进而切换为 Active 状态。而创建失败的 NameNode 则切换为 Standby 状态。

2、 注册 Watcher 监听: 不管创建/hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点是否成功, ZKFC 随后都会向 Zookeeper 注册一个 Watcher 来监听这个节点的状态变化事件, ActiveStandbyElector 主要关注这个节点的 NodeDeleted 事件。

3、 自动触发主备选举: 如果 Active NameNode 状态异常时, ZKFailoverController 会主动删除临时结点/hadoop-ha/ {dfs.nameservices}/ActiveStandbyElectorLock 结点的流程,如果创建成功,这个本来处于 Standby 状态的 NameNode 就选举为主 NameNode 并随后开始切换为 Active 状态。

4、 当然,如果是 Active 状态的 NameNode 所在的机器整个宕掉的话,那么根据 Zookeeper 的临时节点特性, /hadoop-ha/${dfs.nameservices}/ActiveStandbyElectorLock 节点会自动被删除,从而也会自动进行一次主备切换。

脑裂的原因

如果 Zookeeper 客户端机器负载过高或者正在进行 JVM Full GC,那么可能会导致 Zookeeper 客户端到服务端的心跳不能正常发出,一旦这个时间持续较长,超过了配置的 Zookeeper Session Timeout 参数的话, Zookeeper 服务端就会认为客户端的 session 已经过期从而将客户端的 Session 关闭。“假死”有可能引起分布式系统常说的双主或脑裂(brain-split) 现象。具体到本文所述的 NameNode,假设 NameNode1 当前为 Active 状态,NameNode2 当前为 Standby 状态。如果某一时刻 NameNode1 对应的 ZKFC 进程发生了“假死”现象,那么 Zookeeper 服务端会认为 NameNode1 挂掉了,根据前面的主备切换逻辑, NameNode2 会替代 NameNode1 进入 Active 状态。但是此时 NameNode1 可能仍然处于 Active 状态正常运行,即使随后 NameNode1 对应的 ZKFailoverController 因为负载下降或者 Full GC 结束而恢复了正常,感知到自己和 Zookeeper 的 Session 已经关闭,但是由于网络的延迟以及 CPU 线程调度的不确定性,仍然有可能会在接下来的一段时间窗口内NameNode1 认为自己还是处于 Active 状态。这样 NameNode1 和 NameNode2 都处于Active 状态,都可以对外提供服务。这种情况对于 NameNode 这类对数据一致性要求非常高的系统来说是灾难性的,数据会发生错乱且无法恢复。

Hadoop 的 fencing 机制防止脑裂: 中文翻译为隔离,也就是想办法把旧的 Active NameNode

隔离起来,使它不能正常对外提供服务。 ZKFC 为了实现 fencing,会在成功创建 Zookeeper临时结点 hadoop-ha/ {dfs.nameservices}/ActiveBreadCrumb 的持久节点,这个节点里面也保存了 Active NameNode 的地址信息。 正常关闭 Active NameNode时, ActiveStandbyElectorLock 临时结点会自动删除,同时, ZKFC 会删除 ActiveBreadCrumb结点。但是如果在异常的状态下 Zookeeper Session 关闭 (比如前述的 Zookeeper 假死),那么由于 ActiveBreadCrumb 是持久节点,会一直保留下来。后面当另一个 NameNode 选主成功之后,会注意到上一个 Active NameNode 遗留下来的这个节点,从而会对旧的 ActiveNameNode 进行 fencing

Hadoop ****的两种 fencing 机制:

只有在成功地执行完成 fencing 之后,选主成功的 ActiveStandbyElector 才会回调ZKFailoverController 的 becomeActive 方法将对应的 NameNode 转换为 Active 状态,开始

对外提供服务。

基于 QJM 的共享存储系统的总体架构: 基于 QJM 的共享存储系统主要用于保存EditLog,并不保存 FSImage 文件。 FSImage 文件还是在 NameNode 的本地磁盘上。

QJM共享存储的基本思想来自于 Paxos 算法,采用多个称为 JournalNode 的节点组成的JournalNode 集群来存储 EditLog。每个 JournalNode 保存同样的 EditLog 副本。

每次NameNode 写 EditLog 的时候,除了向本地磁盘写入 EditLog 之外,也会并行地向JournalNode 集群之中的每一个 JournalNode 发送写请求,只要大多数 (majority) 的

JournalNode 节点返回成功就认为向 JournalNode 集群写入 EditLog 成功。如果有 N 台JournalNode,那么根据大多数的原则,最多可以容忍有 (N-1)/2 台 JournalNode 节点挂掉。 基于 QJM 的共享存储系统的数据同步机制: Active NameNode 和 StandbyNameNode 使用JouranlNode 集群来进行数据同步的过程如图所示, Active NameNode 首先把 EditLog 提交到 JournalNode 集群,然后 Standby NameNode 再从 JournalNode 集群定时同步 EditLog

linux下常用的分布式文件系统有哪些

常见的分布式文件系统有高可用共享文件系统,GFS、HDFS、Lustre 、Ceph 、GridFS 、mogileFS、TFS、FastDFS等。各自适用于不同的领域。它们都不是系统级的分布式文件系统,而是应用级的分布式文件存储服务。
GFS(Google File System)
--------------------------------------
Google公司为高可用共享文件系统了满足本公司需求而开发的基于Linux的专有分布式文件系统。。尽管Google公布了该系统的一些技术细节,但Google并没有将该系统的软件部分作为开源软件发布。
下面分布式文件系统都是类 GFS的产品。

HDFS
--------------------------------------
Hadoop 实现了一个分布式文件系统(Hadoop Distributed File System),简称HDFS。 Hadoop是Apache Lucene创始人Doug Cutting开发的使用广泛的文本搜索库。它起源于Apache Nutch,后者是一个开源的网络搜索引擎,本身也是Luene项目的一部分。Aapche Hadoop架构是MapReduce算法的一种开源应用,是Google开创其帝国的重要基石。

Ceph
---------------------------------------
是加州大学圣克鲁兹分校的Sage weil攻读博士时开发的分布式文件系统。并使用Ceph完成了高可用共享文件系统他的论文。
说 ceph 性能最高,C++编写的代码,支持Fuse,并且没有单点故障依赖, 于是下载安装, 由于 ceph 使用 btrfs 文件系统, 而btrfs 文件系统需要 Linux 2.6.34 以上的内核才支持。
可是ceph太不成熟了,它基于的btrfs本身就不成熟,它的官方网站上也明确指出不要把ceph用在生产环境中。

Lustre
---------------------------------------
Lustre是一个大规模的、安全可靠的,具备高可用性的集群文件系统,它是由SUN公司开发和维护的。
该项目主要的目的就是开发下一代的集群文件系统,可以支持超过10000个节点,数以PB的数据量存储系统。
目前Lustre已经运用在一些领域,例如HP SFS产品等。 关于高可用共享文件系统和内部文件共享系统的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 高可用共享文件系统的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于内部文件共享系统、高可用共享文件系统的信息别忘了在本站进行查找喔。

版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:springboot中使用自定义两级缓存的方法
下一篇:连接共享文件夹提示限制(共享文件上限)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~