最初试验MogileFS好像是06年初了,从那开始一直看它的代码,去年作doggy的时候就加入了对MogileFS的支持,作为一个备选的Storage Provider实现. 但是一直没有投入生产环境中. 主要的原因是需求并不强烈, 还有就是其他同事并不熟悉,好在使用
Storage接口, 从FileSystem切换MogileFS也非常简单…
这几天放假,没有环境了,决定在自己的MacBookPro上搭建一下,在此记录一下,省得以后又忘了.
1. 安装MogileFS及其相关的CPAN模块
night$ sudo cpan -i BSD::Resource
night$ sudo cpan -i MogileFS::Client
night$ sudo cpan -i MogileFS::Server
night$ sudo cpan -i MogileFS::Utils
night$ sudo cpan -i MogileFS::Client::FilePaths
好了,必要的软件都安装完毕
BTW, 我是懒人,所以用cpan迅速解决一切,
虽然也可以直接从danga.com下载或者svn co, 不过, 有必要那么烦么…
2. 安装数据库
可以通过安装Store::Sqlit来作一个纯测试的环境,但是最好还是选择mysql
night$ mogdbsetup
按照提示修改数据库,或者干脆 mogdbsetup –yes
会生成一个mogilefs数据库.
3.配置tracker(mogilefsd)
建立测试环境:
mkdir -p /usr/local/mogilefs/conf
创建 /usr/local/mogilefs/conf/mogilefsd.conf, 内容如下:
#pidfile = /var/run/mogile/mogilefsd.pid
daemonize = 1
# Database settings
db_dsn = DBI:mysql:mogilefs:host=127.0.0.1
db_user = mogile
# You must insert your password here!
# db_pass = __PASSWORD__
# Network settings
conf_port = 7001
#listen = 127.0.0.1:7001,
# Storage
#
# UPDATE::原先老版本使用NFS,当前版本已经不再使用,可以忽略
# mog_root = /usr/local/mogilefs/mnt
# Plugins
#plugins = …
# Tuning knobs
query_jobs = 2
delete_jobs = 1
replicate_jobs = 1
monitor_jobs = 1
reaper_jobs = 1
#min_free_space = 100
#max_disk_age = 5
#node_timeout = 2
#old_repl_compat = 1
#default_mindevcount = 2
*_jobs用于定义各自工作线程数量, 上面是适合我的MBP的值,仅供测试而已.
把tracker启动起来
mogilefs -c /usr/local/mogilefs/etc/mogielfsd.conf
检查一下:
night$ mogadm check
Checking trackers…
127.0.0.1:7001 … OK
Checking hosts…
No devices found on tracker(s).
4. 配置存储节点(mogstored).
实际上mogilefs的存储节点本质是WebDAV(只不过最初是作为Perbal的wrapper),
因此Nginx,Lighttpd都可以作为存储节点.
还是记录一下mogstored的配置,其他如何配置网上很多:
mogstored的逻辑是host,device. 一个mostored服务对应一个host(逻辑上的),
所以你可以在同一台物理主机上通过监听不同的端口同一台物理主机上通过IP别名来实现不同的host.
下面是创建一个服务:
创建 /usr/local/mogilefs/etc/mogstored.conf
#pidfile = /var/run/mogile/mogstored.pid
daemonize = 1
# Network settings
httplisten = 127.0.0.1:7500
mgmtlisten = 127.0.0.1:7501
# Storage
docroot = /usr/local/mogilefs/mogdata
# Server type
# Perlbal is the default
#server = perlbal
# But lighttpd is supported too
#server = lighttpd
#serverbin = /usr/sbin/lighttpd
# Tuning knobs
#max_conns = 10000
#opt_iostat 1
启动节点服务
$ mkdir -p /usr/local/mogilefs/mogdata
$ mogstored -c etc/mogstored.conf
将存储节点追加到tracker, 命名为storage1
night$ mogadm host add storage1 –ip 127.0.0.1 –port=7500 –status=alive
night$ mogadm host list
storage1 [1]: alive
IP: 127.0.0.1:7500
上述输出表示节点已经被加入到tracker中.
现在,为存储节点增加存储设备device, 首先手动创建一个目录(生产环境下应该mount到一个独立的分区)
night$mkdir /usr/local/mogilefs/mogdata/dev1
添加到storage node:
night$ mogadm device add storage1 1 –status=alive
检查一下结果:
Macintosh-2:mogilefs night$ mogadm check
Checking trackers…
127.0.0.1:7001 … OK
Checking hosts…
[ 1] storage1 … OK
Checking devices…
host device size(G) used(G) free(G) use% ob state I/O%
—- ———— ———- ———- ———- —— ———- —–
[ 1] dev1 55.770 50.008 5.762 89.67% writeable 0.0
—- ———— ———- ———- ———- ——
total: 55.770 50.008 5.762 89.67%
这样,存储节点storage1就完成了, 为了测试复制,可以再启动一个节点,
通过修改etc/mogstored.conf 为: etc/mogstored2.conf
httplisten = 192.168.8.100:7500
mgmtlisten = 192.168.8.100:7501
# Storage
docroot = /usr/local/mogilefs/mogdata2
$ mogstored -c etc/mogstored2.conf
$ mogadm host add storage2 –ip 192.168.8.100 –port=7500 –status=alive
….
(为storage2添加device, id 从2 开始)
现在2个存储节点已经搭建好了, 它们之间可以实现自动复制.
测试一下实际的工作:
Macintosh-2:mogilefs night$ mogadm domain add test
Macintosh-2:mogilefs night$ mogadm domain list
domain class mindevcount
——————– ——————– ————-
test default 2
添加一个文件
mogtool –trackers=127.0.0.1:7001 –domain=test inject test.txt t
查看:
mogtool –trackers=127.0.0.1:7001 –domain=test extract t -
====================
完成.
UPDATE:
1.CPAN,DBI, DBD-Mysql 这些CPAN模块都要事先安装,不再赘述.
2.Device ID 是唯一的,一旦创建将无法删除,只能mark为dead. 所以,如果你某个磁盘坏了,你mark为dead, 后来又修好了,
那么你必须重新格式化并命名为新的device id, 不支持将device从dead变为alive.
mogilefs的存储单位是基于文件,对于大文件,基于chunk。
所以动态扩充存储容量当然是可以的。
为某个节点扩充容量很简单,增加一个硬盘,作为一个device添加到mogilefs的这个节点上去。
关于perl, mixi.jp(日本最大社区),LiveJournal都在用。
国内web开发则少些(不过我上次看到一个web2.0的社区,忘了),但是perl的应用可不少。
关于是否使用memcached,在mogileFS开发者中有过争论。虽然最新版已经加入了memcached的缓存,不过主开发者并不认同这个做法。实际上,我也不认为需要在mogilefs层做缓存,这部分应该在应用层做。因为你每次获取的是一个mogileFS的存储路径数组,这部分应该在中间层缓存起来。实践中可以在nginx这层进行缓存和负载。
class字面是分类,可以针对每一个class定义相应的策略,比如同步复制的副本.
class是从属于domain的. 通过class可以定义文件的重要程度,比如有的文件你需要
3个拷贝,有的则只需要1个.
总存储物理上简单的说是所有的device的和,但实际的存储还需要和相应的文件冗余的副本相关,如果100M,每个文件只有1个副本,实际可以存储100M的文件,但是如果定义每个文件有2个副本,实际只能存储50M的文件.