怎样安装 – MogileFS文档翻译

原文地址:http://mogilefs.pbworks.com/HowTo

简介

这篇文档解释了怎样安装 MogileFS 和一个基本的配置。本文是面向初级系统管理员,让他们可以在一个基本的 linux 发行版上把 MogileFS 跑起来。

假定你要安装 3 种角色。一台机器上可以承担多于一种角色。我会使用主机名 mogiledb.yourdomain.com、mogiletracker.yourdomain.com 和 mogilestorage.yourdomain.com 。根据你的需要重命名他们。

获取 MogileFS

你随便看看就能在 Danga 网站上或者 CPAN 或者从当前的 SVN 仓库里找到 MogileFS 。如果你从 SVN 上拉回代码,你会得到一个崭新的版本并且和这篇文档最相符。

用 svn (http://subversion.trigris.org),chekout 最近最好的版本(下面的例子是从 trunk 中拉回代码)。

$ mkdir mogilefs-src
$ cd mogilefs-src
$ svn checkout http://code.sixapart.com/svn/mogilefs/trunk

安装

创建一个数据库

安装一个 MySQL 服务器已经超出了这篇文档的范围。在多数发行版中都能有这些包,找一个你需要的套件。在安装好一个 Mysql 服务器并且运行在主机 mogiledb.yourdomain.com 上。为 MogileFS 创建一个表和一个用户。某些库不能很好的处理 MySQL 的密码,如果你用到了,用函数 “OLD_PASSWORD” 设置密码。请确认你用了比例子里更好的密码。

#mysql
mysql> CREATE DATABASE mogilefs;
mysql> GRANT ALL ON mogilefs.* TO ‘mogile’@’%’;
mysql> SET PASSWORD FOR ‘mogile’@’%’ = OLD_PASSWORD( ‘sekrit’ );
mysql> FLUSH PRIVILEGES;
mysql> quit

你还需要创建 shema,这会在之后的文档里说到。

安装 Tracker 和 Storage 服务器。

要成功安装 MogileFS 你需要获取并安装 MogileFS 特定的 perl 模块和他们的依赖包。顺利的话,你已经从 SVN 仓库取回了 MogileFS 的源代码。如果是的话,服务器端组件已经在 trunk/server 目录了。一般说来,你需要先安装依赖模块(见下文)。一旦所有的依赖包都已经就绪,就可以用如下命令安装 MogileFS (从你获取的 SVN 顶级目录开始)。

# cd trunk/server/
# perl Makefile.PL
# make
# make test
# make install

如果你在这个过程中出错,错误信息很可能会告诉你缺少了某个依赖模块。如果在 ‘make test’ 这步出错:”t/00-startup….DBI connect(‘mysql’,’root’,…) failed: Can’t
connect to local MySQL server through socket
‘/var/run/mysqld/mysqld.sock’ (2) at t/lib/mogtestlib.pl line 16″,一般可以忽略。在 mogiledb.yourdomain.com 之外运行 MySQL 应该是不必要的。

你和可能想要在每个 tracker 或 storage 服务器(这些会在之后配置)上安装一些实用工具。它们位于 trunk/utils 目录,可以用如下命令安装(从你获取的 SVN 顶级目录开始)。

# cd trunk/utils/
# perl Makefile.PL
# make
# make test
# make install

你还会想要 API —— 工具库需要这个。它们位于 trunk/api/perl 目录,可以用如下命令安装(从你获取的 SVN 顶级目录开始)。

# cd trunk/api/perl
# perl Makefile.PL
# make
# make test
# make install

安装 Perl 模块依赖

对于 Perl 模块,你需要 Perlbal 和 Danga-Socket (至少)和其他依赖。如果你不确定怎样放置依赖模块,考虑使用 CPAN(http://cpan.org/),它可以安装一个模块以及他的所有的依赖。如果你已经有一个合适的 Perl 安装,你可能已经有了多数非 MogileFS 模块。

安装多数 perl 模块的基本过程是:

解压模块

# tar -xvzf Linux-AIO-1.9.tar.gz

创建 makefile:

# cd Linux-AIO-1.9
# perl Makefile.PL

构建代码

#make

测试代码(默写模块可能没有这一步,但不影响使用)

#make test

安装

#make install

如果你看到错误信息表明缺少一个模块依赖,先获取并安装缺少的模块,然后再试一次。

 

定义 – MogileFS文档翻译

原文地址:http://mogilefs.pbworks.com/Definitions

domain:

domain 是文件区分的最高层次。每个 domain 中的文件 key 是唯一的。一个 domain 包含了在 domain 中定义文件的 class 的集合。domain 的例子: fotobilder、livejournal。

class:
每个文件只属于一个 class 。一个 class 只属于一个 domain 。事实上,class 只是指定文件的“最小复制数”的。class 的例子:userpicture、userbackup、phonepost。

key:

key 是一个标识文件的唯一的文本字符串。在一个 domain 中 key 是唯一的。key 的例子:userpciture:34:39、phonepost:93:3834、userbackup:15。

最小复制数:

这是 class 的一个属性。定义了这个 class 中的文件需要被复制到不同的设备的份数,以确保数据冗余避免丢失。

文件:

文件是一个上传到 MogileFS 来存储确定的 bit 集合。文件会根据“最小复制数”被复制。每个文件有一个 key ,是一个 class 的一部分,位于一个 domain 中。文件是 MogileFS 为你存储的东西。

 

高层概览 – MogileFS文档翻译

原文地址:http://mogilefs.pbworks.com/HighLevelOverview

一下是关于 MogileFS 的工作方式的高层概览。

涉及到的部分:

 

  • 应用 (Application):要存储/加载文件的东西。
  • 跟踪器(Tracker)(mogilefsd 进程):基于事件的父进程/消息总线,管理所有来自应用的客户端通信(要处理的请求操作)。包括均衡负载请求到“请求工作进程”,处理所有 mogilefsd 子进程间的通信。你应该运行两个 tracker 在不同的主机上,以实现 HA 或者进一步实现负载均衡(需要多于两个)。mogilefsd 下的子进程包括:
    • 复制(Replication):四处复制文件。
    • 删除(Deletion):从 namespace 中删除是即时的。从文件系统中删除是异步的。
    • 查询(Query):响应来自客户端的请求。
    • 死神(Reaper):在一个磁盘失败的时候将要复制的文件重新排入队列。
    • 监控器(Monitor):监控主机和设备的健康和状态
  • 数据库(Database):存储 MogileFS 元数据(命名空间、某个文件在哪里)的数据库。应当以 HA 配置搭建,以避免单点失败。
  • 存储节点(Storage Nodes):文件存放的地方。存储节点就是一个支持 DELETE、PUT 等操作的。任何 WebDAV 服务器都可以。但是建议使用 mogstroed。mogilefsd 可以配置为使用两个不同的服务器的不同的端口。使用 mogstored 进行所有的 DAV 操作(以及边界监控),选择你的 快速/轻量 的 HTTP 服务器来处理 GET 请求。通常每个挂载点上有一个 fat SATA 磁盘,每个挂载在 /var/mogdata/devNN 。
高层流程:
  • app 请求打开一个文件(使用库来 RPC 一个 tracker,找到任意一个正常的)。进行一个 “create_open” 请求。
  • tracker 用负载均衡决定可以到哪儿去,并给 app 一些可能的位置。
  • app 写到其中的一个位置(如果中途写入失败,可以重试并写到其他地方)。
  • app(客户端)用 “create_close” API 告诉 tracker 它写到哪里去了。
  • 然后 tracker 把名字连入 domain 的命名空间(通过数据库)。
  • tracker 在后台启动文件复制,直到完成文件类 (class) 的复制策略。
  • 之后,app 对 domain + key 进行一个 “get_paths” 请求(key == 文件名)。tracker 回复(在查询数据库/memcahe/其他)文件所有可能的 URL 。基于每个位置的 I/O 使用率评出权重。
  • app 依次尝试这些 URL (尽管 tracker 的持续监控所有的主机/设备,因此不会返回失败的东西。并且默认会对第一个返回项检查两次,除非你不让它这么做)。

 

在火炉战高温

 

周末到南京去玩。结果一到南京天气就开始闷热。大热天的,跑来跑去的也是很可怜的。天热,就没那么好耐心等挡镜头的人走开,也就没耐心好好拍照,太阳也晃眼,所以就没拍到多少好照片。

火车下来直接坐地铁去吃传说中很贵的小龙虾。原来南京地铁的单程票是个小牌子。吃完了龙虾去逛总统府。以前只在照片里见过那个门面。进去了才知道原来里面这么大,又是楼又是园林的。不知道中南海里是啥样子。总统府前面的两个石狮子有点与众不同,长得很瘦。

然后在玄武湖边上走,一边是湖,一边是城墙。不过走了没多少,就有饭店啊什么的把沿湖的地方圈了,就只能看城墙了。话说我还是第一次看到真的城墙。原来城墙还是很高的,古人打仗攻城爬城墙还真的是很危险的。然后还发现一路上每100米有一块石头上写的路程,估计是给跑步锻炼的人看的。

之后跑去看传说中的南师大和南大。南师大果然很神奇,都是中式建筑,学校里还能上坡下坡。在坡顶上有一个黄颜色的房子,我开始还以为是从前有座山,山上有座庙呢。爬上去一看是文学院。相比之下,南大就没那么好玩了。就看到学校门口的路当中摆了台阶在拍毕业照。这个毕业照也拍得真不容易。周围还有车开来开去。虽然汉口路是一条只有弄堂那么宽,还弯弯绕的小路。

晚上到夫子庙吃东西。碰到下暴雨,搞得很狼狈。虽然带了伞,鞋子衣服还是湿了。夫子庙果然是个和上海城隍庙差不多的地方。

第二天去明孝陵。皇帝的陵墓真的是很大。最后的那个土堆就爬的很累。标志性建筑都在大太阳底下,人也多。倒是在一些角落里还发现一些有意思的地方。

天气太热,从土堆后面绕出来就受不了了。本来上去的时候走了一条神道,打算回去的时候走另一条,后来也没去了。

坐车坐到南京博物馆,跑进去吹空调吃东西休息了一下,缓过来了才开始逛。

最后回到火车站。从火车站上面看玄武湖感觉确实不错。不过走累了,也就没在车站里好好找合适的角度。

流水账报完。

 

Firefox 的 .submit() 问题

碰到一个很郁闷的问题。一个在 iframe 里调用父页面的 js 来提交表单,在其他浏览器都正常,但 firefox 上却提交不了。在 firebug 里直接调用可以,在父页面上用 js 调用也行。也许是 firefox 的防 csrf 功能的影响吧。

重现代码:

test1.php

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml”&gt;
<head>
<title>test1</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
</head>
<body>
<script type=”text/javascript”>
<!–
function foo() {
alert(‘foo’);
document.testForm.btn.value=’aaaa’;
document.testForm.submit();
}
//–>
</script>
<form method=”post” action=”test2.php” name=”testForm” target=”ifr”>
<input type=”submit” name=’btn’/>
</form>

</body>
</html>

test2.php

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN” “http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd”&gt;
<html xmlns=”http://www.w3.org/1999/xhtml”&gt;
<head>
<title>test2</title>
<meta http-equiv=”Content-Type” content=”text/html; charset=utf-8″ />
</head>
<body>
<?php
print_r($_POST);
?>
<script type=”text/javascript”>
<!–
<?php if (isset($_POST[‘btn’])):?>
alert(‘111’);
parent.foo();
<?php else: ?>
alert(‘000’);
<?php endif; ?>
//–>
</script>
</body>
</html>

可以试试看在不同浏览器上的差异。

把 .submit() 换成 submit 控件的 .click() 也是一样。

最后还是用setTimeout(…., 1); 跳出调用栈来执行 .submit() 来解决。