架构(一共三台主机):
一个tracker节点+Mysql服务放在一台主机
两个storage节点
注意:Xshell中有多会话管理工具,为了方便管理,建议打开;
(1)、(Tracker节点、Storage节点)安装方法选择yum安装:
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
注意:由于Mogilefs使用perl语言编写的,所以如果perl相关的组件,可能会无法启动Mogilefs的服务;
获取Mogilefs相关的rpm包:
MogileFS-Server-2.46-2.el6.noarch.rpm #核心服务
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm #socket,用于监听
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm #tracker节点
perl-MogileFS-Client-1.14-1.el6.noarch.rpm #客户端
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm #Storage存储节点
MogileFS-Utils-2.19-1.el6.noarch.rpm
(2)、(在Tracker节点安装Mysql数据库)mogilefs服务初始化
注意:生产环境中,数据库一般是主从单独放置,Tracker节点和Storage节点,可以放在一台主机上,在前端的调度器那里做负载均衡即可。
1、数据库授权
GRANT ALL PRIVILEGES ON *.* TO 'mogile' @'127.0.0.1' IDENTIFIED BY 'mogile' WITH GRANT OPTION;
2、设定数据库:
mogdbsetup --help
mogdbsetup --dbhost=127.0.0.1 --dbpass=mogpass
#步骤1可以由mogdbsetup生成,即步骤1可以省略;
注意:用户名默认为:mogile;
注意: --dbpass=mogpass,指定数据库用户mogile的密码是"mogpass",默认为空;
3、添加运行用户
useradd -r mogilefs
mkdir /var/run/mogilefsd/
chown -R mogilefs.mogilefs /data/mogdata/ #storage节点
注意:由于Mogilefsd服务使用mogilefs用户管理,所以,手动安装(per安装)的话,需要创建mogilefs用户。使用yum安装的话,用户已经创建。由于Mogulefs服务的用户身份是mogilefs用户,所以要保证在Storage节点上的"docroot",有管理权限,并且还要和配置文件中的路径对应起来。
4、修改主配置文件:
/etc/mogilefs/mogilefsd.conf
5、启动服务 (tracker服务为mogilefsd) (storage服务为mogstored)
注意:/etc/init.d/mogstored、/etc/init.d/mogilefsd两个脚本有点儿问题,有的时候报错,并不一定是服务启动不了。
(3)、(Tracker节点)MogileFS 的管理:
mogstored 程序的启动将使主机本身成为一个存储的节点,mogstored 启动后, 还需要使用mogadm来让当前的这个主机加入到 MogileFS的系统中。这就是一个存储节点。注意存储节点中还需要添加设备。每个设备有一个 uniq 的 ID 号。同样也要使用 mogadm 来加入到 MogileFS 的系统中。
MogileFS 中的存储主机(节点)管理
现在加入"存储节点"到 trackers 中。注册自己到trackers。相当于为每个主机加入MogileFS的存储系统。
mogadm host add <storage_node_name> --ip=127.0.0.1 --port=7500 -- status=alive
#添加主机,将主机信息注册到数据库中;
mogadm host list <==>
mogadm --tracker=172.17.252.75:7001 check
#检查这个主机是否加入到 MogileFS 的系统中;
mogadm host modify node1 --ip=123.xxx.xxx.70 --status=alive
#可以修改主机IP;
示例:
mogadm --tracker=172.17.252.75:7001 host add node1 --ip=172.17.254.145 --port=7500 --status=alive
mogadm --tracker=172.17.252.75:7001 host add node2 --ip=172.17.253.242 --port=7500 --status=alive
MogileFS中的存储设备管理
在storage节点中"docroot"目录下,建一个目录 ( 并且需要 mount一个硬盘给这个目录 ) 给这个"设备"使用, 我们这的例子是使用dev1在主机中建一个目录,注意建目录使用dev + ID 这种格式,注意所有系统中设备的ID号不能重复。也必须和配置文件中的路径一样.。如下:
mkdir -p /data/mogdata/dev1
chown mogilefs:mogilefs -R /data/mogdata
一定要注意, 给相对应用的块设备 mount 到这个点, 软链也行. 不然写文件都会写到系统硬上, 其它的硬盘都是空的给"设备"加入"存储的节点"当中,相当于为每个设备加入 MogileFS 的存储系统:
mogadm device add <storage_node_name> ID
示例:
Storage节点:
mkdir -p /data/mogdata/dev*
chown mogilefs:mogilefs -R /data/mogdata
如果如果已经启动了/etc/init.d/mogstored的话,会生成一个/data/mogdata/dev*/usage文件。里面记录着dev*下的硬盘的使用情况;
Tracker节点:
mogadm --tracker=172.17.252.75:7001 device add node1 1
mogadm --tracker=172.17.252.75:7001 device add node2 2
mogadm --tracker=172.17.252.75:7001 check
检查我们加入的"设备"信息,这样就能见到上面这个设备了。还能显示加入的大小。mogadm device list标记失效的设备,当硬盘坏了,设备有问题时,这时会自动在一个域内复制到最小设置的保存份数。恢复上面一样在一次 add 设备就好了:
mogadm device mark <storage_node_name> <storage_node_name> ID dead
注意:由于每次使用mogadm命令,都要指明tracker的IP和端口;所以,方便使用,可以创建一个"/etc/mogilefs/mogilefs.conf",在文件中指明" --tracker=172.17.252.75:7001",以后使用mogadm命令,就可以不用再输入密码了。
MogileFS 中域、类的管理
当上面的准备好了,MogileFS 是运行中时,接下来我们要建一个我们自己的'名字空间'和加入文件到存储当中。我们使用 mogadm 的工具来能创建一个"域"和"类",也可以使用这个来增加文件到"类"中。
mogadm domain add <domain_name> #创建"域"
mogadm domain list #检查"域",显示存在的域
mogadm class add <domain_name> <class_name> --mindevcount=3
#在"域"中建"类",并加入最小保存份数
示例:
mogadm domain add img
mogadm domain list
mogadm class add img m26 --mindevcount=3
mogupload --domain=doc --class=m --key=12 --file=./47243-106.jpg
MogileFS 中文件管理
我们可以简单的使用 mog 开头的系列 Linux 命令, 来进行管理, 当然也可以用 Client 的 API来管理. 新的 MogileFS 的工具, 拆分成多个了。下面这些命令, 都需要在/etc/mogilefs/mogilefs.conf 中指定 trackers,不然就需要在下面的命令都加上 –trackers来指定。
1. 上传文件:
mogupload --domain=magedu --key=<key_name> --file=<file_path>
2. 查询文件:
mogfileinfo --trackers=host --domain=<domain_name> --key=<key_name>
例如查询一个叫 crossdomain 的 key 。在指定的 domain 中.
# mogfileinfo --domain=magedu --key=magedu
4. 删除指定文件:
mogdelete --domain=<domain_name> --key=<key_name>
5. 列出所有的文件 key:
这个可以列出指定 domain 下面的所有的 key , 也可以指定的一个前缀, 来找特定前缀的所有文件的 key:
moglistkeys --domain=<domain_name> --key_prefix=<key_name>
6. 列出指定 fid 的文件
这个 fromfid 是指 mogileFS 内部的文件 id , 这个是自增的, 你可以指定一个开始的位置,指定显示多少文件,这个用于查询指定时间段内上传的文件时很有用。比如我们在 8 点上传了一个文件, 是 100 的 id,我们可以查询到从这个之后的所有的 id 的文件。
moglistfids --fromfid=<file_id> --count=<数量>
示例:
mogupload --domain=img --key=1 --file=./281783-106.jpg
mogfileinfo --domain=img --key=1
moglistfids --fromfid=2 --count=10
注意:可以通过浏览器来访问"http://172.17.253.242:7500/dev2/0/000/000/0000000006.fid"
暂时停止服务器
如果你需要维护一个服务器,比如更新内存,升级操作系统之类的需要关机的操作,推荐你在操作之前先设置这些为 "down"。MogileFS 对这种偶然的故障可以很弹性的处理。
$ mogadm host mark mystorage down
... 做一些操作 ...
$ mogadm host mark mystorage alive
只读模式和耗尽(Drain) 模式
如果你想要冻结设备上所有的文件,你要使用只读模式就行了。这将停掉 MogileFS 存放新文件到这个设备上,但它也将阻止删除文件.代替的删除的操作是会给这些内容放到队列中等待为您
标记为'alive'着或'drain'。
$ mogadm device mark mystorage 5 readonly
$ mogadm device mark mystorage 5 drain
耗尽(Drain) 模式,在 2.40 和更高以上。告诉 MogileFS 不会有新的文件应写入设备。但是在耗尽(Drain) 模式,文件可能被删除。所以如果你不希望写文件到这个设备上。可以设置为drain 的模式;
注意:耗尽(Drain) 模式在 MogileFS 的早期版本,,将会从设备删除 FIDS。现在它已经被重新均衡的功能取代。
重新复制文件
如果有一个硬盘坏了,MogileFS 可以自动的让请求不在访问这个设备,但是不会自动的重新复制这个硬盘的文件,你必须通过 mogadm 来手工来标志成 'dead'。只要你这样做,MogileFS 将开始删除设备上的文件,并试图在集群间重新复制它们到其它的设备上。
示例:
实验:Mogilefs系统中有两个副本,而dev1设备损坏了,产生了一个安全隐患,怎样解决?
Storage节点(node3):
yum install perl-Net-Netmask perl-IO-String perl-Sys-Syslog perl-IO-AIO
lftp 172.17.0.1 #获取必要的rpm包
MogileFS-Server-2.46-2.el6.noarch.rpm
perl-Danga-Socket-1.61-1.el6.rf.noarch.rpm
MogileFS-Server-mogilefsd-2.46-2.el6.noarch.rpm
perl-MogileFS-Client-1.14-1.el6.noarch.rpm
MogileFS-Server-mogstored-2.46-2.el6.noarch.rpm
MogileFS-Utils-2.19-1.el6.noarch.rpm
yum localinstall *.rpm -y
mkdir /data/mogdata -p
vim /etc/mogilefs/mogstored.conf
docroot = /data/mogdata
/etc/init.d/mogstored start
ss -ntl
cd /data/
mkdir dmogdata/ev3
chown mogilefs:mogilefs -R .
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes
wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
tar xf Sys-Syscall-0.23.tar.gz
cd Sys-Syscall-0.23
perl Makefile.PL
make && make install
/etc/init.d/mogstored restart
ss -ntl
Tracker节点:
mogadm host mark node1 dead
mogadm --tracker=172.17.252.75:7001 host add node3 --ip=172.17.253.138 --port=7500 --status=alive
mogadm check
mogadm --tracker=172.17.252.75:7001 device add node3 3
mogadm rebalance policy --options="from_hosts=2 to_percent_free=50"
mogadm rebalance test
mogadm rebalance start
注意:生产环境中一般不会立即reblance,因为一个空的dev设备,突然挂到系统中,所有的数据都会往dev3设备上写,容易对dev3设备造成损坏。实际生产中,一般是先将dev3设备挂载起来,标记为可写,其他的dev设备标记为读,等到dev硬盘中写的差不多了,改变所有dev为写,然后再将其reblance;
扩展实验:
上面实验可以看到,上传的文件仅在一个主机上存放,实际上应该是两个节点都存放才对。原因可能是由于Sys::Syscall这个模块造成的。我们看到现在此模块的版本为0.25。需要将此软件降为0.23版本可能会修复此问题:
yum -y install make gcc unzip perl-DBD-MySQL perl perl-CPAN perl- YAML perl-Time-HiRes
wget http://search.cpan.org/CPAN/authors/id/B/BR/BRADFITZ/Sys-Syscall-0.23.tar.gz
tar xf Sys-Syscall-0.23.tar.gz
cd Sys-Syscall-0.23
perl Makefile.PL
make && make install
然后重启Tracker节点、Storage节点中的服务后生效。
注意:lftp中,mget *可以用来下载多个文件;
注意:在企业中,一般会有一个图片处理的工具,例如用于裁剪图片