2014年2月27日星期四

Linux运维实战之磁盘分区、格式化及挂载(一)

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
Linux运维实战之磁盘分区、格式化及挂载(一)  阅读原文»

用户名:土豆呼叫地瓜 文章数:22 评论数:8
访问量:15523:602:176:2 注册日期:2008-11-14

Linux运维实战之磁盘分区、格式化及挂载(一)

在网络系统中,磁盘和文件系统管理是两个非常基本、同时也是非常重要的管理任务,特别是文件系统管理,因为它与用户权限和整个网络系统的安全息息相关。本次博文的主题是关于Linux系统中磁盘分区、格式化及挂载,下次博文我们再详细讨论文件系统管理。

在操作系统中,磁盘管理属于设备管理的范畴。一块硬盘安装到主机之后称为裸设备,若要能够在Linux系统中使用必须对其进行如下步骤:分区=>格式化(创建文件系统)=>挂载我们先来谈谈Linux系统中的设备类型。

一、Linux系统中的设备类型:

Linux沿袭Unix的风格,将所有设备认成是一个文件。

设备文件分为两种:
1、块设备文件(b):

通常称为"随机设备"。所谓"块设备"是指对其信息的存取以"块"为单位,如通常的光盘、硬盘、软盘、磁带等,块长取51210244096字节。块设备可以直接通过块设备特别文件来访问。为了提高数据的传输效率,块设备驱动程序内部采用块缓冲技术。

2、字符设备文件(c):

通常称为"线性设备"。所谓"字符设备"是指在I/O传输中以字符为单位进行传输的设备,如键盘,打印机等。不过需要注意的是以字符为单位并不一定意味着是以字节为单位,因为有的编码规则规定,一个字符占16bit,合2个字节。

设备文件一般存放在/dev目录下:

/dev/hd[a-t]:IDE设备

/dev/sd[a-z]:SCSI设备

/dev/fd[0-7]:标准软驱

/dev/md[0-31]:软raid设备

/dev/loop[0-7]:本地回环设备

/dev/ram[0-15]:内存

/dev/null:无限数据接收设备 ,相当于回收站

/dev/zero:无限零资源,有点像冒泡机

/dev/tty[0-63]:虚拟终端

/dev/ttyS[0-3]:串口

/dev/lp[0-3]:并口

/dev/console:控制台

/dev/fb[0-31]:framebuffer

/dev/cdrom -> /dev/hdc

/dev/modem -> /dev/ttyS[0-9]

/dev/pilot -> /dev/ttyS[0-9]

/dev/console:控制台

Tips:控制台和虚拟终端的区别与联系:

控制台就好比电视机上的按钮,终端好比遥控板,他们的目的都是控制电视机,但是控制台必须在本地,而终端可以在远端,系统只有一个控制台,叫console,其他的都是终端

二、Linux系统中的磁盘及分区:

1、磁盘基础:

日常生活和工作中,常见的磁盘种类有以下几种:

(1)IDE(ATA)硬盘:

集成磁盘电子接口,Integrated Device Electronics,并行传输数据, 最大的理论传输速率为133MB/s

SATA:全称是Serial Advanced Technology Attachment(串行高级技术附件,一种基于行业标准的串行硬件驱动器接口)就是我们现在经常所说的SATA; 常见的理论传输速率:300MB/s, 600MB/s, 6Gb/s

(2)SCSI硬盘:

Small Computer System Interface, UltraSCSI 标准传输速率为320MB/s 常见转速:10000 RPM, 15000RPM

SAS:串行版的SCSI硬盘,最大传输速率:6Gbps

(3)SSD硬盘:

Disk固态硬盘(Solid State Disk)用固态电子存储芯片阵列而制成的硬盘,由控制单元和存储单元(FLASH芯片、DRAM芯片)组成。固态硬盘的接口规范和定义、功能及使用方法上与普通硬盘的完全相同,在产品外形和尺寸上也完全与普通硬盘一致。

(4)USB硬盘:

常见USB接口规范:1.1, 2.0, 3.0

2、Linux系统中的磁盘分区

(1)磁盘分区基础:

  • 首先问大家一个问题:磁盘为什么需要分区?

如果没有分区,我们要在一个磁盘上安装两个以上的操作系统是无法办到的。因此,每一个分区可以当做独立的文件系统来使用以便于安装多个操作系统,这就是磁盘需要分区的原因。

  • Linux中不同类型的硬盘和分区文件名不同:

IDE硬盘和分区文件名:

Linux对连接到IDE接口的硬盘使用/dev/hdxy的方式命名,其中hd表示硬盘为IDE类型,x表示硬盘序号,x的值可以是a、b、c、d。 y为分区号;如第二块IDE硬盘的第二个分区系统中文件名为hdb2

SATA或者SCSI硬盘和分区文件名:

连接到SCSI接口的设备使用ID号进行区别,SCSI设备ID号为0~15,SCSI接口卡本身的ID号是7。Linux对连接到SCSI接口卡的硬盘使用/dev/sdx的方式命名,x的值可以是a、b、c、d等,即ID号为0的SCSI硬盘名为/dev/sda,ID号为1的SCSI硬盘名为/dev/sdb,以此类推。LINUX对SCSI硬盘最多支持15个分区。

a2d132dd-6f59-47e2-9426-3b2728999074

说明:

a、所有使用USB接口的移动存储设备,不论是移动硬盘、优盘,还是USB光驱,都一律使用/dev/sdxx的设备文件。光驱(光盘)的设备文件一般默认为/dev/cdrom,这个就与光驱的接口无关了。

b、一个硬盘最多可以有4个(主+扩展)分区,其中,扩展分区只能有一个(如图中的/dev/hda2为扩展分区,/dev/hda5为扩展分区中划分的逻辑分区),分区的形式只能有两种:

P+P+P+P
P+P+P+E
//P表示主分区,E表示扩展分区(扩展分区保存的是磁盘的二级分区表,它指向具体的逻辑分区,因此扩展分区不能写东西,这是我个人的理解哈)
因1~4号己被保留,所以第1个逻辑分区的代号由5号开始,以此顺序增加到磁盘号,若未划分/dev/sda3,/dev/sda4分区,则这两个代号是空的被保留下来的代号。 逻辑分区和主分区没有关系,只与MBR的空间有关系

  • MBR(Main/Master Boot Record)知识点:

引导扇区在每个分区里都存在

动、静态NAT及NAT端口映射和PAT转换  阅读原文»

用户名:笑壹笑 文章数:28 评论数:0
访问量:24086:577:296:2 注册日期:2013-11-09

动、静态NAT及NAT端口映射和PAT转换

(一)静态NAT

将一个私有地址,转换成一个共有地址,(一对一的),如下图:及将私有地址192.168.10.10转换成公有地址188.88.88.88

R1(config-if)#ipnatinsidenat运用在接口inside方向

R1(config-if)#ipnatoutsidenat运用在接口outside方向

R1(config)#ipnatinsidesourcestatic192.168.10.0188.88.88.88配置静态nat转换

R1#clearipnattranslation*清除所有nat转换条目,静态绑定的不会清除

R1#showrun|snat查看nat配置信息

R1#showipnattranslations查看nat转换条目

wKiom1MNc0zCXo8OAAA_ALQf5Tg155.jpg

wKiom1MNc0zyB-5MAABFIA7imLs430.jpg

wKioL1MNcyeBSGB-AAAyrmKbQnE358.jpg

(二)动态NAT

动态pat也是将一个私有地址"配对"一个公有地址(一对一),不同的是,需要到公有池拿地址,当公有池地址拿尽,私有地址将无法上网,如下图:及将私有地址192.168.20.10转换成公有地址188.88.88.1

R1(config)#ipnatpooldtnat188.88.88.1188.88.88.8netmask255.255.0.0创建公有地址池名,及地址池段

R1(config)#ipaccess-listextendeddtnat创建acl列表

R1(config-ext-nacl)#permitip192.168.20.00.0.0.255any只允许192.168.20段拿地址

R1(config)#ipnatinsidesourcelistdtnatpooldtnatacl运用在nat地址池

wKioL1MNcz2RA98TAAA_ALQf5Tg263.jpg

wKiom1MNc2OwGje5AABByRaWT_s505.jpg

wKiom1MNc2OjrGZIAAA0AskRaFw764.jpg

(三)NAT端口映射

外网需要访问内网服务,可通过端口映射外网口实现

1.通过nat端口映射(非23端口)

2.R1(config)#ipnatinsidesourcestatictcp192.168.1.123202.106.1.12323

R2#telnet202.106.1.12321telnet时需加端口号

wKioL1MNc1Kh4IgQAABDZ7ueWDw309.jpg

wKiom1MNc3jg4I3EAABdznkDQT0310.jpg

2通过nat端口映射出口路由端口

R1(config)#ipnatinsidesourcestatictcp192.168.1.223interfaceFastEthernet0/023

R2#telnet202.106.1.1直接telnet,无需加端口号

wKioL1MNc2KyeZ9AAABjvwnpW0k494.jpg

(四)PAT

多个私有地址对一个公有地址

1.复用路由器外部接口地址(出口路由端口

m1(config)#ipnatinsidesourcelistjkpatinterfacefastEthernet0/0overload调用acl列表,并复用路由器外部接口地址

R1(config)#ipaccess-listextendedjkpat创建acl列表

R1(config-ext-nacl)#permitip192.168.30.00.0.0.255any只允许192.168.30段拿地址

wKioL1MNc3azgFCRAABDZ7ueWDw917.jpg

wKiom1MNc5uTVtNhAABBPTrMCc0083.jpg

wKioL1MNc3bxyvAwAABJ70OAxSI899.jpg

2.复用外部全局地址上公网(即:公网池地址)

R1(config)#ipaccess-listextendedwbpat创建acl

R1(config-ext-nacl)#permitip192.168.40.00.0.0.255any只允许192.168.40段拿地址

R1(config)#ipnatpoolwbpat188.88.188.188188.88.188.188netmask255.255.255.0创建地址池,但起始地址和结束地址一样

R1(config)#ipnatinsidesourcelistwbpatpoolwbpatoverloadacl运用于地址池

【翻译】自定义 UIViewController Transitions - 小木头_迪

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
【翻译】自定义 UIViewController Transitions - 小木头_迪  阅读原文»

  iOS7中引入了控制器间的切换切换动画,适用于UINavigationController栈内核modal显示

  iOS7 介绍了两种切换方式,一种是自动切换,另一种是交互式切换。下面就介绍一下NavigationController中实现fade动画切换。

  源码地址:github.com/ShinobiControls/iOS7-day-by-day

Navigation Controller Delegate

  在动画的世界里面充满了协议,然而现在这个项目中创建一个我们想要看见的视图,添加的协议需要交互式切换和模态视图的展现。

  UINavigationControllerDelegate协议提供了4个新方法,用来决定自定义动画的切换。

  我们感兴趣的方法是:

  

- (id<UIViewControllerAnimatedTransitioning>)navigationController:
animationControllerForOperation:
fromViewController:
toViewController:

这个方法将会在导航控制器切换过度的时候调用(同样适用于storyboard适用segue的过度),所以我们可以决定返回哪种类型的切换。

我们创建一个类作为NavigationController的delegate

@interface SCNavControllerDelegate : NSObject <UINavigationControllerDelegate>
@end

实现方法是:

@implementation SCNavControllerDelegate
- (id<UIViewControllerAnimatedTransitioning>)navigationController:(UINavigationController *)navigationController
animationControllerForOperation:(UINavigationControllerOperation)operation
fromViewController:(UIViewController
*)fromVC
toViewController:(UIViewController
*)toVC
{
return [SCFadeTransition new];
}
@end

我们想要所有的切换都是相同的,不管是进入还是返回,所以我们返回的是SCFadeTransition对象给每一次切换。

设置代理是非常见到你的,你可以在项目里面看见:

- (id)initWithCoder:(NSCoder *)aDecoder
{
self
= [super initWithCoder:aDecoder];
if(self) {
_navDelegate
= [SCNavControllerDelegate new];
self.
delegate = _navDelegate;
}
return self;
}

_navDelegate 是一个ivar类型id<UINavigationControllerDelegate>.

创建自定义变换

我们看见这个代理需要返回一些切换对象,也就是返回一个遵循UIViewControllerAnimatedTransitioning协议的对象,这个协议中有三个方法,其中两个是必须要实现的。

transitionDuration:(必须实现)。返回动画的持续时间

animateTransition:(必须实现)在控制器间实现动画的过度。提供一个我们需要的对象用来联系不同的组件。

animationEnded:(选择实现)这个会在动画完成之后调用,可以在动画完成之后触发一些方法。

我们定义一个SCFadeTransition类来实现这两个方法

@interface SCFadeTransition : NSObject <UIViewControllerAnimatedTransitioning>
@end

实现方法如下

- (NSTimeInterval)transitionDuration:(id<UIViewControllerContextTransitioning>)transitionContext
{
return 2.0;
}

animateTransition:方法调用的时候提供一个遵循UIViewControllerContextTransitioning协议的对象,这个对象用来获取动画完成的点点滴滴。第一个方法我们用 viewControllerForKey:,让我们能够掌握两个视图控制器间的过度。

// Get the two view controllers
UIViewController *fromVC = [transitionContext viewControllerForKey:UITransitionContextFromViewControllerKey];
UIViewController
*toVC = [transitionContext viewControllerForKey:UITransitionContextToViewControllerKey];

这个内容提供给我们一个UIView的动画,通过containerView方法联系

// Get the container view - where the animation has to happen
UIView *containerView = [transitionContext containerView];

我们必须联系每一个视图控制器的子视图

// Add the two VC views to the container
[containerView addSubview:fromVC.view];
[containerView addSubview:toVC.view];

我们不想看见过度的视图,所以我们必须把alpha属性设置为0:

toVC.view.alpha = 0.0;

现在我们已经提供了一个动画,在控制器间切换有个简单的fade效果,我们可以用UIView animation block:


delay:
0
options:
0
animations:
^{
toVC.view.alpha
= 1.f;
}
completion:
^(BOOL finished) {
// Let's get rid of the old VC view
[fromVC.view removeFromSuperview];
// And then we need to tell the context that we're done
[transitionContext completeTransition:YES];
}];

知识点:

1、设置一个动画的持续时间,实现transitionDuration

2、"from"视图控制器的视图需要removed从view的层级中,当动画完成的时候。

3、completeTransition:方法在切换内容需要的时候调用,当动画完成的时候。


本文链接:http://www.cnblogs.com/iOS-dd/p/3573231.html,转载请注明。

进程与线程的一个简单解释 - 王绍军  阅读原文»

进程(process)和线程(thread)是操作系统的基本概念,但是它们比较抽象,不容易掌握。

最近,我读到一篇材料,发现有一个很好的类比,可以把它们解释地清晰易懂。

1.

计算机的核心是CPU,它承担了所有的计算任务。它就像一座工厂,时刻在运行。

2.

假定工厂的电力有限,一次只能供给一个车间使用。也就是说,一个车间开工的时候,其他车间都必须停工。背后的含义就是,单个CPU一次只能运行一个任务。

3.

进程就好比工厂的车间,它代表CPU所能处理的单个任务。任一时刻,CPU总是运行一个进程,其他进程处于非运行状态。

4.

一个车间里,可以有很多工人。他们协同完成一个任务。

5.

线程就好比车间里的工人。一个进程可以包括多个线程。

6.

车间的空间是工人们共享的,比如许多房间是每个工人都可以进出的。这象征一个进程的内存空间是共享的,每个线程都可以使用这些共享内存。

7.

可是,每间房间的大小不同,有些房间最多只能容纳一个人,比如厕所。里面有人的时候,其他人就不能进去了。这代表一个线程使用某些共享内存时,其他线程必须等它结束,才能使用这一块内存。

8.

一个防止他人进入的简单方法,就是门口加一把锁。先到的人锁上门,后到的人看到上锁,就在门口排队,等锁打开再进去。这就叫"互斥锁"(Mutual exclusion,缩写 Mutex),防止多个线程同时读写某一块内存区域。

9.

还有些房间,可以同时容纳n个人,比如厨房。也就是说,如果人数大于n,多出来的人只能在外面等着。这好比某些内存区域,只能供给固定数目的线程使用。

10.

这时的解决方法,就是在门口挂n把钥匙。进去的人就取一把钥匙,出来时再把钥匙挂回原处。后到的人发现钥匙架空了,就知道必须在门口排队等着了。这种做法叫做"信号量"(Semaphore),用来保证多个线程不会互相冲突。

不难看出,mutex是semaphore的一种特殊情况(n=1时)。也就是说,完全可以用后者替代前者。但是,因为mutex较为简单,且效率高,所以在必须保证资源独占的情况下,还是采用这种设计。

11.

操作系统的设计,因此可以归结为三点:

(1)以多进程形式,允许多个任务同时运行;

(2)以多线程形式,允许单个任务分成不同的部分运行;

(3)提供协调机制,一方面防止进程之间和线程之间产生冲突,另一方面允许进程之间和线程之间共享资源。


本文链接:http://www.cnblogs.com/psdesign/p/3573226.html,转载请注明。

阅读更多内容

2014年2月25日星期二

[译]FastClick: native-like tapping for touch apps - hlily

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
[译]FastClick: native-like tapping for touch apps - hlily  阅读原文»

原文地址:http://labs.ft.com/2011/08/fastclick-native-like-tapping-for-touch-apps/

这篇文章是一篇老文了,现在才看到,真是落后啊。

快速点击:像原生一样的触发app
这篇博客最初是发表在Assanka的博客上的,后来12年1月的时候Assanka被金融时代收购了,成为了现在的FT实验室。
12年8月的时候,把FastClick放到了GitHub上,将会一直使用GitHub来托管。
利用JavaScript API 来实现触摸事件和手势是一个非常直观的尝试。随着Webkit浏览器对web标准更多的支持,Web apps 越来越接近原生的app.
但是,你会发现,在越来越深入到Web app的开发过程中,当用户不再把你的app当作一个网站来看待的时候,会出现一些问题。
95年和现在的触屏设备,受欢迎程序是不可同日而语的。JS的Dom 事件原本是用来反应鼠标的“点击”动作,每一个事件对应单一的一个动作。
比如onClick事件。但是怎么样把他们转换到触摸屏设备呢?这是不容易的。
把一个"tap"事件作为一个"click"事件是可行的方法。至少在IOS上,因为没有tap事件-onClick事件被用来代替它是没问题的。但是为了能够正确的处理多种触屏手势,比如“捏”的手势,两次触击的手势等,就需要做一些妥协。比如tap事件与click事件触发,两者之间就有一个300MS的延迟,会让你的app感觉很迟钝,虽然这不是技术上的问题。
我们解决这个问题的方法是,在我们的app中跟踪所有的TouchStart事件,在接收到touchend事件的时候,触发一个click事件。最后,我们完善了快速点击的代码,把他变成了一个小而高效的库,叫做FastClick. 这个代码通过成百上千的用户测试,到目前为止已经比较健壮了。我们很想知道别人是如何解决类似的问题的,也想跟大家一起接受这个挑战并不断的提高我们自己的方式方法。所以我们开放了FastClick. 希望你能够试用它,并提出您的想法。
使用FastClick的时候,在需要使用的层上,实例化它。我们使用document.body是因为希望所有的按钮和链接都获得快速点击。在事件监听的时候,‘click’事件的forwardedTouchEvent属性将被设置为true.
如果在应用程序中,你使用按钮或者是ios风格的菜单,就能感受到明显的反应迟钝现象。下面用一个例子来说明,如何用FastClick来解决这个问题。
<button class=”fastclick” onclick=”someHandler()”>Fast click</button>
<button onclick=”someHandler()”>Slow click</button>
<script type='text/javascript'>
var button = document.querySelector(".fastclick");
new FastClick(button);
</script>

在这个例子中,属性值为fastclick的按钮,当你的手指触摸到屏幕以后,就能立马进行事件处理。而其他的按钮,触摸以后,经了一个延迟的时间才有反应。
不过,通过选择器选择的元素在接受代码合成的点击时,会有一些问题。所以如果把FastClick用到包含选择器的元素上,FastClick会忽略代码作用到选择器上的点击事件,只允许触发元素默认的点击事件。
如果你想让在FastClick层上的其他元素接受非代码合成的点击的话,你需要两个class的帮助,一个是clickevent,一个是touchandclickevent. 对任何在FastClick层上可点击的元素,触碰元素将会触发不同的效果。
(1)没有class值: 元素将只会接受来自FastClick的代码点击。默认的点击事件将会阻止掉。
(2)class值是clickevent 的:元素只会接受默认的点击事件,忽略掉FastClick.
(3)touchandclickevent : 元素 不仅会接受默认的点击事件,还会接受FastClick的事件,并且FastClick的事件会先被触发。
<div class="fastclick">
<button onclick="someHandler()">
Will receive programmatic click event接受FastClick的点击
</button>
<button class="clickevent" onclick="someHandler()">
Will receive non
-programmatic click event只接受默认的点击事件
</button>
<button class="touchandclickevent" onclick="someHandler()">
Will receive both click events两种点击都支持
</button>
</div>
<script type='text/javascript'>
var button = document.querySelector(".fastclick");
new FastClick(button);
</script>

这个有用吗?试一下另外一个例子(http://labs.ft.com/wp-content/uploads/2011/08/fastclickdemo-input.html)。用点击事件来尝试触发input的focus事件。IOS上只会允许非程序的click触发。所以只有在class值为clickevent的时候,才管用

本文链接:http://www.cnblogs.com/lilyimage/p/3568773.html,转载请注明。

ASP.NET MVC 5 - 给电影表和模型添加新字段 - 葡萄城控件技术团队博客  阅读原文»

在本节中,您将使用Entity Framework Code First来实现模型类上的操作。从而使得这些操作和变更,可以应用到数据库中。

默认情况下,就像您在之前的教程中所作的那样,使用 Entity Framework Code First自动创建一个数据库,Code First为数据库所添加的表,将帮助您跟踪数据库是否和从它生成的模型类是同步的。如果他们不是同步的,Entity Framework将抛出一个错误。这非常方便的在开发时就可以发现错误,否则您可能会在运行时才发现这个问题。

为对象模型的变更设置 Code First Migrations

从解决方案资源管理器中双击Movies.mdf,打开数据库工具, 在数据库工具 (数据库资源管理器、 服务器资源管理器或 SQL Server对象资源管理器),右键单击Movies.mdf f,并选择删除

clip_image002

Build应用程序,以确保没有任何编译错误。

工具菜单上,单击库包管理器,然后点击程序包管理器控制台.

clip_image004

程序包管理器控制台窗口,在提示符 PM> 后输入:

Enable-Migrations -ContextTypeName MvcMovie.Models.MovieDBContext

clip_image006

如上所示的Enable-Migrations 命令,会在Migrations文件夹下创建一个Configuration.cs 文件。

clip_image008

在Visual Studio 里面打开Configuration.cs 文件. 用下面的代码替换Seed函数:

protected override void Seed(MvcMovie.Models.MovieDBContext context)
{
context.Movies.AddOrUpdate( i
=> i.Title,
new Movie
{
Title
= "When Harry Met Sally",
ReleaseDate
= DateTime.Parse("1989-1-11"),
Genre
= "Romantic Comedy",
Price
= 7.99M
},

new Movie
{
Title
= "Ghostbusters ",
ReleaseDate
= DateTime.Parse("1984-3-13"),
Genre
= "Comedy",
Price
= 8.99M
},

new Movie
{
Title
= "Ghostbusters 2",
ReleaseDate
= DateTime.Parse("1986-2-23"),
Genre
= "Comedy",
Price
= 9.99M
},

new Movie
{
Title
= "Rio Bravo",
ReleaseDate
= DateTime.Parse("1959-4-15"),
Genre
= "Western",
Price
= 3.99M
}
);

}

右键单击红色波浪线下Movie,并选择"解析(Resolve)",然后单击"using MvcMovie.Models;

clip_image010

这样做会增加下面的语句:

using MvcMovie.Models;

Code First Migrations调用Seed的方法,每个迁移(程序包管理器控制台 更新数据库),此方法用于updates数据(如果数据存在),或inserted数据。

AddOrUpdate方法在下面的代码执行一个的"upsert"操作:

context.Movies.AddOrUpdate(i => i.Title,
new Movie
{
Title
= "When Harry Met Sally",
ReleaseDate
= DateTime.Parse("1989-1-11"),
Genre
= "Romantic Comedy",
Rating
= "PG",
Price
= 7.99M
}

因为Seed方法与每个迁移同时运行时,故,你不能仅仅插入数据,因为当你正试图添加,可能已经完成了创建数据库后的第一次迁移。"upsert"操作阻止错误的发生,如果你尝试插入一个已经存在的行,它覆盖任何数据更改,当你在测试应用程序的同时。你可能不希望这样的事情发生:在某些情况下,当您更改数据测试时,你希望你的变化后数据库同步更新。在这种情况下,你想要做一个有条件的插入操作:只有当它不存在的时候,插入一行。
传递给

分布式文件存储--MFS

本邮件内容由第三方提供,如果您不想继续收到该邮件,可 点此退订
分布式文件存储--MFS  阅读原文»

用户名:san_gh
文章数:51
评论数:22
访问量:6602无忧币:1088博客积分:608:3 注册日期:2013-04-02

分布式文件存储--MFS

分布式文件存储--MFS

今天给大家讲的是目前最比较流行的分布式文件存储--MFS。MooseFS呢是一个具有容错性的网络分布式文件系统。它把数据分散存放在多个物理服务器上,而呈现给用户的则是一个统一的资源。

它有好多比较好的特点比如:

1、高可靠(数据的多个拷贝被存储在不同的计算机上)
2、通过附加新的计算机或者硬盘可以实现容量的动态扩展
3、删除的文件可以根据一个可配置的时间周期进行保留(一个文件系统级别的回收站)
4、不受访问和写入影响的文件连贯快照

下面给大家介绍下mfs的体系结构和工作原理:

1、管理服务器(master server)
一台管理整个文件系统的独立主机,存储着每个文件的元数据(文件的大小、属性、位置信息,包括所有非常规文件的所有信息,例如目录、套接字、管道以及设备文件)
2、数据服务器群(chunk servers)
任意数目的商用服务器,用来存储文件数据并在彼此之间同步(如果某个文件有超过一个备份的话)
3、元数据备份服务器(metalogger server)
任意数量的服务器,用来存储元数据变化日志并周期性下载主要元数据文件,以便用于管理服务器意外停止时好接替其位置。
4、访问mfs的客户端

任意数量的主机,可以通过mfsmount进程与管理服务器(接收和更改元数据)和数据服务器(改变实际文件数据)进行交流。

2012050411333297.jpg

(官方网络示意图)

2012050411295697.jpg2012050411305542.jpg

(读写原理图)

MFS的读数据过程

1.client当需要一个数据时,首先向master server发起查询请求;

2.管理服务器检索自己的数据,获取到数据所在的可用数据服务器位置ip|port|chunkid;

3.管理服务器将数据服务器的地址发送给客户端;

4.客户端向具体的数据服务器发起数据获取请求;

5.数据服务器将数据发送给客户端;

MFS的写数据过程

1.当客户端有数据写需求时,首先向管理服务器提供文件元数据信息请求存储地址(元数据信息如:文件名|大小|份数等);

2.管理服务器根据写文件的元数据信息,到数据服务器创建新的数据块;

3.数据服务器返回创建成功的消息;

4.管理服务器将数据服务器的地址返回给客户端(chunkIP|port|chunkid);

5.客户端向数据服务器写数据;

6.数据服务器返回给客户端写成功的消息;

7.客户端将此次写完成结束信号和一些信息发送到管理服务器来更新文件的长度和最后修改时间

MFS的删除文件过程

1.客户端有删除操作时,首先向Master发送删除信息;

2.Master定位到相应元数据信息进行删除,并将chunk server上块的删除操作加入队列异步清理;

3.响应客户端删除成功的信号

MFS修改文件内容的过程

1.客户端有修改文件内容时,首先向Master发送操作信息;

2.Master申请新的块给.swp文件,

3.客户端关闭文件后,会向Master发送关闭信息;

4.Master会检测内容是否有更新,若有,则申请新的块存放更改后的文件,删除原有块和.swp文件块;

5.若无,则直接删除.swp文件块。

MFS重命名文件的过程

1.客户端重命名文件时,会向Master发送操作信息;

2.Master直接修改元数据信息中的文件名;返回重命名完成信息;

MFS遍历文件的过程

1.遍历文件不需要访问chunk server,当有客户端遍历请求时,向Master发送操作信息;

2.Master返回相应元数据信息;

3.客户端接收到信息后显示

好了上面已经介绍的差不多了,下面咱们开始安装部署mfs。

一、环境介绍

192.168.1.10 master、metalogger

192.168.1.11 chunk server、client server

我这里为了方便我把master和metalogger放到了一块、但是实际生产环境中不要这样因为master本来就是单点,还有chunk server和client server也不应该放到一块。

二、安装步骤

  master server 搭建  [root@localhost Desktop]#  useradd mfs -s /sbin/nologin  [root@localhost Desktop]# mv mfs-1.6.20-2.tar.gz /tmp  [root@localhost Desktop]# cd /tmp/  [root@localhost tmp]#  tar xf mfs-1.6.20-2.tar.gz  [root@localhost tmp]# cd mfs-1.6.20-2  [root@localhost mfs-1.6.20-2]#  ./configure --prefix=/usr/local/mfs --with-default-user=mfs --with-default-group=mfs --disable-mfschunkserver --disable-mfsmount  [root@localhost mfs-1.6.20-2]# cd /usr/local/mfs/etc/  [root@localhost etc]# ls  mfsexports.cfg.dist  mfsmaster.cfg.dist  mfsmetalogger.cfg.dist  [root@localhost etc]# cp mfsmaster.cfg.dist mfsmaster.cfg  [root@localhost etc]# cp mfsexports.cfg.dist mfsexports.cfg  [root@localhost etc]# cp /usr/local/mfs/var/mfs/metadata.mfs.empty /usr/local/mfs/var/mfs/metadata.mfs  [root@localhost etc]# /usr/local/mfs/sbin/mfsmaster start  working directory: /usr/local/mfs/var/mfs  lockfile created and locked  initializing mfsmaster modules ...  loading sessions ... file not found  if it is not fresh installation then you have to restart all active mounts !!!  exports file has been loaded  loading metadata ...  create new empty filesystemmetadata file has been loaded  no charts data file - initializing empty charts  master <-> metaloggers module: listen on *:9419  master <-> chunkservers module: listen on *:9420  main master server module: listen on *:9421  mfsmaster daemon initialized properly  [root@localhost etc]#  /usr/local/mfs/sbin/mfscgiserv  starting simpl

阅读更多内容