月度归档:2015年06月

Hadoop MapReduce工作原理

1.剖析MapReduce作业运行机制

1).经典MapReduce--MapReduce1.0

整个过程有有4个独立的实体

  • 客户端:提交MapReduce
  • JobTracker:协调作业的运行
  • TaskTracker:运行作业划分后的任务
  • HDFS:用来在其他实体之间共享作业文件

以下为运行整体图

A.作业的提交

JobClient的runJob是用于新建JobClient实例并调用其submitJob()方法的便捷方式,提交Job后,runJob()每秒轮询检测作业的进度,随时监控Job的运行状态。

其中JobClient的submitJob()方法所实现的作业提交过程:

  • 向JobTracker请求一个新的作业ID
  • 检查作业的输出说明
  • 计算作业的输入分片
  • 将运行作业所需要的资源(Jar文件,配置文件和计算所得输入分片)复制到一个作业ID命名的目录下JobTracker的文件系统中。

B.作业的初始化

JobTracker接收对其提交的作业后,会把这个调用放入一个队列,交由作业调度器调度,初始化。初始化包括创建一个表示正在运行作业的对象---封装任务和记录信息,以便跟踪任务的状态和进程

C.任务的分配

TaskTracker运行简单的循环来对JobTracker发送心跳,告知自己的是否存活,同时交互信息,对于map任务和reduce任务,TaskTracker会分配适当的固定数量的任务槽,理想状态一般遵循数据本地化,和机架本地化

D.任务的执行

第一步:TaskTracker拷贝JAR文件到本地,第二部:TaskTracker新建本地目录,将JAR文件加压到其下面;第三步:TaskTracker新建一个TaskRunner实例运行该任务。

Streaming和Pipes可运行特殊的Map和Reduce任务,Streaming支持多语言的编写,Pipes还可以与C++进程通信,如下图:

E.进程和状态的更新

通过Job的Status属性对Job进行检测,例如作业云习惯状态,map和reduce运行的进度、Job计数器的值、状态消息描述等等,尤其对计数器Counter(计数器)属性的检查。状态更新在MapReduce系统中的传递流程如下

F.作业的完成

当JobTracker收到Job最后一个Task完成的消息时候便把Job的状态设置为”完成“,JobClient得知后,从runJob()方法返回

2).Yarn(MapReduce 2.0)

Yarn出现在Hadoop 0.23和2.0版本中,相对前面 MapReduce的性能有不少的提高

相比较MapReduce1.0,JobTracker在MRv2 中被拆分成了两个主要的功能使用守护进程执行:资源管理和任务的调度与监视。这个想法创建一个全局的资源管理(global ResourceManager (RM))和为每个应用创建一个应用管理(ApplicationMaster (AM))。一个应用可以使一个MR jobs的经典场景或者是一串连续的Job

ResourceManager 和每个slave节点的NodeManager (NM)构成一个资源估算框架。ResourceManager 对在系统中所有应用的资源分配拥有最终的最高级别仲裁权。其中ResourceManager 拥有两个主要的组件:调度器(Scheduler) 和资源管理器(ApplicationsManager)

实际上每个应用的ApplicationMaster(AM)是资源估算框架具体用到的lib包,被用来和ResourceManager 进行资源谈判,并且为NodeManager执行和监控task

整体如下图:

综上,在Hadoop Yarn中有5个独立的实体

  • 客户端:用来提交MapReduce作业(Job)的
  • Yarn ResourcesManager:用来管理协调分配集群中的资源
  • Yarn NodeManager:用来启动和监控本地计算机资源单位Container的利用情况
  • MapReduce Application Master:用来协调MapReduce Job下的Task的运行。它和MapReduce Task 都运行在 Container中,这个Container由RM(ResourcesManager)调度并有NM(NodeManager)管理
  • HDFS:用来在其他实体之间共享作业文件

整体如下:

A.作业的提交

Job提交相似于MapReduce1.0.当在配置文件中设置mapreduce.framework.name为yarn时 候,MapReduce2.0继承接口ClientProtocol的模式就激活了,RM生成新的Job ID(从Yarn的角度看是Application ID---步骤2),接着Job客户端计算输入分片,拷贝资源(包括Job JAR文件、配置文件,分片信息)到HDFS(步骤3),最后用submitApplication函数提交Job给RM(步骤4)

B.作业的初始化

RM接受到由上面的A提交过来的调用,将其请求给调度器处理,调度器分配Container,同时RM在NM上启动Application Master进程(步骤5a和5b),AM主函数MRAppMatser会初始化一定数量的记录对象(bookkeeping)来跟踪Job的运行进度, 并收取task的进度和完成情况(步骤6),接着MRAppMaster收集计算后的输入分片

之后与MapReduce1.0又有所不同,此时Application Master会决定如何组织运行MapReduce Job,如果Job很小,能在同一个JVM,同一个Node运行的话,则用uber模式运行(参见源码)

C.任务的分配

如果不在uber模式下运行,则Application Master会为所有的map和reducer task向RM请求Container,所有的请求都通过heartbeat(心跳)传递,心跳也传递其他信息,例如关于map数据本地化的信息,分片所 在的主机和机架地址信息,这信息帮主调度器来做出调度的决策,调度器尽可能遵循数据本地化或者机架本地化的原则分配Container

在Yarn中,不像MapReduce1.0中那样限制map或者reduce的slot个数,这样就限制了资源是利用率,Yarn中非配资源更具 有灵活性,可以在配置文件中设置最大分配资源和最小分配资源,例如,用yarn.scheduler.capacity.minimum- allocation-mb设置最小申请资源1G,用yarn.scheduler.capacity.maximum-allocation-mb设置 最大可申请资源10G 这样一个Task申请的资源内存可以灵活的在1G~10G范围内

D.任务的执行

分配给Task任务Container后,NM上的Application Master就联系NM启动(starts)Container,Task最后被一个叫YarnChild的main类执行,不过在此之前各个资源文件已 经从分布式缓存拷贝下来,这样才能开始运行map Task或者reduce Task。PS:YarnChild是一个(dedicated)的JVM

Streaming 和 Pipes 运行机制与MapReduce1.0一样

E.进程和状态的更新

当Yarn运行同时,Task和Container会报告它的进度和状态给Application Master,客户端会每秒轮询检测Application Master,这样就随时收到更新信息,这些信息也哭通过Web UI来查看

F.作业的完成

客户端每5秒轮询检查Job是否完成,期间需要调用函数Job类下waitForCompletion()方法,Job结束后该方法返回。轮询时间间隔可以用配置文件的属性mapreduce.client.completion.pollinterval来设置

2.失败情况

1)经典MapReduce---MapReduce1.0

A.TasK失败

第一种情况:map或reduce任务中的用户代码抛出运行异常,此时子进程JVM进程会在退出之前想TaskTracker发送错误报告,错误报 告被记录错误日志,TaskTracker会将这个任务(Task)正在运行的Task Attempt标记为失败,释放一个任务槽去运行另外一个Task Attempt

第二种情况:子进程JVM突然退出Task Tracker会注意到JVM退出,并将此Task Attempt标记为失败

JobTracker通过心跳得知一个Task Attempt失败后,会重启调度该Task的执行,默认情况下如果失败4次不会重试(通过mapred.map.max.attempts可改变这个次数),整个Job也会标记为失败

B.TaskTracker失败

如果TaskTracker由于崩溃或者运行过慢失败,则停止向JobTracker发送心跳,JobTracker会注意到这点并将这个TaskTracker从等待任务调度TaskTracker池中移除

即使TaskTracker没有失败,也有可能因为失败任务次数远远高于集群的平均失败次数,这种情况会被列入黑名单,在重启后才将此TaskTracker移出黑名单

C.JobTracker失败

JobTracker失败是是最严重的是爱,此时只得重新开始提交运行

2).Yarn失败

A.Task(任务)的失败

情况与MapReduce1.0相似,其中Task Attempt失败这个消息会通知Application Master,由Application Master标记其为失败。当Task失败的比例大于mapreduce.map.failures.maxpercent(map)或者 mapreduce.reduce.failures.maxpercent(reduece)时候,Job失败

B.Application Master的失败

与前面相似,当Application Master失败,会被标记为失败,这是RM会立刻探寻到AM(Application Master)的失败,并新实例化一个AM和借助NM建造新的相应的Container,在设置 yarn.app.mapreduce.am.job.recovery.enable为true情况下失败的AM能够恢复,并且恢复后并不返回。默认情 况下,失败AM会让所有的Task返回

如果客户端轮询得知AM失败后,经过一段时间AM失败状态仍然没有改变,则重新想RM申请相应的资源

C.Node Manager的失败

NM失败时,会停止向RM发送心跳,则RM会将这个NM从可用的NM池中移出,心态间隔时间可由yarn.resourcemanager.nm.liveness-monitor.expiry-interval-ms设置,默认是10分钟

如果NM上Application失败次数过高,此NM会被列入黑名单,AM会在不同Node上运行Task

D.Resources Manager的失败

RM的失败是最严重,离开了RM整个系统将陷入瘫痪,所以它失败后,会利用checkpoint机制来重新构建一个RM,详细配置见权威指南和Hadoop官网

3.作业的调度

1).FIFO Scheduler

这个调度是Hadoop默认d ,使用FIFO调度算法来运行Job,并且可以设置优先级,但是这个FIFO调度并不支持抢占,所以后来的高优先级的Job仍然会被先来低优先级的Job所阻塞

2)Fair Scheduler

Fair Scheduler的目标是让每个用户公平的享有集群当中的资源,多个Job提交过来后,空闲的任务槽资源可以以"让每个用户公平共享集群"的原则被分配,某个用户一个很短的Job将在合理时间内完成,即便另一个用户有一个很长的Job正在运行

一般Job都放在Job池当中,默认时,每个用户都有自己的Job池,当一个用户提交的Job数超过另一个用户时,不会因此得到更多的集群资源

另外Fair Scheduler支持抢占,如果一个池的资源未在一段时间内公平得到集群资源,那么Fair Scheduler会从终止得到多余集群资源的Task,分给前者。

3).Capacity Scheduler

Capacity Scheduler中,集群资源会有很多队列,每个队列有一定的分配能力,在每个队列内会按照FIFO Scheduler去分配集群资源。

4.shuffle和排序

在Hadoop Job运行时,MapReduce会确保每个reducer的输入都按键排序,并且执行这个排序过程---将map的输出所谓reducer的输入---称为shuffle,从许多方面看来,shuffle正是map的心脏。

以下掩盖了一些细节,并且新版Hadoop,在这一块有修改

1).map端

MapTask都一个环形的内存缓冲区,之后当缓冲区被占用内到达一定比例(比如80%),会启用spill线程将缓冲区中的数据写入磁盘,写入磁 盘前,spill线程会据根据最终要送达的reduce将数据划分为相应的partition,每个partition中,线程会按照键进行内排序 (Haoop2.0显示的用的是快排序),当spill线程执行处理最后一批MapTask的输出结构后,启用merger合并spill文件,如果设置 Combiner,那接下来执行Combine函数,合并本地相同键的文件

2).reduce端

接下来运行ReduceTask,其中的Fetch的线程会从Map端以HTTP方式获取相应的文件分区,完成复制map的输出后,reducer 就开始排序最后运行merger把复制过来的文件存储在本地磁盘。(PS:在Yarn中 Map和Reduce之间的数据传输用到了Netty以及Java NIO 详见源代码)

这里需要注意的是:每趟合并目标是合并最小数量的文件以便满足最后一趟的合并系数,eg:有40个文件,我们不会再4趟中,每趟合并10个文件然后 得到4个文件,相反第一堂只合并4个文件,最后的三趟每次合并10个文件,在最后的一趟中4个已经合并的文件和余下的6个文件(未合并)进行10个文件的 合并(见下图),其实这里并没有改变合并次数,它只是一个优化措施,尽量减少写到磁盘的数据量,因为最后一趟总是合并到reduce(?这个地方合并来源来自内存和磁盘,减少了从内存的文件数,所以减少最后一次写到磁盘的数据量)

从Map到Reducer数据整体传输过程如下:

3)配置的调优

调优总的原则给shuffle过程尽量多提供内存空间,在map端,可以通过避免多次溢出写磁盘来获得最佳性能(相关配置 io.sort.*,io.sort.mb),在reduce端,中间数据全部驻留在内存时,就能获得最佳性能,但是默认情况下,这是不可能发生的,因为 一般情况所有内存都预留给reduce含函数(如需修改 需要配置mapred.inmem.merge.threshold,mapred.job.reduce.input.buffer.percent)

5.Task的执行

1).任务执行环境

Hadoop为MapTask和ReduceTask提供了运行环境相关信息,例如MapTask可以找到他所处理文件的名称,通过为mapper和reducer提供一个configure()方法实现,表可获得下图中的Job的配置信息。

Hadoop设置Job的配置参数可以作为Streaming程序的环境变量。

2).推测执行(Speculative Execution)

Speculative Execution机制的为了解决Hadoop中出现缓慢某些Task拖延整个Job运行的问题,Speculative Execution会针对那些慢于平均进度的Task启动Speculative Task,此时如果原Task在Speculative Task前完成,则Speculative Task会被终止,同样的,如果Speculative Task先于原Task完成则原来的Task会被终止

默认情况下Speculative Execution是启用的,下面的属性可以控制是否开启该功能:

3).Output Committers

Hadoop MapReduce利用commit协议确保在Job或者Task运行期间插入是适当的操作,无论他们成功完成或者失败,在新的API中OutputCommitter由接口OutputFormat决定,

下面是OutputCommitter的API:

public abstract class OutputCommitter {

    public abstract void setupJob(JobContext jobContext) throws IOException;

    public void commitJob(JobContext jobContext) throws IOException {
    }

    public void abortJob(JobContext jobContext, JobStatus.State state)
            throws IOException {
    }

    public abstract void setupTask(TaskAttemptContext taskContext)
            throws IOException;

    public abstract boolean needsTaskCommit(TaskAttemptContext taskContext)
            throws IOException;

    public abstract void commitTask(TaskAttemptContext taskContext)
            throws IOException;

    public abstract void abortTask(TaskAttemptContext taskContext)
            throws IOException;

}

其中当将要运行Job时候运行setupJob()方法;当Job运行成功后调用commitJob()方法,并且输出目录后缀_SUCCESS; 当Job没有成功运行,则调用abortJob(),并且删除相应的输出文件;相类似Task执行成功调用commitTask()方法,Task执行失 败调用abortTask()方法,并且删掉相应生成的文件

4).Task JVM重用

启动JVM重用后,可以让不同Task重用一个JVM,节省了重建销毁JVM的时间,在Hadoop2.0中默认情况不提供这种功能

5).跳过坏记录

在大数据中经常有一些损坏的记录,当Job开始处理这个损坏的记录时候,导致Job失败,如果这些记录并不明显影响运行结果,我们就可以跳过损坏记录让Job成功运行

一般情况,当任务失败失败两次后会启用skipping mode,对于一直在某记录失败的Task,NM或者TaskTracker将会运行一下TaskAttempt

A.任务失败

B.任务失败

C.开启skipping mode。任务失败,失败记录由TaskTracker或者NM保存

D.仍然启用skipping mode,任务继续运行,但是跳过上一次尝试失败的坏记录

在默认情况下,skipping mode是关闭的 可以用SkipBadRecords类来启用该功能

 

来源:http://www.cnblogs.com/biyeymyhjob/archive/2012/08/11/2631750.html

如何画透视图

5方法: 基本透视绘图 一点透视 两点透视法 三点透视法 零点透视

Draw Perspective Intro.jpg

透视图是一种在平面上表现空间视觉关系的绘图技巧。有很多种形式的透视图,例如单点透视、二点透视、三点透视、鸟瞰图、虫眼视图和其他的透视图形 式。本教程将讲解用单点透视来绘制在一个方格途径上表现的场景。单点透视也是一种假设有多条相互平行的线条无限延伸最后汇集到一个消失点的透视绘图方法。

方法 1: 基本透视绘图

  1. Draw Perspective Step 1.jpg
    1
    在纸的中心画一个“X”记号,作为消失点。然后从中心向你的纸张边缘绘制直线,但请确保你绘制的直线可用于你的构图中。

    广告

  2. Draw Perspective Step 2.jpg
    2
    在右边画一系列的柱子。在快要接近中心也就是那个消失点的地方,用一系列的短直线来代替柱子。
  3. Draw Perspective Step 3.jpg
    3
    在左边也画一系列的柱子,并加上竖直的长凳。记住在你画到快要接近中心也就是消失点的时候,再次用线条来代替柱子。
  4. Draw Perspective Step 4.jpg
    4
    下一步用格子图案画出人行道上的屋顶。
  5. Draw Perspective Step 5.jpg
    5
    接下来在画上勾勒出左边的房子和右边的海滩景象。
  6. Draw Perspective Step 6.jpg
    6
    最后勾勒出突出显示小路和屋顶的线条。
  7. Draw Perspective Step 7.jpg
    7
    给你的画作上墨,就算完成了。使用具有不同尖头大小的黑色钢笔或是记号笔来给你的画作上墨,以便会有一些绘图纹理上的变化。

方法 2: 一点透视

当观看者正好面对构图物体的正面时,常常采用一点透视绘图法。在这种绘图方法中,场景中的水平线和竖直线在图中仍然是水平线和竖直线,离开观看者较远的线,将会有一个倾角指向所谓的“消失点”。点击下面任一视图以近距离查看。

  1. 1
    在你的图中“确定地平线”。用硬铅笔绘制一条水平线当作地平线。地平线决定了根据地形和站在地面上的高度,观看者能看多远。
  2. 2
    “选择消失点”。消失点将决定透视的效果。作为参考,最基本的消失点设在纸张的水平中心,地平线的上面。如果你向右设置消失点,绘图看上去好像视点移到了构图对象的左边。对于某些构图对象,根据相对于地面的俯仰角,消失点也可以设置得高于或低于地平线。
  3. 3

    “勾勒出主要的构图对象”。

    • Perspective2_777.jpg

      要注意将所有的水平线和竖直线绘制得非常水平和竖直。

    • Perspective3_861.jpg

      从靠近观看者开始向远处延伸的线条,应将其画得朝向消失点方向延伸。这样能得到很好的透视效果。

  4. Perspective_595.jpg
    4
    “添加绘图的细节”。沿着你所勾勒的参考线并根据比例绘制更多的细节,丰富构图。

方法 3: 两点透视法

当构图对象的边角正对着观看者时,可以使用两点透视法,也就是有两个消失点的构图方法。此方法最适合绘制等轴测对象。

  1. 1
    在你的图中“确定地平线”。象在第一种方法里那样,草绘一条水平线当作地平线。
  2. 2
    确定视点,也就是看图人大概的视线位置。视点可能落在纸的底边的下方(纸外),你不需要实际标出该点。
  3. 3
    “确定你第一个消失点”。通常方法是以与左边成 60 度角的角度画出视线的第一条线,将你的消失点标记在这条线与地平线交叉的点。
  4. 4
    “确定你第二个消失点”。通常方法是以与右边成30度角的角度画出视线的第二条线。再次,消失点将设置在这条线与地平线的交点上。这个60度和30度的角度可以有所不同,但是从观察者的眼睛看出延伸到消失点的这两条视线的夹角必须为90度。
  5. 5
    “勾勒出主要的对象”。以完美的垂直角度画出所有的竖直线条,朝向左边的水平线绘制成以一个角度朝向左边的消失点,朝向右边的水平线绘制成以一个角度朝向右边的消失点(所有的水平线如果延伸足够远,都应该交汇于左边或是右边的消失点)。
  6. 6

    “丰富你的构图”。按照水平线的方向勾勒出主要的绘图对象。线条距离视点近或者远的时候,要按照不同的比例来勾勒出绘图对象。

     

    • Perspective_650.jpg

      先用轻的用尺子辅助画出的线(图中绿线所示)来画,以确保构图细节是符合透视效果的。最后擦除这些辅助线。

方法 4: 三点透视法

  1. 1
    “要知道三点透视法包括了两点透视法”,也就是有两个消失点的透视法加上它还有第三个透视点,也就是在竖直透视方向上的第三个消失点,就像是在地面抬头望一个高塔一样 -- 观看者面对一个观察对象竖直的边角。
  2. 2
    “三点透视法还可以扩展到四点、五点,......,等等对图中俯仰角度、倾斜或是旋转部分的透视,但是它通常基于同一部分多条平行的直线,以及把这些事实上相互平行的部分关联起来。
  3. 3
    拿楼梯这个例子来看, 不同的观察角度可以确定不同的“第三点”位置。这样就会有几个“其他的”消失点在“一些奇怪的向上到天空(或向下)的消失角度”中跑出到画纸范围以外,例 如另一个完全相同的楼梯可以(旋转过来)面向不同的角度,就像在同一张图中所示的建筑物中的前厅等。

方法 5: 零点透视

  1. 1
    想象一个没有平行线条的例如自然风景的景观。这种视图的透视对象是像歪的树、巨石、山、瓦砾、石块、碎石和沙丘等不规则形状。
  2. 2
    画这种物体的大小基本都随着距离延伸而变得越来越小,构图元素例如树枝等在背景上都变得越来越稀疏的透视图,要用纹理、暗影和较低对比度的色彩来表现渐行渐远的效果,这样远处物体的颜色变淡,色调过渡到蓝色。

小提示

  • 总是使用直尺,保证你绘制的线条是笔直的。
  • 总是用硬铅笔开始绘图。在绘图这一阶段推荐使用2H铅笔,如果你想最终绘图中看不到参考线的话,可以使用更硬的铅笔。用稍软铅笔,比如HB铅笔完成绘图。
  • Perspective_629.jpg

    一个练习的好方法是,找一处你可以看到景物消失在地平线的地方(比如铁路轨道是最好的,但是要小心火车)。坐下来开始绘制景物;然后向左(或右)移动超过5米,再画一遍。练习从不同的角度绘图,把握住消失点在哪里。

  • Click the picture to view the block lettering in a larger size...

    透视画法还可以应用到绘制三维文字和数字,以取得强烈的视觉表现效果。

警告

  • 确保绘图时你的手很干净。没有什么比因为手不干净而毁了花了好几个小时画的漂亮的绘图更伤心的了。
  • 记得先要试着轻轻地画,否则你将会在完成的绘图上看到有以前试图清除的线条。
  • 画坏了可以扔掉重来。事故总是会发生的。
  • Ordinary geometric drawings do not show perspective no matter how far lines are extended.

    这是在没有透视情况下的三维视图。坐标系统并没有消失点。这种绘图中的平行线在延伸时似乎并不收敛(靠近在一起)。

你需要准备

  • 铅笔:2H 或更硬,HB、2B 或更软
  • 纸张
  • 要绘制的一个模型对象

来源和引文

附加视频资源,学习透视图链接: http://pan.baidu.com/s/1kTnAgzd 密码: bgky

Hadoop的kerberos的实践部署

根据原文,结合从网络上查到的资料汇总起来,形成便于阅读的本文

一. Hadoop的认证机制

相关hadoop安全问题参考:大数据安全Hadoop安全模型的演进

hadoop安全认证主要涉及kerberos和HTTP SPNEGO, kerberos下面有介绍, HTTP SPNEGO 和kerberos 的介绍如下:Kerberos and SPNEGO 以及 SPNEGO

另外, 下面是一些早期网络上的有关使用SPNEGO文章,可以部分辅助理解SPNEGO
管理SPNEGO TAI:关于使用Kerberos服务主体名称的提示
如何在Notes中通过account使用SPNEGO单点登录
Kerberos原理
基于 SAML 的 WebSphere Application Server 单点登录的场景设计
跨 KDC 域的 WebSphere Web Services Security 应用中的 Kerberos 加密算法
测试驱动的单点登录

hadoop官网上的 相关安全文档地址:http://hadoop.apache.org/docs/r2.7.0/hadoop-auth/Examples.html

二. hadoop-kerberos介绍

Kerberos能解决的Hadoop安全认证问题

kerberos实现的是机器级别的安全认证,也就是前面提到的服务到服务的认证问题。事先对集群中确定的机器由管理员手动添加到kerberos 数据库中,在KDC上分别产生主机与各个节点的keytab(包含了host和对应节点的名字,还有他们之间的密钥),并将这些keytab分发到对应的 节点上。通过这些keytab文件,节点可以从KDC上获得与目标节点通信的密钥,进而被目标节点所认证,提供相应的服务,防止了被冒充的可能性。

  • 解决服务器到服务器的认证

由于kerberos对集群里的所有机器都分发了keytab,相互之间使用密钥进行通信,确保不会冒充服务器的情况。集群中的机器就是它们所宣称的,是可靠的。

防止了用户伪装成Datanode,Tasktracker,去接受JobTracker,Namenode的任务指派。

  • 解决client到服务器的认证

Kerberos对可信任的客户端提供认证,确保他们可以执行作业的相关操作。防止用户恶意冒充client提交作业的情况。

用户无法伪装成其他用户入侵到一个HDFS 或者MapReduce集群上

用户即使知道datanode的相关信息,也无法读取HDFS上的数据

用户无法发送对于作业的操作到JobTracker上

  • 对用户级别上的认证并没有实现

无法控制用户提交作业的操作。不能够实现限制用户提交作业的权限。不能控制哪些用户可以提交该类型的作业,哪些用户不能提交该类型的作业。这些由ACL模块控

Kerberos工作原理介绍

基本概念

Princal(安全个体):被认证的个体,有一个名字和口令

KDC(key distribution center ) : 是一个网络服务,提供ticket 和临时会话密钥

Ticket:一个记录,客户用它来向服务器证明自己的身份,包括客户标识、会话密钥、时间戳。

AS (Authentication Server): 认证服务器

TSG(Ticket Granting Server): 许可证服务器

kerberos 工作原理

Kerberos协议

Kerberos可以分为两个部分:

  • Client向KDC发送自己的身份信息,KDC从Ticket Granting Service得到TGT(ticket-granting ticket), 并用协议开始前Client与KDC之间的密钥将TGT加密回复给Client。此时只有真正的Client才能利用它与KDC之间的 密钥将加密后的TGT解密,从而获得TGT。(此过程避免了Client直接向KDC发送密码,以求通过验证的不安全方式)
  • Client利用之前获得的TGT向KDC请求其他Service的Ticket,从而通过其他Service的身份鉴别

Kerberos认证过程

Kerberos协议的重点在于第二部分(即认证过程):

(1)Client将之前获得TGT和要请求的服务信息(服务名等)发送给KDC,KDC中的Ticket Granting Service将为Client和Service之间生成一个Session Key用于Service对Client的身份鉴别。然后KDC将这个Session Key和用户名,用户地址(IP),服务名,有效期, 时间戳一起包装成一个Ticket(这些信息最终用于Service对Client的身份鉴别)发 送给Service, 不过Kerberos协议并没有直接将Ticket发送给Service,而是通过Client转发给Service,所以有了第 二步。

(2)此时KDC将刚才的Ticket转发给Client。由于这个Ticket是要给Service的,不能让Client看到,所以KDC用协 议开始前KDC与Service之间的密钥将Ticket加密后再发送给Client。同时为了让Client和Service之间共享那个密钥(KDC 在第一步为它们创建的Session Key),KDC用Client与它之间的密钥将Session Key加密随加密的Ticket一起返回给Client。

(3)为了完成Ticket的传递,Client将刚才收到的Ticket转发到Service. 由于Client不知道KDC与Service 之间的密钥,所以它无法算改Ticket中的信息。同时Client将收到的Session Key解密出来,然后将自己的用户名,用户地址(IP)打包成Authenticator用Session Key加密也发送给Service。

(4)Service 收到Ticket后利用它与KDC之间的密钥将Ticket中的信息解密出来,从而获得Session Key和用户名,用户地址(IP),服务名,有效期。然后再用Session Key将Authenticator解密从而获得用户名,用户地址(IP)将其与之前Ticket中解密出来的用户名,用户地址(IP)做比较从而验证 Client的身份。

(5)如果Service有返回结果,将其返回给Client。

kerberos在Hadoop上的应用

Hadoop集群内部使用Kerberos进行认证

具体的执行过程可以举例如下:

使用kerberos进行验证的原因

  • 可靠 Hadoop 本身并没有认证功能和创建用户组功能,使用依靠外围的认证系统
  • 高效 Kerberos使用对称钥匙操作,比SSL的公共密钥快
  • 操作简单 用户可以方便进行操作,不需要很复杂的指令。比如废除一个用户只需要从Kerbores的KDC数据库中删除即可。

简单来说,没有做kerberos认证的Hadoop,只要有client端就能够连接上。而且,通过一个有root的权限的内网机器,通过创建对应的linux用户,就能够得到Hadoop集群上对应的权限。

而实行Kerberos后,任意机器的任意用户都必须现在Kerberos的KDC中有记录,才允许和集群中其它的模块进行通信。

三. Java的安全机制

详细介绍请参考JAAS:灵活的Java安全机制

简单来说,用户首先使用LoginContext的接口进行登录验证。LoginContext可以配置使用不同的验证协议。验证通过后,用户得到 一个subject,里面包含凭证,公私钥等。之后,在涉及到需要进行权限认证的地方(例如,资源访问,外部链接校验,协议访问等),使用doAs函数 ()代替直接执行。

这样,java的权限认证就和用户的业务逻辑分离了。

    //一段典型的代码如下
    LoginContext lc = new LoginContext("MyExample");
    try {
    lc.login();
    } catch (LoginException) {
    // Authentication failed.
    }

    // Authentication successful, we can now continue.
    // We can use the returned Subject if we like.
    Subject sub = lc.getSubject();
    Subject.doAs(sub, new MyPrivilegedAction());

Kerberos认证协议

Kerberos是一种网络认证协议,其设计目标是通过密钥系统为客户机 / 服务器应用程序提供强大的认证服务。

简单介绍

使用Kerberos时,一个客户端需要经过三个步骤来获取服务:

  1. 认证:客户端向认证服务器发送一条报文,并获取一个含时间戳的Ticket-Granting Ticket(TGT)。
  2. 授权:客户端使用TGT向Ticket-Granting Server(TGS)请求一个服务Ticket。
  3. 服务请求:客户端向服务器出示服务Ticket,以证实自己的合法性。该服务器提供客户端所需服务,在Hadoop应用中,服务器可以是namenode或jobtracker。

为此,Kerberos需要The Key Distribution Centers(KDC)来进行认证。KDC只有一个Master,可以带多个slaves机器。slaves机器仅进行普通验证。Mater上做的修改需要自动同步到slaves。

另外,KDC需要一个admin,来进行日常的管理操作。这个admin可以通过远程或者本地方式登录。

搭建Kerberos

环境:假设我们有5个机器,分别是hadoop1~hadoop5。选择hadoop1,hadoop2,hadoop3组成分布式的KDC。hadoop1作为Master机器。

1.安装:通过yum安装即可,组成KDC。

yum install -y krb5-server krb5-lib krb5-workstation

2.配置:Kerberos的配置文件只有两个。在Hadoop1中创建以下两个文件,并同步/etc/krb5.conf到所有机器。

  1. /var/kerberos/krb5kdc/kdc.conf:包括KDC的配置信息。默认放在 /usr/local/var/krb5kdc。或者通过覆盖KRB5_KDC_PROFILE环境变量修改配置文件位置。配置示例:
    [kdcdefaults]
     kdc_ports = 88
     kdc_tcp_ports = 88
    
    [realms]
     HADOOP.COM = {
      master_key_type = aes128-cts
      acl_file = /var/kerberos/krb5kdc/kadm5.acl
      dict_file = /usr/share/dict/words
      admin_keytab = /var/kerberos/krb5kdc/kadm5.keytab
      max_renewable_life = 7d
      supported_enctypes = aes128-cts:normal des3-hmac-sha1:normal arcfour-hmac:normal des-hmac-sha1:normal des-cbc-md5:normal des-cbc-crc:normal
     }
    

    说明:

    HADOOP.COM:是设定的realms。名字随意。Kerberos可以支持多个realms,会增加复杂度。本文不探讨。大小写敏感,一般为了识别使用全部大写。这个realms跟机器的host没有大关系。
    
    max_renewable_life = 7d 涉及到是否能进行ticket的renwe必须配置。
    
    master_key_type:和supported_enctypes默认使用aes256-cts。由于,JAVA使用aes256-cts验证方式需要安装额外的jar包。推荐不使用。
    
    acl_file:标注了admin的用户权限,需要用户自己创建。文件格式是 
         Kerberos_principal permissions [target_principal]  [restrictions]
        支持通配符等。最简单的写法是
        */admin@HADOOP.COM      *
        代表名称匹配*/admin@HADOOP.COM 都认为是admin,权限是 *。代表全部权限。
    
    admin_keytab:KDC进行校验的keytab。后文会提及如何创建。
    
    supported_enctypes:支持的校验方式。注意把aes256-cts去掉。
    
  2. /etc/krb5.conf:包含Kerberos的配置信息。例如,KDC的位置,Kerberos的admin的realms 等。需要所有使用的Kerberos的机器上的配置文件都同步。这里仅列举需要的基本配置。详细介绍参考:krb5conf配置示例:
    [logging]
     default = FILE:/var/log/krb5libs.log
     kdc = FILE:/var/log/krb5kdc.log
     admin_server = FILE:/var/log/kadmind.log
    
    [libdefaults]
     default_realm = HADOOP.COM
     dns_lookup_realm = false
     dns_lookup_kdc = false
     ticket_lifetime = 24h
     renew_lifetime = 7d
     max_life = 12h 0m 0s
     forwardable = true
     udp_preference_limit = 1
    
    [realms]
     HADOOP.COM = {
      kdc = hadoop1:88
      admin_server = hadoop1:749
      default_domain = HADOOP.COM
     }
    
    [appdefaults]
    

    说明:

    [logging]:表示server端的日志的打印位置
    [libdefaults]:每种连接的默认配置,需要注意以下几个关键的小配置
       default_realm = HADOOP.COM 默认的realm,必须跟要配置的realm的名称一致。
       udp_preference_limit = 1 禁止使用udp可以防止一个Hadoop中的错误
    [realms]:列举使用的realm。
       kdc:代表要kdc的位置。格式是 机器:端口
       admin_server:代表admin的位置。格式是 机器:端口
       default_domain:代表默认的域名
    
    [appdefaults]:可以设定一些针对特定应用的配置,覆盖默认配置。
    
  3. 初始化并启动:完成上面两个配置文件后,就可以进行初始化并启动了。A.初始化数据库:在hadoop1上运行命令。其中-r指定对应realm。
    kdb5_util create -r HADOOP.COM -s
    

    如果遇到数据库已经存在的提示,可以把/var/kerberos/krb5kdc/目录下的principal的相关文件都删除掉。默认的数据库名字都是principal。可以使用-d指定数据库名字。(尚未测试多数据库的情况)。

    B.启动kerberos。如果想开机自启动,需要stash文件。

     /usr/local/sbin/krb5kdc
     /usr/local/sbin/kadmind
    

    至此kerberos,搭建完毕。

  4. 搭建Slave KDCs为了在生产环境中获得高可用的KDC。还需要搭建Slave KDCs。 TODO 经过各种努力还是不能成功同步,先放下。
  5. 测试kerberos,搭建完毕后,进行以下步骤测试Kerberos是否可用。A. 进入kadmin在kadmin上添加一个超级管理员账户,需要输入passwd
    kadmin.local
    addprinc admin/admin
    

    B. 在其它机器尝试通过kadmin连接,需要输入密码

    kinit admin/admin
    kadmin 
    

    如果能成功进入,则搭建成功。

kerberos日常操作

  • 管理员操作
    1. 登录到管理员账户: 如果在本机上,可以通过kadmin.local直接登录。其它机器的,先使用kinit进行验证。
      kadmin.local  
      
      kinit admin/admin
      kadmin 
      
    2. 增删改查账户:在管理员的状态下使用addprinc,delprinc,modprinc,listprincs命令。使用?可以列出所有的命令。
      kamdin:addprinc -randkey hdfs/hadoop1
      kamdin:delprinc hdfs/hadoop1
      kamdin:listprincs命令
      
    3. 生成keytab:使用xst命令或者ktadd命令
      kadmin:xst -k /xxx/xxx/kerberos.keytab hdfs/hadoop1
      
  • 用户操作
    1. 查看当前的认证用户:klist
    2. 认证用户:kinit -kt /xx/xx/kerberos.keytab hdfs/hadoop1
    3. 删除当前的认证的缓存: kdestroy

四. 在CM上使用Kerberos认证

在CM上使用Kerberos认证,它会帮我们创建所有的需要的Kerberos账户,并且在启动的时候自动生成keytab存放到对应的启动目录,在配置文件中添加对应的keytab文件配置和用户名。

所以,只需要给CM创建一个拥有管理员权限的账户。CM就能够完成大部分的初始化工作。

初始化部署

  1. 为CM添加一个账户,并生成keytab文件kadmin kadmin:addprinc -randkey cloudera-scm/admin@HADOOP.COM kadmin:xst -k cmf.keytab cloudera-scm/admin@HADOOP.COM
  2. 将上文产生的keytab文件移到cloudera-scm的配置目录,添加cmf.principal文件并写入账户的名称,最后修改文件权限。
    mv cmf.keytab /etc/cloudera-scm-server/
    echo "cloudera-scm/admin@HADOOP.COM" >> /etc/cloudera-scm-server/cmf.principal
    chown cloudera-scm:cloudera-scm cmf.keytab 
    chmod 600 cmf.keytab 
    chown cloudera-scm:cloudera-scm cmf.principal
    chmod 600 cmf.principal
    

    默认配置目录在/etc/cloudera-scm-server/,但是我们修改为/home/cloudera-manager/cm-4.6.3/etc/cloudera-scm-server/

  3. 设置CM的default Realm :在界面上顶部的Administrator-setting-security-Kerberos Security Realm 填入 HADOOP.COM
  4. 针对所有服务开启security选项
    • Zookeeper:
      • 勾选 Zookeeper Service > Configuration > Enable Zookeeper Security
    • HDFS:
      • 勾选 HDFS Service > Configuration > Authentication
      • 勾选 HDFS Service > Configuration > Authorization
      • 修改Datanode Transceiver Port 到1004
      • 修改Datanode HTTP Web UI Port 到1006
    • HBASE:
      • 勾选HBase Service > Configuration > Authentication

      - 勾选HBase Service > Configuration > Authorization

  1. 启动即可

五. 非CM下的keytab配置

检查:如果JAVA的版本在1.6.21或以前的,会遇到客户端需要renew ticket,才能通过认证。而renwe ticket必须保证kdc的配置文件包含max_renewable_life = 7d项。

创建账户

创建所有账户,生成keytab(我们使用hadoop账户启动所有的服务,所以,只生成hadoop和HTTP账户就足够了)

kadmin:addprinc -randkey hadoop/hadoop1@HADOOP.COM
...
kadmin:addprinc -randkey hadoop/hadoop5@HADOOP.COM
kadmin:addprinc -randkey HTTP/hadoop1@HADOOP.COM
...
kadmin:addprinc -randkey HTTP/hadoop5@HADOOP.COM
kadmin:xst -k /xxx/hadoop.keytab hadoop/hadoop1 HTTP/hadoop1
...
kadmin:xst -k /xxx/hadoop.keytab hadoop/hadoop5 HTTP/hadoop5

说明:一共添加了10个账户分别是hadoop的hadoop1到hadoop5的账户和HTTP的hadoop1到hadoop5的账户。导出账户的时候,把hadoop1机器的hadoop账户和HTTP账户导入到同一个keytab文件中。

在标准的情况中,依据不同服务的启动者的不同,会创建不同的账户,导出不同的keytab文件。由于我们使用的是hadoop用户启动所有服务的状 况,所以一个hadoop.keytab就足够使用了。如果像ClouderaManager那样的一个用户启动一种服务,就要创建不同的用户,导出不同 的keytab。例如:hadoop1的zookeeper配置文件中需要zookeeper.keytab,当中含有 zookeeper/hadoop1这个账户

下文提到的配置文件中添加keytab文件,都要求不同机器含有对应的机器名和启动用户的keytab文件。要测试这个机器的keytab文件是否可用,可使用以下命令进行测试:

kinit -kt /xx/xx/hadoop.keytab hadoop/hadoop1
klist 

为ZK添加认证

  • 修改zoo.cfg添加配置
    • authProvider.1=org.apache.zookeeper.server.auth.SASLAuthenticationProvider
    • jaasLoginRenew=3600000
  • 在配置目录中添加对应账户的keytab文件且创建jaas.conf配置文件,内容如下:
    Server {
        com.sun.security.auth.module.Krb5LoginModule required
        useKeyTab=true
        keyTab="/XX/XX/hadoop.keytab"
        storeKey=true
        useTicketCache=true
        principal="hadoop/hadoop3@HADOOP.COM";
    };
    

    其中keytab填写真实的keytab的绝对路径,principal填写对应的认证的用户和机器名称。

  • 在配置目录中添加java.env的配置文件,内容如下:
    export JVMFLAGS="-Djava.security.auth.login.config=/xx/xx/jaas.conf"
    
  • 每个zookeeper的机器都进行以上的修改
  • 启动方式和平常无异,如成功使用安全方式启动,日志中看到如下日志:
    2013-11-18 10:23:30,067 ... - successfully logged in.
    

为HDFS添加认证

  • 增加基本配置包括各种的princal和keytab文件的配置(生成的hdfs的keytab和HTTP的keytab最好放一起,容易配置。下面的配置中keytab文件使用绝对路径,principal使用_HOST,Hadoop会自动替换为对应的域名。)。
    • core-site.xml
      • hadoop.security.authorization:true
      • hadoop.security.authentication:kerberos
    • hdfs-site.xml
      • dfs.block.access.token.enable:true
      • dfs.namenode.keytab.file: /xx/xx/hadoop.keytab
      • dfs.namenode.kerberos.principal: hadoop/_HOST@HADOOP.COM
      • dfs.namenode.kerberos.internal.spnego.principal: HTTP/_HOST@HADOOP.COM
      • dfs.datanode.keytab.file: /xx/xx/hadoop.keytab
      • dfs.datanode.kerberos.principal: hadoop/_HOST@HADOOP.COM
      • dfs.datanode.address: 1004 (小于1024)
      • dfs.datanode.http.address: 1006 (小于1024)
      • dfs.journalnode.keytab.file: /xx/xx/hadoop.keytab
      • dfs.journalnode.kerberos.principal: hadoop/_HOST@HADOOP.COM
      • dfs.journalnode.kerberos.internal.spnego.principal: HTTP/_HOST@HADOOP.COM
    • hadoop-env.sh
      export HADOOP_SECURE_DN_USER=hadoop
      export HADOOP_SECURE_DN_PID_DIR=/home/hadoop/hadoop/pids
      export HADOOP_SECURE_DN_LOG_DIR=/home/hadoop/hadoop/logs
      export JSVC_HOME=/usr/bin
      #如果root下没有JAVA_HOME配置,则需要指定JAVA_HOME
      export JAVA_HOME=/home/hadoop/java/jdk 
      
  • 启动:设置了Security后,NameNode,QJM,ZKFC可以通过start-dfs.sh启动。DataNode需要使用root权 限启动。设置了HADOOP_SECURE_DN_USER的环境变量后,start-dfs.sh的启动脚本将会自动跳过DATANODE的启动。所 以,整个启动过程分为以下两步:
    • 启动NameNode,QJM,ZKFC
      start-dfs.sh
      

      说明:查看QJM的日志和ZKFC的日志。检查有无exception。QJM的报错不会有明显的提示。如果启动不成功检查以下几点是否做好:

      • QJM和NameNode对应的keytab文件是否包含hadoop账户和HTTP账户对应该机器的kerberos账户。
      • keytab使用绝对路径,可以避免一些问题。

      疑惑:ZKFC中有日志,但是工作正常,大胆预测连接zookeeper不需要强制通过jaas验证。TODO:验证此猜想。

      INFO org.apache.zookeeper.ClientCnxn: Opening socket connection to server hadoop3/10.1.74.46:59181. Will not attempt to authenticate using SASL (无法定位登录配置)
      
    • 启动DataNode:
      • 配置JSVC:DataNode需要JSVC启动。首先安装JSVC,然后配置的hadoop-env.sh的JSVC_HOME变量。JSVC运行还需要一个commons-daemon-xxx.jar包。从commons/daemon下载一个最新版本的jar包。当前,JSVC启动的时候遇到一个奇怪的bug,就是JSVC的classpath不支持*匹配。详细修改如下:
        #添加commons-daemon的jar包,并替换路径为绝对路径
        export CLASSPATH=$CLASSPATH:/xxx/commons-daemon-1.0.15.jar
        temp=${CLASSPATH//':'/' '}
        t=`echo $temp`
        export CLASSPATH=${t//' '/':'}
        
      • mv问题:由于权限问题,在移动日志文件启动的时候,会询问是否覆盖只读的日志文件。这个会导致使用start-secure-dns.sh启动的时候不顺畅。推荐修改hadoop-daemon.sh的74行:
        mv "$log" "$log.$num"; -->修改为--> mv -f "$log" "$log.$num";         
        
      • 启动:
        • 切换到root用户,需要配置这个root用户免密码登陆到其它的机器。
          #自动登陆并启动datanode
          sh /home/xx/hadoop/sbin/start-secure-dns.sh
          
        • 否则,需要单独登陆到所有机器启动datanode。
          #如果单独登陆启动datanode
          sh /home/xx/hadoop/sbin/hadoop-daemon.sh datanode start
          
  • 测试:使用任意用户通过keytab文件进行认证,运行hdfs相关命令。
    kinit -kt /xx/xx/qiujw/keytab qiujw/hadoopN
    #对于java1.6_26以下版本的需要renew ticket
    kinit -R
    klist
    hdfs dfs -ls /tmp
    

六. 为YARN添加认证配置

  • 添加配置
    • yarn.xml:
      • yarn.resourcemanager.keytab:/xx/xx/hadoop.keytab
      • yarn.resourcemanager.principal:hadoop/_HOST@HADOOP.COM
      • yarn.nodemanager.keytab:/xx/xx/hadoop.keytab
      • yarn.nodemanager.principal:hadoop/_HOST@HADOOP.COM
      • yarn.nodemanager.container-executor.class:org.apache.hadoop.yarn.server.nodemanager.LinuxContainerExecutor
      • yarn.nodemanager.linux-container-executor.group:hadoop
    • mapred.xml:
      • mapreduce.jobhistory.keytab:/xx/xx/hadoop.keytab
      • >mapreduce.jobhistory.principal:hadoop/_HOST@HADOOP.COM
  • 修改container-executor.conf.dir,重新编译container-executor:
    cp ~/hadoop/src
    mvn package -Pdist,native -DskipTests -Dtar -Dcontainer-executor.conf.dir=/etc
    cp ./hadoop-yarn-project/target/hadoop-yarn-project-2.0.0-cdh4.2.1/bin/container-executor ~/hadoop/bin
    #以下命令查看编译是否成功
    strings ~/hadoop/bin/container-executor|grep etc
    #修改权限
    sudo chown root:hadoop  /xx/hadoop/bin/container-executor
    sudo chmod 4750 /xx/hadoop/bin/container-executor
    

    说明:为什么要编译container-executor?

    答:因为container-executor要求container-executor.cfg这个文件及其所有父目录都属于root用户,且权 限小于755。配置文件container-executor.cfg默认的路径在../etc/hadoop/container- executor.cfg。如果,按照默认的路径修改所有父目录都属于root,显然不现实。于是,把路径编译到/etc/container- executor.cfg中。

  • 创建/etc/container-executor.cfg文件,文件内容如下:
    #运行container的用户
    yarn.nodemanager.linux-container-executor.group=hadoop
    #这个是允许运行应用的用户列表,默认是全部可以运行
    #banned.users=
    #这个是允许提交job的最小的userid的值。centos中一般用户的id在500以上。
    min.user.id=500
    

    修改/etc/container-executor.cfg的权限

    sudo chown root:root /etc/container-executor.cfg
    sudo chmod 600 /etc/container-executor.cfg
    
  • 启动,使用hadoop用户直接启动即可
    start-yarn.sh
    
  • 检查Nodemanager和Resourcemanager的日志是否有异常。
    • 一般异常都是因为container-executor.cfg的权限和container-executor的权限问题。请仔细核对:
      [hadoop@hadoop2 hadoop]$ ls ~/hadoop/bin/container-executor  -l
      

      -rwsr-x--- 1 root hadoop 89206 Nov 18 16:18 /home/hadoop/hadoop/bin/container-executor [hadoop@hadoop2 hadoop]$ ls /etc/container-executor.cfg -l -rw------- 1 root root 240 Nov 18 16:31 /etc/container-executor.cfg

  • 测试:使用任意用户通过keytab文件进行认证,运行yarn相关命令。
    kinit -kt /xx/xx/qiujw/keytab qiujw/hadoopN
    #对于java1.6_26以下版本的需要renew ticket
    kinit -R
    klist
    yarn jar /xx/xx/hadoop-mapreduce-examples-xx.jar pi 10 100
    

七. 为hbase添加认证

  • 添加配置:
    • hbase-site.xml:以下添加到client和server端
      • hbase.security.authentication:kerberos
      • hbase.rpc.engine: org.apache.hadoop.hbase.ipc.SecureRpcEngine
    • hbase-site.xml:以下添加到server端
      • hbase.regionserver.kerberos.principal:hadoop/_HOST@HADOOP.COM
      • hbase.regionserver.keytab.file: /xx/xx/hadoop.keytab
      • hbase.master.kerberos.principal: hadoop/_HOST@HADOOP.COM
      • hbase.master.keytab.file: /xx/xx/hadoop.keytab
  • 添加hbase连接secure的zookeeper:
    • 创建zk-jaas.conf配置文件,内容如下:
      Client {
        com.sun.security.auth.module.Krb5LoginModule required
        useKeyTab=true
        useTicketCache=false
        keyTab="/xx/hadoop.keytab"
        principal="hadoop/hadoopN@HADOOP.COM";
      };
      
    • 修改hbase-env.sh:
      export HBASE_OPTS="$HBASE_OPTS -Djava.security.auth.login.config=/xx/zk-jaas.conf"
      export HBASE_MANAGES_ZK=false
      
    • 确保以下配置项是正确的:
      • hbase-site.xml:
        • hbase.zookeeper.quorum: hadoopN,...,hadoopN
        • hbase.cluster.distributed: true
    • 添加以下项目到zoo.cfg中:
      • kerberos.removeHostFromPrincipal: true
      • kerberos.removeRealmFromPrincipal: true
  • 启动:如往常启动即可
    start-hbase.sh
    
  • TroubleShooting笔者在启动hbase后,在zookeeper的日志中大量发现这种信息:
     Client failed to SASL authenticate: javax.security.sas     l.SaslException: GSS initiate failed [Caused by GSSException: Failure unspecified at GSS-API level (Mechanism level: Specified version of key is not available (44     ))]
    

    在多次调整无果后,怀疑是因为我的一些老旧的账户的renewmax属性还是0.于是,把所有相关账户都删除,生成后,再次启动。这个错误就消失了。

Hbase的权限控制

  • 启动hbase的用户是超级用户拥有所有的权限。
  • hbase支持4个权限
    • R :读权限 Get, Scan, or Exists calls
    • W :写权限 Put, Delete, LockRow, UnlockRow, IncrementColumnValue, CheckAndDelete, CheckAndPut, Flush, or Compact
    • C :创建权限 Create, Alter, or Drop
    • A :管理员权限 Enable, Disable, MajorCompact, Grant, Revoke, and Shutdown.
  • 权限控制语句:
    grant <user> <permissions>[ <table>[ <column family>[ <column qualifier> ] ] ]
    revoke <user> <permissions> [ <table> [ <column family> [ <column qualifier> ]]]
    alter <table> {OWNER => <user>} # sets the table owner
    user_permission <table>  # displays existing permissions
    
  • 创建表的用户拥有该表的所有权限
  • 如果赋予权限的时候没有针对某个表或者CF进行赋予,就会对全局获得权限。请小心。

Hive的权限

  • Hive的客户端的权限和普通的客户端的一致就可以了。

客户端配置

使用者要和实行了kerberos的集群进行通信。要kerberos的管理员创建对应的账户。并且生成keytab返回给使用者,使用者通过kinit命令认证后,就跟平常使用Hadoop的方式一致地使用即可。以下是一个例子:

kadmin:addprinc qiujw/hadoop1
kadmin:xst -k qiujw.keytab qiujw/hadoop1
#将qiujw.keytab交给用户
#在hadoop1机器上
kinit -kt qiujw.keytab qiujw/hadoop1
klist
    Ticket cache: FILE:/tmp/krb5cc_512
    Default principal: qiujw/hadoop2@HADOOP.COM

    Valid starting     Expires            Service principal
    11/19/13 10:53:54  11/20/13 10:53:54  krbtgt/HADOOP.COM@HADOOP.COM
            renew until 11/26/13 10:44:10

说明:Expires下面的是这个认证的过期的日志。renew until后面的是续约期。
意思是,如果这个缓存过了认证的过期时间,就会失效。在续约期期间通过使用kinit -R可以续约这个认证。但是,过了续约期。必须要使用keytab重新认证。

Hadoop等的服务中,都会使用keytab自动做续约不会存在过期的情况。如果客户端需要长久运行不过期,需要在程序中使用keytab做认证。

协议控制

Hadoop的框架中支持针对不同的协议开启权限控制。不再本次探究范围内。服务协议控制

参考阅读:

管理SPNEGO TAI:关于使用Kerberos服务主体名称的提示
如何在Notes中通过account使用SPNEGO单点登录
Kerberos原理
基于 SAML 的 WebSphere Application Server 单点登录的场景设计
跨 KDC 域的 WebSphere Web Services Security 应用中的 Kerberos 加密算法
测试驱动的单点登录
大数据安全Hadoop安全模型的演进
Kerberos and SPNEGO 以及 SPNEGO
Hadoop MapReduce工作原理
Hadoop学习入门
hadoop2.x本地伪分布环境实践yarn
Hadoop MapReduceV2(Yarn) 框架简介
Hadoop2.0NameNode HA实践
Hadoop2 HA方案之QJM
Hadoop应用构建企业级的安全解决方案
vmware虚拟机下hadoop集群安装过程

 

来源:http://blog.csdn.net/xiao_jun_0820/article/details/39375819

Yarn的JVM重用功能uber

在文章开头,我想先做几点说明:

1、本文的内容来自我对Yarn的相应功能的理解和实践。而我对该部分功能的理解主要来自对Hadoop的开发者之前相应言论的分析,并且我也将我的分析发给了Hadoop community, 并得到了Yarn的创始人兼架构师Arun Murthy的肯定回复。

2、本文中uber的配置部分,主要参考之前Hadoop开发者的言论。但是我当初看该言论的时候对一些细节有所疑惑,因此在本文中我对很多地方做了修改:使一些用词的引用前后一致,并加上了很多描述性的过渡语言。

3、本文为研究性质,并非官方文档的翻译。因此,如果读者发现任何纰漏,希望不吝赐教,万分感激!

首先,简单回顾一下Hadoop 1.x中的JVM重用功能:用户可以通过更改配置,来指定TaskTracker在同一个JVM里面最多可以累积执行的Task的数量(默认是1)。这样 的好处是减少JVM启动、退出的次数,从而达到提高任务执行效率的目的。 配置的方法也很简单:通过设置mapred-site.xml里面参数mapred.job.reuse.jvm.num.tasks的值。该值默认是1,意味着TaskTracker会为每一个Map任务或Reduce任务都启动一个JVM,当任务执行完后再退出该JVM。依次类推,如果该值设置为3,TaskTracker则会在同一个JVM里面最多依次执行3个Task,然后才会退出该JVM。

在 Yarn(Hadoop MapReduce v2)里面,不再有参数mapred.job.reuse.jvm.num.tasks,但它也有类似JVM Reuse的功能——uber。据Arun的说法,启用该功能能够让一些任务的执行效率提高2到3倍(“we've observed 2x-3x speedup for some jobs”)。不过,由于Yarn的结构已经大不同于MapReduce v1中JobTracker/TaskTracker的结构,因此uber的原理和配置都和之前的JVM重用机制大不相同。

1) uber的原理:

Yarn的默认配置会禁用uber组件,即不允许JVM重用。我们先看看在这种情况下,Yarn是如何执行一个MapReduce job的。首先,Resource Manager里的Application Manager会为每一个application(比如一个用户提交的MapReduce Job)在NodeManager里面申请一个container,然后在该container里面启动一个Application Master。container在Yarn中是分配资源的容器(内存、cpu、硬盘等),它启动时便会相应启动一个JVM。此 时,Application Master便陆续为application包含的每一个task(一个Map task或Reduce task)向Resource Manager申请一个container。等每得到一个container后,便要求该container所属的NodeManager将此 container启动,然后就在这个container里面执行相应的task。等这个task执行完后,这个container便会被 NodeManager收回,而container所拥有的JVM也相应地被退出。在这种情况下,可以看出每一个JVM仅会执行一Task, JVM并未被重用。

用户可以通过启用uber组件来允许JVM重用——即在同一个container里面依次执行多个task。在yarn-site.xml文件中,改变一下几个参数的配置即可启用uber的方法:

参数| 默认值 | 描述

- mapreduce.job.ubertask.enable | (false) | 是否启用user功能。如果启用了该功能,则会将一个“小的application”的所有子task在同一个JVM里面执行,达到JVM重用的目的。这 个JVM便是负责该application的ApplicationMaster所用的JVM(运行在其container里)。那具体什么样的 application算是“小的application"呢?下面几个参数便是用来定义何谓一个“小的application"

- mapreduce.job.ubertask.maxmaps | 9 | map任务数的阀值,如果一个application包含的map数小于该值的定义,那么该application就会被认为是一个小的application

- mapreduce.job.ubertask.maxreduces | 1 | reduce任务数的阀值,如果一个application包含的reduce数小于该值的定义,那么该application就会被认为是一个小的 application。不过目前Yarn不支持该值大于1的情况“CURRENTLY THE CODE CANNOT SUPPORT MORE THAN ONE REDUCE”

- mapreduce.job.ubertask.maxbytes | | application的输入大小的阀值。默认为dfs.block.size的值。当实际的输入大小部超过该值的设定,便会认为该application为一个小的application。
最后,我们来看当uber功能被启用的时候,Yarn是如何执行一个application的。首先,Resource Manager里的Application Manager会为每一个application在NodeManager里面申请一个container,然后在该container里面启动一个 Application Master。containe启动时便会相应启动一个JVM。此时,如果uber功能被启用,并且该application被认为是一个“小的 application”,那么Application Master便会将该application包含的每一个task依次在这个container里的JVM里顺序执行,直到所有task被执行完 ("WIth 'uber' mode enabled, you'll run everything within the container of the AM itself")。这样Application Master便不用再为每一个task向Resource Manager去申请一个单独的container,最终达到了 JVM重用(资源重用)的目的。

来源:http://blog.csdn.net/samhacker/article/details/15692003

VRRP概述

来源:互联网

随着Internet的发展,人们对网络的可靠性的要求越来越高。对于局域网用户来说,能够时刻与外部网络保持联系是非常重要的。

通常情况下,内部网络中的所有主机都设置一条相同的缺省路由,指向出口网关(即图1中的路由器RouterA),实现主机与外部网络的通信。当出口网关发生故障时,主机与外部网络的通信就会中断。

配置多个出口网关是提高系统可靠性的常见方法,但局域网内的主机设备通常不支持动态路由协议,如何在多个出口网关之间进行选路是个问题。

VRRP-1

IETF(Internet Engineering Task Force,因特网工程任务组)推出了VRRP(Virtual Router Redundancy Protocol)虚拟路由冗余协议,来解决局域网主机访问外部网络的可靠性问题。

VRRP是一种容错协议,它通过把几台路由设备联合组成一台虚拟的路由设备,并通过一定的机制来保证当主机的下一跳设备出现故障时,可以及时将业务切换到其它设备,从而保持通讯的连续性和可靠性。

使用VRRP的优势在于:既不需要改变组网情况,也不需要在主机上配置任何动态路由或者路由发现协议,就可以获得更高可靠性的缺省路由。

VRRP协议对应的是RFC3768,该协议仅适用于IPv4。

VRRP的基本概念

以下是与VRRP协议相关的基本概念:

概念

解释

VRRP路由器(VRRP Router运行VRRP的设备,它可能属于一个或多个虚拟路由器。
虚拟路由器(Virtual Router)由VRRP管理的抽象设备,又称为VRRP备份组,被当作一个共享局域网内主机的缺省网关。
它包括了一个虚拟路由器标识符和一组虚拟IP地址。
虚拟IP地址(Virtual IP Address)虚拟路由器的IP地址,一个虚拟路由器可以有一个或多个IP地址,由用户配置。
IP地址拥有者(IP Address Owner)如果一个VRRP路由器将虚拟路由器的IP地址作为真实的接口地址,则该设备是IP地址拥有者。
当这台设备正常工作时,它会响应目的地址是虚拟IP地址的报文,如ping、TCP连接等。
虚拟MAC地址是虚拟路由器根据虚拟路由器ID生成的MAC地址。
一个虚拟路由器拥有一个虚拟MAC地址,格式为:00-00-5E-00-01-{VRID}。
当虚拟路由器回应ARP请求时,使用虚拟MAC地址,而不是接口的真实MAC地址。
主IP地址(Primary IP Address)从接口的真实IP地址中选出来的一个主用IP地址,通常选择配置的第一个IP地址。
VRRP广播报文使用主IP地址作为IP报文的源地址。
Master路由器(Virtual Router Master)是承担转发报文或者应答ARP请求的VRRP路由器,转发报文都是发送到虚拟IP地址的。
如果IP地址拥有者是可用的,通常它将成为Master。
Backup路由器(Virtual Router Backup)一组没有承担转发任务的VRRP路由器,当Master设备出现故障时,它们将通过竞选成为新的Master。
抢占模式在抢占模式下,如果Backup的优先级比当前Master的优先级高,将主动将自己升级成Master。

 

VRRP的工作原理

 

VRRP将局域网的一组路由器构成一个备份组,相当于一台虚拟路由器。局域网内的主机只需要知道这个虚拟路由器的IP地址,并不需知道具体某台设备的IP地址,将网络内主机的缺省网关设置为该虚拟路由器的IP地址,主机就可以利用该虚拟网关与外部网络进行通信。

VRRP将该虚拟路由器动态关联到承担传输业务的物理路由器上,当该物理路由器出现故障时,再次选择新路由器来接替业务传输工作,整个过程对用户完全透明,实现了内部网络和外部网络不间断通信。

VRR2287
如图1所示,虚拟路由器的组网环境如下:

  • RouterA、RouterB和RouterC属于同一个VRRP组,组成一个虚拟路由器,这个虚拟路由器有自己的IP地址10.110.10.1。虚拟IP地址可以直接指定,也可以借用该VRRP组所包含的路由器上某接口地址。
  • 物理路由器RouterA、RouterB和RouterC的实际IP地址分别是10.110.10.5、10.110.10.6和10.110.10.7。
  • 局域网内的主机只需要将缺省路由设为10.110.10.1即可,无需知道具体路由器上的接口地址。

主机利用该虚拟网关与外部网络通信。路由器工作机制如下:

  • 根据优先级的大小挑选Master设备。Master的选举有两种方法:
    • 比较优先级的大小,优先级高者当选为Master。
    • 当两台优先级相同的路由器同时竞争Master时,比较接口IP地址大小。接口地址大者当选为Master。
  • 其它路由器作为备份路由器,随时监听Master的状态。
    • 当主路由器正常工作时,它会每隔一段时间(Advertisement_Interval)发送一个VRRP组播报文,以通知组内的备份路由器,主路由器处于正常工作状态。
    • 当组内的备份路由器一段时间(Master_Down_Interval)内没有接收到来自主路由器的报文,则将自己转为主路由器。一个VRRP组里有多台备份路由器时,短时间内可能产生多个Master,此时,路由器将会将收到的VRRP报文中的优先级与本地优先级做比较。从而选取优先级高的设备做Master。

从上述分析可以看到,主机不需要增加额外工作,与外界的通信也不会因某台路由器故障而受到影响。

-----------------------------------------------------------

VRRP协议介绍

  • VRRP的报文结构
  • VRRP的状态机

----------------------------------------------------

VRRP的报文结构

VRRP协议只有一种报文,即VRRP报文。VRRP报文用来将Master设备的优先级和状态通告给同一虚拟路由器的所有VRRP路由器。

VRRP报文封装在IP报文中,发送到分配给VRRP的IPv4组播地址。在IP报文头中,源地址为发送报文的主接口地址(不是虚拟地址或辅助地址),目的地址是224.0.0.18,TTL是255,协议号是112。VRRP报文的结构如图1所示。

图1 VRRP报文结构
VRRP3930

各字段的含义:

  • Version:协议版本号,现在的VRRP为版本2。
  • Type:报文类型,只有一种取值,1,表示Advertisement。
  • Virtual Rtr ID(VRID):虚拟路由器ID,取值范围是1~255。
  • Priority:发送报文的VRRP路由器在虚拟路由器中的优先级。取值范围是0~255,其中可用的范围是1~254。0表示设备停止参与VRRP,用来使备份路由器尽快成为主路由器,而不必等到计时器超时;255则保留给IP地址拥有者。缺省值是100。
  • Count IP Addrs:VRRP广播中包含的虚拟IP地址个数。
  • Authentication Type:验证类型,协议中指定了3种类型:
    • 0:Non Authentication
    • 1:Simple Text Password
    • 2:Reserved

    各字段的含义:

    • RFC2338中Authentication Type取值如下:
    • 0 - No Authentication
    • 1 - Simple Text Password
    • 2 - IP Authentication Header
    • 随后的RFC3768中将Authentication Type取值变更如下:
      • 0 - No Authentication
      • 1 - Reserved
      • 2 - Reserved

      说明:

      变更的原因:实践和分析证明,这些认证方式不能提供真正的安全。而限制TTL=255可以阻止大多数对本地脆弱性的攻击。

    • 实现了Simple Text Password认证方式
    • Advertisement Interval:发送通告报文的时间间隔,缺省为1秒。
    • Checksum:校验和。
    • IP Address(es):虚拟路由器IP地址,地址个数是Count IP Addrs的值。
    • Authentication Data:验证字,目前只有明文认证才用到该部分,对于其它认证方式,一律填0。

    ---------------------------------

    VRRP的状态机

    VRRP协议中定义了三种状态机:初始状态(Initialize)、活动状态(Master)、备份状态(Backup)。其中,只有处于活动状态的设备才可以转发那些发送到虚拟IP地址的报文。

    VRRP状态转换如图1所示。

    VRRP5282

    Initialize

    设备启动时进入此状态,当收到接口Startup的消息,将转入Backup或Master状态(IP地址拥有者的接口优先级为255,直接转为Master)。在此状态时,不会对VRRP报文做任何处理。

    Master

    当路由器处于Master状态时,它将会做下列工作:

    • 定期发送VRRP报文。
    • 以虚拟MAC地址响应对虚拟IP地址的ARP请求。
    • 转发目的MAC地址为虚拟MAC地址的IP报文。
    • 如果它是这个虚拟IP地址的拥有者,则接收目的IP地址为这个虚拟IP地址的IP报文。否则,丢弃这个IP报文。
    • 如果收到比自己优先级大的报文则转为Backup状态。
    • 如果收到优先级和自己相同的报文,并且发送端的主IP地址比自己的主IP地址大,则转为Backup状态。
    • 当接收到接口的Shutdown事件时,转为Initialize。
    Backup

    当路由器处于Backup状态时,它将会做下列工作:

    • 接收Master发送的VRRP报文,判断Master的状态是否正常。
    • 对虚拟IP地址的ARP请求,不做响应。
    • 丢弃目的MAC地址为虚拟MAC地址的IP报文。
    • 丢弃目的IP地址为虚拟IP地址的IP报文。
    • Backup状态下如果收到比自己优先级小的报文时,丢弃报文,不重置定时器;如果收到优先级和自己相同的报文,则重置定时器,不进一步比较IP地址。
    • 当Backup接收到MASTER_DOWN_TIMER定时器超时的事件时,才会转为Master。
    • 当接收到接口的Shutdown事件时,转为Initialize。

    ------------------------------------------------

    提供的VRRP功能,包括主备备份、负载分担备份、VRRP监视接口状态、VRRP快速切换等。

    • 主备备份
    • 负载分担
    • 监视接口状态
    • VRRP快速切换
    • 虚拟IP地址Ping开关
    • VRRP的安全功能
    • VRRP平滑倒换
    • VRRP管理组
    • mVRRP

    -----------------------------------------

    主备备份

    这是VRRP提供IP地址备份功能的基本方式。主备备份方式需要建立一个虚拟路由器,该虚拟路由器包括一个Master和若干Backup设备。

    • 正常情况下,业务全部由Master承担。
    • Master出现故障时,Backup设备接替工作。

    ---------------------------------------------------------------------------------------

    负载分担

    现在允许一台路由器为多个作备份。通过多虚拟路由器设置可以实现负载分担。

    负载分担方式是指多台路由器同时承担业务,因此需要建立两个或更多的备份组。

    负载分担方式具有以下特点。

    • 每个备份组都包括一个Master设备和若干Backup设备。
    • 各备份组的Master可以不同。
    • 同一台路由器可以加入多个备份组,在不同备份组中有不同的优先级。

    VRRP999

    如图1所示:

    • 配置两个备份组:组1和组2;
    • RouterA在备份组1中作为Master,在备份组2中作为Backup;
    • RouterB在备份组1和2中都作为Backup;
    • RouterC在备份组2中作为Master,在备份组1中作为Backup。
    • 一部分主机使用备份组1作网关,另一部分主机使用备份组2作为网关。

    这样,以达到分担数据流,而又相互备份的目的。

    ----------------------------------------------------------------------------------

    监视接口状态

    VRRP可以监视所有接口的状态。当被监视的接口Down或Up时,该路由器的优先级会自动降低或升高一定的数值,使得备份组中各设备优先级高低顺序发生变化,VRRP路由器重新进行Master竞选。

    -------------------------------------------------

    VRRP快速切换

    双向转发检测BFD(Bidirectional Forwarding Detection)机制,能够快速检测、监控网络中链路或者IP路由的连通状况,VRRP通过监视BFD会话状态实现主备快速切换,主备切换的时间控制在1秒以内。

    对于以下情况,BFD都能够将检测到的故障通知接口板,从而加快VRRP主备倒换的速度。

    • 备份组包含的接口出现故障。
    • Master和Backup不直接相连。
    • Master和Backup直接相连,但在中间链路上存在传输设备。

    BFD对Backup和Master之间的实际地址通信情况进行检测,如果通信不正常,Backup就认为Master已经不可用,升级成Master。在以下两种情况下Backup转换为Master:

    • 当两台路由器之间的背靠背连接全部断开时,Backup主动升级成Master,承载上行流量;
    • 当Master重新启动、或Master与交换机之间的链路断开、或与Master相连的交换机重新启动时,Backup主动升级成Master,承载上行流量。

    VRRP快速切换的环境要求:

    • 在Backup上,BFD Session检测的接口必须和Master设备相连;
    • 在Master不可用时,Backup的优先级增加并大于原来Master的优先级,促使自己快速切换为Master。

    ---------------------------------------------------------------

    虚拟IP地址Ping开关

    RFC3768并没有规定虚拟IP地址应不应该Ping通。不能Ping通虚拟IP地址,会给监控虚拟路由器的工作情况带来一定的麻烦,能够 Ping通虚拟IP地址可以比较方便的监控虚拟路由器的工作情况,但是带来可能遭到ICMP攻击的隐患。控制Ping通虚拟IP地址的开关命令,用户可以 选择是否打开。

    --------------------------------------------------------------------------------

    VRRP的安全功能

    对于安全程度不同的网络环境,可以在报头上设定不同的认证方式和认证字。

    在一个安全的网络中,可以采用缺省设置:路由器对要发送的VRRP报文不进行任何认证处理,收到VRRP报文的路由器也不进行任何认证,认为收到的都是真实的、合法的VRRP报文。这种情况下,不需要设置认证字。

    在有可能受到安全威胁的网络中,VRRP提供简单字符认证,可以设置长度为1~8的认证字。

    --------------------------------------------------------

    VRRP平滑倒换

    概述

    CE设备作为业务系统的网关,需要启用VRRP(Virtual Router Redundancy Protocol)冗余备份功能。

    在路由器主板和备板状态都正常的情况下,VRRP备份组中的Master设备会以Advertisement_Interval间隔定时发送VRRP广播报文,Backup通过不断检测接收到的广播报文来判断Master状态是否正常。

    当Master设备发生主备倒换后,从发生主备倒换到新主板正常工作,需要一段时间,该时间随不同设备和不同配置差别较大,结果可能导致 Master设备不能正常处理VRRP协议报文,Backup设备因为收不到广播报文而抢占到Master状态,并针对每一个虚拟路由器的虚IP地址发送 免费ARP,给相关绑定模块发送状态变化通知。

    由于倒换过程中系统过于繁忙,Master端的Hello协议报文无法正常发送,而Backup端无法及时收到报文,会抢占成为Master,引起 链路切换,导致丢包。因此需要启用了VRRP功能的CE设备支持VRRP的平滑倒换(SS,Smoth Switch)功能,避免因主备倒换影响业务流量。

    基本原理

    VRRP9837

    在VRRP平滑倒换的过程中,Master和Backup分工不同,相互配合,共同保证业务的平滑传输。

    • 要进行VRRP整机平滑倒换处理,必须分别在Master和Backup上使能VRRP协议报文时间间隔学习功能。如图所示,设备1和设备2都使能VRRP协议报文时间间隔学习功能。
      • 如果使能了VRRP协议报文时间间隔学习功能,Master状态的VRRP不学习也不检查协议报文时间间隔的一致性。
      • 非Master状态的VRRP收到Master状态VRRP发来的协议报文后,会检查报文中的时间间隔值,如果和自己的不同,非Master状态的VRRP就会学习到报文中的时间间隔,并调整自己的协议报文时间间隔值,与报文中的值保持一致。
    • 设备1配置整机VRRP平滑倒换功能。设备主备倒换新的主板启动后,VRRP根据设备主备倒换前的状态判断,保存当前配置的VRPP协议报文时间间隔,并对Master状态的VRRP进行协议报文时间间隔调整,然后以当前配置的时间间隔发出VRRP平滑倒换报文,报文中携带着新的时间间隔发送到对端设备2。
    • 设备2收到的VRRP协议报文中携带的时间间隔和自己本地的间隔不一致,将对自己的运行时间间隔调整,并调整自己的定时器,与其保持一致。
    • 设备1平滑结束时将发出VRRP恢复报文,报文中携带着主备倒换前配置的时间间隔,此时设备2上的VRRP会再进行一次时间间隔学习。
    注意事项

    学习功能优先于抢占功能,即如果收到的协议报文时间间隔和自己当前的不一致,并且报文中携带的优先级低于自己当前的配置优先级,这种情况VRRP首先考虑的是学习功能和重置定时器,而后才会考虑是否抢占。

    VRRP整机平滑倒换功能还依赖于系统本身,如果设备自身从主备倒换一开始系统便非常繁忙,无法调度VRRP模块运行的情况,VRRP整机平滑倒换功能无效。

    VRRP加入了VGMP之后,VRRP的运行将依赖于VGMP,此时的VRRP将不受平滑倒换的影响。该功能不能用于业务VRRP。

    ----------------------------

    VRRP管理组

    在配置大量VRRP备份组时:

    • 过多VRRP协议报文占用较大的链路带宽
    • 大量VRRP报文的处理对系统造成一定的负担
    • 每个VRRP备份组都要维护协议定时器,对系统来说也是个很大的开销

    此外,每个VRRP备份组状态相对独立,无法保证同一路由器上相关联的接口上VRRP状态都为主用,在严格要求来回路径一致的应用中存在局限性:

    • 基于NAT网关的可靠性组网
    • 基于Proxy服务器的可靠性组网
    • 基于状态防火墙的可靠性组网

    为防止VRRP状态不一致现象的发生,华为公司在VRRP的基础上自主开发了扩展协议VGMP(VRRP Group Management Protocol),即VRRP组管理协议。基于VGMP协议建立的VRRP管理组负责统一管理加入其中的各VRRP备份组的状态,保证一台路由器上的接 口同时处于主用或备用状态,实现路由器VRRP状态的一致性。

    VRRP管理组有Master设备和Slave设备之分。

    • Master设备:VRRP管理组状态为Master的设备,该路由器上被管理的VRRP备份组状态都是Master(因接口Down而变成Initialize的除外),承担流量传输的任务,并定时发送Hello报文。
    • Slave设备:VRRP管理组状态为Slave的设备,该路由器上被管理的VRRP备份组状态都是非Master,不传输流量,处于监听状态,一旦Master设备出现故障,Slave将竞选成为Master。

    VRRP管理组相当于在VRRP备份组的基础上叠加了一层逻辑层。VRRP备份组加入VGMP之后,不再发送传统VRRP报文,由VRRP管理组负责统一管理加入其中的各VRRP备份组的状态。

    VRRP备份组感知到接口状态变化后,会改变自身的状态。VGMP将感知到这种状态迁移,然后来确定是否切换VGMP的状态,从而切换VGMP组内VRRP备份组的状态。

    VRRP管理组提供的功能
    • 状态一致性管理VRRP管理组对所属VRRP组的主备切换进行裁决,改变了传统VRRP中各设备VRRP状态相对独立的现象,从而确保了同一路由器上VRRP备份组的状态一致性。
    • 抢占管理对于加入VRRP管理组的VRRP备份组来说,无论各备份组内路由器是否启动了抢占功能,抢占行为发生与否必须由VRRP管理组统一决定。
    • 通道管理配置专门的数据通道传输VGMP报文,提高VGMP报文传输的可靠性。

      一个VRRP管理组中至少要有一条数据通道。数据通道可以和业务通道在同一条物理链路上。

    图1描述了业务通道和数据通道的关系。A1-S-B1、A2-S-B2、A3-S-B3可以是数据通道也可以是业务通道,A4-H-B4只能作为数据通道。

    VRRP12173

    VRRP管理组工作方式

    VRRP管理组的工作方式有主备备份和负载分担。

    • 主备备份方式
      • 仅有一个VRRP管理组
      • 正常情况下,VRRP管理组优先级高的路由器作为Master,承担传输业务传输,VRRP管理组优先级低的路由器作为Slave;
      • 当Master设备出现故障时,主备状态发生切换。

      VRRP12572

    • 负载分担方式
      • 至少有两个VRRP管理组
      • 路由器上的VRRP备份组加入不同的管理组
      • 正常情况下,同一路由器上有状态为Master的VRRP管理组,也有状态为Slave的VRRP管理组,网络内的传输流量在多个路由器之间进行负载分担;
      • 当Master设备出现故障时,主备状态进行切换。

      VRRP12972

    • 如图3所示。
      • RouterA上的VRRP管理组1包含备份组1、2、3,优先级为Level1;VRRP管理组2包含备份组4、5、6,优先级为Level2;Level1>Level2
      • RouterB上的VRRP管理组1包括备份组1、2、3,优先级为Level3;VRRP管理组2包含备份组4、5、6,优先级为Level4;Level3
      • Level1=Level4,Level2=Level3
      • RouterA是VRRP管理组1协商出的Master,也是管理组2协商出的Slave
      • RouterB是VRRP管理组1协商出的Slave,也是管理组2协商出的Master
      • Network1内部分主机的默认网关是备份组1,部分主机的默认网关是备份组4;Network2、Network3内主机默认网关的设置原理同Network1
      • 正常情况下,RouterA和RouterB两台路由器对对业务流量进行分担

      如果RouterB出现故障,则VRRP管理组2将重新裁决各设备的状态,管理组2中的RouterA状态切换为Master,RouterB状态 切换为Slave,此时RouterA承担全部会话业务。当RouterB恢复正常后,RouterB将继续作为VRRP管理组2的Master,流量将 在两个路由器之间分担。

    mVRRP

    mVRRP是指管理VRRP。管理VRRP备份组从本质上讲就是普通的VRRP备份组,唯一特殊之处在于:普通的VRRP备份组被配置为管理VRRP备份组之后,可以绑定其他的业务备份组,并根据绑定关系,决定相关业务备份组的状态。

    一个管理VRRP备份组可以绑定多个业务备份组,但它不能作为业务备份组与其他管理备份组进行绑定。

    管理VRRP备份组也可以作为一般成员加入VGMP组中。在将管理VRRP备份组加入VGMP组后,也可以配置管理VRRP监视Peer BFD和Link BFD会话状态但管理VRRP备份组状态机会丧失自己的独立性除了Initialize状态之外,Backup和Master状态需要根据所加入的VGMP组的状态来决定。