月度归档:2015年05月

Riak与MongoDB的对比

最近在学习riak,搜索了一些文章, 尽管比较老了, 但是还是保存下来, 学习一下

原文地址:http://blog.nosqlfan.com/html/2705.html

本文来自Riak所属的Basho公司的技术WiKi,文章从几个方面对Riak和MongoDB进行了对比,这不是一篇PK文章,NoSQLFan翻译给大家,希望本文能让您对Riak和MongoDB有更多的了解。

来源地址:wiki.basho.com

riak-001-2

机制与概念上的异同

Riak和MongoDB在使用特性上有下面几个相同点:

  • 都是文档型的数据模型
  • 具体存储方式都不是以文档型进行存储
  • 写性能及写吞吐都很高

虽然上面几点看起来二者挺像,但在内部实现上两者却是相去甚远。比如Riak是一个分布式的存储,而MongoDB可以理解为是一个单一的数据库系 统,同时加上了Replication和Sharding功能。MongoDB的内部数据结构上还是文档,而Riak是不用关心存储内容的二进制。 MongoDB提供GridFS机制来存储二进制内容,而Riak的二进制内容与普通内容存储方式一样。MongoDB的写入方式是 in-place方式,修改一个文档是原子性的,而Riak是通过quormNRW的机制保证写入操作安全性的。

  • http://www.mongodb.org/display/DOCS/Home
  • http://blog.mongodb.org/post/248614779/fast-updates-with-mongodb-update-in-place
  • http://www.mongodb.org/display/DOCS/Updating#Updating-Update

复制备份及横向扩展

Riak主要通过一致性hash算法来实现其数据的复制及分片,一致性hash机制是Riak的核心思想之一。在Riak中,每个节点都是对等的,所以其不存在单点故障。

  • Add Nodes to Riak
  • Consistent Hashing

而MongoDB在1.6版本后也推出了强有力的复制备份功能

1.主从复制

  • http://www.mongodb.org/display/DOCS/Master+Slave

2.Replica Sets

Replica Sets是MongoDB的重头功能之一,它让几个节点组成一个集合,在这个集合中的节点中有一个主机提供写入,其它节点会从主机上备份数据,主机故障后会自动在从机中选取产生新的主机。

  • http://www.mongodb.org/display/DOCS/Replica+Sets

而在数据分片上,MongoDB提供了一种叫auto-sharding的机制,使数据在多个节点间可以均匀分布,提供动态添加删除节点的功能。

  • http://www.mongodb.org/display/DOCS/Sharding
  • http://www.mongodb.org/display/DOCS/Sharding+Introduction
  • http://en.wikipedia.org/wiki/Sharding

数据分片的自动调整

Riak基于一致性hash策略,在有节点从hash环上移除后,其数据会自动分摊整个环上的其它节点上。其负载也就被均匀分摊了。而MongoDB也支持在Sharding中摘除节点后的自动数据迁移,具体见此文:

  • http://www.mongodb.org/display/DOCS/Configuring+Sharding#ConfiguringSharding-Removingashard

性能对比

Riak的存储引擎本身是作为插件的形式挂载的,Riak支持BitCask,InnoDB和LevelDB等存储引擎,使用默认的BitCask 引擎,你可以在性能和数据持久化的选择上进行调节。相比之下,MongoDB由于采用了mmap机制,如果索引和热数据能被内存完全装下,那么其操作基本 上相当于内存操作,所以MongoDB的当机性能是相当高的。

  • http://www.mongodb.org/display/DOCS/Durability+and+Repair
  • http://blog.mongodb.org/post/381927266/what-about-durability

数据模型

Riak的数据存储没有特定的格式需求,它允许你存储不同体积的文档型数据,另外Riak还可以在数据间创建link来为数据建立关联。

  • Data Storage in Riak

MongoDB的数据是以BSON格式存储的,你可以在MongoDB中存储任意JSON格式的文档,在存储时会被转成BSON进行存储,另外二进制数据也可以转换成相应的一种BSON数据类型进行存储,GridFS正是基于这种类型来实现的。

查询语句及分布式操作

Riak只提供key-value式的数据操作接口,它支持key-value数据的各种操作,也支持link-walking和 MapReduce操作,像二级索引这种东西,在Riak里是不存在的,因为Riak根本不关心它存的数据是什么样的,value对它来说只是一串数据。

  • https://wiki.basho.com/display/RIAK/MapReduce

MongoDB提供与关系型数据库类似的各种数据操作(除了关联查询),其索引机制更是与关系型数据库几乎一模一样。同时MongoDB也提供MapReduce的操作接口,用以处理一些批量任务。

  • http://www.mongodb.org/display/DOCS/Indexes
  • http://www.mongodb.org/display/DOCS/Querying
  • http://www.mongodb.org/display/DOCS/MapReduce

冲突解决策略

Riak使用vector-clock机制来进行冲突检测,所以其冲突解决的选择权是留给应用层来做的。应用层可以决定两个用户对同一行数据的更新哪一个会胜出。

  • Vector Clocks

MongoDB使用的是最近更新者胜出的方式,相对来说更简单直接。

  • http://www.mongodb.org/display/DOCS/Atomic+Operations

API

Riak提供给非Erlang的客户端两种操作方式

  • 1. HTTP
  • 2. Protocol Buffers

MongoDB的协议是自己制定的一套特有协议,其客户端由其所属的10gen公司开发并维护,基本主流的语言都有相应的官方客户端。

  • http://www.mongodb.org/display/DOCS/Mongo+Wire+Protocol

终于有了替代Visio的免费软件:EDraw Mind Map

作者:xbeta 版本:071020/071018
更新:此软件为国产软件。系列产品中,功能更强大的是EDraw Max,07年11月19日前中文版促销中,仅28元。多位网友已注册表示支持。
  终于有了替代Visio的免费软件—— EDraw Mind Map。这款于2007年10月最新发布 V1.0的国产免费软件,终结了流程图软件“好用则价高,免费则难用”的局面。它体积小巧、功能丰富、作为免费软件,完全可以满足普通用户绘制流程图的需求。
终于有了替代Visio的免费软件:EDraw <wbr>Mind <wbr>Map
 
1 体积小巧
  安装文件仅7.8MB。
  安装后多大呢?表面看,共占用空间55MB。但实际上,很多是示例、素材和帮助,真正运行所需的exe和dll,不超过8MB。比起它丰富的功能来,算是很小巧了。
 
2 视频演示
  百闻不如一见,请点击下图,查看flash演示(803x567,600KB)!需要说明的是,此演示也是用免费软件(Wink)制作的。另外,为了减小flash文件的体积,对颜色进行了压缩处理。实际上 EDraw 的界面非常漂亮。
 
3 功能丰富
  相信你看完演示后,已经对它丰富的功能产生了深刻印象。我认为,如下5方面的特性,使它成为了出色的软件。
  - 易用的标准绘图、格式化工具
  - 预装了丰富的素材库
  - 良好的集成性,可插入office及其他OLE对象
  - 多标签、多页面的组织形式
  - 输出为通用的网页、pdf、exe格式
 
4 产品背景
  出品公司EDraw致力于高质量易使用的流程图类工具软件。其产品虽多,但实际都是同一类绘图工具,价格在几十美元左右。由此也可以推断,本款Mind Map采用的应该是同一底层技术,虽为V1.0,但技术已经过同类产品的考验。推出免费产品,真是个人用户的福音。
  EDraw Max,    EDraw Network Diagrammer

  EDraw Organizational Chart,   EDraw Soft Diagrammer

EDraw Flowchart Software

5 思维导图

本软件名为Mind Map,思维导图功能如何呢?实事求是地说,使用起来与流程图软件并无差别,可以实现如下的效果,比FreeMind要美观一些,但不如FreeMind方便。

下图为本文“3. 功能丰富”部分的直观展示,即用EDraw Mind Map绘制。

终于有了替代Visio的免费软件:EDraw <wbr>Mind <wbr>Map

也就是说,虽名为Mind Map,实际上如同其他产品一样,本质都是流程图绘制工具。

6 总结

虽然仅为V1.0,试用中也出现过一些bug,但EDraw Mind Map已经使普通用户替换昂贵的Visio成为可能,从而为大家善用佳软、提高效率、减少盗版提供了便利。并且作为专业公司,相信EDraw会在未来版本中不断改进,带给用户更好的体验。

7 补充

2007-10-23补充:在本文发表后,xbeta与很多网友出于支持,注册了功能更加强大的EDraw Max 3.2中文版。这是部分截图与作品示例。

终于有了替代Visio的免费软件:EDraw <wbr>Mind <wbr>Map 

终于有了替代Visio的免费软件:EDraw <wbr>Mind <wbr>Map

WordPress 优化Title、Description和Keywords

不 少童鞋都喜欢安装诸如All in one seo 这样的优化插件,其实,这样的WordPress插件无非就是优化 Title,Meta的Description和Keywords。当然了,有不少免费主题在初期开发的时候,都没有优化Description和 Keywords。

Title 优化

Title 的优化很简单,只要使用下面的代码替换header.php文件中默认的Title调用代码就可以啦:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<title><?php
	global $page, $paged;
	$site_description = get_bloginfo( 'description', 'display' );
 	if ($site_description && ( is_home() || is_front_page() )) {
		bloginfo('name');
		echo " - $site_description";
	} else {
		echo trim(wp_title('',0));
		if ( $paged >= 2 || $page >= 2 )
			echo ' - ' . sprintf( __( '第%s页' ), max( $paged, $page ) );
		echo ' | ' ;
		bloginfo('name');
	}
?></title>

以上代码的特色:

1.如果设置了网站副标题,就像是副标题:倡萌的自留地 - 专注于WordPress主题开发

2.如果文章或存档目录有分页,显示分页:WordPress 优化 Description和Keywords - 第2页 | 倡萌的自留地

Description和Keywords优化

使用下面的代码替换header.php文件中默认的Description和Keywords调用代码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
<?php if (is_home() || is_front_page())
	{
	$description = "输入首页的描述文字";
	$keywords = "输入首页的关键词";
	}
	elseif (is_category())
	{
	$description = strip_tags(trim(category_description()));
	$keywords = single_cat_title('', false);
	}
	elseif (is_tag())
	{
	$description = sprintf( __( '与标签 %s 相关联的文章列表'), single_tag_title('', false));
    $keywords = single_tag_title('', false);
	}
	elseif (is_single())
	{
     if ($post->post_excerpt) {$description = $post->post_excerpt;} 
	 else {$description = mb_strimwidth(strip_tags($post->post_content),0,110,"");}
    $keywords = "";
    $tags = wp_get_post_tags($post->ID);
    foreach ($tags as $tag ) {$keywords = $keywords . $tag->name . ", ";}
	}
	elseif (is_page())
	{
	$keywords = get_post_meta($post->ID, "keywords", true);
	$description = get_post_meta($post->ID, "description", true);
	}
	?>
<meta name="keywords" content="<?php echo $keywords ?>" />
<meta name="description" content="<?php echo $description?>" />

用上述的方法,Keywords就是文章的tags,Description是发表日志时的摘要,如果没有添加摘要,就是该文章截取110个字作为摘要。

由于Page页面不支持填写标签tag和摘要,所以借助自定义字段来输出关键词和描述。使用字段 keywords 添加关键词,使用字段 description 添加描述文字。

注:本文的代码最后更新于 2013-4-24。

RocketMQ入门

RocketMQ是一款分布式、队列模型的消息中间件,具有以下特点:能够保证严格的消息顺序

一.RocketMQ网络部署特点

来源:http://www.changeself.net/archives/rocketmq%E5%85%A5%E9%97%A8%EF%BC%881%EF%BC%89.html

    (1)NameServer是一个几乎无状态的节点,可集群部署,节点之间无任何信息同步
    (2)Broker部署相对复杂,Broker氛围Master与Slave,一个Master可以对应多个Slaver,但是一个Slaver只能对应 一个Master,Master与Slaver的对应关系通过指定相同的BrokerName,不同的BrokerId来定义,BrokerId为0表示 Master,非0表示Slaver。Master可以部署多个。每个Broker与NameServer集群中的所有节点建立长连接,定时注册 Topic信息到所有的NameServer
    (3)Producer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供 Topic服务的Master建立长连接,且定时向Master发送心跳。Produce完全无状态,可集群部署
    (4)Consumer与NameServer集群中的其中一个节点(随机选择)建立长连接,定期从NameServer取Topic路由信息,并向提供 Topic服务的Master、Slaver建立长连接,且定时向Master、Slaver发送心跳。Consumer即可从Master订阅消息,也 可以从Slave订阅消息,订阅规则由Broker配置决定

二.RocketMQ储存特点

   (1)零拷贝原理:Consumer消费消息过程,使用了零拷贝,零拷贝包括一下2中方式,RocketMQ使用第一种方式,因小块数据传输的要求效果比sendfile方式好
           a )使用mmap+write方式
             优点:即使频繁调用,使用小文件块传输,效率也很高
             缺点:不能很好的利用DMA方式,会比sendfile多消耗CPU资源,内存安全性控制复杂,需要避免JVM Crash问题
        b)使用sendfile方式
             优点:可以利用DMA方式,消耗CPU资源少,大块文件传输效率高,无内存安全新问题
             缺点:小块文件效率低于mmap方式,只能是BIO方式传输,不能使用NIO
    (2)数据存储结构

三.RocketMQ关键特性

1.单机支持1W以上的持久化队列

    (1)所有数据单独储存到commit Log ,完全顺序写,随机读
    (2)对最终用户展现的队列实际只储存消息在Commit Log 的位置信息,并且串行方式刷盘
     这样做的好处:
    (1)队列轻量化,单个队列数据量非常少
    (2)对磁盘的访问串行话,避免磁盘竞争,不会因为队列增加导致IOWait增高
     每个方案都有优缺点,他的缺点是:
    (1)写虽然是顺序写,但是读却变成了随机读
    (2)读一条消息,会先读Consume  Queue,再读Commit Log,增加了开销
    (3)要保证Commit Log 与 Consume  Queue完全的一致,增加了编程的复杂度
     以上缺点如何客服:
    (1)随机读,尽可能让读命中pagecache,减少IO操作,所以内存越大越好。如果系统中堆积的消息过多,读数据要访问硬盘会不会由于随机读导致系统性能急剧下降,答案是否定的。
        a)访问pagecache时,即使只访问1K的消息,系统也会提前预读出更多的数据,在下次读时就可能命中pagecache
        b)随机访问Commit Log 磁盘数据,系统IO调度算法设置为NOOP方式,会在一定程度上将完全的随机读变成顺序跳跃方式,而顺序跳跃方式读较完全的随机读性能高5倍
    (2)由于Consume Queue存储数量极少,而且顺序读,在pagecache的与读取情况下,Consume Queue的读性能与内存几乎一直,即使堆积情况下。所以可以认为Consume Queue完全不会阻碍读性能
    (3)Commit Log中存储了所有的元信息,包含消息体,类似于MySQl、Oracle的redolog,所以只要有Commit Log存在, Consume  Queue即使丢失数据,仍可以恢复出来

2.刷盘策略

rocketmq中的所有消息都是持久化的,先写入系统pagecache,然后刷盘,可以保证内存与磁盘都有一份数据,访问时,可以直接从内存读取
2.1异步刷盘
在有 RAID 卡, SAS 15000 转磁盘测试顺序写文件,速度可以达到 300M 每秒左右,而线上的网卡一般都为千兆网卡,写磁盘速度明显快于数据网络入口速度,那么是否可以做到写完    内存就向用户返回,由后台线程刷盘呢?

(1).  由于磁盘速度大于网卡速度,那么刷盘的进度肯定可以跟上消息的写入速度。

(2).  万一由于此时系统压力过大,可能堆积消息,除了写入 IO,还有读取 IO,万一出现磁盘读取落后情况,会不会导致系统内存溢出,答案是否定的,原因如下:

a)  写入消息到 PAGECACHE 时,如果内存不足,则尝试丢弃干净的 PAGE,腾出内存供新消息使用,策略

是 LRU 方式。

b)  如果干净页不足,此时写入 PAGECACHE 会被阻塞,系统尝试刷盘部分数据,大约每次尝试 32 个 PAGE,

来找出更多干净 PAGE。

综上,内存溢出的情况不会出现

2.2同步刷盘:
同步刷盘与异步刷盘的唯一区别是异步刷盘写完 PAGECACHE 直接返回,而同步刷盘需要等待刷盘完成才返回,同步刷盘流程如下:
    (1)写入 PAGECACHE 后,线程等待,通知刷盘线程刷盘。
    (2)刷盘线程刷盘后,唤醒前端等待线程,可能是一批线程。
    (3)前端等待线程向用户返回成功。

3.消息查询

3.1按照MessageId查询消息

MsgId总共16个字节,包含消息储存主机地址,消息Commit Log Offset。从MsgId中解析出Broker的地址和Commit Log 偏移地址,然后按照存储格式所在位置消息buffer解析成一个完整消息
3.2按照Message Key查询消息

1.根据查询的key的hashcode%slotNum得到具体的槽位置  (slotNum是一个索引文件里面包含的最大槽目数目,例如图中所示 slotNum=500W)
2.根据slotValue(slot对应位置的值)查找到索引项列表的最后一项(倒序排列,slotValue总是指向最新的一个索引项)
3.遍历索引项列表返回查询时间范围内的结果集(默认一次最大返回的32条记录)
4.Hash冲突,寻找key的slot位置时相当于执行了两次散列函数,一次key的hash,一次key的hash取值模,因此这里存在两 次冲突的情况;第一种,key的hash值不同但模数相同,此时查询的时候会在比较第一次key的hash值(每个索引项保存了key的hash值),过 滤掉hash值不想等的情况。第二种,hash值相等key不想等,出于性能的考虑冲突的检测放到客户端处理(key的原始值是存储在消息文件中的,避免 对数据文件的解析),客户端比较一次消息体的key是否相同
5.存储,为了节省空间索引项中存储的时间是时间差值(存储时间——开始时间,开始时间存储在索引文件头中),整个索引文件是定长的,结构也是固定的

4.服务器消息过滤

RocketMQ的消息过滤方式有别于其他的消息中间件,是在订阅时,再做过滤,先来看下Consume Queue存储结构

1.在Broker端进行Message Tag比较,先遍历Consume Queue,如果存储的Message Tag与订阅的Message Tag不符合,则跳过,继续比对下一个,符合则传输给Consumer。注意Message Tag是字符串形式,Consume Queue中存储的是其对应的hashcode,比对时也是比对hashcode
2.Consumer收到过滤消息后,同样也要执行在broker端的操作,但是比对的是真实的Message Tag字符串,而不是hashcode
为什么过滤要这么做?
1.Message Tag存储hashcode,是为了在Consume Queue定长方式存储,节约空间
2.过滤过程中不会访问Commit Log 数据,可以保证堆积情况下也能高效过滤
3.即使存在hash冲突,也可以在Consumer端进行修正,保证万无一失

5.单个JVM进程也能利用机器超大内存

1.Producer发送消息,消息从socket进入java 堆
2.Producer发送消息,消息从java堆进入pagecache,物理内存
3.Producer发送消息,由异步线程刷盘,消息从pagecache刷入磁盘
4.Consumer拉消息(正常消费),消息直接从pagecache(数据在物理内存)转入socket,到达Consumer,不经过java堆。这种消费场景最多,线上96G物理内存,按照1K消息算,可以物理缓存1亿条消息
5.Consumer拉消息(异常消费),消息直接从pagecache转入socket
6.Consumer拉消息(异常消费),由于socket访问了虚拟内存,产生缺页中断,此时会产生磁盘IO,从磁盘Load消息到pagecache,然后直接从socket发出去
7.同5
8.同6

6.消息堆积问题解决办法

堆积性能指标
1消息的堆积容量依赖磁盘大小
2发消息的吞吐量大小受影响程度无Slave情况,会受一定影响
有Slave情况,不受影响
3正常消费的Consumer是否会受影响无Slave情况,会受一定影响
有Slave情况,不受影响
4访问堆积在磁盘的消息时,吞吐量有多大与访问的并发有关,最终会降到5000左右
在有Slave情况下,Master一旦发现Consumer访问堆积在磁盘的数据时,回想Consumer下达一个重定向指令,令 Consumer从Slave拉取数据,这样正常的发消息与正常的消费不会因为堆积受影响,因为系统将堆积场景与非堆积场景分割在了两个不同的节点处理。 这里会产生一个问题,Slave会不会写性能下降,答案是否定的。因为Slave的消息写入只追求吞吐量,不追求实时性,只要整体的吞吐量高就行了,而 Slave每次都是从Master拉取一批数据,如1M,这种批量顺序写入方式使堆积情况,整体吞吐量影响相对较小,只是写入RT会变长

 

大数据安全Hadoop安全模型的演进

敏感信息的安全和保护是当今人们最关心的问题之一。进入大数据时代,很多组织都在从各种源头收集数据,进行分析,并基于对海量数据集的分析做出决 策,因此这一过程中的安全问题变得愈发重要。与此同时,HIPAA和其他隐私保护法之类的法律法规也要求组织加强对这些数据集的访问控制和隐私限制。来自 内部和外部攻击者的网络安全漏洞与日俱增,通常都要数月之后才能发现,而那些受此影响的人正在为此付出代价。没能对他们的数据做出恰当访问控制的组织将受 到起诉,出现在负面报道中,并将面临监管机构的罚款。

请想一想下面这些让人大开眼界的统计数据:

  • 赛门铁克和Ponemon研究所今年公布的一项研究表明,一个安全漏洞在美国的平均组织化成本是540万美元1。另据最近一项研究表明,仅仅网络犯罪在美国造成的损失每年就有140亿美元之多。
  • 2011年索尼游戏机网络中出现的漏洞可以算是近代最大的安全漏洞之一,专家们估计索尼与该漏洞相关的损失大约在27亿到240亿美元之间(范围很大,但这个漏洞太大了,所以几乎难以对其进行量化)。2
  • Netflix和AOL已经因为其管理的大量数据和对个人信息的保护而受到金额达数百万美元的起诉(某些已经立案),尽管他们已经对这些数据做了“匿名化”处理并且是为了研究才公布的。3
  • 跟安全漏洞相关的除了可量化的成本(客户和业务合作伙伴的损失,诉讼,监管罚款),经历此类事件的组织的可信度和声誉还会受到影响,甚至可能会导致公司歇业。4

简而言之,如果没有恰当的安全控制,大数据很容易变成花费巨大的大问题。

对于处理大数据的组织来说这意味着什么?意味着你拥有的数据越多,对数据的保护就越重要。意味着不仅要安全有效地控制离开自有网络的数据,还必须做 好网络内部的数据访问控制。依据数据的敏感程度,我们可能要确保数据分析师能看到的数据是可以让他们分析的数据,并且必须明白发布这些数据及其分析结果可 能产生的后果。仅Netflix数据泄漏一个案例就足以表明,即使已经试图对数据做了“匿名化”处理,也可能会发布一些意料之外的信息——一些在差异化隐私领域标明的东西。

Apache Hadoop是最流行的大数据处理平台之一。尽管最初设计Hadoop时根本没考虑安全问题,但它的安全模型在不断地演进。Hadoop的兴起也招致了很 多批判,并且随着安全专家不断指出其潜在的安全漏洞及大数据的安全风险,使得Hadoop一直在改进其安全性。“Hadoop安全”市场曾出现过爆炸性的 增长,很多厂商都发布了“安全加强”版的Hadoop和对Hadoop的安全加以补充的解决方案。这类产品有Cloudera Sentry、 IBM InfoSphere Optim Data Masking、 英特尔的安全版Hadoop、DataStax企业版、 DataGuise for Hadoop、用于Hadoop的Protegrity大数据保护器、Revelytix Loom、Zettaset 安全数据仓库,此外还有很多,这里就不再一一列举了。与此同时,Apache也有 Apache Accumulo这样的项目,为使用Hapdoop提供了添加额外安全措施的机制。最终还出现了 Knox网关 (由HortonWorks贡献)和Rhino项目(由英特尔贡献)这样的开源项目,承诺要让Hadoop本身发生重大改变。

要让Hadoop达到安全性要求的巨大需求使得Hadoop一直在发生着变化,这也是我要在本文中重点讨论的内容。

Hadoop安全(简)史

Doug Cutting和Mike Cafarella最初为Nutch项目开发Hadoop时并没有考虑安全因素,这是众所周知的事实。因为Hadoop的最初用例都是围绕着如何管理大量 的公共web数据,无需考虑保密性。按照Hadoop最初的设想,它假定集群总是处于可信的环境中,由可信用户使用的相互协作的可信计算机组成。

最初的Hadoop中并没有安全模型,它不对用户或服务进行验证,也没有数据隐私。因为Hadoop被设计成在分布式的设备集群上执行代码,任何人 都能提交代码并得到执行。尽管在较早的版本中实现了审计和授权控制(HDFS文件许可),然而这种访问控制很容易避开,因为任何用户只需要做一个命令行切 换就可以模拟成其他任何用户。这种模拟行为非常普遍,大多数用户都会这么干,所以这一已有的安全控制其实没起到什么作用。

在当时,考虑到安全问题的组织把Hadoop隔离在专有网络中,只有经过授权的用户才能访问。然而由于Hadoop内部几乎没有安全控制,在这样的 环境中也会出现很多意外和安全事故。善意的用户可能会犯错(比如用一个分布式删除在几秒内就会删除大量数据)。所有用户和程序员对集群内的所有数据都有相 同的访问权限,所有任务都能访问集群内的任何数据,并且所有用户都可能会去读取任何数据集。因为MapReduce没有认证或授权的概念,某个顽劣的用户 可能为了让自己的任务更快完成而降低其他Hadoop任务的优先级,甚至更坏,直接杀掉其他任务。

随着Hadoop在数据分析和处理平台中的地位日益凸显,安全专家们开始关心来自Hadoop集群内部的恶意用户的威胁。恶意开发人员能轻易写出假 冒其他用户Hadoop服务的代码来(比如写一个新的TaskTracker并将其注册为Hapdoop服务,或者冒充hdfs或mapred用户,把 HDFS里的东西全删掉等等)。因为DataNode没有访问控制,恶意用户可以绕过访问控制从DataNode中读取任意数据块,或将垃圾数据写到 DataNode中破坏目标分析数据的完整性。所有人都能向JobTracker提交任务,并可以任意执行。

因为这些安全问题,Hadoop社区意识到他们需要更加健壮的安全控制,因此,雅虎的一个团队决定重点解决认证问题,选择Kerberos作为Hadoop的认证机制,这在他们2009年的白皮书上有记录。

在Hadoop发布.20.20x版本时他们实现了自己的目标,该版本采用了下面这些机制:

  • Kerberos RPC (SASL/GSSAPI) RPC连接上做相互认证——用SASL/GSSAPI来实现Kerberos及RPC连接上的用户、进程及Hadoop服务的相互认证。
  • HTTP Web控制台提供即插即用的认证——也就是说web应用和web控制台的实现者可以为HTTP连接实现自己的认证机制。包括(但不限于)HTTP SPNEGO认证。
  • 强制执行HDFS的文件许可——可以通过NameNode根据文件许可(用户及组的访问控制列表(ACLs))强制执行对HDFS中文件的访问控制。
  • 用于后续认证检查的代理令牌——为了降低性能开销和Kerberos KDC上的负载,可以在各种客户端和服务经过初始的用户认证后使用代理令牌。具体来说,代理令牌用于跟NameNode之间的通讯,在无需Kerberos服务器参与的情况下完成后续的认证后访问。
  • 用于数据块访问控制的块访问令牌——当需要访问数据块时,NameNode会根据HDFS的文件许可做出访问控制决策,并 发出一个块访问令牌(用HMAC-SHA1),可以把这个令牌交给DataNode用于块访问请求。因为DataNode没有文件或访问许可的概念,所以 必须在HDFS许可和数据块的访问之间建立对接。
  • 用作业令牌强制任务授权——作业令牌是由JobTracker创建的,传给TaskTracker,确保Task只能做交给他们去做的作业。也可以把Task配置成当用户提交作业时才运行,简化访问控制检查。
  • 把这些整合到一起让Hadoop向前迈出了一大步。自那之后,又实现了一些值得称道的修改:
  • 即插即用的认证HTTP SPNEGO认证—— 尽管2009年的Hadoop安全设计重点是即插即用的认证,但因为RPC连接(用户、应用和Hadoop服务)已经采用了Kerberos认证,所以 Hadoop开发者社区觉得如果能跟Kerberos保持一致更好。现在Hadoop web控制台被配置成使用HTTP SPNEGO这一用于web控制台的Kerberos实现。这样可以部分满足Hadoop亟需的一致性。
  • 网络加密——采用了SASL的连接可以配置成使用机密保护质量(QoP),在网络层强制加密,包括使用Kerberos RPC的连接和使用代理令牌的后续认证。Web控制台和MapReduce随机操作可以配置成使用SSL进行加密。HDFS文件传输器也能配置为加密的。

自对安全性进行重新设计以来,Hadoop的安全模型大体上没发生什么变化。随着时间的推移,Hadoop体系中的一些组件在Hadoop之上构建了自己的安全层,比如Apache Accumulo,提供单元级的授权,而HBase提供列和族系一级的访问控制。

Hadoop当前所面临的安全挑战

组织在保证Hadoop的安全性时会面临一些安全方面的挑战,在我和Boris Lublinsky 及 Alexey Yakubovich写的新书中,我们用了两章的篇幅集中讨论Hadoop的安全问题,其中一章的重点是Hadoop本身的安全能力,另外一章的重点是对 Hadoop的安全性进行补充的策略。

常见的安全问题有:

  • 如何强制所有类型的客户端(比如web控制台和进程)上的用户及应用进行验证?
  • 如何确保服务不是流氓服务冒充的(比如流氓TaskTracker和Task,未经授权的进程向 DataNode 出示ID 以访问数据块等?)
  • 如何根据已有的访问控制策略和用户凭据强制数据的访问控制?
  • 如何实现基于属性的访问控制(ABAC)或基于角色的访问控制(RBAC)?
  • 怎么才能将Hadoop跟已有的企业安全服务集成到一起?
  • 如何控制谁被授权可以访问、修改和停止MapReduce作业?
  • 怎么才能加密传输中的数据?
  • 如何加密静态数据?
  • 如何对事件进行跟踪和审计,如何跟踪数据的出处?
  • 对于架设在网络上的Hadoop集群,通过网络途径保护它的最好办法是什么?

这其中很多问题都能靠Hadoop自身的能力解决,但也有很多是Hadoop所无能为力的,所以行业内涌现出了很多Hadoop安全补充工具。厂商们发布安全产品来弥补Hadoop的不足有几个原因:

  1. 没有静态数据加密。目前HDFS上的静态数据没有加密。那些对Hadoop集群中的数据加密有严格安全要求的组织,被迫使用第三方工具实现HDFS硬盘层面的加密,或安全性经过加强的Hadoop版本(比如今年早些时候英特尔发布的版本)。
  2. Kerberos为中心的方式——Hadoop依靠 Kerberos做认证。对于采用了其他方式的组织而言,这意味着他们要单独搭建一套认证系统。
  3. 有限的授权能力——尽管Hadoop能基于用户及群组许可和访问控制列表(ACL)进行授权,但对于有些组织来说这样是不 够的。很多组织基于XACML和基于属性的访问控制使用灵活动态的访问控制策略。尽管肯定可以用Accumulo执行这些层面的授权过滤器,但 Hadoop的授权凭证作用是有限的。
  4. 安全模型和配置的复杂性。 Hadoop的认证有几个相关的数据流,用于应用程序和Hadoop服务的Kerberos RPC认证,用于web控制台的HTTP SPNEGO认证,以及使用代理令牌、块令牌、作业令牌。对于网络加密,也必须配置三种加密机制,用于SASL机制的保护质量,用于web控制台的 SSL,HDFS数据传输加密。所有这些设置都要分别进行配置,并且很容易出错。

如果Hadoop如今还不具备实现者所要求的安全能力,那么他们只能转而集成第三方工具,或使用某个厂商提供的安全加强版Hadoop,或采用其他有创造性的办法。

即将发生的大变化

2013年开端之际,英特尔发起了一个开源项目Rhino, 以提升Hadoop及其整个体系的安全能力,并将代码贡献给了Apache。这有望显著加强Hadoop当前的贡献。这一开源项目的总体目标是要支持加密 和密钥管理,一个超越Hadoop当前提供的用户及群组ACL的通用授权框架,一个基于认证框架的通用令牌,改善HBase的安全性,改善安全审计。这些 任务都被记录在Hadoop、 MapReduce、HBase 和 Zookeeper的JIRA中,择重点摘录如下:

  • 加密的静态数据——JIRA 任务 HADOOP-9331 (Hadoop加密编码解码器框架及加密编码解码器的实现) 和 MAPREDUCE-5025 (支持MapReduce中的加密编码解码器的密钥发行和管理) 有直接的关系。第一个侧重于创建一个加密框架及其实现,以支持对HDFS上文件的加密和解密;第二个侧重于为MapReduce提供密钥发行和管理框架, 以便能在MapReduce操作过程中对数据加密和解密。为此向Hadoop中引入了一个可分割AES编码解码器的实现,可以对磁盘上分散的数据加密和解 密。密钥发行和管理框架可以在MapReduce操作过程中解析密钥的上下文,因此MapReduce作业能够进行加解密操作。他们已经发展出的需求包括 MapReduce作业不同阶段的不同选项,并且要支持灵活的密钥获取办法。在一些相关的任务中,ZOOKEEPER-1688 将提供透明的快照加密能力,并在硬盘记录日志,防止敏感信息从静态文件中泄漏出去。
  • 基于令牌的认证及统一授权框架——JIRA 任务 HADOOP-9392 (基于令牌的认证及单点登录) 和 HADOOP-9466 (统一授权框架) 也是相互关联的。第一项任务展示了一个跟Kerberos耦合不是那么紧密的基于令牌的认证框架。第二项任务会用基于令牌的框架支持灵活的授权强制引擎, 以取代(但能向后兼容)当前的ACL式访问控制。对基于令牌的认证框架,第一项任务计划支持多种认证机制的令牌,比如LDAP 用户名/密码认证,Kerberos,X.509证书认证,SQL认证(基于SQL数据库的用户名/密码认证)和SAML。第二项任务要支持一个先进的授 权模型,侧重于基于属性的访问控制(ABAC)和XACML标准。
  • 提升HBase的安全性——JIRA 任务 HBASE-6222 (增加每-键值安全) 向HBase添加Apache Accumulo具备但HBase还没有的单元级授权。开发出构建在加密框架上的HBASE-7544 ,把它扩展到HBase,提供透明的表加密。

这些就是Hadoop的主要变化,但有望解决有这些安全需求的组织的安全问题。

结论

在我们这个步履匆匆而又相互关联的世界里,大数据就是王道,在我们对海量数据进行处理和分析时,明白安全的重要性至关重要。这要从弄懂数据及相关的 安全策略开始,也要明白组织的安全策略,并知道如何强制执行。本文介绍了Hadoop的安全简史,重点讲了常见的安全问题,并介绍了Rhino项目,给出 了一个未来的快照。

hadoop安全相关链接

https://en.wikipedia.org/wiki/SPNEGO
https://msdn.microsoft.com/en-us/library/ms995330.aspx
http://hadoop.apache.org/docs/r2.7.0/hadoop-auth/Examples.html
来源:http://www.infoq.com/cn/articles/HadoopSecurityModel/